Repository: LycheeOrg/Lychee (language: php)

Issue:
Album allow public upload but disallow deletion
As per title, i can't seems to configure this. 
My goal is to create an public album allow anyone/anonymous to upload photos but disallow delete permission. 
[Enhancement] Front-End on Livewire - Tracking advancement.
## TODO

- [ ] layouts (justified etc)
- [x] image view
- [ ] Upload
- [ ] side panel
- [ ] modals for albums (delete, share, new)
- [ ] modals for pictures (delete, share)
- [x] Basic settings view
- [x] Diagnostics view
- [x] Log view
- [x] U2F view
- [x] User view
- [x] Advanced setting view
- [ ] Modules view (improved settings)
- [ ] Context menus
- [ ] Hot keys for shortcuts
- [x] Admin login/password first query on install

## Expectations and Questions

- **Required:** seamless change from current front-end to Livewire = practically invisible to the user (but may induce minor loss of functionality).
- **Question:** Do we leave the JS version still available as a setting and freeze it like for the v3?
- **Question:** ~~Do we release the livewire first as a Beta functionality that is *Opt-in*? That way the refactoring can be propagated through the back-end without stopping new (hypothetical/hopeful :sweat_smile:) development of Lychee.~~ **Yes**.


Discussion / hints:
1. Access Rights management is not available yet (but soonTM)
2. It will be:
    > My goal is to create an public album allow ~~anyone/anonymous~~ **logged-in users** to upload photos but disallow delete permission.

Allowing anyone/anonymous to upload is too much of a security risk, we are not allowing that directly from the UI.
However if you want to shoot yourself in the foot, it is be possible by changing one flag in the database:
https://github.com/LycheeOrg/Lychee/blob/master/app/Policies/AlbumPolicy.php#L161
```php
	public function canUpload(User $user, ?AbstractAlbum $abstractAlbum = null): bool
	{
		// The upload right on the root album is directly determined by the user's capabilities.
		if ($abstractAlbum === null || !$abstractAlbum instanceof BaseAlbum) {
			return $user->may_upload;
		}

		return $this->isOwner($user, $abstractAlbum) ||
			$abstractAlbum->current_user_permissions()?->grants_upload === true ||
			$abstractAlbum->public_permissions()?->grants_upload === true;
	}

```
You just need to find the line in the `access_permissions` table with the `user_id = null` and `album = <albumID>` and set  `grants_upload` to `1`.
^ that part you can probably already do.
https://www.youtube.com/watch?v=ELvpenyp-ak 
Closing this as https://github.com/LycheeOrg/Lychee/pull/1303 provides better info

Fix patch:
diff --git a/.env.example b/.env.example
index dc65064bdb2..fe8f76839ca 100644
--- a/.env.example
+++ b/.env.example
@@ -9,6 +9,9 @@ APP_FORCE_HTTPS=false
 # Do note that this disable CSP!!
 DEBUGBAR_ENABLED=false
 
+# enable or disable the v5 layout.
+LIVEWIRE_ENABLED=true
+
 # enable or disable log viewer. By default it is enabled.
 LOG_VIEWER_ENABLED=true
 
@@ -101,3 +104,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 5b2b4f189d1..fd8a185fabc 100644
--- a/.github/workflows/.env.mariadb
+++ b/.github/workflows/.env.mariadb
@@ -3,6 +3,7 @@ APP_URL=https://localhost
 APP_ENV=dev
 APP_KEY=SomeRandomString
 APP_DEBUG=true
+LIVEWIRE_ENABLED=false
 
 DB_CONNECTION=mysql
 DB_HOST=localhost
diff --git a/.github/workflows/.env.postgresql b/.github/workflows/.env.postgresql
index 2d6c582c84b..57702d51d0c 100644
--- a/.github/workflows/.env.postgresql
+++ b/.github/workflows/.env.postgresql
@@ -3,6 +3,7 @@ APP_URL=https://localhost
 APP_ENV=dev
 APP_KEY=SomeRandomString
 APP_DEBUG=true
+LIVEWIRE_ENABLED=false
 
 DB_CONNECTION=pgsql
 DB_HOST=localhost
diff --git a/.github/workflows/.env.sqlite b/.github/workflows/.env.sqlite
index 1aff99054cb..676b77bfaff 100644
--- a/.github/workflows/.env.sqlite
+++ b/.github/workflows/.env.sqlite
@@ -3,6 +3,7 @@ APP_URL=https://localhost
 APP_ENV=dev
 APP_KEY=SomeRandomString
 APP_DEBUG=true
+LIVEWIRE_ENABLED=false
 
 DB_CONNECTION=sqlite
 DB_LIST_FOREIGN_KEYS=true
diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml
index 3b914d1ab15..69f1e3b84ee 100644
--- a/.github/workflows/CICD.yml
+++ b/.github/workflows/CICD.yml
@@ -69,6 +69,35 @@ jobs:
       - name: Check source code for code style errors
         run: PHP_CS_FIXER_IGNORE_ENV=1 vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.php --verbose --diff --dry-run
 
+  check_js:
+    name: 2️⃣ JS Node ${{ matrix.node-version }} - Code Style errors & Compilation
+    runs-on: ubuntu-latest
+    needs:
+      - php_syntax_errors
+    strategy:
+        matrix:
+            node-version: [16, 18, 20]
+    steps:
+      - name: Checkout code
+        uses: actions/checkout@v3
+
+      - name: Use Node.js ${{ matrix.node-version }}
+        uses: actions/setup-node@v3
+        with:
+            node-version: ${{ matrix.node-version }}
+
+      - name: Install
+        run: npm install -D
+
+      - name: Check Style
+        run: npm run check-formatting
+
+      - name: Check TypeScript
+        run: npm run check
+
+      - name: Compile Front-end
+        run: npm run build
+
   phpstan:
     name: 2️⃣ PHP 8.2 - PHPStan
     runs-on: ubuntu-latest
@@ -106,6 +135,7 @@ jobs:
           - sqlite
         test-suite:
           - Feature
+          - Livewire
     # Service containers to run with `container-job`
     services:
       # Label used to access the service container
@@ -282,6 +312,17 @@ jobs:
         with:
           composer-options: --no-dev
 
+      - name: Use Node.js 20
+        uses: actions/setup-node@v3
+        with:
+            node-version: 20
+
+      - name: Install
+        run: npm install
+
+      - name: Compile Front-end
+        run: npm run build
+
       - name: Build Dist
         run: |
           make clean dist
diff --git a/.gitignore b/.gitignore
index e380c9e2f36..2db2a099c05 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,9 +5,11 @@ build/*
 # Those are personal
 public/dist/user.css
 public/dist/custom.js
+public/build/*
 
 # Pictures we do not commit
 public/uploads/**
+public/uploads-*/**
 
 # Storage stuff: useless
 /storage/*.key
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/Makefile b/Makefile
index 17ae0a26169..4c6374b1f7d 100644
--- a/Makefile
+++ b/Makefile
@@ -5,7 +5,13 @@ composer:
 	composer install --prefer-dist --no-dev
 	php artisan vendor:publish --tag=log-viewer-asset
 
-dist-gen: clean composer
+npm-build:
+	rm -r public/build 2> /dev/null || true
+	rm -r node_modules 2> /dev/null || true
+	npm install
+	npm run build
+
+dist-gen: clean composer npm-build
 	@echo "packaging..."
 	@mkdir Lychee
 	@mkdir Lychee/public
@@ -19,6 +25,7 @@ dist-gen: clean composer
 	@cp -r config                           Lychee
 	@cp -r composer-cache                   Lychee
 	@cp -r database                         Lychee
+	@cp -r public/build                     Lychee/public
 	@cp -r public/dist                      Lychee/public
 	@cp -r public/vendor                    Lychee/public
 	@cp -r public/installer                 Lychee/public
@@ -46,6 +53,7 @@ dist-gen: clean composer
 	@cp -r version.md                       Lychee
 	@touch Lychee/storage/logs/laravel.log
 	@touch Lychee/public/dist/user.css
+	@touch Lychee/public/dist/custom.js
 	@touch Lychee/public/uploads/import/index.html
 	@touch Lychee/public/sym/index.html
 
@@ -63,6 +71,12 @@ dist: dist-clean
 clean:
 	@rm build/* 2> /dev/null || true
 	@rm -r Lychee 2> /dev/null || true
+	@rm -r public/build 2> /dev/null || true
+	@rm -r node_modules 2> /dev/null || true
+	@rm -r vendor  2> /dev/null || true
+
+install: composer npm-build
+	php artisan migrate
 
 test:
 	@if [ -x "vendor/bin/phpunit" ]; then \
@@ -90,6 +104,7 @@ formatting:
 phpstan:
 	vendor/bin/phpstan analyze
 
+# Generating new versions
 gen_minor:
 	php scripts/gen_release.php
 	git add database
@@ -106,6 +121,8 @@ gen_major:
 release_major: gen_major
 	git commit -m "bump to version $(shell cat version.md)"
 
+# Building tests 1 by 1
+
 TESTS_PHP := $(shell find tests/Feature -name "*Test.php" -printf "%f\n")
 TEST_DONE := $(addprefix build/,$(TESTS_PHP:.php=.done))
 
diff --git a/app/Actions/Diagnostics/Pipes/Infos/SystemInfo.php b/app/Actions/Diagnostics/Pipes/Infos/SystemInfo.php
index ac35ab4d37b..34e8ccf5fb7 100644
--- a/app/Actions/Diagnostics/Pipes/Infos/SystemInfo.php
+++ b/app/Actions/Diagnostics/Pipes/Infos/SystemInfo.php
@@ -4,6 +4,8 @@
 
 use App\Actions\Diagnostics\Diagnostics;
 use App\Contracts\DiagnosticPipe;
+use App\Facades\Helpers;
+use App\Livewire\Components\Forms\Add\Upload;
 use Carbon\CarbonTimeZone;
 use Illuminate\Database\QueryException;
 use Illuminate\Support\Facades\DB;
@@ -53,10 +55,18 @@ public function handle(array &$data, \Closure $next): array
 		$data[] = Diagnostics::line('Timezone:', ($timeZone !== false ? $timeZone : null)?->getName());
 		$data[] = Diagnostics::line('Max uploaded file size:', ini_get('upload_max_filesize'));
 		$data[] = Diagnostics::line('Max post size:', ini_get('post_max_size'));
+		$this->getUploadLimit($data);
 		$data[] = Diagnostics::line('Max execution time: ', ini_get('max_execution_time'));
 		$data[] = Diagnostics::line($dbtype . ' Version:', $dbver);
 		$data[] = '';
 
 		return $next($data);
 	}
+
+	private function getUploadLimit(array &$data): void
+	{
+		$size = Upload::getUploadLimit();
+
+		$data[] = Diagnostics::line('Livewire chunk size:', Helpers::getSymbolByQuantity($size));
+	}
 }
diff --git a/app/Actions/Search/PhotoSearch.php b/app/Actions/Search/PhotoSearch.php
index f11a11bbc03..10f7b61070e 100644
--- a/app/Actions/Search/PhotoSearch.php
+++ b/app/Actions/Search/PhotoSearch.php
@@ -8,6 +8,7 @@
 use App\Models\Extensions\SortingDecorator;
 use App\Models\Photo;
 use App\Policies\PhotoQueryPolicy;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Collection;
 
 class PhotoSearch
@@ -20,9 +21,27 @@ public function __construct(PhotoQueryPolicy $photoQueryPolicy)
 	}
 
 	/**
+	 * Apply search directly.
+	 *
 	 * @throws InternalLycheeException
 	 */
 	public function query(array $terms): Collection
+	{
+		$query = $this->sqlQuery($terms);
+		$sorting = PhotoSortingCriterion::createDefault();
+
+		return (new SortingDecorator($query))
+			->orderBy($sorting->column, $sorting->order)->get();
+	}
+
+	/**
+	 * Create the query manually.
+	 *
+	 * @param array $terms
+	 *
+	 * @return Builder
+	 */
+	public function sqlQuery(array $terms): Builder
 	{
 		$query = $this->photoQueryPolicy->applySearchabilityFilter(
 			Photo::query()->with(['album', 'size_variants', 'size_variants.sym_links'])
@@ -40,10 +59,6 @@ public function query(array $terms): Collection
 			);
 		}
 
-		$sorting = PhotoSortingCriterion::createDefault();
-
-		return (new SortingDecorator($query))
-			->orderBy($sorting->column, $sorting->order)
-			->get();
+		return $query;
 	}
 }
diff --git a/app/Assets/Helpers.php b/app/Assets/Helpers.php
index fbea1f9f342..c0281d67dbd 100644
--- a/app/Assets/Helpers.php
+++ b/app/Assets/Helpers.php
@@ -217,4 +217,52 @@ public function convertSize(string $size): int
 
 		return $size;
 	}
+
+	/**
+	 * Converts a decimal degree into integer degree, minutes and seconds.
+	 *
+	 * @param float|null $decimal
+	 * @param bool       $type    - indicates if the passed decimal indicates a
+	 *                            latitude (`true`) or a longitude (`false`)
+	 *
+	 * @returns string
+	 */
+	public function decimalToDegreeMinutesSeconds(float|null $decimal, bool $type): null|string
+	{
+		if ($decimal === null) {
+			return null;
+		}
+
+		$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;
+	}
 }
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 @@
+<?php
+
+namespace App\Contracts\Livewire;
+
+/**
+ * This defines components which have an openable state.
+ *
+ * @property bool $isOpen whether the Openable component is open or not.
+ */
+interface Openable
+{
+	/**
+	 * Open the component.
+	 *
+	 * @return void
+	 */
+	public function open(): void;
+
+	/**
+	 * Close the component.
+	 *
+	 * @return void
+	 */
+	public function close(): void;
+
+	/**
+	 * Toggle the component.
+	 *
+	 * @return void
+	 */
+	public function toggle(): void;
+}
diff --git a/app/Contracts/Livewire/Params.php b/app/Contracts/Livewire/Params.php
new file mode 100644
index 00000000000..c029ad05e90
--- /dev/null
+++ b/app/Contracts/Livewire/Params.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace App\Contracts\Livewire;
+
+/**
+ * This defines constants which are used as keys when sending dispatch messages between components.
+ */
+interface Params
+{
+	public const PARENT_ID = 'parentID';
+
+	public const ALBUM_ID = 'albumID';
+	public const ALBUM_IDS = 'albumIDs';
+
+	public const PHOTO_ID = 'photoID';
+	public const PHOTO_IDS = 'photoIDs';
+}
diff --git a/app/Contracts/Livewire/Reloadable.php b/app/Contracts/Livewire/Reloadable.php
new file mode 100644
index 00000000000..3fbf8408181
--- /dev/null
+++ b/app/Contracts/Livewire/Reloadable.php
@@ -0,0 +1,8 @@
+<?php
+
+namespace App\Contracts\Livewire;
+
+interface Reloadable
+{
+	public function reloadPage(): void;
+}
diff --git a/app/Enum/AlbumDecorationOrientation.php b/app/Enum/AlbumDecorationOrientation.php
index 17a26e028a8..4b6acd40b89 100644
--- a/app/Enum/AlbumDecorationOrientation.php
+++ b/app/Enum/AlbumDecorationOrientation.php
@@ -13,4 +13,20 @@ enum AlbumDecorationOrientation: string
 	case ROW_REVERSE = 'row-reverse';
 	case COLUMN = 'column';
 	case COLUMN_REVERSE = 'column-reverse';
+
+	/**
+	 * Convert the enum into it's translated format.
+	 * Note that it is missing owner.
+	 *
+	 * @return array<string,string>
+	 */
+	public static function localized(): array
+	{
+		return [
+			self::ROW->value => __('lychee.ALBUM_DECORATION_ORIENTATION_ROW'),
+			self::ROW_REVERSE->value => __('lychee.ALBUM_DECORATION_ORIENTATION_ROW_REVERSE'),
+			self::COLUMN->value => __('lychee.ALBUM_DECORATION_ORIENTATION_COLUMN'),
+			self::COLUMN_REVERSE->value => __('lychee.ALBUM_DECORATION_ORIENTATION_COLUMN_REVERSE'),
+		];
+	}
 }
diff --git a/app/Enum/AlbumDecorationType.php b/app/Enum/AlbumDecorationType.php
index 46543a73f14..f6a59e6dda1 100644
--- a/app/Enum/AlbumDecorationType.php
+++ b/app/Enum/AlbumDecorationType.php
@@ -14,4 +14,21 @@ enum AlbumDecorationType: string
 	case ALBUM = 'album';
 	case PHOTO = 'photo';
 	case ALL = 'all';
+
+	/**
+	 * Convert the enum into it's translated format.
+	 * Note that it is missing owner.
+	 *
+	 * @return array<string,string>
+	 */
+	public static function localized(): array
+	{
+		return [
+			self::NONE->value => __('lychee.ALBUM_DECORATION_NONE'),
+			self::LAYERS->value => __('lychee.ALBUM_DECORATION_ORIGINAL'),
+			self::ALBUM->value => __('lychee.ALBUM_DECORATION_ALBUM'),
+			self::PHOTO->value => __('lychee.ALBUM_DECORATION_PHOTO'),
+			self::ALL->value => __('lychee.ALBUM_DECORATION_ALL'),
+		];
+	}
 }
diff --git a/app/Enum/AlbumLayoutType.php b/app/Enum/AlbumLayoutType.php
deleted file mode 100644
index cfe890ee812..00000000000
--- a/app/Enum/AlbumLayoutType.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-namespace App\Enum;
-
-/**
- * Enum AlbumLayoutType.
- *
- * All the allowed layout possibilities on Album
- */
-enum AlbumLayoutType: string
-{
-	case SQUARE = 'square';
-	case JUSTIFIED = 'justified';
-	case UNJUSTIFIED = 'unjustified';
-}
diff --git a/app/Enum/ImageOverlayType.php b/app/Enum/ImageOverlayType.php
index 08dcd545d27..6d806addd56 100644
--- a/app/Enum/ImageOverlayType.php
+++ b/app/Enum/ImageOverlayType.php
@@ -13,4 +13,20 @@ enum ImageOverlayType: string
 	case DESC = 'desc';
 	case DATE = 'date';
 	case EXIF = 'exif';
+
+	/**
+	 * Convert the enum into it's translated format.
+	 * Note that it is missing owner.
+	 *
+	 * @return array<string,string>
+	 */
+	public static function localized(): array
+	{
+		return [
+			self::EXIF->value => __('lychee.OVERLAY_EXIF'),
+			self::DESC->value => __('lychee.OVERLAY_DESCRIPTION'),
+			self::DATE->value => __('lychee.OVERLAY_DATE'),
+			self::NONE->value => __('lychee.OVERLAY_NONE'),
+		];
+	}
 }
diff --git a/app/Enum/Livewire/FileStatus.php b/app/Enum/Livewire/FileStatus.php
new file mode 100644
index 00000000000..e9ca3b3a38b
--- /dev/null
+++ b/app/Enum/Livewire/FileStatus.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Enum\Livewire;
+
+enum FileStatus: string
+{
+	case UPLOADING = 'uploading';
+	case PROCESSING = 'processing';
+	case READY = 'ready';
+	case SKIPPED = 'skipped';
+	case DONE = 'done';
+	case ERROR = 'error';
+}
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 @@
+<?php
+
+namespace App\Enum\Livewire;
+
+enum NotificationType: string
+{
+	case SUCCESS = 'success';
+	case ERROR = 'error';
+	case INFO = 'info';
+	case WARNING = 'warning';
+}
diff --git a/app/Enum/PhotoLayoutType.php b/app/Enum/PhotoLayoutType.php
new file mode 100644
index 00000000000..efb80cd4ff3
--- /dev/null
+++ b/app/Enum/PhotoLayoutType.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace App\Enum;
+
+/**
+ * Enum PhotoLayoutType.
+ *
+ * All the allowed layout possibilities on Album
+ */
+enum PhotoLayoutType: string
+{
+	case SQUARE = 'square';
+	case JUSTIFIED = 'justified';
+	case UNJUSTIFIED = 'unjustified'; // ! Legcay
+	case MASONRY = 'masonry';
+	case GRID = 'grid';
+
+	/**
+	 * Convert the enum into it's translated format.
+	 * Note that it is missing owner.
+	 *
+	 * @return array<string,string>
+	 */
+	public static function localized(): array
+	{
+		// yes, the UNJUSTIFIED is dropped.
+		return [
+			self::SQUARE->value => __('lychee.LAYOUT_SQUARES'),
+			self::JUSTIFIED->value => __('lychee.LAYOUT_JUSTIFIED'),
+			self::MASONRY->value => __('lychee.LAYOUT_MASONRY'),
+			self::GRID->value => __('lychee.LAYOUT_GRID'),
+		];
+	}
+}
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 @@
+<?php
+
+namespace App\Enum\Traits;
+
+use App\Exceptions\Internal\LycheeLogicException;
+use Closure;
+
+trait WireableEnumTrait
+{
+	public function toLivewire(): string|int
+	{
+		return $this->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<string, string|int> | 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/Handler.php b/app/Exceptions/Handler.php
index 7faff50ac37..b2487d0fe30 100644
--- a/app/Exceptions/Handler.php
+++ b/app/Exceptions/Handler.php
@@ -10,10 +10,12 @@
 use App\Exceptions\Handlers\InstallationHandler;
 use App\Exceptions\Handlers\MigrationHandler;
 use App\Exceptions\Handlers\NoEncryptionKey;
+use App\Exceptions\Handlers\ViteManifestNotFoundHandler;
 use Illuminate\Auth\AuthenticationException;
 use Illuminate\Contracts\Container\BindingResolutionException;
 use Illuminate\Contracts\Container\Container;
 use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
+use Illuminate\Foundation\ViteManifestNotFoundException;
 use Illuminate\Http\RedirectResponse;
 use Illuminate\Http\Request;
 use Illuminate\Http\Response;
@@ -95,6 +97,22 @@ class Handler extends ExceptionHandler
 		TokenMismatchException::class,
 		SessionExpiredException::class,
 		NoWriteAccessOnLogsExceptions::class,
+		ViteManifestNotFoundException::class,
+	];
+
+	/** @var array<int,class-string<HttpExceptionHandler>> */
+	protected $exception_checks = [
+		NoEncryptionKey::class,
+		AccessDBDenied::class,
+		InstallationHandler::class,
+		AdminSetterHandler::class,
+		MigrationHandler::class,
+		ViteManifestNotFoundHandler::class,
+	];
+
+	/** @var array<int,class-string<\Throwable>> */
+	protected $force_exception_to_http = [
+		ViteManifestNotFoundException::class,
 	];
 
 	/**
@@ -226,18 +244,41 @@ protected function mapException(\Throwable $e): \Throwable
 	 */
 	protected function prepareResponse($request, \Throwable $e): RedirectResponse|Response
 	{
-		if (!$this->isHttpException($e) && config('app.debug') === true) {
-			return $this->toIlluminateResponse($this->convertExceptionToResponse($e), $e);
-		}
-
 		if (!$this->isHttpException($e)) {
-			$e = new HttpException(500, $e->getMessage(), $e);
+			if ($this->mustForceToHttpException($e) || config('app.debug') !== true) {
+				$e = new HttpException(500, $e->getMessage(), $e);
+			} else {
+				return $this->toIlluminateResponse($this->convertExceptionToResponse($e), $e);
+			}
 		}
 
 		/** @var HttpExceptionInterface $e */
 		return $this->toIlluminateResponse($this->renderHttpException($e), $e);
 	}
 
+	/**
+	 * Check if the exception must be converted to HttpException.
+	 *
+	 * @param \Throwable $e to check
+	 *
+	 * @return bool true if conversion is required
+	 */
+	protected function mustForceToHttpException(\Throwable $e): bool
+	{
+		// This loop order is more efficient:
+		// We take the first layer of the exception, check if match any of the forced conversion
+		// then the next layer etc...
+		do {
+			foreach ($this->force_exception_to_http as $exception) {
+				if ($e instanceof $exception) {
+					return true;
+				}
+			}
+		} while ($e = $e->getPrevious());
+
+		return false;
+	}
+
 	/**
 	 * Renders the given HttpException into HTML.
 	 *
@@ -280,13 +321,9 @@ protected function renderHttpException(HttpExceptionInterface $e): SymfonyRespon
 		// We check, if any of our special handlers wants to do something.
 
 		/** @var HttpExceptionHandler[] $checks */
-		$checks = [
-			new NoEncryptionKey(),
-			new AccessDBDenied(),
-			new InstallationHandler(),
-			new AdminSetterHandler(),
-			new MigrationHandler(),
-		];
+		$checks = collect($this->exception_checks)
+			->map(fn ($c) => new $c())
+			->toArray();
 
 		foreach ($checks as $check) {
 			if ($check->check($e)) {
diff --git a/app/Exceptions/Handlers/ViteManifestNotFoundHandler.php b/app/Exceptions/Handlers/ViteManifestNotFoundHandler.php
new file mode 100644
index 00000000000..93f6e316bb4
--- /dev/null
+++ b/app/Exceptions/Handlers/ViteManifestNotFoundHandler.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace App\Exceptions\Handlers;
+
+use App\Contracts\Exceptions\Handlers\HttpExceptionHandler;
+use Illuminate\Foundation\ViteManifestNotFoundException;
+use Symfony\Component\HttpFoundation\Response as SymfonyResponse;
+use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface as HttpException;
+
+/**
+ * Class ViteManifestNotFoundHandler.
+ *
+ * If vite manifest is not found, indicate user must run "npm run dev" rather than a big error message.
+ */
+class ViteManifestNotFoundHandler implements HttpExceptionHandler
+{
+	/**
+	 * {@inheritDoc}
+	 */
+	public function check(HttpException $e): bool
+	{
+		do {
+			if ($e instanceof ViteManifestNotFoundException) {
+				return true;
+			}
+		} while ($e = $e->getPrevious());
+
+		return false;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public function renderHttpException(SymfonyResponse $defaultResponse, HttpException $e): SymfonyResponse
+	{
+		return response()->view('error.error', [
+			'code' => $e->getStatusCode(),
+			'type' => class_basename($e),
+			'message' => 'Vite manifest not found, please execute `npm run dev`',
+		], $e->getStatusCode(), $e->getHeaders());
+	}
+}
diff --git a/app/Exceptions/PhotoCollectionEmptyException.php b/app/Exceptions/PhotoCollectionEmptyException.php
new file mode 100644
index 00000000000..7ed45102677
--- /dev/null
+++ b/app/Exceptions/PhotoCollectionEmptyException.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace App\Exceptions;
+
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * PhotoCollectionEmptyException.
+ *
+ * This exception is thrown, if a user request a frame but no pictures can be found.
+ * We throw an error 500 because it is likely to be a server error.
+ */
+class PhotoCollectionEmptyException extends BaseLycheeException
+{
+	public const DEFAULT_MESSAGE = 'Photo collection is empty.';
+
+	public function __construct(string $msg = self::DEFAULT_MESSAGE, ?\Throwable $previous = null)
+	{
+		parent::__construct(Response::HTTP_INTERNAL_SERVER_ERROR, $msg, $previous);
+	}
+}
diff --git a/app/Facades/Helpers.php b/app/Facades/Helpers.php
index 7fee525703a..ff77200cf8e 100644
--- a/app/Facades/Helpers.php
+++ b/app/Facades/Helpers.php
@@ -20,6 +20,7 @@
  * @method static bool   isExecAvailable()
  * @method static string secondsToHMS(int|float $d)
  * @method static int    convertSize(string $size)
+ * @method static string decimalToDegreeMinutesSeconds(float $decimal, bool $type)
  */
 class Helpers extends Facade
 {
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/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..d747858bccf 100644
--- a/app/Http/Middleware/DisableCSP.php
+++ b/app/Http/Middleware/DisableCSP.php
@@ -3,7 +3,10 @@
 namespace App\Http\Middleware;
 
 use App\Contracts\Exceptions\LycheeException;
+use Illuminate\Contracts\Container\BindingResolutionException;
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\File;
+use Illuminate\Support\Str;
 
 /**
  * Class DisableCSP.
@@ -44,6 +47,31 @@ 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
+		if (config('app.livewire', false) === true || Str::startsWith($request->getRequestUri(), '/livewire/')) {
+			$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/Requests/Settings/SetLayoutSettingRequest.php b/app/Http/Requests/Settings/SetLayoutSettingRequest.php
index c75354b105a..931ce3ca6d1 100644
--- a/app/Http/Requests/Settings/SetLayoutSettingRequest.php
+++ b/app/Http/Requests/Settings/SetLayoutSettingRequest.php
@@ -2,7 +2,7 @@
 
 namespace App\Http\Requests\Settings;
 
-use App\Enum\AlbumLayoutType;
+use App\Enum\PhotoLayoutType;
 use Illuminate\Validation\Rules\Enum;
 
 class SetLayoutSettingRequest extends AbstractSettingRequest
@@ -12,13 +12,13 @@ class SetLayoutSettingRequest extends AbstractSettingRequest
 	public function rules(): array
 	{
 		return [
-			self::ATTRIBUTE => ['required', new Enum(AlbumLayoutType::class)],
+			self::ATTRIBUTE => ['required', new Enum(PhotoLayoutType::class)],
 		];
 	}
 
 	protected function processValidatedValues(array $values, array $files): void
 	{
 		$this->name = self::ATTRIBUTE;
-		$this->value = AlbumLayoutType::from($values[self::ATTRIBUTE]);
+		$this->value = PhotoLayoutType::from($values[self::ATTRIBUTE]);
 	}
 }
diff --git a/app/Http/Requests/User/U2FRequest.php b/app/Http/Requests/User/U2FRequest.php
index 61611f71c41..8ec64a3520f 100644
--- a/app/Http/Requests/User/U2FRequest.php
+++ b/app/Http/Requests/User/U2FRequest.php
@@ -18,6 +18,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/Collections/AlbumCollectionResource.php b/app/Http/Resources/Collections/AlbumCollectionResource.php
new file mode 100644
index 00000000000..99326aa7e47
--- /dev/null
+++ b/app/Http/Resources/Collections/AlbumCollectionResource.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Http\Resources\Collections;
+
+use App\Http\Resources\Models\AlbumResource;
+use Illuminate\Http\Resources\Json\ResourceCollection;
+
+/**
+ * Provide stronger typechecking for Album collections.
+ */
+class AlbumCollectionResource extends ResourceCollection
+{
+	/**
+	 * The resource that this resource collects.
+	 *
+	 * @var string
+	 */
+	public $collects = AlbumResource::class;
+}
diff --git a/app/Http/Resources/ConfigurationResource.php b/app/Http/Resources/ConfigurationResource.php
index 147b853b6f5..879a2ba3087 100644
--- a/app/Http/Resources/ConfigurationResource.php
+++ b/app/Http/Resources/ConfigurationResource.php
@@ -6,11 +6,11 @@
 use App\DTO\PhotoSortingCriterion;
 use App\Enum\AlbumDecorationOrientation;
 use App\Enum\AlbumDecorationType;
-use App\Enum\AlbumLayoutType;
 use App\Enum\DefaultAlbumProtectionType;
 use App\Enum\ImageOverlayType;
 use App\Enum\LicenseType;
 use App\Enum\MapProviders;
+use App\Enum\PhotoLayoutType;
 use App\Enum\ThumbAlbumSubtitleType;
 use App\Exceptions\Handler;
 use App\Metadata\Versions\InstalledVersion;
@@ -138,7 +138,7 @@ public function toArray($request): array
 			'image_overlay_type' => Configs::getValueAsEnum('image_overlay_type', ImageOverlayType::class),
 			'landing_page_enable' => Configs::getValueAsBool('landing_page_enable'),
 			'lang' => Configs::getValueAsString('lang'),
-			'layout' => Configs::getValueAsEnum('layout', AlbumLayoutType::class),
+			'layout' => Configs::getValueAsEnum('layout', PhotoLayoutType::class),
 			'legacy_id_redirection' => Configs::getValueAsBool('legacy_id_redirection'),
 			'location_decoding' => Configs::getValueAsBool('location_decoding'),
 			'location_decoding_timeout' => Configs::getValueAsInt('location_decoding_timeout'),
diff --git a/app/Http/Resources/Models/AlbumResource.php b/app/Http/Resources/Models/AlbumResource.php
index b5a03fec7a4..c93938cd4a9 100644
--- a/app/Http/Resources/Models/AlbumResource.php
+++ b/app/Http/Resources/Models/AlbumResource.php
@@ -3,6 +3,7 @@
 namespace App\Http\Resources\Models;
 
 use App\DTO\AlbumProtectionPolicy;
+use App\Http\Resources\Collections\AlbumCollectionResource;
 use App\Http\Resources\Collections\PhotoCollectionResource;
 use App\Http\Resources\Rights\AlbumRightsResource;
 use App\Http\Resources\Traits\WithStatus;
@@ -46,7 +47,7 @@ public function toArray($request)
 			// children
 			'parent_id' => $this->resource->parent_id,
 			'has_albums' => !$this->resource->isLeaf(),
-			'albums' => AlbumResource::collection($this->whenLoaded('children')),
+			'albums' => AlbumCollectionResource::make($this->whenLoaded('children')),
 			'photos' => PhotoCollectionResource::make($this->whenLoaded('photos')),
 			'num_subalbums' => $this->resource->num_children,
 			'num_photos' => $this->resource->num_photos,
diff --git a/app/Http/Resources/Models/PhotoResource.php b/app/Http/Resources/Models/PhotoResource.php
index 54302d645e3..6cb43408557 100644
--- a/app/Http/Resources/Models/PhotoResource.php
+++ b/app/Http/Resources/Models/PhotoResource.php
@@ -2,12 +2,17 @@
 
 namespace App\Http\Resources\Models;
 
+use App\Enum\LicenseType;
 use App\Enum\SizeVariantType;
+use App\Facades\Helpers;
 use App\Http\Resources\Rights\PhotoRightsResource;
 use App\Http\Resources\Traits\WithStatus;
+use App\Models\Configs;
 use App\Models\Extensions\SizeVariants;
 use App\Models\Photo;
+use App\Models\SizeVariant;
 use App\Policies\PhotoPolicy;
+use GrahamCampbell\Markdown\Facades\Markdown;
 use Illuminate\Contracts\Support\Arrayable;
 use Illuminate\Http\Request;
 use Illuminate\Http\Resources\Json\JsonResource;
@@ -65,12 +70,12 @@ public function toArray($request)
 			'description' => $this->resource->description,
 			'focal' => $this->resource->focal,
 			'img_direction' => null,
-			'is_public' => $this->resource->is_public,
+			'is_public' => $this->resource->is_public, // TO BE REMOVED LATER
 			'is_starred' => $this->resource->is_starred,
 			'iso' => $this->resource->iso,
 			'latitude' => $this->resource->latitude,
 			'lens' => $this->resource->lens,
-			'license' => $this->resource->license->localization(),
+			'license' => $this->resource->license,
 			'live_photo_checksum' => $this->resource->live_photo_checksum,
 			'live_photo_content_id' => $this->resource->live_photo_content_id,
 			'live_photo_url' => $this->resource->live_photo_url,
@@ -83,7 +88,7 @@ public function toArray($request)
 			'size_variants' => [
 				'medium' => $medium === null ? null : SizeVariantResource::make($medium)->toArray($request),
 				'medium2x' => $medium2x === null ? null : SizeVariantResource::make($medium2x)->toArray($request),
-				'original' => $original === null ? null : SizeVariantResource::make($original)->noUrl($downgrade)->toArray($request),
+				'original' => $original === null ? null : SizeVariantResource::make($original)->setNoUrl($downgrade)->toArray($request),
 				'small' => $small === null ? null : SizeVariantResource::make($small)->toArray($request),
 				'small2x' => $small2x === null ? null : SizeVariantResource::make($small2x)->toArray($request),
 				'thumb' => $thumb === null ? null : SizeVariantResource::make($thumb)->toArray($request),
@@ -98,6 +103,70 @@ public function toArray($request)
 			'rights' => PhotoRightsResource::make($this->resource)->toArray($request),
 			'next_photo_id' => null,
 			'previous_photo_id' => null,
+			'preformatted' => $this->preformatted($original),
+			'precomputed' => $this->precomputed(),
 		];
 	}
+
+	private function preformatted(?SizeVariant $original): array
+	{
+		$overlay_date_format = Configs::getValueAsString('date_format_photo_overlay');
+		$date_format_uploaded = Configs::getValueAsString('date_format_sidebar_uploaded');
+		$date_format_taken_at = Configs::getValueAsString('date_format_sidebar_taken_at');
+
+		return [
+			'created_at' => $this->resource->created_at->format($date_format_uploaded),
+			'taken_at' => $this->resource->taken_at?->format($date_format_taken_at),
+			'date_overlay' => ($this->resource->taken_at ?? $this->resource->created_at)->format($overlay_date_format) ?? '',
+
+			'shutter' => str_replace('s', 'sec', $this->resource->shutter ?? ''),
+			'aperture' => str_replace('f/', '', $this->resource->aperture ?? ''),
+			'iso' => sprintf(__('lychee.PHOTO_ISO'), $this->resource->iso),
+			'lens' => ($this->resource->lens === '' || $this->resource->lens === null) ? '' : sprintf('(%s)', $this->resource->lens),
+
+			'duration' => Helpers::secondsToHMS(intval($this->resource->aperture)),
+			'fps' => $this->resource->focal === null ? $this->resource->focal . ' fps' : '',
+
+			'filesize' => Helpers::getSymbolByQuantity($original?->filesize ?? 0),
+			'resolution' => $original?->width . ' x ' . $original?->height,
+			'latitude' => Helpers::decimalToDegreeMinutesSeconds($this->resource->latitude, true),
+			'longitude' => Helpers::decimalToDegreeMinutesSeconds($this->resource->longitude, false),
+			'altitude' => round($this->resource->altitude, 1) . 'm',
+			'license' => $this->resource->license !== LicenseType::NONE ? $this->resource->license->localization() : '',
+			'description' => ($this->resource->description ?? '') === '' ? '' : Markdown::convert($this->resource->description)->getContent(),
+		];
+	}
+
+	private function precomputed(): array
+	{
+		return [
+			'is_video' => $this->resource->isVideo(),
+			'is_raw' => $this->resource->isRaw(),
+			'is_livephoto' => $this->resource->live_photo_url !== null,
+			'is_camera_date' => $this->resource->taken_at !== null,
+			'has_exif' => $this->genExifHash() !== '',
+			'has_location' => $this->has_location(),
+		];
+	}
+
+	private function has_location(): bool
+	{
+		return $this->resource->longitude !== null &&
+			$this->resource->latitude !== null &&
+			$this->resource->altitude !== null;
+	}
+
+	private function genExifHash(): string
+	{
+		$exifHash = $this->resource->make;
+		$exifHash .= $this->resource->model;
+		$exifHash .= $this->resource->shutter;
+		if (!$this->resource->isVideo()) {
+			$exifHash .= $this->resource->aperture;
+			$exifHash .= $this->resource->focal;
+		}
+		$exifHash .= $this->resource->iso;
+
+		return $exifHash;
+	}
 }
diff --git a/app/Http/Resources/Models/SizeVariantResource.php b/app/Http/Resources/Models/SizeVariantResource.php
index 4aa7efcfb7d..382c75d08fb 100644
--- a/app/Http/Resources/Models/SizeVariantResource.php
+++ b/app/Http/Resources/Models/SizeVariantResource.php
@@ -25,7 +25,7 @@ public function __construct(SizeVariant $sizeVariant)
 	 *
 	 * @return SizeVariantResource
 	 */
-	public function noUrl(bool $noUrl): self
+	public function setNoUrl(bool $noUrl): self
 	{
 		$this->noUrl = $noUrl;
 
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/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 @@
+<?php
+
+namespace App\Http\RuleSets;
+
+use App\Contracts\Http\Requests\RequestAttribute;
+use App\Contracts\Http\RuleSet;
+use App\Rules\RandomIDRule;
+use App\Rules\TitleRule;
+
+class AddAlbumRuleSet implements RuleSet
+{
+	public static function rules(): array
+	{
+		return [
+			RequestAttribute::PARENT_ID_ATTRIBUTE => ['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 @@
+<?php
+
+namespace App\Http\RuleSets;
+
+use App\Contracts\Http\Requests\RequestAttribute;
+use App\Contracts\Http\RuleSet;
+use App\Rules\PasswordRule;
+use App\Rules\UsernameRule;
+
+class ChangeLoginRuleSet implements RuleSet
+{
+	public static function rules(): array
+	{
+		return [
+			RequestAttribute::USERNAME_ATTRIBUTE => ['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 @@
+<?php
+
+namespace App\Http\RuleSets;
+
+use App\Contracts\Http\Requests\RequestAttribute;
+use App\Contracts\Http\RuleSet;
+use App\Rules\PasswordRule;
+use App\Rules\UsernameRule;
+
+class LoginRuleSet implements RuleSet
+{
+	public static function rules(): array
+	{
+		return [
+			RequestAttribute::USERNAME_ATTRIBUTE => ['required', new UsernameRule()],
+			RequestAttribute::PASSWORD_ATTRIBUTE => ['required', new PasswordRule(false)],
+		];
+	}
+}
diff --git a/app/Http/RuleSets/Users/SetUserSettingsRuleSet.php b/app/Http/RuleSets/Users/SetUserSettingsRuleSet.php
index 0be59d22219..61e5ae1ee27 100644
--- a/app/Http/RuleSets/Users/SetUserSettingsRuleSet.php
+++ b/app/Http/RuleSets/Users/SetUserSettingsRuleSet.php
@@ -17,7 +17,7 @@ public static function rules(): array
 	{
 		return [
 			RequestAttribute::ID_ATTRIBUTE => ['required', new IntegerIDRule(false)],
-			RequestAttribute::USERNAME_ATTRIBUTE => ['required', new UsernameRule()],
+			RequestAttribute::USERNAME_ATTRIBUTE => ['required', new UsernameRule(), 'min:1'],
 			RequestAttribute::PASSWORD_ATTRIBUTE => ['sometimes', new PasswordRule(false)],
 			RequestAttribute::MAY_UPLOAD_ATTRIBUTE => 'present|boolean',
 			RequestAttribute::MAY_EDIT_OWN_SETTINGS_ATTRIBUTE => 'present|boolean',
diff --git a/app/Image/Files/NativeLocalFile.php b/app/Image/Files/NativeLocalFile.php
index 37fd483c1c5..39df280681b 100644
--- a/app/Image/Files/NativeLocalFile.php
+++ b/app/Image/Files/NativeLocalFile.php
@@ -95,6 +95,41 @@ public function write($stream, bool $collectStatistics = false, ?string $mimeTyp
 		}
 	}
 
+	/**
+	 * If new content is written to the file, the internally cached mime
+	 * type is cleared.
+	 * The mime type will be re-determined again upon the next invocation of
+	 * {@link NativeLocalFile::getMimeType()}.
+	 * This can be avoided by passing the MIME type of the stream.
+	 *
+	 * @param resource    $stream   the input stream which provides the input to write
+	 * @param string|null $mimeType the mime type of `$stream`
+	 *
+	 * @returns void
+	 */
+	public function append($stream, bool $collectStatistics = false, ?string $mimeType = null): ?StreamStat
+	{
+		try {
+			$streamStat = $collectStatistics ? static::appendStatFilter($stream) : null;
+
+			if (!is_resource($this->stream)) {
+				$this->stream = fopen($this->getPath(), 'a+b');
+			}
+			$this->cachedMimeType = null;
+			stream_copy_to_stream($stream, $this->stream);
+			$this->cachedMimeType = $mimeType;
+			// File statistics info (filesize, access mode, etc.) are cached
+			// by PHP to avoid costly I/O calls.
+			// If cache is not cleared, an old size may be reported after
+			// write.
+			clearstatcache(true, $this->getPath());
+
+			return $streamStat;
+		} catch (\ErrorException $e) {
+			throw new MediaFileOperationException($e->getMessage(), $e);
+		}
+	}
+
 	/**
 	 * {@inheritDoc}
 	 */
diff --git a/app/Livewire/Components/Base/ContextMenu.php b/app/Livewire/Components/Base/ContextMenu.php
new file mode 100644
index 00000000000..f443978c486
--- /dev/null
+++ b/app/Livewire/Components/Base/ContextMenu.php
@@ -0,0 +1,78 @@
+<?php
+
+namespace App\Livewire\Components\Base;
+
+use App\Contracts\Livewire\Openable;
+use App\Livewire\Traits\UseOpenable;
+use Illuminate\View\View;
+use Livewire\Attributes\Locked;
+use Livewire\Attributes\On;
+use Livewire\Component;
+
+/**
+ * Modal component, extends Component.
+ *
+ * This aims to encapsulate any floating box that appears in Lychee Interface:
+ * - login
+ * - privacy properties...
+ */
+class ContextMenu extends Component implements Openable
+{
+	use UseOpenable;
+
+	/**
+	 * @var string defines the type of menu loaded in the pop-up.
+	 *             It needs to be in App\Http\Livewire\ContextMenus.
+	 */
+	public string $type;
+
+	/**
+	 * @var string defines the x y transformX transformY position of the menu
+	 */
+	public string $style;
+
+	/**
+	 * @var array defines the arguments to be passed to the
+	 *            Livewire component loaded inside the ContextMenu
+	 */
+	#[Locked]
+	public array $params = [];
+
+	/**
+	 * Open the Context Menu.
+	 *
+	 * @param string $type   defines the Component loaded inside the modal
+	 * @param array  $params Arguments to pass to the modal
+	 *
+	 * @return void
+	 */
+	#[On('openContextMenu')]
+	public function openContextMenu(string $type, array $params = [], string $style = 'left: 30px; top: 30px;'): void
+	{
+		$this->type = $type;
+		$this->params = $params;
+		$this->style = $style;
+		$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 @@
+<?php
+
+namespace App\Livewire\Components\Base;
+
+use App\Contracts\Livewire\Openable;
+use App\Livewire\Traits\UseOpenable;
+use Illuminate\View\View;
+use Livewire\Attributes\On;
+use Livewire\Component;
+
+/**
+ * Modal component, extends Openable.
+ *
+ * This aims to encapsulate any floating box that appears in Lychee Interface:
+ * - login
+ * - privacy properties...
+ */
+class Modal extends Component implements Openable
+{
+	use UseOpenable;
+
+	/**
+	 * @var string defines the type of Modal.
+	 *             This correspond to the Livewire component loaded inside the Modal.
+	 */
+	public string $type = '';
+
+	/**
+	 * Defines if we include a close button.
+	 * if '' => 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..ef67252571b
--- /dev/null
+++ b/app/Livewire/Components/Forms/Add/ImportFromServer.php
@@ -0,0 +1,90 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Add;
+
+use App\Actions\Import\FromServer;
+use App\Contracts\Livewire\Params;
+use App\Contracts\Models\AbstractAlbum;
+use App\Livewire\Forms\ImportFromServerForm;
+use App\Livewire\Traits\InteractWithModal;
+use App\Policies\AlbumPolicy;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Gate;
+use Illuminate\View\View;
+use Livewire\Component;
+use Symfony\Component\HttpFoundation\StreamedResponse;
+
+/**
+ * This defines the Import From Server modals.
+ */
+class ImportFromServer extends Component
+{
+	/**
+	 * Allow modal integration.
+	 */
+	use InteractWithModal;
+
+	public ImportFromServerForm $form;
+	private FromServer $fromServer;
+
+	public function boot(): void
+	{
+		$this->fromServer = resolve(FromServer::class);
+	}
+
+	/**
+	 * We load the parameters.
+	 *
+	 * @param array{parentID:?string} $params set of parameters of the form
+	 *
+	 * @return void
+	 */
+	public function mount(array $params = ['parentID' => null]): void
+	{
+		Gate::authorize(AlbumPolicy::CAN_IMPORT_FROM_SERVER, AbstractAlbum::class);
+
+		$this->form->init($params[Params::PARENT_ID] ?? null);
+	}
+
+	/**
+	 * Call the parametrized rendering.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		return view('livewire.forms.add.import-from-server');
+	}
+
+	/**
+	 * Add an handle to close the modal form from a user-land call.
+	 *
+	 * @return void
+	 */
+	public function close(): void
+	{
+		$this->closeModal();
+	}
+
+	/**
+	 * Hook the submit button.
+	 *
+	 * @return StreamedResponse
+	 */
+	public function submit(): StreamedResponse
+	{
+		Gate::authorize(AlbumPolicy::CAN_IMPORT_FROM_SERVER, AbstractAlbum::class);
+
+		// Empty error bag
+		$this->resetErrorBag();
+
+		$this->form->prepare();
+		$this->form->validate();
+
+		/** @var int $userId */
+		$userId = Auth::id();
+
+		// Validate
+		return $this->fromServer->do($this->form->paths, $this->form->getAlbum(), $this->form->getImportMode(), $userId);
+	}
+}
diff --git a/app/Livewire/Components/Forms/Add/ImportFromUrl.php b/app/Livewire/Components/Forms/Add/ImportFromUrl.php
new file mode 100644
index 00000000000..ec292b4708a
--- /dev/null
+++ b/app/Livewire/Components/Forms/Add/ImportFromUrl.php
@@ -0,0 +1,107 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Add;
+
+use App\Actions\Import\FromUrl;
+use App\Contracts\Livewire\Params;
+use App\Contracts\Models\AbstractAlbum;
+use App\Exceptions\MassImportException;
+use App\Livewire\Components\Pages\Gallery\Album as PageGalleryAlbum;
+use App\Livewire\Forms\ImportFromUrlForm;
+use App\Livewire\Traits\InteractWithModal;
+use App\Livewire\Traits\Notify;
+use App\Models\Album;
+use App\Policies\AlbumPolicy;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Gate;
+use Illuminate\View\View;
+use Livewire\Component;
+
+/**
+ * This defines the Import From Url modals.
+ */
+class ImportFromUrl extends Component
+{
+	/**
+	 * Allow modal integration.
+	 */
+	use InteractWithModal;
+	use Notify;
+
+	private FromUrl $fromUrl;
+
+	public function boot(): void
+	{
+		$this->fromUrl = resolve(FromUrl::class);
+	}
+
+	public ImportFromUrlForm $form;
+
+	/**
+	 * We load the parameters.
+	 *
+	 * @param array{parentID:?string} $params set of parameters of the form
+	 *
+	 * @return void
+	 */
+	public function mount(array $params = ['parentID' => null]): void
+	{
+		$albumId = $params[Params::PARENT_ID] ?? null;
+
+		/** @var Album $album */
+		$album = $albumId === null ? null : Album::query()->findOrFail($albumId);
+
+		Gate::authorize(AlbumPolicy::CAN_UPLOAD, [AbstractAlbum::class, $album]);
+
+		$this->form->init($albumId);
+	}
+
+	/**
+	 * Call the parametrized rendering.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		return view('livewire.forms.add.import-from-url');
+	}
+
+	/**
+	 * Add an handle to close the modal form from a user-land call.
+	 *
+	 * @return void
+	 */
+	public function close(): void
+	{
+		$this->closeModal();
+	}
+
+	/**
+	 * A form has a Submit method.
+	 *
+	 * @return void
+	 */
+	public function submit(): void
+	{
+		// Reset error bag
+		$this->resetErrorBag();
+
+		$this->form->prepare();
+		$this->form->validate();
+
+		Gate::authorize(AlbumPolicy::CAN_UPLOAD, [AbstractAlbum::class, $this->form->getAlbum()]);
+
+		/** @var int $userId */
+		$userId = Auth::id();
+
+		try {
+			$this->fromUrl->do($this->form->urls, $this->form->getAlbum(), $userId);
+			$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('reloadPage')->to(PageGalleryAlbum::class);
+		$this->close();
+	}
+}
diff --git a/app/Livewire/Components/Forms/Add/Upload.php b/app/Livewire/Components/Forms/Add/Upload.php
new file mode 100644
index 00000000000..55834adc012
--- /dev/null
+++ b/app/Livewire/Components/Forms/Add/Upload.php
@@ -0,0 +1,169 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Add;
+
+use App\Contracts\Livewire\Params;
+use App\Contracts\Models\AbstractAlbum;
+use App\Enum\Livewire\FileStatus;
+use App\Exceptions\PhotoSkippedException;
+use App\Facades\Helpers;
+use App\Image\Files\NativeLocalFile;
+use App\Image\Files\ProcessableJobFile;
+use App\Jobs\ProcessImageJob;
+use App\Livewire\Traits\InteractWithModal;
+use App\Models\Album;
+use App\Models\Configs;
+use App\Policies\AlbumPolicy;
+use Illuminate\Contracts\View\View;
+use Illuminate\Support\Facades\Gate;
+use Illuminate\Support\Facades\Storage;
+use Illuminate\Support\Str;
+use Livewire\Component;
+use Livewire\Features\SupportFileUploads\FileUploadConfiguration;
+use Livewire\Features\SupportFileUploads\TemporaryUploadedFile;
+use Livewire\WithFileUploads;
+use function Safe\ini_get;
+
+/**
+ * This defines the Upload Form used in modals.
+ */
+class Upload extends Component
+{
+	use WithFileUploads;
+	use InteractWithModal;
+
+	/**
+	 * @var string|null albumId of where to upload the picture
+	 */
+	public ?string $albumId = null;
+
+	/** @var array<int,array{fileName:string,fileChunk:mixed,lastModified:int,progress:int,uuidName:string,extension:string,fileSize:int,stage:string}> */
+	public array $uploads = [];
+
+	public int $chunkSize;
+	public int $parallelism;
+
+	/**
+	 * Mount the component.
+	 *
+	 * @param array{parentID:?string} $params
+	 *
+	 * @return void
+	 */
+	public function mount(array $params = ['parentID' => null]): void
+	{
+		$this->albumId = $params[Params::PARENT_ID] ?? null;
+		$album = $this->albumId === null ? null : Album::findOrFail($this->albumId);
+		Gate::authorize(AlbumPolicy::CAN_UPLOAD, [AbstractAlbum::class, $album]);
+
+		$this->chunkSize = self::getUploadLimit();
+		$this->parallelism = Configs::getValueAsInt('upload_processing_limit');
+	}
+
+	public function render(): View
+	{
+		return view('livewire.forms.add.upload');
+	}
+
+	/**
+	 * @param TemporaryUploadedFile $value
+	 * @param string                $key
+	 *
+	 * @return void
+	 */
+	public function updatedUploads($value, string $key): void
+	{
+		$keys = explode('.', $key);
+		$index = intval($keys[0]);
+		$attribute = $keys[1] ?? null;
+
+		$fileDetails = $this->uploads[$index];
+		// Initialize data if not existing.
+		$fileDetails['extension'] ??= '.' . pathinfo($fileDetails['fileName'], PATHINFO_EXTENSION);
+		$fileDetails['uuidName'] ??= strtr(base64_encode(random_bytes(12)), '+/', '-_') . $fileDetails['extension'];
+
+		// Ensure data are set
+		$this->uploads[$index]['extension'] = $fileDetails['extension'];
+		$this->uploads[$index]['uuidName'] = $fileDetails['uuidName'];
+		$this->uploads[$index]['stage'] = $fileDetails['stage'] ?? FileStatus::UPLOADING->value;
+		$this->uploads[$index]['progress'] = $fileDetails['progress'] ?? 0;
+
+		if ($attribute === 'fileChunk') {
+			$fileDetails = $this->uploads[$index];
+			/** @var TemporaryUploadedFile $chunkFile */
+			$chunkFile = $fileDetails['fileChunk'];
+			$final = new NativeLocalFile(Storage::path('/livewire-tmp/' . $fileDetails['uuidName']));
+			$final->append($chunkFile->readStream());
+			$chunkFile->delete();
+
+			$curSize = $final->getFilesize();
+
+			$this->uploads[$index]['progress'] = intval($curSize / $fileDetails['fileSize'] * 100);
+			if ($this->uploads[$index]['progress'] === 100) {
+				$this->uploads[$index]['stage'] = FileStatus::READY->value;
+			}
+		}
+
+		$this->triggerProcessing();
+	}
+
+	public function triggerProcessing(): void
+	{
+		foreach ($this->uploads as $idx => $fileData) {
+			if ($fileData['stage'] === FileStatus::READY->value) {
+				$uploadedFile = new NativeLocalFile(Storage::path('/livewire-tmp/' . $fileData['uuidName']));
+				$processableFile = new ProcessableJobFile(
+					$fileData['extension'],
+					$fileData['fileName']
+				);
+				$processableFile->write($uploadedFile->read());
+				$uploadedFile->close();
+				$uploadedFile->delete();
+				$processableFile->close();
+				// End of work-around
+
+				try {
+					$this->uploads[$idx]['stage'] = FileStatus::PROCESSING->value;
+
+					if (Configs::getValueAsBool('use_job_queues')) {
+						ProcessImageJob::dispatch($processableFile, $this->albumId, $fileData['lastModified']);
+					} else {
+						ProcessImageJob::dispatchSync($processableFile, $this->albumId, $fileData['lastModified']);
+					}
+					$this->uploads[$idx]['stage'] = FileStatus::DONE->value;
+				} catch (PhotoSkippedException $e) {
+					$this->uploads[$idx]['stage'] = FileStatus::SKIPPED->value;
+				}
+			}
+		}
+	}
+
+	public static function getUploadLimit(): int
+	{
+		$size = Configs::getValueAsInt('upload_chunk_size');
+		if ($size === 0) {
+			$size = (int) min(
+				Helpers::convertSize(ini_get('upload_max_filesize')),
+				Helpers::convertSize(ini_get('post_max_size')),
+				Helpers::convertSize(ini_get('memory_limit')) / 10
+			);
+		}
+
+		/** @var array<int,string> $rules */
+		$rules = FileUploadConfiguration::rules();
+		$sizeRule = collect($rules)->first(fn ($rule) => Str::startsWith($rule, 'max:'), 'max:12288');
+		$LivewireSizeLimit = intval(Str::substr($sizeRule, 4)) * 1024;
+
+		return min($size, $LivewireSizeLimit);
+	}
+
+	/**
+	 * Close the modal containing the Upload panel.
+	 *
+	 * @return void
+	 */
+	public function close(): void
+	{
+		$this->closeModal();
+	}
+}
diff --git a/app/Livewire/Components/Forms/Album/Create.php b/app/Livewire/Components/Forms/Album/Create.php
new file mode 100644
index 00000000000..6c355a81e83
--- /dev/null
+++ b/app/Livewire/Components/Forms/Album/Create.php
@@ -0,0 +1,102 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Album;
+
+use App\Actions\Album\Create as AlbumCreate;
+use App\Contracts\Livewire\Params;
+use App\Contracts\Models\AbstractAlbum;
+use App\Exceptions\UnauthenticatedException;
+use App\Http\RuleSets\AddAlbumRuleSet;
+use App\Livewire\Traits\InteractWithModal;
+use App\Models\Album;
+use App\Policies\AlbumPolicy;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Gate;
+use Illuminate\View\View;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+/**
+ * The Create Album Modal.
+ */
+class Create extends Component
+{
+	/**
+	 * Allow modal integration.
+	 */
+	use InteractWithModal;
+
+	#[Locked] public ?string $parent_id = null;
+	public string $title = '';
+
+	/**
+	 * This defines the set of validation rules to be applied on the input.
+	 * It would be a good idea to unify (namely reuse) the rules from the JSON api.
+	 *
+	 * @return array
+	 */
+	protected function rules(): array
+	{
+		return AddAlbumRuleSet::rules();
+	}
+
+	/**
+	 * Mount the component.
+	 *
+	 * @param array $params
+	 *
+	 * @return void
+	 */
+	public function mount(array $params = []): void
+	{
+		$this->parent_id = $params[Params::PARENT_ID];
+		Gate::authorize(AlbumPolicy::CAN_EDIT_ID, [AbstractAlbum::class, [$this->parent_id]]);
+	}
+
+	/**
+	 * Call the parametrized rendering.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		return view('livewire.forms.add.create');
+	}
+
+	/**
+	 * A form has a Submit method.
+	 *
+	 * @return void
+	 */
+	public function submit(): void
+	{
+		// Reset error bag
+		$this->resetErrorBag();
+
+		// Validate
+		$this->validate();
+
+		/** @var Album|null $parentAlbum */
+		$parentAlbum = $this->parent_id === null ? null : Album::query()->findOrFail($this->parent_id);
+
+		// Authorize
+		Gate::authorize(AlbumPolicy::CAN_EDIT, [AbstractAlbum::class, $parentAlbum]);
+
+		/** @var int $ownerId */
+		$ownerId = Auth::id() ?? throw new UnauthenticatedException();
+		$create = new AlbumCreate($ownerId);
+		$new_album = $create->create($this->title, $parentAlbum);
+
+		$this->redirect(route('livewire-gallery-album', ['albumId' => $new_album->id]), true);
+	}
+
+	/**
+	 * 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/CreateTag.php b/app/Livewire/Components/Forms/Album/CreateTag.php
new file mode 100644
index 00000000000..c280045ec70
--- /dev/null
+++ b/app/Livewire/Components/Forms/Album/CreateTag.php
@@ -0,0 +1,103 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Album;
+
+use App\Actions\Album\CreateTagAlbum;
+use App\Contracts\Models\AbstractAlbum;
+use App\Http\RuleSets\Album\AddTagAlbumRuleSet;
+use App\Livewire\Traits\InteractWithModal;
+use App\Policies\AlbumPolicy;
+use Illuminate\Support\Facades\Gate;
+use Illuminate\View\View;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+/**
+ * The CreateTag Album Modal.
+ */
+class CreateTag extends Component
+{
+	/**
+	 * Allow modal integration.
+	 */
+	use InteractWithModal;
+
+	private CreateTagAlbum $create;
+
+	public string $title = '';
+	public string $tag = '';
+	#[Locked] public array $tags = [];
+	public function boot(): void
+	{
+		$this->create = resolve(CreateTagAlbum::class);
+	}
+
+	/**
+	 * This defines the set of validation rules to be applied on the input.
+	 * It would be a good idea to unify (namely reuse) the rules from the JSON api.
+	 *
+	 * @return array
+	 */
+	protected function rules(): array
+	{
+		return AddTagAlbumRuleSet::rules();
+	}
+
+	/**
+	 * Mount the component.
+	 *
+	 * @param array $params
+	 *
+	 * @return void
+	 */
+	public function mount(array $params = []): void
+	{
+		Gate::authorize(AlbumPolicy::CAN_UPLOAD, [AbstractAlbum::class, null]);
+	}
+
+	/**
+	 * Call the parametrized rendering.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		return view('livewire.forms.add.create-tag');
+	}
+
+	/**
+	 * A form has a Submit method.
+	 *
+	 * @return void
+	 */
+	public function submit(): void
+	{
+		// Reset error bag
+		$this->resetErrorBag();
+
+		$this->tags = explode(',', $this->tag);
+
+		// Validate
+		$this->validate();
+
+		// Authorize
+		Gate::authorize(AlbumPolicy::CAN_EDIT, [AbstractAlbum::class, null]);
+
+		// Create
+		$new_album = $this->create->create($this->title, $this->tags);
+
+		// Do we want refresh or direcly open newly created Album ?
+		$this->close();
+		$this->redirect(route('livewire-gallery-album', ['albumId' => $new_album->id]), true);
+	}
+
+	/**
+	 * 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/Delete.php b/app/Livewire/Components/Forms/Album/Delete.php
new file mode 100644
index 00000000000..114a7205e5d
--- /dev/null
+++ b/app/Livewire/Components/Forms/Album/Delete.php
@@ -0,0 +1,101 @@
+<?php
+
+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\InteractWithModal;
+use App\Policies\AlbumPolicy;
+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;
+
+class Delete extends Component
+{
+	use AuthorizesRequests;
+	use InteractWithModal;
+
+	// We need to use an array instead of directly said album id to reuse the rules (because I'm lazy).
+	/** @var array<int,string> */
+	#[Locked] public array $albumIDs;
+	#[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 array{albumID?:string,albumIDs?:array<int,string>,parentID:?string} $params to delete
+	 *
+	 * @return void
+	 */
+	public function mount(array $params = ['parentID' => null]): void
+	{
+		$id = $params[Params::ALBUM_ID] ?? null;
+		$this->albumIDs = $id !== null ? [$id] : $params[Params::ALBUM_IDS] ?? [];
+		$this->num = count($this->albumIDs);
+
+		if ($this->num === 1) {
+			$this->title = $this->albumFactory->findBaseAlbumOrFail($this->albumIDs[0])->title;
+		}
+
+		Gate::authorize(AlbumPolicy::CAN_DELETE_ID, [AbstractAlbum::class, $this->albumIDs]);
+		$this->parent_id = $params[Params::PARENT_ID] ?? SmartAlbumType::UNSORTED->value;
+	}
+
+	/**
+	 * Simply render the form.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		return view('livewire.forms.album.delete');
+	}
+
+	/**
+	 * Execute deletion.
+	 *
+	 * @return void
+	 */
+	public function delete(): void
+	{
+		$this->validate(DeleteAlbumsRuleSet::rules());
+
+		Gate::authorize(AlbumPolicy::CAN_DELETE_ID, [AbstractAlbum::class, $this->albumIDs]);
+
+		$fileDeleter = $this->deleteAction->do($this->albumIDs);
+		App::terminating(fn () => $fileDeleter->do());
+
+		if ($this->parent_id === SmartAlbumType::UNSORTED->value) {
+			$this->redirect(route('livewire-gallery'), true);
+		} else {
+			$this->redirect(route('livewire-gallery-album', ['albumId' => $this->parent_id]), true);
+		}
+	}
+
+	/**
+	 * 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/DeletePanel.php b/app/Livewire/Components/Forms/Album/DeletePanel.php
new file mode 100644
index 00000000000..073e99eaa8b
--- /dev/null
+++ b/app/Livewire/Components/Forms/Album/DeletePanel.php
@@ -0,0 +1,89 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Album;
+
+use App\Actions\Album\Delete as DeleteAction;
+use App\Contracts\Models\AbstractAlbum;
+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\Policies\AlbumPolicy;
+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;
+
+class DeletePanel extends Component
+{
+	use AuthorizesRequests;
+	use UseValidator;
+	use Notify;
+
+	// We need to use an array instead of directly said album id to reuse the rules (because I'm lazy).
+	/** @var array<int,string> */
+	#[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
+	{
+		Gate::authorize(AlbumPolicy::CAN_DELETE, [AbstractAlbum::class, $album]);
+
+		$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..e9654f24c51
--- /dev/null
+++ b/app/Livewire/Components/Forms/Album/Merge.php
@@ -0,0 +1,134 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Album;
+
+use App\Actions\Album\Merge as AlbumMerge;
+use App\Contracts\Livewire\Params;
+use App\Contracts\Models\AbstractAlbum;
+use App\Factories\AlbumFactory;
+use App\Http\RuleSets\Album\MergeAlbumsRuleSet;
+use App\Livewire\Traits\InteractWithModal;
+use App\Models\Album;
+use App\Policies\AlbumPolicy;
+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;
+
+class Merge extends Component
+{
+	use InteractWithModal;
+	use AuthorizesRequests;
+
+	#[Locked] public ?string $parent_id = null;
+	/** @var array<int,string> */
+	#[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<int,string>,parentID:?string} $params to move
+	 *
+	 * @return void
+	 */
+	public function mount(array $params = ['parentID' => null]): void
+	{
+		$id = $params[Params::ALBUM_ID] ?? null;
+		$this->albumIDs = $id !== null ? [$id] : $params[Params::ALBUM_IDS] ?? [];
+		$this->num = count($this->albumIDs);
+
+		if ($this->num === 1) {
+			/** @var Album $album */
+			$album = $this->albumFactory->findBaseAlbumOrFail($this->albumIDs[0], false);
+			$this->lft = $album->_lft;
+			$this->rgt = $album->_rgt;
+		} elseif ($this->num > 1) {
+			$this->albumID = array_shift($this->albumIDs);
+			$this->title = $this->albumFactory->findBaseAlbumOrFail($this->albumID, false)->title;
+		}
+
+		if (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] ?? null;
+	}
+
+	/**
+	 * 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<int,Album> $albums */
+		$albums = Album::query()->findOrFail($this->albumIDs);
+
+		$this->mergeAlbums->do($album, $albums);
+
+		if ($this->parent_id !== null) {
+			$this->redirect(route('livewire-gallery-album', ['albumId' => $this->parent_id]), true);
+		} else {
+			$this->redirect(route('livewire-gallery'), 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..24ddcd49e32
--- /dev/null
+++ b/app/Livewire/Components/Forms/Album/Move.php
@@ -0,0 +1,127 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Album;
+
+use App\Actions\Album\Move as AlbumMove;
+use App\Contracts\Livewire\Params;
+use App\Contracts\Models\AbstractAlbum;
+use App\Factories\AlbumFactory;
+use App\Http\RuleSets\Album\MoveAlbumsRuleSet;
+use App\Livewire\Traits\InteractWithModal;
+use App\Models\Album;
+use App\Policies\AlbumPolicy;
+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;
+
+class Move extends Component
+{
+	use InteractWithModal;
+	use AuthorizesRequests;
+
+	#[Locked] public ?string $parent_id = null;
+	/** @var array<int,string> */
+	#[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<int,string>,parentID:?string} $params to move
+	 *
+	 * @return void
+	 */
+	public function mount(array $params = ['parentID' => null]): void
+	{
+		$id = $params[Params::ALBUM_ID] ?? null;
+		$this->albumIDs = $id !== null ? [$id] : $params[Params::ALBUM_IDS] ?? [];
+		$this->num = count($this->albumIDs);
+
+		if ($this->num === 1) {
+			/** @var Album $album */
+			$album = $this->albumFactory->findBaseAlbumOrFail($this->albumIDs[0], false);
+			$this->titleMoved = $album->title;
+			$this->lft = $album->_lft;
+			$this->rgt = $album->_rgt;
+		}
+
+		Gate::authorize(AlbumPolicy::CAN_EDIT_ID, [AbstractAlbum::class, $this->albumIDs]);
+		$this->parent_id = $params[Params::PARENT_ID] ?? null;
+	}
+
+	/**
+	 * 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<int,Album> $albums */
+		$albums = Album::query()->findOrFail($this->albumIDs);
+		$this->moveAlbums->do($album, $albums);
+
+		if ($this->parent_id !== null) {
+			$this->redirect(route('livewire-gallery-album', ['albumId' => $this->parent_id]), true);
+		} else {
+			$this->redirect(route('livewire-gallery'), 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
new file mode 100644
index 00000000000..38041ca154f
--- /dev/null
+++ b/app/Livewire/Components/Forms/Album/MovePanel.php
@@ -0,0 +1,111 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Album;
+
+use App\Actions\Album\Move as AlbumMove;
+use App\Contracts\Models\AbstractAlbum;
+use App\Http\RuleSets\Album\MoveAlbumsRuleSet;
+use App\Livewire\Traits\Notify;
+use App\Livewire\Traits\UseValidator;
+use App\Models\Album;
+use App\Policies\AlbumPolicy;
+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;
+
+class MovePanel extends Component
+{
+	use AuthorizesRequests;
+	use UseValidator;
+	use Notify;
+
+	// We need to use an array instead of directly said album id to reuse the rules.
+	/** @var array<int,string> */
+	#[Locked] public array $albumIDs;
+	#[Locked] public ?string $titleMoved;
+	// Destination
+	#[Locked] public ?string $albumID = null;
+	#[Locked] public ?string $title = null;
+	#[Locked] public ?string $parent_id = null;
+	#[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.
+	 *
+	 * @param Album $album to update the attributes of
+	 *
+	 * @return void
+	 */
+	public function mount(Album $album): void
+	{
+		Gate::authorize(AlbumPolicy::CAN_EDIT, [AbstractAlbum::class, $album]);
+
+		$this->albumIDs = [$album->id];
+		$this->titleMoved = $album->title;
+		$this->lft = $album->_lft;
+		$this->rgt = $album->_rgt;
+		$this->parent_id = $album->parent_id;
+	}
+
+	/**
+	 * Prepare confirmation step.
+	 *
+	 * @param string $id
+	 * @param string $title
+	 *
+	 * @return void
+	 */
+	public function setAlbum(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-panel');
+	}
+
+	/**
+	 * Execute transfer of ownership.
+	 */
+	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);
+		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<int,Album> $albums */
+		$albums = Album::query()->findOrFail($this->albumIDs);
+		$this->moveAlbums->do($album, $albums);
+
+		if ($this->parent_id !== null) {
+			$this->redirect(route('livewire-gallery-album', ['albumId' => $this->parent_id]), true);
+		} else {
+			$this->redirect(route('livewire-gallery'), true);
+		}
+	}
+}
diff --git a/app/Livewire/Components/Forms/Album/Properties.php b/app/Livewire/Components/Forms/Album/Properties.php
new file mode 100644
index 00000000000..108544ea0db
--- /dev/null
+++ b/app/Livewire/Components/Forms/Album/Properties.php
@@ -0,0 +1,137 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Album;
+
+use App\Contracts\Http\Requests\RequestAttribute;
+use App\Contracts\Models\AbstractAlbum;
+use App\DTO\PhotoSortingCriterion;
+use App\Enum\ColumnSortingPhotoType;
+use App\Enum\LicenseType;
+use App\Enum\OrderSortingType;
+use App\Factories\AlbumFactory;
+use App\Http\RuleSets\Album\SetAlbumDescriptionRuleSet;
+use App\Http\RuleSets\Album\SetAlbumSortingRuleSet;
+use App\Livewire\Traits\Notify;
+use App\Livewire\Traits\UseValidator;
+use App\Models\Album as ModelsAlbum;
+use App\Models\Extensions\BaseAlbum;
+use App\Policies\AlbumPolicy;
+use App\Rules\TitleRule;
+use Illuminate\Contracts\View\View;
+use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
+use Illuminate\Support\Facades\Gate;
+use Illuminate\Validation\Rules\Enum;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+class Properties extends Component
+{
+	use AuthorizesRequests;
+	use UseValidator;
+	use Notify;
+
+	#[Locked] public string $albumID;
+	public string $title; // ! wired
+	public string $description; // ! wired
+	public string $sorting_column = ''; // ! wired
+	public string $sorting_order = ''; // ! wired
+	public string $license = 'none';
+
+	public array $sorting_columns;
+	public array $sorting_orders;
+
+	/**
+	 * 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
+	{
+		Gate::authorize(AlbumPolicy::CAN_EDIT, [AbstractAlbum::class, $album]);
+
+		$this->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 ?? '';
+		if ($album instanceof ModelsAlbum) {
+			$this->license = $album->license->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()],
+			RequestAttribute::LICENSE_ATTRIBUTE => ['required', new Enum(LicenseType::class)],
+			...SetAlbumDescriptionRuleSet::rules(),
+			...SetAlbumSortingRuleSet::rules(),
+		];
+
+		if (!$this->areValid($rules)) {
+			return;
+		}
+
+		$baseAlbum = $albumFactory->findBaseAlbumOrFail($this->albumID, false);
+		Gate::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;
+
+		if ($baseAlbum instanceof ModelsAlbum) {
+			$baseAlbum->license = LicenseType::from($this->license);
+		}
+
+		$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::localized()];
+	}
+
+	/**
+	 * 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::localized()];
+	}
+
+	final public function getLicensesProperty(): array
+	{
+		return LicenseType::localized();
+	}
+}
diff --git a/app/Livewire/Components/Forms/Album/Rename.php b/app/Livewire/Components/Forms/Album/Rename.php
new file mode 100644
index 00000000000..b830776f269
--- /dev/null
+++ b/app/Livewire/Components/Forms/Album/Rename.php
@@ -0,0 +1,93 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Album;
+
+use App\Contracts\Livewire\Params;
+use App\Contracts\Models\AbstractAlbum;
+use App\Enum\SmartAlbumType;
+use App\Factories\AlbumFactory;
+use App\Http\RuleSets\Album\SetAlbumsTitleRuleSet;
+use App\Livewire\Components\Pages\Gallery\Album as GalleryAlbum;
+use App\Livewire\Traits\InteractWithModal;
+use App\Models\BaseAlbumImpl;
+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;
+
+class Rename extends Component
+{
+	use InteractWithModal;
+	use AuthorizesRequests;
+
+	#[Locked] public ?string $parent_id = null;
+	/** @var array<int,string> */
+	#[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<int,string>,parentID:?string} $params to move
+	 *
+	 * @return void
+	 */
+	public function mount(array $params = ['parentID' => null]): void
+	{
+		$id = $params[Params::ALBUM_ID] ?? null;
+		$this->albumIDs = $id !== null ? [$id] : $params[Params::ALBUM_IDS] ?? [];
+		$this->num = count($this->albumIDs);
+
+		if ($this->num === 1) {
+			$this->title = $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;
+	}
+
+	/**
+	 * 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/Album/SearchAlbum.php b/app/Livewire/Components/Forms/Album/SearchAlbum.php
new file mode 100644
index 00000000000..2a71f535790
--- /dev/null
+++ b/app/Livewire/Components/Forms/Album/SearchAlbum.php
@@ -0,0 +1,182 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Album;
+
+use App\DTO\AlbumSortingCriterion;
+use App\Models\Album;
+use App\Models\Extensions\SortingDecorator;
+use App\Policies\AlbumQueryPolicy;
+use Illuminate\Contracts\View\View;
+use Illuminate\Support\Collection;
+use Illuminate\Support\Str;
+use Kalnoy\Nestedset\Collection as NsCollection;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+/**
+ * TODO: improve speed. 800ms component.
+ */
+class SearchAlbum extends Component
+{
+	private const SHORTEN_BY = 80;
+
+	public ?string $search = null; // ! wired
+	#[Locked] public array $albumListSaved;
+	/**
+	 * This is the equivalent of the constructor for Livewire Components.
+	 *
+	 * @param int|null    $lft       constraint on serach - left
+	 * @param int|null    $rgt       constraint on serach - right
+	 * @param string|null $parent_id contraint on search remove sub-tree
+	 *
+	 * @return void
+	 */
+	public function mount(?string $parent_id, ?int $lft = null, ?int $rgt = null): void
+	{
+		$this->albumListSaved = $this->getAlbumsListWithPath($lft, $rgt, $parent_id);
+	}
+
+	/**
+	 * Give the tree of albums owned by the user.
+	 *
+	 * @return Collection<int,Album>
+	 */
+	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;
+	}
+
+	/**
+	 * Simply render the form.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		return view('livewire.forms.album.search-album');
+	}
+
+	private function getAlbumsListWithPath(?int $lft, ?int $rgt, ?string $parent_id): array
+	{
+		$albumQueryPolicy = resolve(AlbumQueryPolicy::class);
+		$unfiltered = $albumQueryPolicy->applyReachabilityFilter(
+			// We remove all sub albums
+			// Otherwise it would create cyclic dependency
+			Album::query()
+				->when($lft !== null,
+					fn ($q) => $q->where('_lft', '<', $lft)->orWhere('_rgt', '>', $rgt))
+		);
+		$sorting = AlbumSortingCriterion::createDefault();
+		$query = (new SortingDecorator($unfiltered))
+			->orderBy($sorting->column, $sorting->order);
+
+		/** @var NsCollection<Album> $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 ($parent_id !== 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;
+	}
+
+	/**
+	 * 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 < self::SHORTEN_BY) {
+			return $title;
+		}
+		/** @var Collection<int,string> $title_split */
+		$title_split = collect(explode('/', $title));
+		$last_elem = $title_split->last();
+		$len_last_elem = strlen($last_elem);
+
+		$num_chunks = $title_split->count() - 1;
+
+		if ($num_chunks === 0) {
+			return Str::limit($last_elem, self::SHORTEN_BY, '…');
+		}
+
+		$title_split = $title_split->take($num_chunks);
+		/** @var Collection<int,int> $title_lengths */
+		$title_lengths = $title_split->map(fn ($v) => strlen($v));
+
+		// find best target length.
+
+		$len_to_reduce = self::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;
+	}
+
+	public function placeholder(): string
+	{
+		return "<div class='w-full p-4 text-center'>Loading album list...</div>";
+	}
+}
diff --git a/app/Livewire/Components/Forms/Album/ShareWith.php b/app/Livewire/Components/Forms/Album/ShareWith.php
new file mode 100644
index 00000000000..f853041c192
--- /dev/null
+++ b/app/Livewire/Components/Forms/Album/ShareWith.php
@@ -0,0 +1,155 @@
+<?php
+
+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;
+use App\Livewire\Traits\UseValidator;
+use App\Models\AccessPermission;
+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;
+
+class ShareWith extends Component
+{
+	use AuthorizesRequests;
+	use UseValidator;
+	use Notify;
+
+	public BaseAlbum $album;
+
+	public array $perms;
+
+	public ?string $search = null; // ! wired
+
+	public ?int $userID = null;
+	public ?string $username = null;
+
+	public bool $grants_full_photo_access;
+	public bool $grants_download;
+	public bool $grants_upload;
+	public bool $grants_edit;
+	public bool $grants_delete;
+
+	/**
+	 * 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->album = $album;
+		Gate::authorize(AlbumPolicy::CAN_SHARE_WITH_USERS, [AbstractAlbum::class, $this->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
+	{
+		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;
+		$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', 'album'])->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
+	{
+		$perm = AccessPermission::with('album')->findOrFail($id);
+		Gate::authorize(AlbumPolicy::CAN_SHARE_WITH_USERS, [AbstractAlbum::class, $perm->album]);
+
+		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..e42d1483d67
--- /dev/null
+++ b/app/Livewire/Components/Forms/Album/ShareWithLine.php
@@ -0,0 +1,83 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Album;
+
+use App\Contracts\Models\AbstractAlbum;
+use App\Livewire\Traits\Notify;
+use App\Livewire\Traits\UseValidator;
+use App\Models\AccessPermission;
+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;
+
+class ShareWithLine extends Component
+{
+	use AuthorizesRequests;
+	use UseValidator;
+	use Notify;
+
+	public AccessPermission $perm;
+
+	#[Locked] public string $album_title;
+	#[Locked] public string $username;
+	public bool $grants_full_photo_access;
+	public bool $grants_download;
+	public bool $grants_upload;
+	public bool $grants_edit;
+	public bool $grants_delete;
+
+	/**
+	 * This is the equivalent of the constructor for Livewire Components.
+	 *
+	 * @param AccessPermission $perm
+	 *
+	 * @return void
+	 */
+	public function mount(AccessPermission $perm, string $album_title = ''): void
+	{
+		Gate::authorize(AlbumPolicy::CAN_SHARE_WITH_USERS, [AbstractAlbum::class, $perm->album]);
+
+		$this->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::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;
+		$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..1c6e0aa785d
--- /dev/null
+++ b/app/Livewire/Components/Forms/Album/Transfer.php
@@ -0,0 +1,121 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Album;
+
+use App\Contracts\Models\AbstractAlbum;
+use App\Factories\AlbumFactory;
+use App\Livewire\Traits\Notify;
+use App\Livewire\Traits\UseValidator;
+use App\Models\Album;
+use App\Models\Extensions\BaseAlbum;
+use App\Models\User;
+use App\Policies\AlbumPolicy;
+use App\Rules\AlbumIDRule;
+use App\Rules\UsernameRule;
+use Illuminate\Contracts\View\View;
+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;
+
+class Transfer extends Component
+{
+	use AuthorizesRequests;
+	use UseValidator;
+	use Notify;
+
+	#[Locked] public string $albumID;
+	#[Locked] public string $title;
+	#[Locked] public int $current_owner;
+	public string $username; // ! wired
+
+	/**
+	 * 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
+	{
+		Gate::authorize(AlbumPolicy::IS_OWNER, [AbstractAlbum::class, $album]);
+
+		$this->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
+		Gate::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->makeRoot();
+			$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-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/UnlockAlbum.php b/app/Livewire/Components/Forms/Album/UnlockAlbum.php
new file mode 100644
index 00000000000..4dbac54c150
--- /dev/null
+++ b/app/Livewire/Components/Forms/Album/UnlockAlbum.php
@@ -0,0 +1,76 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Album;
+
+use App\Actions\Album\Unlock;
+use App\Factories\AlbumFactory;
+use App\Http\RuleSets\Album\UnlockAlbumRuleSet;
+use App\Livewire\Traits\Notify;
+use App\Livewire\Traits\UseValidator;
+use Illuminate\Contracts\View\View;
+use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+class UnlockAlbum extends Component
+{
+	use AuthorizesRequests;
+	use UseValidator;
+	use Notify;
+
+	#[Locked] public string $albumID;
+	public string $password = ''; // ! wired
+
+	private Unlock $unlock;
+	private AlbumFactory $albumFactory;
+
+	/**
+	 * Initialize private attributes.
+	 *
+	 * @return void
+	 */
+	public function boot(): void
+	{
+		$this->unlock = resolve(Unlock::class);
+		$this->albumFactory = resolve(AlbumFactory::class);
+	}
+
+	/**
+	 * This is the equivalent of the constructor for Livewire Components.
+	 *
+	 * @param $albumID album to unlock
+	 *
+	 * @return void
+	 */
+	public function mount(string $albumID): void
+	{
+		$this->albumID = $albumID;
+	}
+
+	/**
+	 * Simply render the form.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		return view('livewire.forms.album.unlock-album');
+	}
+
+	/**
+	 * Method called from the front-end to unlock the album when given a password.
+	 * This will throw an exception on failure!
+	 *
+	 * @return void
+	 */
+	public function submit(): void
+	{
+		if (!$this->areValid(UnlockAlbumRuleSet::rules())) {
+			return;
+		}
+
+		$album = $this->albumFactory->findBaseAlbumOrFail($this->albumID);
+		$this->unlock->do($album, $this->password);
+		$this->redirect(route('livewire-gallery-album', ['albumId' => $this->albumID]));
+	}
+}
diff --git a/app/Livewire/Components/Forms/Album/Visibility.php b/app/Livewire/Components/Forms/Album/Visibility.php
new file mode 100644
index 00000000000..71fabdd06ad
--- /dev/null
+++ b/app/Livewire/Components/Forms/Album/Visibility.php
@@ -0,0 +1,147 @@
+<?php
+
+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;
+use App\Livewire\Traits\Notify;
+use App\Models\AccessPermission;
+use App\Models\Extensions\BaseAlbum;
+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;
+
+class Visibility extends Component
+{
+	use AuthorizesRequests;
+	use Notify;
+
+	public bool $is_public = false; // ! wired
+	public bool $grants_full_photo_access = false; // ! wired
+	public bool $is_link_required = false; // ! wired
+	public bool $grants_download = false; // ! wired
+	public bool $is_password_required = false; // ! wired
+	public bool $is_nsfw = false; // ! wired
+	public ?string $password = null; // ! wired
+
+	#[Locked] public string $albumID;
+	/**
+	 * This is the equivalent of the constructor for Livewire Components.
+	 *
+	 * @param BaseAlbum $album to update the visibility of
+	 *
+	 * @return void
+	 */
+	public function mount(BaseAlbum $album): void
+	{
+		Gate::authorize(AlbumPolicy::CAN_EDIT, [AbstractAlbum::class, $album]);
+
+		$this->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());
+
+		Gate::authorize(AlbumPolicy::CAN_EDIT, [AbstractAlbum::class, $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/Confirms/SaveAll.php b/app/Livewire/Components/Forms/Confirms/SaveAll.php
new file mode 100644
index 00000000000..c3dc041d90c
--- /dev/null
+++ b/app/Livewire/Components/Forms/Confirms/SaveAll.php
@@ -0,0 +1,47 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Confirms;
+
+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;
+
+/**
+ * This defines the Login Form used in modals.
+ */
+class SaveAll extends Component
+{
+	use InteractWithModal;
+
+	/**
+	 * Call the parametrized rendering.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		Gate::authorize(SettingsPolicy::CAN_EDIT, [Configs::class]);
+
+		return view('livewire.forms.confirms.save-all');
+	}
+
+	/**
+	 * Hook the submit button.
+	 *
+	 * @return void
+	 */
+	public function confirm(): void
+	{
+		$this->closeModal();
+		$this->dispatch('saveAll')->to(AllSettings::class);
+	}
+
+	public function close(): void
+	{
+		$this->closeModal();
+	}
+}
diff --git a/app/Livewire/Components/Forms/Photo/CopyTo.php b/app/Livewire/Components/Forms/Photo/CopyTo.php
new file mode 100644
index 00000000000..a02d4f26b94
--- /dev/null
+++ b/app/Livewire/Components/Forms/Photo/CopyTo.php
@@ -0,0 +1,124 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Photo;
+
+use App\Actions\Photo\Duplicate;
+use App\Actions\User\Notify as UserNotify;
+use App\Contracts\Livewire\Params;
+use App\Enum\SmartAlbumType;
+use App\Http\RuleSets\Photo\DuplicatePhotosRuleSet;
+use App\Livewire\Traits\InteractWithModal;
+use App\Livewire\Traits\Notify;
+use App\Livewire\Traits\UseValidator;
+use App\Models\Album;
+use App\Models\Photo;
+use App\Policies\AlbumPolicy;
+use App\Policies\PhotoPolicy;
+use Illuminate\Contracts\View\View;
+use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
+use Illuminate\Support\Facades\Gate;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+class CopyTo extends Component
+{
+	use InteractWithModal;
+	use AuthorizesRequests;
+	use UseValidator;
+	use Notify;
+
+	private Duplicate $duplicate;
+
+	#[Locked] public string $parent_id;
+	/** @var array<int,string> */
+	#[Locked] public array $photoIDs;
+	#[Locked] public string $title = '';
+	// Destination
+	#[Locked] public ?string $albumID = null;
+	#[Locked] public ?string $albumTitle = null;
+	#[Locked] public int $num;
+	/**
+	 * Boot method.
+	 */
+	public function boot(): void
+	{
+		$this->duplicate = resolve(Duplicate::class);
+	}
+
+	/**
+	 * This is the equivalent of the constructor for Livewire Components.
+	 *
+	 * @param array{photoID?:string,photoIDs?:array<int,string>,albumID:?string} $params to move
+	 *
+	 * @return void
+	 */
+	public function mount(array $params = ['albumID' => null]): void
+	{
+		$id = $params[Params::PHOTO_ID] ?? null;
+		$this->photoIDs = $id !== null ? [$id] : $params[Params::PHOTO_IDS] ?? [];
+		$this->num = count($this->photoIDs);
+
+		if ($this->num === 1) {
+			/** @var Photo $photo */
+			$photo = Photo::query()->findOrFail($this->photoIDs[0]);
+			$this->title = $photo->title;
+		}
+
+		Gate::authorize(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->photoIDs]);
+		$this->parent_id = $params[Params::ALBUM_ID] ?? SmartAlbumType::UNSORTED->value;
+	}
+
+	/**
+	 * 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;
+
+		$this->validate(DuplicatePhotosRuleSet::rules());
+		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::authorize(AlbumPolicy::CAN_EDIT, [Album::class, $album]);
+
+		$photos = Photo::query()->with(['size_variants'])->findOrFail($this->photoIDs);
+
+		$copiedPhotos = $this->duplicate->do($photos, $album);
+
+		$notify = new UserNotify();
+
+		$copiedPhotos->each(fn ($photo, $k) => $notify->do($photo));
+
+		// We stay in current album.
+		$this->redirect(route('livewire-gallery-album', ['albumId' => $this->parent_id]), true);
+	}
+
+	/**
+	 * Simply render the form.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		return view('livewire.forms.photo.copyTo');
+	}
+
+	/**
+	 * 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/Delete.php b/app/Livewire/Components/Forms/Photo/Delete.php
new file mode 100644
index 00000000000..ebf8855f3d1
--- /dev/null
+++ b/app/Livewire/Components/Forms/Photo/Delete.php
@@ -0,0 +1,95 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Photo;
+
+use App\Actions\Photo\Delete as DeleteAction;
+use App\Contracts\Livewire\Params;
+use App\Enum\SmartAlbumType;
+use App\Http\RuleSets\Photo\DeletePhotosRuleSet;
+use App\Livewire\Traits\InteractWithModal;
+use App\Livewire\Traits\Notify;
+use App\Livewire\Traits\UseValidator;
+use App\Models\Photo;
+use App\Policies\PhotoPolicy;
+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;
+
+class Delete extends Component
+{
+	use InteractWithModal;
+	use AuthorizesRequests;
+	use UseValidator;
+	use Notify;
+
+	/** @var array<int,string> */
+	#[Locked] public array $photoIDs;
+	#[Locked] public ?string $albumId = null;
+	#[Locked] public string $title = '';
+	#[Locked] public int $num;
+	/**
+	 * This is the equivalent of the constructor for Livewire Components.
+	 *
+	 * @param array{albumID:?string,photoID?:string,photoIDs?:array<int,string>} $params to delete
+	 *
+	 * @return void
+	 */
+	public function mount(array $params = ['albumID' => null]): void
+	{
+		$id = $params[Params::PHOTO_ID] ?? null;
+		$this->photoIDs = $id !== null ? [$id] : $params[Params::PHOTO_IDS] ?? [];
+
+		Gate::authorize(PhotoPolicy::CAN_DELETE_BY_ID, [Photo::class, $this->photoIDs]);
+
+		$this->num = count($this->photoIDs);
+
+		if ($this->num === 1) {
+			/** @var Photo $photo */
+			$photo = Photo::query()->findOrFail($this->photoIDs[0]);
+			$this->title = $photo->title;
+		}
+
+		$this->albumId = $params[Params::ALBUM_ID] ?? null;
+		$this->num = count($this->photoIDs);
+	}
+
+	/**
+	 * 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::authorize(PhotoPolicy::CAN_DELETE_BY_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 ?? SmartAlbumType::UNSORTED->value]));
+	}
+
+	/**
+	 * 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/Download.php b/app/Livewire/Components/Forms/Photo/Download.php
new file mode 100644
index 00000000000..7ff0b67f279
--- /dev/null
+++ b/app/Livewire/Components/Forms/Photo/Download.php
@@ -0,0 +1,69 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Photo;
+
+use App\Contracts\Livewire\Params;
+use App\Enum\DownloadVariantType;
+use App\Livewire\Traits\InteractWithModal;
+use App\Livewire\Traits\Notify;
+use App\Livewire\Traits\UseValidator;
+use App\Models\Photo;
+use App\Policies\PhotoPolicy;
+use Illuminate\Contracts\View\View;
+use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
+use Illuminate\Support\Facades\Gate;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+class Download extends Component
+{
+	use InteractWithModal;
+	use AuthorizesRequests;
+	use UseValidator;
+	use Notify;
+
+	/** @var array<int,string> */
+	#[Locked] public array $photoIDs;
+	public Photo $photo;
+
+	/**
+	 * This is the equivalent of the constructor for Livewire Components.
+	 *
+	 * @param array{albumID:?string,photoID?:string,photoIDs?:array<int,string>} $params to download
+	 *
+	 * @return void
+	 */
+	public function mount(array $params = ['albumID' => null]): void
+	{
+		$id = $params[Params::PHOTO_ID] ?? null;
+		$this->photoIDs = $id !== null ? [$id] : $params[Params::PHOTO_IDS] ?? [];
+		$num = count($this->photoIDs);
+
+		if ($num === 1) {
+			$this->photo = Photo::query()->findOrFail($this->photoIDs[0]);
+			Gate::authorize(PhotoPolicy::CAN_DOWNLOAD, [Photo::class, $this->photo]);
+		} else {
+			$this->redirect(route('photo_download', ['kind' => DownloadVariantType::ORIGINAL->value]) . '&photoIDs=' . implode(',', $this->photoIDs));
+		}
+	}
+
+	/**
+	 * Simply render the form.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		return view('livewire.forms.photo.download');
+	}
+
+	/**
+	 * 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/Move.php b/app/Livewire/Components/Forms/Photo/Move.php
new file mode 100644
index 00000000000..eaea905ce26
--- /dev/null
+++ b/app/Livewire/Components/Forms/Photo/Move.php
@@ -0,0 +1,118 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Photo;
+
+use App\Actions\User\Notify as UserNotify;
+use App\Contracts\Livewire\Params;
+use App\Enum\SmartAlbumType;
+use App\Http\RuleSets\Photo\MovePhotosRuleSet;
+use App\Livewire\Traits\InteractWithModal;
+use App\Models\Album;
+use App\Models\Photo;
+use App\Policies\AlbumPolicy;
+use App\Policies\PhotoPolicy;
+use Illuminate\Contracts\View\View;
+use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
+use Illuminate\Support\Facades\Gate;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+class Move extends Component
+{
+	use InteractWithModal;
+	use AuthorizesRequests;
+
+	#[Locked] public string $parent_id;
+	/** @var array<int,string> */
+	#[Locked] public array $photoIDs;
+	#[Locked] public string $title = '';
+	#[Locked] public int $num;
+	// Destination
+	#[Locked] public ?string $albumID = null;
+	#[Locked] public ?string $albumTitle = null;
+	/**
+	 * This is the equivalent of the constructor for Livewire Components.
+	 *
+	 * @param array{photoID?:string,photoIDs?:array<int,string>,albumID:?string} $params to move
+	 *
+	 * @return void
+	 */
+	public function mount(array $params = ['albumID' => null]): void
+	{
+		$id = $params[Params::PHOTO_ID] ?? null;
+		$this->photoIDs = $id !== null ? [$id] : $params[Params::PHOTO_IDS] ?? [];
+		$this->num = count($this->photoIDs);
+
+		if ($this->num === 1) {
+			/** @var Photo $photo */
+			$photo = Photo::query()->findOrFail($this->photoIDs[0]);
+			$this->title = $photo->title;
+		}
+
+		Gate::authorize(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->photoIDs]);
+		$this->parent_id = $params[Params::ALBUM_ID] ?? SmartAlbumType::UNSORTED->value;
+	}
+
+	/**
+	 * 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;
+
+		$this->validate(MovePhotosRuleSet::rules());
+		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::authorize(AlbumPolicy::CAN_EDIT, [Album::class, $album]);
+
+		$photos = Photo::query()->findOrFail($this->photoIDs);
+
+		$notify = new UserNotify();
+
+		/** @var Photo $photo */
+		foreach ($photos as $photo) {
+			$photo->album_id = $album?->id;
+			// Avoid unnecessary DB request, when we access the album of a
+			// photo later (e.g. when a notification is sent).
+			$photo->setRelation('album', $album);
+			if ($album !== null) {
+				$photo->owner_id = $album->owner_id;
+			}
+			$photo->save();
+			$notify->do($photo);
+		}
+
+		// We stay in current album.
+		$this->redirect(route('livewire-gallery-album', ['albumId' => $this->parent_id]), true);
+	}
+
+	/**
+	 * Simply render the form.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		return view('livewire.forms.photo.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/Photo/Rename.php b/app/Livewire/Components/Forms/Photo/Rename.php
new file mode 100644
index 00000000000..4993bd03662
--- /dev/null
+++ b/app/Livewire/Components/Forms/Photo/Rename.php
@@ -0,0 +1,83 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Photo;
+
+use App\Contracts\Livewire\Params;
+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;
+use Illuminate\Contracts\View\View;
+use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
+use Illuminate\Support\Facades\Gate;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+class Rename extends Component
+{
+	use InteractWithModal;
+	use AuthorizesRequests;
+
+	/** @var array<int,string> */
+	#[Locked] public array $photoIDs;
+	#[Locked] public int $num;
+	public string $title = '';
+
+	/**
+	 * This is the equivalent of the constructor for Livewire Components.
+	 *
+	 * @param array{photoID?:string,photoIDs?:array<int,string>,albumID:?string} $params to move
+	 *
+	 * @return void
+	 */
+	public function mount(array $params = ['albumID' => null]): void
+	{
+		$id = $params[Params::PHOTO_ID] ?? null;
+		$this->photoIDs = $id !== null ? [$id] : $params[Params::PHOTO_IDS] ?? [];
+		$this->num = count($this->photoIDs);
+
+		if ($this->num === 1) {
+			/** @var Photo $photo */
+			$photo = Photo::query()->findOrFail($this->photoIDs[0]);
+			$this->title = $photo->title;
+		}
+
+		Gate::authorize(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->photoIDs]);
+	}
+
+	/**
+	 * Rename.
+	 *
+	 * @return void
+	 */
+	public function submit(): void
+	{
+		$this->validate(SetPhotosTitleRuleSet::rules());
+		Gate::authorize(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->photoIDs]);
+		Photo::query()->whereIn('id', $this->photoIDs)->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.photo.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/Tag.php b/app/Livewire/Components/Forms/Photo/Tag.php
new file mode 100644
index 00000000000..71f7ac24a89
--- /dev/null
+++ b/app/Livewire/Components/Forms/Photo/Tag.php
@@ -0,0 +1,94 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Photo;
+
+use App\Contracts\Livewire\Params;
+use App\Livewire\Components\Pages\Gallery\Album as GalleryAlbum;
+use App\Livewire\Traits\InteractWithModal;
+use App\Models\Photo;
+use App\Policies\PhotoPolicy;
+use Illuminate\Contracts\View\View;
+use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
+use Illuminate\Support\Facades\Gate;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+class Tag extends Component
+{
+	use InteractWithModal;
+	use AuthorizesRequests;
+
+	/** @var array<int,string> */
+	#[Locked] public array $photoIDs;
+	#[Locked] public array $tags = [];
+	#[Locked] public int $num;
+	public bool $shall_override = false;
+	public ?string $tag = '';
+
+	/**
+	 * This is the equivalent of the constructor for Livewire Components.
+	 *
+	 * @param array{photoID?:string,photoIDs?:array<int,string>,albumID:?string} $params to move
+	 *
+	 * @return void
+	 */
+	public function mount(array $params = ['albumID' => null]): void
+	{
+		$id = $params[Params::PHOTO_ID] ?? null;
+		$this->photoIDs = $id !== null ? [$id] : $params[Params::PHOTO_IDS] ?? [];
+		$this->num = count($this->photoIDs);
+
+		if ($this->num === 1) {
+			/** @var Photo $photo */
+			$photo = Photo::query()->findOrFail($this->photoIDs[0]);
+			$this->tag = implode(', ', $photo->tags);
+		}
+
+		Gate::authorize(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->photoIDs]);
+	}
+
+	/**
+	 * Tag.
+	 *
+	 * @return void
+	 */
+	public function submit(): void
+	{
+		$this->tags = collect(explode(',', $this->tag))->map(fn ($v) => trim($v))->filter(fn ($v) => $v !== '')->all();
+
+		Gate::authorize(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->photoIDs]);
+
+		$photos = Photo::query()->whereIn('id', $this->photoIDs)->get();
+		foreach ($photos as $photo) {
+			if ($this->shall_override) {
+				$photo->tags = $this->tags;
+			} else {
+				$photo->tags = array_unique(array_merge($photo->tags, $this->tags));
+			}
+			$photo->save();
+		}
+
+		$this->close();
+		$this->dispatch('reloadPage')->to(GalleryAlbum::class);
+	}
+
+	/**
+	 * Simply render the form.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		return view('livewire.forms.photo.tag');
+	}
+
+	/**
+	 * 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..7f9e528942e
--- /dev/null
+++ b/app/Livewire/Components/Forms/Profile/GetApiToken.php
@@ -0,0 +1,111 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Profile;
+
+use App\Actions\User\TokenDisable;
+use App\Actions\User\TokenReset;
+use App\Exceptions\UnauthenticatedException;
+use App\Livewire\Traits\InteractWithModal;
+use App\Models\User;
+use App\Policies\UserPolicy;
+use Illuminate\Contracts\View\View;
+use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
+use Illuminate\Support\Facades\Auth;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+/**
+ * Retrieve the API token for the current user.
+ * This is the Modal integration.
+ */
+class GetApiToken extends Component
+{
+	use InteractWithModal;
+	use AuthorizesRequests;
+
+	// String of the token or message
+	#[Locked] public string $token = '';
+	// token is disabled
+	#[Locked] public bool $isDisabled;
+	private TokenReset $tokenReset;
+	private TokenDisable $tokenDisable;
+
+	public function boot(): void
+	{
+		$this->tokenReset = resolve(TokenReset::class);
+		$this->tokenDisable = resolve(TokenDisable::class);
+	}
+
+	/**
+	 * Mount the current data of the user.
+	 * $token is kept empty in order to avoid revealing the data.
+	 *
+	 * @return void
+	 */
+	public function mount(): void
+	{
+		$user = Auth::user() ?? throw new UnauthenticatedException();
+
+		$this->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.
+	 *
+	 * @return void
+	 */
+	public function resetToken(): void
+	{
+		/**
+		 * Authorize the request.
+		 */
+		$this->authorize(UserPolicy::CAN_EDIT, [User::class]);
+
+		$this->token = $this->tokenReset->do();
+		$this->isDisabled = false;
+	}
+
+	/**
+	 * Method call from front-end to disable the token.
+	 * We simply erase the current one.
+	 *
+	 * @return void
+	 */
+	public function disableToken(): void
+	{
+		/**
+		 * Authorize the request.
+		 */
+		$this->authorize(UserPolicy::CAN_EDIT, [User::class]);
+
+		$this->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..ab9c9d2921c
--- /dev/null
+++ b/app/Livewire/Components/Forms/Profile/ManageSecondFactor.php
@@ -0,0 +1,89 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Profile;
+
+use App\Exceptions\UnauthenticatedException;
+use App\Exceptions\UnauthorizedException;
+use App\Livewire\Traits\Notify;
+use App\Livewire\Traits\UseValidator;
+use App\Models\User;
+use App\Policies\UserPolicy;
+use Illuminate\Contracts\View\View;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Str;
+use Laragear\WebAuthn\Models\WebAuthnCredential;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+class ManageSecondFactor extends Component
+{
+	use Notify;
+	use UseValidator;
+
+	/**
+	 * Credential used.
+	 *
+	 * @var WebAuthnCredential
+	 */
+	public WebAuthnCredential $credential;
+
+	#[Locked] public bool $has_error = false;
+	/** @var string alias to rename the credentials. By default we provide the first parts of the ID */
+	public string $alias; // ! wired
+
+	public function rules(): array
+	{
+		return ['alias' => 'required|string|min:5|max:255'];
+	}
+
+	/**
+	 * Just mount the component with the required WebAuthn Credentials.
+	 *
+	 * @param WebAuthnCredential $credential
+	 *
+	 * @return void
+	 */
+	public function mount(WebAuthnCredential $credential): void
+	{
+		$this->authorize(UserPolicy::CAN_EDIT, [User::class]);
+
+		if ($credential->authenticatable_id !== (Auth::id() ?? throw new UnauthenticatedException())) {
+			throw new UnauthorizedException();
+		}
+
+		$this->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
+	{
+		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'));
+	}
+}
diff --git a/app/Livewire/Components/Forms/Profile/SecondFactor.php b/app/Livewire/Components/Forms/Profile/SecondFactor.php
new file mode 100644
index 00000000000..c1f96d18c47
--- /dev/null
+++ b/app/Livewire/Components/Forms/Profile/SecondFactor.php
@@ -0,0 +1,65 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Profile;
+
+use App\Exceptions\UnauthenticatedException;
+use App\Livewire\Traits\Notify;
+use App\Models\User;
+use App\Policies\UserPolicy;
+use Illuminate\Database\Eloquent\Collection;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\View\View;
+use Laragear\WebAuthn\Models\WebAuthnCredential;
+use Livewire\Attributes\On;
+use Livewire\Component;
+
+class SecondFactor extends Component
+{
+	use Notify;
+
+	/**
+	 * Rendering of the front-end.
+	 *
+	 * @return View
+	 */
+	#[On('reload-component')]
+	public function render(): View
+	{
+		$this->authorize(UserPolicy::CAN_EDIT, [User::class]);
+
+		return view('livewire.modules.profile.second-factor');
+	}
+
+	/**
+	 * Return the list of credentials associated to the current logged in user.
+	 *
+	 * @return Collection<int,WebAuthnCredential>
+	 *
+	 * @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
+	{
+		/** @var User $user */
+		$user = Auth::user() ?? throw new UnauthenticatedException();
+
+		$user->webAuthnCredentials()->where('id', '=', $id)->delete();
+		$this->notify(__('lychee.U2F_CREDENTIALS_DELETED'));
+	}
+}
diff --git a/app/Livewire/Components/Forms/Profile/SetEmail.php b/app/Livewire/Components/Forms/Profile/SetEmail.php
new file mode 100644
index 00000000000..709945e6803
--- /dev/null
+++ b/app/Livewire/Components/Forms/Profile/SetEmail.php
@@ -0,0 +1,67 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Profile;
+
+use App\Exceptions\UnauthenticatedException;
+use App\Models\User;
+use App\Policies\UserPolicy;
+use Illuminate\Contracts\View\View;
+use Illuminate\Support\Facades\Auth;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+class SetEmail extends Component
+{
+	#[Locked] public string $description;
+	#[Locked] public string $placeholder = 'email@example.com';
+	#[Locked] public string $action;
+	public ?string $value; // ! Wired
+
+	/**
+	 * Mount the description and action localization.
+	 * We keep the value in the rendering to make it more dynamic.
+	 *
+	 * @return void
+	 */
+	public function mount(): void
+	{
+		$this->authorize(UserPolicy::CAN_EDIT, [User::class]);
+
+		/** @var User $user */
+		$user = Auth::user();
+		$this->value = $user->email;
+		$this->description = __('lychee.ENTER_EMAIL');
+		$this->action = __('lychee.SAVE');
+	}
+
+	/**
+	 * Render the component with the email form.
+	 *
+	 * @return View
+	 *
+	 * @throws UnauthenticatedException
+	 */
+	public function render(): View
+	{
+		return view('livewire.forms.settings.input');
+	}
+
+	/**
+	 * Save the email address entered.
+	 *
+	 * @return void
+	 *
+	 * @throws UnauthenticatedException
+	 */
+	public function save(): void
+	{
+		$this->validate(['value' => 'required|email']);
+
+		$this->authorize(UserPolicy::CAN_EDIT, [User::class]);
+
+		/** @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..489ddd0a459
--- /dev/null
+++ b/app/Livewire/Components/Forms/Profile/SetLogin.php
@@ -0,0 +1,92 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Profile;
+
+use App\Actions\Settings\UpdateLogin;
+use App\Http\RuleSets\ChangeLoginRuleSet;
+use App\Livewire\Traits\InteractWithModal;
+use App\Livewire\Traits\Notify;
+use App\Models\User;
+use App\Policies\UserPolicy;
+use App\Rules\CurrentPasswordRule;
+use Illuminate\Contracts\View\View;
+use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
+use Illuminate\Support\Facades\Auth;
+use Livewire\Component;
+
+/**
+ * Because Livewire is sending the data to the client,
+ * we do not provide the model as public property.
+ */
+class SetLogin extends Component
+{
+	use InteractWithModal;
+	use AuthorizesRequests;
+	use Notify;
+
+	public string $oldPassword = ''; // ! wired
+	public string $username = ''; // ! wired
+	public string $password = ''; // ! wired
+	public string $password_confirmation = ''; // ! wired
+
+	private UpdateLogin $updateLogin;
+
+	public function boot(): void
+	{
+		$this->updateLogin = resolve(UpdateLogin::class);
+	}
+
+	public function mount(): void
+	{
+		$this->authorize(UserPolicy::CAN_EDIT, [User::class]);
+	}
+
+	/**
+	 * Simply render the form.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		return view('livewire.forms.profile.set-login');
+	}
+
+	/**
+	 * Update Username & Password of current user.
+	 */
+	public function submit(): void
+	{
+		$this->validate(ChangeLoginRuleSet::rules());
+		$this->validate(['oldPassword' => new CurrentPasswordRule()]);
+
+		$this->authorize(UserPolicy::CAN_EDIT, [User::class]);
+
+		$currentUser = $this->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);
+		$this->notify(__('lychee.CHANGE_SUCCESS'));
+
+		$this->oldPassword = '';
+		$this->username = '';
+		$this->password = '';
+		$this->password_confirmation = '';
+	}
+
+	/**
+	 * 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..d10ae9a52fc
--- /dev/null
+++ b/app/Livewire/Components/Forms/Settings/Base/BaseConfigDoubleDropDown.php
@@ -0,0 +1,95 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Settings\Base;
+
+use App\Enum\Livewire\NotificationType;
+use App\Livewire\Traits\Notify;
+use App\Models\Configs;
+use App\Policies\SettingsPolicy;
+use Illuminate\Contracts\View\View;
+use Illuminate\Database\Eloquent\InvalidCastException;
+use Illuminate\Database\Eloquent\JsonEncodingException;
+use Illuminate\Support\Facades\Gate;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+/**
+ * Basic double drop down menu for sortings.
+ * Do note that it will save and update the value immediately.
+ * No confirmation is requested.
+ */
+abstract class BaseConfigDoubleDropDown extends Component
+{
+	use Notify;
+
+	#[Locked] public string $begin;
+	#[Locked] public string $middle;
+	#[Locked] public string $end;
+	public Configs $config1;
+	public Configs $config2;
+	public string $value1; // ! Wired
+	public string $value2; // ! Wired
+
+	/**
+	 * Renders the double drop down.
+	 * Note that the values are synchroized with the two config attributes.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		$this->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::authorize(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..c7b2ac354a7
--- /dev/null
+++ b/app/Livewire/Components/Forms/Settings/Base/BaseConfigDropDown.php
@@ -0,0 +1,69 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Settings\Base;
+
+use App\Enum\Livewire\NotificationType;
+use App\Livewire\Traits\Notify;
+use App\Models\Configs;
+use App\Policies\SettingsPolicy;
+use Illuminate\Contracts\View\View;
+use Illuminate\Support\Facades\Gate;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+/**
+ * Basic drop down menu.
+ * Do note that it will save and update the value immediately.
+ * No confirmation is requested.
+ */
+abstract class BaseConfigDropDown extends Component
+{
+	use Notify;
+
+	public Configs $config;
+
+	#[Locked] public string $description;
+	public string $value; // ! Wired
+
+	/**
+	 * Renders the view of the dropdown menu.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		$this->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::authorize(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..694c3d8a379
--- /dev/null
+++ b/app/Livewire/Components/Forms/Settings/Base/BooleanSetting.php
@@ -0,0 +1,77 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Settings\Base;
+
+use App\Livewire\Traits\Notify;
+use App\Models\Configs;
+use App\Policies\SettingsPolicy;
+use Illuminate\Contracts\View\View;
+use Illuminate\Database\Eloquent\InvalidCastException;
+use Illuminate\Database\Eloquent\JsonEncodingException;
+use Illuminate\Support\Facades\Gate;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+/**
+ * Basic boolean toggle.
+ * No confirmation is requested.
+ */
+class BooleanSetting extends Component
+{
+	use Notify;
+
+	public Configs $config;
+
+	#[Locked] public string $description;
+	#[Locked] public string $footer;
+	public bool $flag; // ! Wired
+
+	/**
+	 * Mount the toggle.
+	 *
+	 * @param string $description - LANG key
+	 * @param string $name        - Name of the config attribute
+	 * @param string $footer      - text under the toggle if necessary
+	 *
+	 * @return void
+	 */
+	public function mount(string $description, string $name, string $footer = ''): void
+	{
+		$this->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::authorize(SettingsPolicy::CAN_EDIT, [Configs::class]);
+
+		$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..d64f7b399ce
--- /dev/null
+++ b/app/Livewire/Components/Forms/Settings/Base/StringSetting.php
@@ -0,0 +1,76 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Settings\Base;
+
+use App\Enum\Livewire\NotificationType;
+use App\Livewire\Traits\Notify;
+use App\Models\Configs;
+use App\Policies\SettingsPolicy;
+use Illuminate\Contracts\View\View;
+use Illuminate\Support\Facades\Gate;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+/**
+ * String setting input.
+ * To persist the data a call to save() is required.
+ */
+class StringSetting extends Component
+{
+	use Notify;
+
+	public Configs $config;
+	#[Locked] public string $description;
+	#[Locked] public string $placeholder;
+	#[Locked] public string $action;
+	public string $value; // ! Wired
+
+	/**
+	 * @param string $description - LANG key
+	 * @param string $name        - name of the config attribute
+	 * @param string $placeholder - LANG key
+	 * @param string $action      - LANG key
+	 *
+	 * @return void
+	 */
+	public function mount(string $description, string $name, string $placeholder, string $action): void
+	{
+		$this->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::authorize(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..cdab0a7ebd7
--- /dev/null
+++ b/app/Livewire/Components/Forms/Settings/SetAlbumDecorationOrientationSetting.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Settings;
+
+use App\Enum\AlbumDecorationOrientation;
+use App\Livewire\Components\Forms\Settings\Base\BaseConfigDropDown;
+use App\Models\Configs;
+
+/**
+ * Defines the drop down menu for the orientation of the album decorations.
+ */
+class SetAlbumDecorationOrientationSetting extends BaseConfigDropDown
+{
+	/**
+	 * Options available.
+	 *
+	 * @return array
+	 */
+	public function getOptionsProperty(): array
+	{
+		return AlbumDecorationOrientation::localized();
+	}
+
+	/**
+	 * 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..a9fe65396e7
--- /dev/null
+++ b/app/Livewire/Components/Forms/Settings/SetAlbumDecorationSetting.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Settings;
+
+use App\Enum\AlbumDecorationType;
+use App\Livewire\Components\Forms\Settings\Base\BaseConfigDropDown;
+use App\Models\Configs;
+
+/**
+ * Defines the drop down menu for the decoration of albums.
+ */
+class SetAlbumDecorationSetting extends BaseConfigDropDown
+{
+	/**
+	 * Specify the options available.
+	 *
+	 * @return array
+	 */
+	public function getOptionsProperty(): array
+	{
+		return AlbumDecorationType::localized();
+	}
+
+	/**
+	 * 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..c7d28fa5dd6
--- /dev/null
+++ b/app/Livewire/Components/Forms/Settings/SetAlbumSortingSetting.php
@@ -0,0 +1,56 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Settings;
+
+use App\Enum\ColumnSortingAlbumType;
+use App\Enum\OrderSortingType;
+use App\Livewire\Components\Forms\Settings\Base\BaseConfigDoubleDropDown;
+use App\Models\Configs;
+use function Safe\preg_match;
+
+/**
+ * Provide the drop down menu for the sorting type and order of Albums.
+ */
+class SetAlbumSortingSetting extends BaseConfigDoubleDropDown
+{
+	/**
+	 * Set up the texts.
+	 *
+	 * @return void
+	 */
+	public function mount(): void
+	{
+		// We cannot abuse the sprintf in the case of blade templates compared to JS
+		// So we do a simple preg_match to retrieve the chunks.
+		// Note this assumes that %1$s is before %2$s !
+		/** @var string $sort_album_by */
+		$sort_album_by = __('lychee.SORT_ALBUM_BY');
+		preg_match('/^(.*)%1\$s(.*)%2\$s(.*)$/', $sort_album_by, $matches);
+		$this->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::localized();
+	}
+
+	/**
+	 * Give the options on the ordering.
+	 *
+	 * @return array
+	 */
+	public function getOptions2Property(): array
+	{
+		return OrderSortingType::localized();
+	}
+}
\ 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 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Settings;
+
+use App\Livewire\Components\Forms\Settings\Base\BaseConfigDropDown;
+use App\Models\Configs;
+
+/**
+ * Drop down menu for the language used by Lychee.
+ */
+class SetLangSetting extends BaseConfigDropDown
+{
+	/**
+	 * Give the list of available languages.
+	 *
+	 * @return array
+	 */
+	public function getOptionsProperty(): array
+	{
+		return config('app.supported_locale');
+	}
+
+	/**
+	 * Set up the texts.
+	 *
+	 * @return void
+	 */
+	public function mount()
+	{
+		$this->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..d7488c3cb7e
--- /dev/null
+++ b/app/Livewire/Components/Forms/Settings/SetLayoutSetting.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Settings;
+
+use App\Enum\PhotoLayoutType;
+use App\Livewire\Components\Forms\Settings\Base\BaseConfigDropDown;
+use App\Models\Configs;
+
+/**
+ * Defines the drop down menu for the layout used by the gallery.
+ */
+class SetLayoutSetting extends BaseConfigDropDown
+{
+	/**
+	 * Provides the different options.
+	 *
+	 * @return array
+	 */
+	public function getOptionsProperty(): array
+	{
+		return PhotoLayoutType::localized();
+	}
+
+	/**
+	 * Mount the texts.
+	 *
+	 * @return void
+	 */
+	public function mount()
+	{
+		$this->description = __('lychee.LAYOUT_TYPE');
+		$this->config = Configs::where('key', '=', 'layout')->firstOrFail();
+	}
+}
\ 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..0b5784829af
--- /dev/null
+++ b/app/Livewire/Components/Forms/Settings/SetLicenseDefaultSetting.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Settings;
+
+use App\Enum\LicenseType;
+use App\Livewire\Components\Forms\Settings\Base\BaseConfigDropDown;
+use App\Models\Configs;
+
+/**
+ * Drop Down menu for the default license.
+ */
+class SetLicenseDefaultSetting extends BaseConfigDropDown
+{
+	/**
+	 * We have to use this mapping to provide easilly readable license type.
+	 *
+	 * @return array
+	 */
+	public function getOptionsProperty(): array
+	{
+		return LicenseType::localized();
+	}
+
+	/**
+	 * 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 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Settings;
+
+use App\Livewire\Components\Forms\Settings\Base\BaseConfigDropDown;
+use App\Models\Configs;
+
+/**
+ * Provides a drop down menu to chose the map provider.
+ */
+class SetMapProviderSetting extends BaseConfigDropDown
+{
+	/**
+	 * Options for the provider.
+	 *
+	 * @return array
+	 */
+	public function getOptionsProperty(): array
+	{
+		return [
+			'Wikimedia' => __('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..8b5a15f59ad
--- /dev/null
+++ b/app/Livewire/Components/Forms/Settings/SetPhotoOverlaySetting.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Settings;
+
+use App\Enum\ImageOverlayType;
+use App\Livewire\Components\Forms\Settings\Base\BaseConfigDropDown;
+use App\Models\Configs;
+
+/**
+ * Defines the default overlay when accessing a picture.
+ */
+class SetPhotoOverlaySetting extends BaseConfigDropDown
+{
+	/**
+	 * Default overlay options.
+	 *
+	 * @return array
+	 */
+	public function getOptionsProperty(): array
+	{
+		return ImageOverlayType::localized();
+	}
+
+	/**
+	 * 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..af16d021e77
--- /dev/null
+++ b/app/Livewire/Components/Forms/Settings/SetPhotoSortingSetting.php
@@ -0,0 +1,56 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Settings;
+
+use App\Enum\ColumnSortingPhotoType;
+use App\Enum\OrderSortingType;
+use App\Livewire\Components\Forms\Settings\Base\BaseConfigDoubleDropDown;
+use App\Models\Configs;
+use function Safe\preg_match;
+
+/**
+ * Set drop down for default ordering in albums.
+ */
+class SetPhotoSortingSetting extends BaseConfigDoubleDropDown
+{
+	/**
+	 * Set the strings for the menu.
+	 *
+	 * @return void
+	 */
+	public function mount(): void
+	{
+		// We cannot abuse the sprintf in the case of blade templates compared to JS
+		// So we do a simple preg_match to retrieve the chunks.
+		// Note this assumes that %1$s is before %2$s !
+		/** @var string $sort_photo_by */
+		$sort_photo_by = __('lychee.SORT_PHOTO_BY');
+		preg_match('/^(.*)%1\$s(.*)%2\$s(.*)$/', $sort_photo_by, $matches);
+		$this->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::localized();
+	}
+
+	/**
+	 * Ordering ascending or descending.
+	 *
+	 * @return array
+	 */
+	public function getOptions2Property(): array
+	{
+		return OrderSortingType::localized();
+	}
+}
\ 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..c8a2a410b84
--- /dev/null
+++ b/app/Livewire/Components/Menus/AlbumAdd.php
@@ -0,0 +1,69 @@
+<?php
+
+namespace App\Livewire\Components\Menus;
+
+use App\Livewire\Traits\InteractWithContextMenu;
+use App\Livewire\Traits\InteractWithModal;
+use Illuminate\Contracts\View\View;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+/**
+ * This defines the context menu when clicking in the header to add an album.
+ */
+class AlbumAdd extends Component
+{
+	use InteractWithModal;
+	use InteractWithContextMenu;
+
+	#[Locked] public array $params;
+	/**
+	 * Renders the Add menu in the top right.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		return view('livewire.context-menus.album-add');
+	}
+
+	/**
+	 * Open Create Album modal.
+	 *
+	 * @return void
+	 */
+	public function openAlbumCreateModal(): void
+	{
+		$this->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.upload', $this->params);
+	}
+}
diff --git a/app/Livewire/Components/Menus/AlbumDropdown.php b/app/Livewire/Components/Menus/AlbumDropdown.php
new file mode 100644
index 00000000000..a944619cdad
--- /dev/null
+++ b/app/Livewire/Components/Menus/AlbumDropdown.php
@@ -0,0 +1,61 @@
+<?php
+
+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;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+/**
+ * This defines the context menu when right clicking on a single albums.
+ */
+class AlbumDropdown extends Component
+{
+	use InteractWithModal;
+	use InteractWithContextMenu;
+
+	/** @var array{parentID:?string,albumID:string} */
+	#[Locked] public array $params;
+	/**
+	 * Renders the Add menu in the top right.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		return view('livewire.context-menus.album-dropdown');
+	}
+
+	public function rename(): void
+	{
+		$this->closeContextMenu();
+		$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.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.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.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->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
new file mode 100644
index 00000000000..7cbe9e9d196
--- /dev/null
+++ b/app/Livewire/Components/Menus/AlbumsDropdown.php
@@ -0,0 +1,61 @@
+<?php
+
+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;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+/**
+ * This defines the context menu when right clicking on multiple albums.
+ */
+class AlbumsDropdown extends Component
+{
+	use InteractWithModal;
+	use InteractWithContextMenu;
+
+	/** @var array{parentID:?string,albumIDs:array<int,string>} */
+	#[Locked] public array $params;
+	/**
+	 * Renders the Add menu in the top right.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		return view('livewire.context-menus.albums-dropdown');
+	}
+
+	public function renameAll(): void
+	{
+		$this->closeContextMenu();
+		$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.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.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.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();
+	}
+}
diff --git a/app/Livewire/Components/Menus/LeftMenu.php b/app/Livewire/Components/Menus/LeftMenu.php
new file mode 100644
index 00000000000..5c6e4943262
--- /dev/null
+++ b/app/Livewire/Components/Menus/LeftMenu.php
@@ -0,0 +1,137 @@
+<?php
+
+namespace App\Livewire\Components\Menus;
+
+use App\Contracts\Livewire\Openable;
+use App\Livewire\Traits\InteractWithModal;
+use App\Livewire\Traits\UseOpenable;
+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\Support\Facades\URL;
+use Illuminate\View\View;
+use Livewire\Attributes\Locked;
+use Livewire\Attributes\On;
+use Livewire\Component;
+
+/**
+ * This is the Left menu component.
+ * In here we will manage the different links:
+ * - settings.
+ * - User profile (New!)
+ * - users
+ * - U2F (redirect to user profile)
+ * - sharing
+ * - Diagnostics
+ * - Logs
+ * - About
+ * - logout.
+ */
+class LeftMenu extends Component implements Openable
+{
+	use InteractWithModal;
+	use UseOpenable;
+
+	#[Locked] public bool $has_dev_tools = false;
+	#[Locked] public ?string $clockwork_url = null;
+	#[Locked] public ?string $doc_api_url = null;
+	/**
+	 * Method called from user-land.
+	 * Log out the user.
+	 */
+	public function logout(): void
+	{
+		Auth::logout();
+		Session::flush();
+
+		// Hard redirect & refresh instead of using Livewire.
+		// Enures the full reloading of the page.
+		redirect(route('livewire-gallery'));
+	}
+
+	/**
+	 * Render the Left menu.
+	 *
+	 * @return View
+	 */
+	#[On('reloadPage')]
+	public function render(): View
+	{
+		$this->loadDevMenu();
+
+		return view('livewire.components.left-menu');
+	}
+
+	/**
+	 * Open the Context Menu.
+	 *
+	 * @return void
+	 */
+	#[On('openLeftMenu')]
+	public function openLeftMenu(): void
+	{
+		$this->open();
+	}
+
+	/**
+	 * Close the LeftMenu component.
+	 *
+	 * @return void
+	 */
+	#[On('closeLeftMenu')]
+	public function closeLeftMenu(): void
+	{
+		$this->close();
+	}
+
+	/**
+	 * Toggle the LeftMenu component.
+	 *
+	 * @return void
+	 */
+	#[On('toggleLeftMenu')]
+	public function toggleLeftMenu(): void
+	{
+		$this->toggle();
+	}
+
+	/**
+	 * Open a about modal box.
+	 * TODO Consider moving this directly to Blade.
+	 *
+	 * @return void
+	 */
+	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 ? URL::asset('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/Livewire/Components/Menus/PhotoDropdown.php b/app/Livewire/Components/Menus/PhotoDropdown.php
new file mode 100644
index 00000000000..86c5488653e
--- /dev/null
+++ b/app/Livewire/Components/Menus/PhotoDropdown.php
@@ -0,0 +1,118 @@
+<?php
+
+namespace App\Livewire\Components\Menus;
+
+use App\Contracts\Livewire\Params;
+use App\Contracts\Models\AbstractAlbum;
+use App\Livewire\Components\Pages\Gallery\Album as GalleryAlbum;
+use App\Livewire\Traits\InteractWithContextMenu;
+use App\Livewire\Traits\InteractWithModal;
+use App\Livewire\Traits\Notify;
+use App\Models\Album;
+use App\Models\Photo;
+use App\Policies\AlbumPolicy;
+use App\Policies\PhotoPolicy;
+use Illuminate\Contracts\View\View;
+use Illuminate\Support\Facades\Gate;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+/**
+ * This defines the context menu when right clicking on a single photo.
+ */
+class PhotoDropdown extends Component
+{
+	use InteractWithModal;
+	use InteractWithContextMenu;
+	use Notify;
+
+	/** @var array{albumID:?string,photoID:string} */
+	#[Locked] public array $params;
+	#[Locked] public bool $is_starred;
+	/**
+	 * mount info and load star condition.
+	 *
+	 * @param array{albumID:?string,photoID:string} $params
+	 *
+	 * @return void
+	 */
+	public function mount(array $params): void
+	{
+		$this->params = $params;
+		$this->is_starred = Photo::query()->findOrFail($params[Params::PHOTO_ID])->is_starred;
+	}
+
+	/**
+	 * Renders the Add menu in the top right.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		return view('livewire.context-menus.photo-dropdown');
+	}
+
+	public function star(): void
+	{
+		$this->closeContextMenu();
+		Gate::authorize(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->params[Params::PHOTO_ID]]);
+		Photo::where('id', '=', $this->params[Params::PHOTO_ID])->update(['is_starred' => true]);
+		$this->dispatch('reloadPage')->to(GalleryAlbum::class);
+	}
+
+	public function unstar(): void
+	{
+		$this->closeContextMenu();
+		Gate::authorize(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->params[Params::PHOTO_ID]]);
+		Photo::where('id', '=', $this->params[Params::PHOTO_ID])->update(['is_starred' => false]);
+		$this->dispatch('reloadPage')->to(GalleryAlbum::class);
+	}
+
+	public function tag(): void
+	{
+		$this->closeContextMenu();
+		$this->openModal('forms.photo.tag', [Params::PHOTO_ID => $this->params[Params::PHOTO_ID], Params::ALBUM_ID => $this->params[Params::ALBUM_ID]]);
+	}
+
+	public function setAsCover(): void
+	{
+		/** @var Album $album */
+		$album = Album::query()->findOrFail($this->params[Params::ALBUM_ID]);
+
+		Gate::authorize(AlbumPolicy::CAN_EDIT, [AbstractAlbum::class, $album]);
+		$album->cover_id = $album->cover_id === $this->params[Params::PHOTO_ID] ? null : $this->params[Params::PHOTO_ID];
+		$album->save();
+		$this->dispatch('reloadPage')->to(GalleryAlbum::class);
+		$this->closeContextMenu();
+	}
+
+	public function rename(): void
+	{
+		$this->closeContextMenu();
+		$this->openModal('forms.photo.rename', [Params::PHOTO_ID => $this->params[Params::PHOTO_ID], Params::ALBUM_ID => $this->params[Params::ALBUM_ID]]);
+	}
+
+	public function copyTo(): void
+	{
+		$this->closeContextMenu();
+		$this->openModal('forms.photo.copy-to', [Params::PHOTO_ID => $this->params[Params::PHOTO_ID], Params::ALBUM_ID => $this->params[Params::ALBUM_ID]]);
+	}
+
+	public function move(): void
+	{
+		$this->closeContextMenu();
+		$this->openModal('forms.photo.move', [Params::PHOTO_ID => $this->params[Params::PHOTO_ID], Params::ALBUM_ID => $this->params[Params::ALBUM_ID]]);
+	}
+
+	public function delete(): void
+	{
+		$this->closeContextMenu();
+		$this->openModal('forms.photo.delete', [Params::PHOTO_ID => $this->params[Params::PHOTO_ID], Params::ALBUM_ID => $this->params[Params::ALBUM_ID]]);
+	}
+
+	public function download(): void
+	{
+		$this->closeContextMenu();
+		$this->openModal('forms.photo.download', [Params::PHOTO_ID => $this->params[Params::PHOTO_ID], Params::ALBUM_ID => $this->params[Params::ALBUM_ID]]);
+	}
+}
diff --git a/app/Livewire/Components/Menus/PhotosDropdown.php b/app/Livewire/Components/Menus/PhotosDropdown.php
new file mode 100644
index 00000000000..9e74d5caf34
--- /dev/null
+++ b/app/Livewire/Components/Menus/PhotosDropdown.php
@@ -0,0 +1,102 @@
+<?php
+
+namespace App\Livewire\Components\Menus;
+
+use App\Contracts\Livewire\Params;
+use App\Livewire\Components\Pages\Gallery\Album as GalleryAlbum;
+use App\Livewire\Traits\InteractWithContextMenu;
+use App\Livewire\Traits\InteractWithModal;
+use App\Models\Photo;
+use App\Policies\PhotoPolicy;
+use Illuminate\Contracts\View\View;
+use Illuminate\Support\Facades\Gate;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+/**
+ * This defines the context menu when right clicking on multiple photo.
+ */
+class PhotosDropdown extends Component
+{
+	use InteractWithModal;
+	use InteractWithContextMenu;
+
+	/** @var array{albumID:?string,photoIDs:array<int,string>} */
+	#[Locked] public array $params;
+	#[Locked] public bool $are_starred;
+	/**
+	 * mount info and load star condition.
+	 *
+	 * @param array{albumID:?string,photoIDs:array<int,string>} $params
+	 *
+	 * @return void
+	 */
+	public function mount(array $params): void
+	{
+		$this->params = $params;
+		$this->are_starred = count($params[Params::PHOTO_IDS]) ===
+			Photo::query()->whereIn('id', $params[Params::PHOTO_IDS])->where('is_starred', '=', true)->count();
+	}
+
+	/**
+	 * Renders the Add menu in the top right.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		return view('livewire.context-menus.photos-dropdown');
+	}
+
+	public function starAll(): void
+	{
+		$this->closeContextMenu();
+		Gate::authorize(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->params[Params::PHOTO_IDS]]);
+		Photo::whereIn('id', $this->params[Params::PHOTO_IDS])->update(['is_starred' => true]);
+		$this->dispatch('reloadPage')->to(GalleryAlbum::class);
+	}
+
+	public function unstarAll(): void
+	{
+		$this->closeContextMenu();
+		Gate::authorize(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->params[Params::PHOTO_IDS]]);
+		Photo::whereIn('id', $this->params[Params::PHOTO_IDS])->update(['is_starred' => false]);
+		$this->dispatch('reloadPage')->to(GalleryAlbum::class);
+	}
+
+	public function tagAll(): void
+	{
+		$this->closeContextMenu();
+		$this->openModal('forms.photo.tag', [Params::PHOTO_IDS => $this->params[Params::PHOTO_IDS], Params::ALBUM_ID => $this->params[Params::ALBUM_ID]]);
+	}
+
+	public function renameAll(): void
+	{
+		$this->closeContextMenu();
+		$this->openModal('forms.photo.rename', [Params::PHOTO_IDS => $this->params[Params::PHOTO_IDS], Params::ALBUM_ID => $this->params[Params::ALBUM_ID]]);
+	}
+
+	public function copyAllTo(): void
+	{
+		$this->closeContextMenu();
+		$this->openModal('forms.photo.copy-to', [Params::PHOTO_IDS => $this->params[Params::PHOTO_IDS], Params::ALBUM_ID => $this->params[Params::ALBUM_ID]]);
+	}
+
+	public function moveAll(): void
+	{
+		$this->closeContextMenu();
+		$this->openModal('forms.photo.move', [Params::PHOTO_IDS => $this->params[Params::PHOTO_IDS], Params::ALBUM_ID => $this->params[Params::ALBUM_ID]]);
+	}
+
+	public function deleteAll(): void
+	{
+		$this->closeContextMenu();
+		$this->openModal('forms.photo.delete', [Params::PHOTO_IDS => $this->params[Params::PHOTO_IDS], Params::ALBUM_ID => $this->params[Params::ALBUM_ID]]);
+	}
+
+	public function downloadAll(): void
+	{
+		$this->closeContextMenu();
+		$this->openModal('forms.photo.download', [Params::PHOTO_IDS => $this->params[Params::PHOTO_IDS], Params::ALBUM_ID => $this->params[Params::ALBUM_ID]]);
+	}
+}
diff --git a/app/Livewire/Components/Modals/About.php b/app/Livewire/Components/Modals/About.php
new file mode 100644
index 00000000000..33383e154e3
--- /dev/null
+++ b/app/Livewire/Components/Modals/About.php
@@ -0,0 +1,56 @@
+<?php
+
+namespace App\Livewire\Components\Modals;
+
+use App\Livewire\Traits\InteractWithModal;
+use App\Metadata\Versions\FileVersion;
+use App\Metadata\Versions\GitHubVersion;
+use App\Metadata\Versions\InstalledVersion;
+use App\Models\Configs;
+use Illuminate\Contracts\View\View;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+/**
+ * This defines the about modal that can be found in the Left Menu.
+ */
+class About extends Component
+{
+	use InteractWithModal;
+
+	#[Locked] public bool $is_new_release_available = false;
+	#[Locked] public bool $is_git_update_available = false;
+	#[Locked] public ?string $version = null;
+	/**
+	 * Mount the component. We set the attributes here.
+	 *
+	 * @return void
+	 */
+	public function mount(): void
+	{
+		if (!Configs::getValueAsBool('hide_version_number')) {
+			$this->version = resolve(InstalledVersion::class)->getVersion()->toString();
+		}
+
+		$fileVersion = resolve(FileVersion::class);
+		$gitHubVersion = resolve(GitHubVersion::class);
+		if (Configs::getValueAsBool('check_for_updates')) {
+			// @codeCoverageIgnoreStart
+			$fileVersion->hydrate();
+			$gitHubVersion->hydrate();
+			// @codeCoverageIgnoreEnd
+		}
+		$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..bbafa5e6ee7
--- /dev/null
+++ b/app/Livewire/Components/Modals/Login.php
@@ -0,0 +1,95 @@
+<?php
+
+namespace App\Livewire\Components\Modals;
+
+use App\Exceptions\Internal\QueryBuilderException;
+use App\Http\RuleSets\LoginRuleSet;
+use App\Metadata\Versions\FileVersion;
+use App\Metadata\Versions\GitHubVersion;
+use App\Metadata\Versions\InstalledVersion;
+use App\Models\Configs;
+use Illuminate\Contracts\Container\BindingResolutionException;
+use Illuminate\Contracts\View\View;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Log;
+use Illuminate\Validation\ValidationException;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+/**
+ * This defines the Login Form used in modals.
+ */
+class Login extends Component
+{
+	#[Locked] public bool $is_new_release_available = false;
+	#[Locked] public bool $is_git_update_available = false;
+	#[Locked] public ?string $version = null;
+	public ?string $username; // ! wired
+	public ?string $password; // ! wired
+
+	/**
+	 * Call the parametrized rendering.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		return view('livewire.modals.login');
+	}
+
+	/**
+	 * Mount the component.
+	 *
+	 * @return void
+	 */
+	public function mount(): void
+	{
+		if (!Configs::getValueAsBool('hide_version_number')) {
+			$this->version = resolve(InstalledVersion::class)->getVersion()->toString();
+		}
+
+		$fileVersion = resolve(FileVersion::class);
+		$gitHubVersion = resolve(GitHubVersion::class);
+		if (Configs::getValueAsBool('check_for_updates')) {
+			// @codeCoverageIgnoreStart
+			$fileVersion->hydrate();
+			$gitHubVersion->hydrate();
+			// @codeCoverageIgnoreEnd
+		}
+		$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..ab4b70fedc5
--- /dev/null
+++ b/app/Livewire/Components/Modules/Diagnostics/AbstractPreSection.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace App\Livewire\Components\Modules\Diagnostics;
+
+use Illuminate\View\View;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+/**
+ * Basic pre section to display the diagnostics parts.
+ */
+abstract class AbstractPreSection extends Component
+{
+	#[Locked] public string $title;
+	/**
+	 * Rendering of the front-end.
+	 *
+	 * @return View
+	 */
+	final public function render(): View
+	{
+		return view('livewire.modules.diagnostics.pre');
+	}
+
+	/**
+	 * Defined the data to be displayed.
+	 *
+	 * @return array
+	 */
+	abstract public function getDataProperty(): array;
+
+	/**
+	 * Return error message because we don't want this serialized.
+	 *
+	 * @return string
+	 */
+	public function getErrorMessageProperty(): string
+	{
+		return 'Error: You must have administrator rights to see this.';
+	}
+}
diff --git a/app/Livewire/Components/Modules/Diagnostics/Configurations.php b/app/Livewire/Components/Modules/Diagnostics/Configurations.php
new file mode 100644
index 00000000000..127647856ee
--- /dev/null
+++ b/app/Livewire/Components/Modules/Diagnostics/Configurations.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace App\Livewire\Components\Modules\Diagnostics;
+
+use App\Actions\Diagnostics\Configuration;
+use App\Models\Configs;
+use App\Policies\SettingsPolicy;
+use Illuminate\Support\Facades\Gate;
+use Livewire\Attributes\Locked;
+
+class Configurations extends AbstractPreSection
+{
+	#[Locked] public string $title = 'Config Information';
+	public function getDataProperty(): array
+	{
+		return Gate::check(SettingsPolicy::CAN_SEE_DIAGNOSTICS, Configs::class) ? resolve(Configuration::class)->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..e1ea04ea885
--- /dev/null
+++ b/app/Livewire/Components/Modules/Diagnostics/Errors.php
@@ -0,0 +1,63 @@
+<?php
+
+namespace App\Livewire\Components\Modules\Diagnostics;
+
+use App\Actions\Diagnostics\Errors as DiagnosticsErrors;
+use Illuminate\Support\Str;
+use Illuminate\View\View;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+class Errors extends Component
+{
+	#[Locked] public string $title = 'Diagnostics';
+	#[Locked] public string $error_msg = 'No critical problems found. Lychee should work without problems!';
+	public function placeholder(): string
+	{
+		return '<p class="font-mono">
+	Diagnostics
+	-----------
+	<span class="text-primary-500 font-bold">    ' . __('lychee.LOADING') . ' ...</span>
+</p>
+';
+	}
+
+	/**
+	 * 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-warning-600';
+				$arr['type'] = 'Warning:';
+				$arr['line'] = Str::substr($line, 9);
+			}
+
+			if (Str::startsWith($line, 'Error: ')) {
+				// @codeCoverageIgnoreStart
+				$arr['color'] = 'text-danger-600';
+				$arr['type'] = 'Error:';
+				$arr['line'] = Str::substr($line, 7);
+				// @codeCoverageIgnoreEnd
+			}
+
+			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..e9f437cd5f5
--- /dev/null
+++ b/app/Livewire/Components/Modules/Diagnostics/Infos.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace App\Livewire\Components\Modules\Diagnostics;
+
+use App\Actions\Diagnostics\Info;
+use App\Models\Configs;
+use App\Policies\SettingsPolicy;
+use Illuminate\Support\Facades\Gate;
+use Livewire\Attributes\Locked;
+
+class Infos extends AbstractPreSection
+{
+	#[Locked] public string $title = 'System Information';
+	public function getDataProperty(): array
+	{
+		return Gate::check(SettingsPolicy::CAN_SEE_DIAGNOSTICS, Configs::class) ? resolve(Info::class)->get() : [];
+	}
+}
diff --git a/app/Livewire/Components/Modules/Diagnostics/Optimize.php b/app/Livewire/Components/Modules/Diagnostics/Optimize.php
new file mode 100644
index 00000000000..f1753c97dc7
--- /dev/null
+++ b/app/Livewire/Components/Modules/Diagnostics/Optimize.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace App\Livewire\Components\Modules\Diagnostics;
+
+use App\Actions\Db\OptimizeDb;
+use App\Actions\Db\OptimizeTables;
+use App\Models\Configs;
+use App\Policies\SettingsPolicy;
+use Illuminate\Support\Facades\Gate;
+use Illuminate\View\View;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+class Optimize extends Component
+{
+	#[Locked] public string $title = 'Optimize DB';
+	#[Locked] public array $result = [];
+	#[Locked] public string $action;
+	private OptimizeDb $optimizeDb;
+	private OptimizeTables $optimizeTables;
+
+	public function boot(): void
+	{
+		$this->optimizeDb = resolve(OptimizeDb::class);
+		$this->optimizeTables = resolve(OptimizeTables::class);
+		$this->action = 'Optimize!';
+	}
+
+	/**
+	 * Rendering of the front-end.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		if (!Gate::check(SettingsPolicy::CAN_SEE_DIAGNOSTICS, Configs::class)) {
+			$this->result[] = 'Error: You must have administrator rights to see this.';
+		}
+
+		return view('livewire.modules.diagnostics.with-action-call');
+	}
+
+	/**
+	 * Return the size used by Lychee.
+	 * We now separate this from the initial get() call as this is quite time consuming.
+	 *
+	 * @return void
+	 */
+	public function do(): void
+	{
+		Gate::authorize(SettingsPolicy::CAN_SEE_DIAGNOSTICS, Configs::class);
+		$this->result = collect($this->optimizeDb->do())->merge(collect($this->optimizeTables->do()))->all();
+	}
+}
diff --git a/app/Livewire/Components/Modules/Diagnostics/Space.php b/app/Livewire/Components/Modules/Diagnostics/Space.php
new file mode 100644
index 00000000000..cedb61f0dd8
--- /dev/null
+++ b/app/Livewire/Components/Modules/Diagnostics/Space.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace App\Livewire\Components\Modules\Diagnostics;
+
+use App\Actions\Diagnostics\Space as DiagnosticsSpace;
+use App\Models\Configs;
+use App\Policies\SettingsPolicy;
+use Illuminate\Support\Facades\Gate;
+use Illuminate\View\View;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+class Space extends Component
+{
+	#[Locked] public string $title = 'Space Usage';
+	#[Locked] public array $result = [];
+	#[Locked] public string $action;
+	private DiagnosticsSpace $diagnostics;
+
+	public function boot(): void
+	{
+		$this->diagnostics = resolve(DiagnosticsSpace::class);
+		$this->action = __('lychee.DIAGNOSTICS_GET_SIZE');
+	}
+
+	/**
+	 * Rendering of the front-end.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		if (!Gate::check(SettingsPolicy::CAN_SEE_DIAGNOSTICS, Configs::class)) {
+			$this->result[] = 'Error: You must have administrator rights to see this.';
+		}
+
+		return view('livewire.modules.diagnostics.with-action-call');
+	}
+
+	/**
+	 * Return the size used by Lychee.
+	 * We now separate this from the initial get() call as this is quite time consuming.
+	 *
+	 * @return void
+	 */
+	public function do(): void
+	{
+		Gate::authorize(SettingsPolicy::CAN_SEE_DIAGNOSTICS, Configs::class);
+		$this->result = $this->diagnostics->get();
+	}
+}
diff --git a/app/Livewire/Components/Modules/Users/UserLine.php b/app/Livewire/Components/Modules/Users/UserLine.php
new file mode 100644
index 00000000000..ca900c32b23
--- /dev/null
+++ b/app/Livewire/Components/Modules/Users/UserLine.php
@@ -0,0 +1,106 @@
+<?php
+
+namespace App\Livewire\Components\Modules\Users;
+
+use App\Actions\User\Save;
+use App\Http\RuleSets\Users\SetUserSettingsRuleSet;
+use App\Livewire\Traits\UseValidator;
+use App\Models\User;
+use App\Policies\UserPolicy;
+use Illuminate\Contracts\View\View;
+use Illuminate\Support\Facades\Gate;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+/**
+ * In the User management page, this represent a user (line).
+ */
+class UserLine extends Component
+{
+	use UseValidator;
+
+	private Save $save;
+	public User $user;
+	// We cannot model bind hidden attributes, as a result, it is better to add properties to the component
+	#[Locked] public int $id;
+	public string $username; // ! Wired
+	public string $password = '';  // ! Wired
+	public bool $may_upload; // ! Wired
+	public bool $may_edit_own_settings; // ! Wired
+
+	/**
+	 * Initialization of private properties.
+	 *
+	 * @return void
+	 */
+	public function boot()
+	{
+		$this->save = resolve(Save::class);
+	}
+
+	/**
+	 * Given a user, load the properties.
+	 * Note that password stays empty to ensure that we do not update it by mistake.
+	 *
+	 * @param User $user
+	 *
+	 * @return void
+	 */
+	public function mount(User $user): void
+	{
+		Gate::authorize(UserPolicy::CAN_CREATE_OR_EDIT_OR_DELETE, [User::class]);
+
+		$this->user = $user;
+		$this->id = $user->id;
+		$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 !== '';
+	}
+
+	/**
+	 * Save modification done to a user.
+	 * Note that an admin can change the password of a user at will.
+	 *
+	 * @return void
+	 */
+	public function save(): void
+	{
+		if (!$this->areValid(SetUserSettingsRuleSet::rules())) {
+			return;
+		}
+
+		Gate::authorize(UserPolicy::CAN_CREATE_OR_EDIT_OR_DELETE, [User::class]);
+
+		$this->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..6429d9afbf4
--- /dev/null
+++ b/app/Livewire/Components/Pages/AllSettings.php
@@ -0,0 +1,75 @@
+<?php
+
+namespace App\Livewire\Components\Pages;
+
+use App\Livewire\Components\Menus\LeftMenu;
+use App\Livewire\Forms\AllConfigsForms;
+use App\Livewire\Traits\InteractWithModal;
+use App\Models\Configs;
+use App\Policies\SettingsPolicy;
+use Illuminate\Support\Facades\Gate;
+use Illuminate\View\View;
+use Livewire\Attributes\On;
+use Livewire\Component;
+
+class AllSettings extends Component
+{
+	/**
+	 * Add interaction with modal.
+	 */
+	use InteractWithModal;
+
+	public AllConfigsForms $form;
+
+	/**
+	 * Mount the component of the front-end.
+	 *
+	 * @return void
+	 */
+	public function mount(): void
+	{
+		Gate::authorize(SettingsPolicy::CAN_EDIT, [Configs::class]);
+
+		$this->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
+	{
+		$this->dispatch('closeLeftMenu')->to(LeftMenu::class);
+
+		return $this->redirect(route('settings'), true);
+	}
+}
diff --git a/app/Livewire/Components/Pages/Diagnostics.php b/app/Livewire/Components/Pages/Diagnostics.php
new file mode 100644
index 00000000000..a09e8ae2220
--- /dev/null
+++ b/app/Livewire/Components/Pages/Diagnostics.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace App\Livewire\Components\Pages;
+
+use App\Livewire\Components\Menus\LeftMenu;
+use Illuminate\View\View;
+use Livewire\Attributes\On;
+use Livewire\Component;
+
+class Diagnostics extends Component
+{
+	/**
+	 * Rendering of the front-end.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		return view('livewire.pages.diagnostics');
+	}
+
+	public function back(): mixed
+	{
+		$this->dispatch('closeLeftMenu')->to(LeftMenu::class);
+
+		return $this->redirect(route('livewire-gallery'), true);
+	}
+
+	#[On('reloadPage')]
+	public function reloadPage(): void
+	{
+		$this->render();
+	}
+}
diff --git a/app/Livewire/Components/Pages/Frame.php b/app/Livewire/Components/Pages/Frame.php
new file mode 100644
index 00000000000..0a6bd082b38
--- /dev/null
+++ b/app/Livewire/Components/Pages/Frame.php
@@ -0,0 +1,113 @@
+<?php
+
+namespace App\Livewire\Components\Pages;
+
+use App\Contracts\Models\AbstractAlbum;
+use App\Exceptions\PhotoCollectionEmptyException;
+use App\Exceptions\UnauthorizedException;
+use App\Factories\AlbumFactory;
+use App\Models\Configs;
+use App\Models\Photo;
+use App\Policies\AlbumPolicy;
+use App\Policies\PhotoQueryPolicy;
+use Illuminate\Contracts\Container\BindingResolutionException;
+use Illuminate\Support\Facades\Gate;
+use Illuminate\View\View;
+use Livewire\Attributes\Renderless;
+use Livewire\Component;
+
+class Frame extends Component
+{
+	private AlbumFactory $albumFactory;
+	private PhotoQueryPolicy $photoQueryPolicy;
+
+	public ?string $title = null;
+	public ?string $albumId = null;
+	public string $frame;
+	public string $src = '';
+	public string $srcset = '';
+	public int $timeout;
+	public string $back;
+
+	/**
+	 * Render component.
+	 *
+	 * @return View
+	 *
+	 * @throws BindingResolutionException
+	 */
+	public function render(): View
+	{
+		return view('livewire.pages.gallery.frame');
+	}
+
+	public function mount(?string $albumId = null): void
+	{
+		if (!Configs::getValueAsBool('mod_frame_enabled')) {
+			throw new UnauthorizedException();
+		}
+
+		$randomAlbumId = Configs::getValueAsString('random_album_id');
+		$this->albumId = $albumId ?? (($randomAlbumId !== '') ? $randomAlbumId : null);
+
+		$album = $this->albumId === null ? null : $this->albumFactory->findAbstractAlbumOrFail($this->albumId);
+		Gate::authorize(AlbumPolicy::CAN_ACCESS, [AbstractAlbum::class, $album]);
+
+		$this->title = $album?->title;
+		$this->loadPhoto();
+		$this->timeout = Configs::getValueAsInt('mod_frame_refresh');
+		$this->back = $albumId !== null ? route('livewire-gallery-album', ['albumId' => $albumId]) : route('livewire-gallery');
+	}
+
+	#[Renderless]
+	public function loadPhoto(int $retries = 5): array
+	{
+		// avoid infinite recursion
+		if ($retries === 0) {
+			$this->src = '';
+			$this->srcset = '';
+
+			return ['src' => '', 'srcset' => ''];
+		}
+
+		// default query
+		$query = $this->photoQueryPolicy->applySearchabilityFilter(Photo::query()->with(['album', 'size_variants', 'size_variants.sym_links']));
+
+		if ($this->albumId !== null) {
+			$query = $this->albumFactory->findAbstractAlbumOrFail($this->albumId)
+									 ->photos()
+									 ->with(['album', 'size_variants', 'size_variants.sym_links']);
+		}
+
+		/** @var ?Photo $photo */
+		// PHPStan does not understand that `firstOrFail` returns `Photo`, but assumes that it returns `Model`
+		// @phpstan-ignore-next-line
+		$photo = $query->inRandomOrder()->first();
+		if ($photo === null) {
+			$this->title === null ?
+				throw new PhotoCollectionEmptyException() : throw new PhotoCollectionEmptyException('Photo collection of ' . $this->title . ' is empty');
+		}
+
+		// retry
+		if ($photo->isVideo()) {
+			return $this->loadPhoto($retries - 1);
+		}
+
+		$this->src = $photo->size_variants->getMedium()?->url ?? $photo->size_variants->getOriginal()?->url;
+
+		if ($photo->size_variants->getMedium() !== null && $photo->size_variants->getMedium2x() !== null) {
+			$this->srcset = $photo->size_variants->getMedium()->url . ' ' . $photo->size_variants->getMedium()->width . 'w';
+			$this->srcset .= $photo->size_variants->getMedium2x()->url . ' ' . $photo->size_variants->getMedium2x()->width . 'w';
+		} else {
+			$this->srcset = '';
+		}
+
+		return ['src' => $this->src, 'srcset' => $this->srcset];
+	}
+
+	public function boot(): void
+	{
+		$this->albumFactory = resolve(AlbumFactory::class);
+		$this->photoQueryPolicy = resolve(PhotoQueryPolicy::class);
+	}
+}
diff --git a/app/Livewire/Components/Pages/Gallery/Album.php b/app/Livewire/Components/Pages/Gallery/Album.php
new file mode 100644
index 00000000000..22343893656
--- /dev/null
+++ b/app/Livewire/Components/Pages/Gallery/Album.php
@@ -0,0 +1,219 @@
+<?php
+
+namespace App\Livewire\Components\Pages\Gallery;
+
+use App\Contracts\Livewire\Reloadable;
+use App\Contracts\Models\AbstractAlbum;
+use App\Enum\SizeVariantType;
+use App\Exceptions\Internal\QueryBuilderException;
+use App\Factories\AlbumFactory;
+use App\Livewire\DTO\AlbumFlags;
+use App\Livewire\DTO\AlbumFormatted;
+use App\Livewire\DTO\AlbumRights;
+use App\Livewire\DTO\Layouts;
+use App\Livewire\DTO\PhotoFlags;
+use App\Livewire\DTO\SessionFlags;
+use App\Models\Album as ModelsAlbum;
+use App\Models\Configs;
+use App\Models\Extensions\BaseAlbum;
+use App\Models\Photo;
+use App\Models\SizeVariant;
+use App\Models\User;
+use App\Policies\AlbumPolicy;
+use App\Policies\PhotoPolicy;
+use Illuminate\Database\Eloquent\RelationNotFoundException;
+use Illuminate\Support\Collection;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Gate;
+use Illuminate\View\View;
+use Livewire\Attributes\On;
+use Livewire\Attributes\Renderless;
+
+/**
+ * Album sub module.
+ *
+ * We just load the layout from config and render.
+ * The variable $album is automatically mounted from the Livewire call
+ */
+class Album extends BaseAlbumComponent implements Reloadable
+{
+	private AlbumFactory $albumFactory;
+
+	public ?AbstractAlbum $album = null;
+
+	/**
+	 * Boot method, called before any interaction with the component.
+	 *
+	 * @return void
+	 */
+	public function boot(): void
+	{
+		$this->albumFactory = resolve(AlbumFactory::class);
+		$this->layouts = new Layouts();
+	}
+
+	public function mount(string $albumId, string $photoId = ''): void
+	{
+		$this->albumId = $albumId;
+		$this->photoId = $photoId;
+		$this->flags = new AlbumFlags();
+
+		$this->reloadPage();
+	}
+
+	/**
+	 * Rendering of the blade template.
+	 *
+	 * @return View
+	 */
+	final public function render(): View
+	{
+		$this->sessionFlags = SessionFlags::get();
+		$this->rights = AlbumRights::make($this->album);
+
+		if ($this->flags->is_accessible) {
+			$this->num_users = User::count();
+			$this->header_url ??= $this->fetchHeaderUrl()?->url;
+			$this->num_albums = $this->album instanceof ModelsAlbum ? $this->album->children->count() : 0;
+			$this->num_photos = $this->album->photos->count();
+
+			$is_latitude_longitude_found = false;
+			if ($this->album instanceof ModelsAlbum) {
+				$is_latitude_longitude_found = $this->album->all_photos()->whereNotNull('latitude')->whereNotNull('longitude')->count() > 0;
+			} else {
+				$is_latitude_longitude_found = $this->album->photos()->whereNotNull('latitude')->whereNotNull('longitude')->count() > 0;
+			}
+			// Only display if there are actual data
+			$this->flags->is_map_accessible = $this->flags->is_map_accessible && $is_latitude_longitude_found;
+
+			$this->photoFlags = new PhotoFlags(
+				can_autoplay: true,
+				can_rotate: Configs::getValueAsBool('editor_enabled'),
+				can_edit: $this->rights->can_edit,
+			);
+		}
+
+		return view('livewire.pages.gallery.album');
+	}
+
+	/**
+	 * Reload the data.
+	 *
+	 * @return void
+	 */
+	#[On('reloadPage')]
+	public function reloadPage(): void
+	{
+		$this->album = $this->albumFactory->findAbstractAlbumOrFail($this->albumId);
+		$this->flags->is_base_album = $this->album instanceof BaseAlbum;
+		$this->flags->is_accessible = Gate::check(AlbumPolicy::CAN_ACCESS, [ModelsAlbum::class, $this->album]);
+
+		if (!$this->flags->is_accessible) {
+			$this->flags->is_password_protected =
+				$this->album->public_permissions() !== null &&
+				$this->album->public_permissions()->password !== null;
+		}
+
+		if (Auth::check() && !$this->flags->is_accessible && !$this->flags->is_password_protected) {
+			$this->redirect(route('livewire-gallery'));
+		}
+	}
+
+	/**
+	 * Return the photoIDs (no need to wait to compute the geometry).
+	 *
+	 * @return Collection<Photo>
+	 */
+	public function getPhotosProperty(): Collection
+	{
+		return $this->album->photos;
+	}
+
+	/**
+	 * @return Collection<ModelsAlbum>|null
+	 */
+	public function getAlbumsProperty(): Collection|null
+	{
+		if ($this->album instanceof ModelsAlbum) {
+			return $this->album->children;
+		}
+
+		return null;
+	}
+
+	/**
+	 * Used in the JS front-end to manage the selected albums.
+	 *
+	 * @return array
+	 */
+	public function getAlbumIDsProperty(): array
+	{
+		return $this->getAlbumsProperty()?->map(fn ($v, $k) => $v->id)?->all() ?? [];
+	}
+
+	/**
+	 * 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();
+	}
+
+	public function getBackProperty(): string
+	{
+		if ($this->album instanceof ModelsAlbum && $this->album->parent_id !== null) {
+			return route('livewire-gallery-album', ['albumId' => $this->album->parent_id]);
+		}
+
+		return route('livewire-gallery');
+	}
+
+	public function getTitleProperty(): string
+	{
+		return $this->album->title;
+	}
+
+	#[Renderless]
+	public function setCover(?string $photoID): void
+	{
+		if (!$this->album instanceof ModelsAlbum) {
+			return;
+		}
+
+		Gate::authorize(AlbumPolicy::CAN_EDIT, [AbstractAlbum::class, $this->album]);
+
+		$photo = $photoID === null ? null : Photo::query()->findOrFail($photoID);
+		if ($photo !== null) {
+			Gate::authorize(PhotoPolicy::CAN_SEE, [Photo::class, $photo]);
+		}
+
+		$this->album->cover_id = ($this->album->cover_id === $photo->id) ? null : $photo->id;
+		$this->album->save();
+		$this->notify(__('lychee.CHANGE_SUCCESS'));
+	}
+
+	public function getAlbumFormattedProperty(): AlbumFormatted
+	{
+		return new AlbumFormatted($this->album, $this->fetchHeaderUrl()?->url);
+	}
+
+	public function getNoImagesAlbumsMessageProperty(): string
+	{
+		return 'Nothing to see here';
+	}
+}
diff --git a/app/Livewire/Components/Pages/Gallery/Albums.php b/app/Livewire/Components/Pages/Gallery/Albums.php
new file mode 100644
index 00000000000..18ac64b26a4
--- /dev/null
+++ b/app/Livewire/Components/Pages/Gallery/Albums.php
@@ -0,0 +1,93 @@
+<?php
+
+namespace App\Livewire\Components\Pages\Gallery;
+
+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\DTO\AlbumRights;
+use App\Livewire\DTO\AlbumsFlags;
+use App\Livewire\DTO\SessionFlags;
+use App\Livewire\Traits\AlbumsPhotosContextMenus;
+use App\Livewire\Traits\SilentUpdate;
+use App\Models\Configs;
+use Illuminate\Contracts\Container\BindingResolutionException;
+use Illuminate\Support\Collection;
+use Illuminate\View\View;
+use Livewire\Attributes\Locked;
+use Livewire\Attributes\On;
+use Livewire\Component;
+
+/**
+ * This is the "start" page of the gallery
+ * Integrate the list of all albums at top level.
+ */
+class Albums extends Component implements Reloadable
+{
+	use AlbumsPhotosContextMenus;
+	use SilentUpdate;
+
+	private TopAlbumsResource $topAlbums;
+
+	#[Locked] public string $title;
+	/** @var array<int,string> */
+	#[Locked] public array $albumIDs;
+	#[Locked] public ?string $albumId = null;
+	public AlbumsFlags $flags;
+	public AlbumRights $rights;
+	public SessionFlags $sessionFlags;
+
+	/**
+	 * Render component.
+	 *
+	 * @return View
+	 *
+	 * @throws BindingResolutionException
+	 */
+	public function render(): View
+	{
+		$this->flags = new AlbumsFlags();
+		$this->rights = AlbumRights::make(null);
+		$this->albumIDs = $this->topAlbums->albums->map(fn ($v, $k) => $v->id)->all();
+
+		return view('livewire.pages.gallery.albums');
+	}
+
+	public function mount(): void
+	{
+		$this->sessionFlags = SessionFlags::get();
+	}
+
+	#[On('reloadPage')]
+	public function reloadPage(): void
+	{
+		$this->topAlbums = resolve(Top::class)->get();
+	}
+
+	public function boot(): void
+	{
+		$this->topAlbums = resolve(Top::class)->get();
+		$this->title = Configs::getValueAsString('site_title');
+	}
+
+	public function getAlbumsProperty(): Collection
+	{
+		return $this->topAlbums->albums;
+	}
+
+	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);
+	}
+
+	public function getSharedAlbumsProperty(): Collection
+	{
+		return $this->topAlbums->shared_albums;
+	}
+}
diff --git a/app/Livewire/Components/Pages/Gallery/BaseAlbumComponent.php b/app/Livewire/Components/Pages/Gallery/BaseAlbumComponent.php
new file mode 100644
index 00000000000..270a9a0e899
--- /dev/null
+++ b/app/Livewire/Components/Pages/Gallery/BaseAlbumComponent.php
@@ -0,0 +1,155 @@
+<?php
+
+namespace App\Livewire\Components\Pages\Gallery;
+
+use App\Enum\ImageOverlayType;
+use App\Enum\LicenseType;
+use App\Enum\MapProviders;
+use App\Http\Resources\Collections\PhotoCollectionResource;
+use App\Livewire\DTO\AlbumFlags;
+use App\Livewire\DTO\AlbumFormatted;
+use App\Livewire\DTO\AlbumRights;
+use App\Livewire\DTO\Layouts;
+use App\Livewire\DTO\PhotoFlags;
+use App\Livewire\DTO\SessionFlags;
+use App\Livewire\Traits\AlbumsPhotosContextMenus;
+use App\Livewire\Traits\Notify;
+use App\Livewire\Traits\SilentUpdate;
+use App\Livewire\Traits\UsePhotoViewActions;
+use App\Models\Album as ModelsAlbum;
+use App\Models\Configs;
+use App\Models\Photo;
+use Illuminate\Pagination\LengthAwarePaginator;
+use Illuminate\Support\Collection;
+use Illuminate\View\View;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+/**
+ * Album sub module.
+ *
+ * We just load the layout from config and render.
+ * The variable $album is automatically mounted from the Livewire call
+ */
+abstract class BaseAlbumComponent extends Component
+{
+	use AlbumsPhotosContextMenus;
+	use SilentUpdate;
+	use Notify;
+
+	use UsePhotoViewActions;
+
+	protected Layouts $layouts;
+
+	#[Locked] public ?string $albumId = null;
+	#[Locked] public ?string $photoId = null;
+	#[Locked] public ?string $header_url = null;
+	#[Locked] public int $num_albums = 0;
+	#[Locked] public int $num_photos = 0;
+	#[Locked] public int $num_users = 0;
+	#[Locked] public PhotoFlags $photoFlags;
+	#[Locked] public AlbumFlags $flags;
+	#[Locked] public AlbumRights $rights;
+	public SessionFlags $sessionFlags;
+
+	/**
+	 * Rendering of the blade template.
+	 *
+	 * @return View
+	 */
+	abstract public function render(): View;
+
+	/**
+	 * Return the photoIDs (no need to wait to compute the geometry).
+	 *
+	 * @return PhotoCollectionResource
+	 */
+	final public function getPhotosResourceProperty(): PhotoCollectionResource
+	{
+		return PhotoCollectionResource::make($this->getPhotosProperty());
+	}
+
+	/**
+	 * Return the photoIDs (no need to wait to compute the geometry).
+	 *
+	 * @return Collection<Photo>
+	 */
+	abstract public function getPhotosProperty(): Collection|LengthAwarePaginator;
+
+	/**
+	 * Return the albums.
+	 *
+	 * @return Collection<ModelsAlbum>|null
+	 */
+	abstract public function getAlbumsProperty(): Collection|null;
+
+	/**
+	 * Used in the JS front-end to manage the selected albums.
+	 *
+	 * @return array
+	 */
+	abstract public function getAlbumIDsProperty(): array;
+
+	/**
+	 * Back property used to retrieve the URL to step back and back arrow.
+	 *
+	 * @return string
+	 */
+	abstract public function getBackProperty(): string;
+
+	/**
+	 * Title property for the header.
+	 *
+	 * @return string
+	 */
+	abstract public function getTitleProperty(): string;
+
+	/**
+	 * Data for Details & Hero.
+	 *
+	 * @return AlbumFormatted|null
+	 */
+	abstract public function getAlbumFormattedProperty(): AlbumFormatted|null;
+
+	/**
+	 * Return the data used to generate the layout on the front-end.
+	 *
+	 * @return Layouts
+	 */
+	final public function getLayoutsProperty(): Layouts
+	{
+		return $this->layouts;
+	}
+
+	/**
+	 * Getter for the license types in the front-end.
+	 *
+	 * @return array associated array of license type and their localization
+	 */
+	final public function getLicensesProperty(): array
+	{
+		return LicenseType::localized();
+	}
+
+	/**
+	 * Getter for the OverlayType displayed in photoView.
+	 *
+	 * @return string enum
+	 */
+	final public function getOverlayTypeProperty(): string
+	{
+		return Configs::getValueAsEnum('image_overlay_type', ImageOverlayType::class)->value;
+	}
+
+	final public function getMapProviderProperty(): MapProviders
+	{
+		return Configs::getValueAsEnum('map_provider', MapProviders::class);
+	}
+
+	/**
+	 * Message displayed when no result or the page is empty.
+	 *
+	 * @return string
+	 */
+	abstract public function getNoImagesAlbumsMessageProperty(): string;
+}
diff --git a/app/Livewire/Components/Pages/Gallery/Search.php b/app/Livewire/Components/Pages/Gallery/Search.php
new file mode 100644
index 00000000000..dfb8c284ec1
--- /dev/null
+++ b/app/Livewire/Components/Pages/Gallery/Search.php
@@ -0,0 +1,168 @@
+<?php
+
+namespace App\Livewire\Components\Pages\Gallery;
+
+use App\Actions\Search\AlbumSearch;
+use App\Actions\Search\PhotoSearch;
+use App\Enum\ColumnSortingPhotoType;
+use App\Enum\OrderSortingType;
+use App\Livewire\DTO\AlbumFlags;
+use App\Livewire\DTO\AlbumRights;
+use App\Livewire\DTO\Layouts;
+use App\Livewire\DTO\PhotoFlags;
+use App\Livewire\DTO\SessionFlags;
+use App\Models\Album as ModelsAlbum;
+use App\Models\Configs;
+use App\Models\Photo;
+use Illuminate\Pagination\LengthAwarePaginator;
+use Illuminate\Support\Collection;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\View\View;
+use Livewire\Attributes\Locked;
+use Livewire\Attributes\Url;
+use Livewire\WithPagination;
+use function Safe\base64_decode;
+
+/**
+ * Search page.
+ */
+class Search extends BaseAlbumComponent
+{
+	use WithPagination;
+	private AlbumSearch $albumSearch;
+	private PhotoSearch $photoSearch;
+
+	/** @var LengthAwarePaginator<Photo> */
+	private LengthAwarePaginator $photos;
+	/** @var Collection<ModelsAlbum> */
+	private Collection $albums;
+
+	#[Locked]
+	#[Url(history: true)]
+	public string $urlQuery = '';
+	public string $searchQuery = ''; // ! Wired
+
+	/** @var string[] */
+	protected array $terms = [];
+
+	#[Locked]
+	public int $search_minimum_length_required;
+
+	public function boot(): void
+	{
+		$this->layouts = new Layouts();
+		$this->albumSearch = resolve(AlbumSearch::class);
+		$this->photoSearch = resolve(PhotoSearch::class);
+		$this->photos = new LengthAwarePaginator([], 0, 200);
+		$this->albums = collect([]);
+		$this->num_albums = 0;
+		$this->num_photos = 0;
+		$this->search_minimum_length_required = Configs::getValueAsInt('search_minimum_length_required');
+	}
+
+	public function mount(string $albumId = ''): void
+	{
+		if (!Auth::check() && !Configs::getValueAsBool('search_public')) {
+			redirect(route('livewire-gallery'));
+		}
+
+		$this->rights = AlbumRights::make(null);
+
+		$this->flags = new AlbumFlags();
+		$this->photoFlags = new PhotoFlags(
+			can_autoplay: true,
+			can_rotate: Configs::getValueAsBool('editor_enabled'),
+			can_edit: false,
+		);
+		$this->sessionFlags = SessionFlags::get();
+		$this->flags->is_base_album = false;
+		$this->flags->is_accessible = true;
+	}
+
+	/**
+	 * Whenever searchQuery is updated, we recompute the urlQuery.
+	 *
+	 * @return void
+	 */
+	public function updatedSearchQuery(): void
+	{
+		$this->urlQuery = base64_encode($this->searchQuery);
+	}
+
+	/**
+	 * Render component.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		$this->searchQuery = base64_decode($this->urlQuery, true);
+		$this->terms = explode(' ', str_replace(
+			['\\', '%', '_'],
+			['\\\\', '\\%', '\\_'],
+			$this->searchQuery
+		));
+
+		if (strlen($this->searchQuery) >= $this->search_minimum_length_required) {
+			/** @var LengthAwarePaginator<Photo> $photoResults */
+			/** @disregard P1013 Undefined method withQueryString() (stupid intelephense) */
+			$photoResults = $this->photoSearch
+				->sqlQuery($this->terms)
+				->orderBy(ColumnSortingPhotoType::TAKEN_AT->value, OrderSortingType::ASC->value)
+				->paginate(Configs::getValueAsInt('search_pagination_limit'))
+				->withQueryString();
+			$this->photos = $photoResults;
+			/** @var Collection<ModelsAlbum> $albumResults */
+			$albumResults = $this->albumSearch->queryAlbums($this->terms);
+			$this->albums = $albumResults;
+			$this->num_albums = $this->albums->count();
+			$this->num_photos = $this->photos->count();
+			$this->albumId = '';
+			$this->photoId = '';
+		}
+
+		return view('livewire.pages.gallery.search');
+	}
+
+	/**
+	 * Return the photos.
+	 *
+	 * @return Collection<Photo>
+	 */
+	public function getPhotosProperty(): Collection
+	{
+		return collect($this->photos->items());
+	}
+
+	public function getAlbumsProperty(): ?Collection
+	{
+		return $this->albums;
+	}
+
+	public function getAlbumIDsProperty(): array
+	{
+		return $this->albums->map(fn ($v, $k) => $v->id)->all();
+	}
+
+	// For now, simple
+	public function getBackProperty(): string
+	{
+		return route('livewire-gallery');
+	}
+
+	// For now, simple
+	public function getTitleProperty(): string
+	{
+		return __('lychee.SEARCH');
+	}
+
+	public function getAlbumFormattedProperty(): null
+	{
+		return null;
+	}
+
+	public function getNoImagesAlbumsMessageProperty(): string
+	{
+		return strlen($this->searchQuery) < 3 ? '' : 'No results';
+	}
+}
diff --git a/app/Livewire/Components/Pages/Gallery/SensitiveWarning.php b/app/Livewire/Components/Pages/Gallery/SensitiveWarning.php
new file mode 100644
index 00000000000..75fd651f999
--- /dev/null
+++ b/app/Livewire/Components/Pages/Gallery/SensitiveWarning.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace App\Livewire\Components\Pages\Gallery;
+
+use App\Contracts\Livewire\Openable;
+use App\Contracts\Models\AbstractAlbum;
+use App\Livewire\Traits\UseOpenable;
+use App\Models\Album;
+use App\Models\Configs;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\View\View;
+use Livewire\Component;
+
+/**
+ * This is the overlay displaying the NSFW warning.
+ */
+class SensitiveWarning extends Component implements Openable
+{
+	use UseOpenable;
+
+	// Text to be displayed. THIS IS HTML UNSANITIZED
+	public string $text;
+	public bool $isBlurred;
+
+	/**
+	 * Prepare the warning if required by the album.
+	 * - We also give the ability to override the text in LANG by the user.
+	 *
+	 * @param AbstractAlbum|null $album
+	 *
+	 * @return void
+	 */
+	public function mount(?AbstractAlbum $album = null): void
+	{
+		$this->text = Configs::getValueAsString('nsfw_banner_override');
+		$this->isBlurred = Configs::getValueAsBool('nsfw_banner_blur_backdrop');
+
+		// TODO: remember if was open or not.
+
+		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..b07d8c5eead
--- /dev/null
+++ b/app/Livewire/Components/Pages/Jobs.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace App\Livewire\Components\Pages;
+
+use App\Exceptions\ConfigurationKeyMissingException;
+use App\Livewire\Components\Menus\LeftMenu;
+use App\Models\Configs;
+use App\Models\JobHistory;
+use App\Policies\SettingsPolicy;
+use Illuminate\Database\Eloquent\Collection;
+use Illuminate\Support\Facades\Gate;
+use Illuminate\View\View;
+use Livewire\Component;
+
+class Jobs extends Component
+{
+	/**
+	 * Mount the component of the front-end.
+	 *
+	 * @return void
+	 */
+	public function mount(): void
+	{
+		Gate::authorize(SettingsPolicy::CAN_SEE_LOGS, [Configs::class]);
+	}
+
+	/**
+	 * We use a computed property instead of attributes
+	 * in order to avoid poluting the data sent to the user.
+	 *
+	 * @return Collection
+	 *
+	 * @throws ConfigurationKeyMissingException
+	 */
+	public function getJobsProperty(): Collection
+	{
+		return JobHistory::query()
+			->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
+	{
+		$this->dispatch('closeLeftMenu')->to(LeftMenu::class);
+
+		return $this->redirect(route('livewire-gallery'), true);
+	}
+}
diff --git a/app/Livewire/Components/Pages/Landing.php b/app/Livewire/Components/Pages/Landing.php
new file mode 100644
index 00000000000..7fee45e3b4d
--- /dev/null
+++ b/app/Livewire/Components/Pages/Landing.php
@@ -0,0 +1,43 @@
+<?php
+
+namespace App\Livewire\Components\Pages;
+
+use App\Models\Configs;
+use Illuminate\Support\Facades\URL;
+use Illuminate\Support\Str;
+use Illuminate\View\View;
+use Livewire\Component;
+
+class Landing extends Component
+{
+	public string $title;
+	public string $subtitle;
+	public string $background;
+
+	/**
+	 * @return void
+	 */
+	public function mount(): void
+	{
+		if (!Configs::getValueAsBool('landing_page_enable')) {
+			redirect(route('livewire-gallery'));
+		}
+		$this->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/Map.php b/app/Livewire/Components/Pages/Map.php
new file mode 100644
index 00000000000..63691fff544
--- /dev/null
+++ b/app/Livewire/Components/Pages/Map.php
@@ -0,0 +1,91 @@
+<?php
+
+namespace App\Livewire\Components\Pages;
+
+use App\Actions\Album\PositionData as AlbumPositionData;
+use App\Actions\Albums\PositionData as RootPositionData;
+use App\Contracts\Models\AbstractAlbum;
+use App\Enum\MapProviders;
+use App\Factories\AlbumFactory;
+use App\Models\Configs;
+use App\Policies\AlbumPolicy;
+use Illuminate\Contracts\Container\BindingResolutionException;
+use Illuminate\Support\Facades\Gate;
+use Illuminate\View\View;
+use Livewire\Attributes\Locked;
+use Livewire\Component;
+
+class Map extends Component
+{
+	private RootPositionData $rootPositionData;
+	private AlbumPositionData $albumPositionData;
+	private AlbumFactory $albumFactory;
+	private ?AbstractAlbum $album = null;
+
+	#[Locked] public string $title;
+	#[Locked] public ?string $albumId = null;
+	public MapProviders $map_provider;
+
+	/**
+	 * Render component.
+	 *
+	 * @return View
+	 *
+	 * @throws BindingResolutionException
+	 */
+	public function render(): View
+	{
+		$this->map_provider = Configs::getValueAsEnum('map_provider', MapProviders::class);
+
+		return view('livewire.pages.gallery.map');
+	}
+
+	public function mount(?string $albumId = null): void
+	{
+		$this->albumId = $albumId;
+
+		if ($albumId !== null) {
+			$this->album = $this->albumFactory->findAbstractAlbumOrFail($this->albumId);
+			$this->title = $this->album->title;
+		}
+
+		Gate::authorize(AlbumPolicy::CAN_ACCESS_MAP, [AbstractAlbum::class, $this->album]);
+	}
+
+	/**
+	 * @return array
+	 */
+	public function getDataProperty(): array
+	{
+		if ($this->albumId === null) {
+			/** @var array $ret */
+			$ret = $this->rootPositionData->do()->toArray(request());
+
+			return $ret;
+		}
+
+		$includeSubAlbums = Configs::getValueAsBool('map_include_subalbums');
+
+		/** @var array $ret */
+		$ret = $this->albumPositionData->get($this->album, $includeSubAlbums)->toArray(request());
+
+		return $ret;
+	}
+
+	public function boot(): void
+	{
+		$this->albumFactory = resolve(AlbumFactory::class);
+		$this->rootPositionData = resolve(RootPositionData::class);
+		$this->albumPositionData = resolve(AlbumPositionData::class);
+		$this->title = Configs::getValueAsString('site_title');
+	}
+
+	public function back(): mixed
+	{
+		if ($this->albumId === null) {
+			return $this->redirect(route('livewire-gallery'), true);
+		} else {
+			return $this->redirect(route('livewire-gallery-album', ['albumId' => $this->albumId]), true);
+		}
+	}
+}
diff --git a/app/Livewire/Components/Pages/Profile.php b/app/Livewire/Components/Pages/Profile.php
new file mode 100644
index 00000000000..5c9f140a387
--- /dev/null
+++ b/app/Livewire/Components/Pages/Profile.php
@@ -0,0 +1,58 @@
+<?php
+
+namespace App\Livewire\Components\Pages;
+
+use App\Exceptions\ConfigurationKeyMissingException;
+use App\Livewire\Components\Menus\LeftMenu;
+use App\Models\Configs;
+use App\Models\User;
+use App\Policies\UserPolicy;
+use Illuminate\Support\Facades\Gate;
+use Illuminate\View\View;
+use Livewire\Component;
+
+/**
+ * Profile page, allows the user to:
+ * - Change their username,
+ * - Change their password,
+ * - Set up their email for notifications
+ * - Update their API Token
+ * - Set up their U2F.
+ */
+class Profile extends Component
+{
+	public bool $are_notification_active = false;
+	public bool $is_token_auh_active = true;
+
+	/**
+	 * Set up the profile page.
+	 *
+	 * @return void
+	 *
+	 * @throws ConfigurationKeyMissingException
+	 */
+	public function mount(): void
+	{
+		Gate::authorize(UserPolicy::CAN_EDIT, User::class);
+
+		$this->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
+	{
+		$this->dispatch('closeLeftMenu')->to(LeftMenu::class);
+
+		return $this->redirect(route('livewire-gallery'), true);
+	}
+}
diff --git a/app/Livewire/Components/Pages/Settings.php b/app/Livewire/Components/Pages/Settings.php
new file mode 100644
index 00000000000..bd026a5440a
--- /dev/null
+++ b/app/Livewire/Components/Pages/Settings.php
@@ -0,0 +1,97 @@
+<?php
+
+namespace App\Livewire\Components\Pages;
+
+use App\Exceptions\InsufficientFilesystemPermissions;
+use App\Livewire\Components\Menus\LeftMenu;
+use App\Livewire\Traits\InteractWithModal;
+use App\Livewire\Traits\Notify;
+use App\Models\Configs;
+use App\Policies\SettingsPolicy;
+use Illuminate\Support\Facades\Gate;
+use Illuminate\Support\Facades\Storage;
+use Illuminate\View\View;
+use Livewire\Component;
+
+class Settings extends Component
+{
+	/*
+	* Add interaction with modal
+	*/
+	use InteractWithModal;
+	use Notify;
+
+	public string $css;
+	public string $js;
+
+	/**
+	 * Mount the component of the front-end.
+	 *
+	 * @return void
+	 */
+	public function mount(): void
+	{
+		Gate::authorize(SettingsPolicy::CAN_EDIT, [Configs::class]);
+		$this->css = Storage::disk('dist')->get('user.css');
+		$this->js = Storage::disk('dist')->get('custom.js');
+	}
+
+	/**
+	 * Rendering of the front-end.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		return view('livewire.pages.settings');
+	}
+
+	public function back(): mixed
+	{
+		$this->dispatch('closeLeftMenu')->to(LeftMenu::class);
+
+		return $this->redirect(route('livewire-gallery'), true);
+	}
+
+	/**
+	 * Takes the css input text and put it into `dist/user.css`.
+	 * This allows admins to actually personalize the look of their
+	 * installation.
+	 *
+	 * @return void
+	 *
+	 * @throws InsufficientFilesystemPermissions
+	 */
+	public function setCSS(): void
+	{
+		Gate::authorize(SettingsPolicy::CAN_EDIT, Configs::class);
+
+		if (Storage::disk('dist')->put('user.css', $this->css) === false) {
+			if (Storage::disk('dist')->get('user.css') !== $this->css) {
+				throw new InsufficientFilesystemPermissions('Could not save CSS');
+			}
+		}
+		$this->notify(__('lychee.CHANGE_SUCCESS'));
+	}
+
+	/**
+	 * Takes the js input text and put it into `dist/custom.js`.
+	 * This allows admins to actually execute custom js code on their
+	 * Lychee-Laravel installation.
+	 *
+	 * @return void
+	 *
+	 * @throws InsufficientFilesystemPermissions
+	 */
+	public function setJS(): void
+	{
+		Gate::authorize(SettingsPolicy::CAN_EDIT, Configs::class);
+
+		if (Storage::disk('dist')->put('custom.js', $this->js) === false) {
+			if (Storage::disk('dist')->get('custom.js') !== $this->js) {
+				throw new InsufficientFilesystemPermissions('Could not save JS');
+			}
+		}
+		$this->notify(__('lychee.CHANGE_SUCCESS'));
+	}
+}
diff --git a/app/Livewire/Components/Pages/Sharing.php b/app/Livewire/Components/Pages/Sharing.php
new file mode 100644
index 00000000000..a5249aad4fa
--- /dev/null
+++ b/app/Livewire/Components/Pages/Sharing.php
@@ -0,0 +1,76 @@
+<?php
+
+namespace App\Livewire\Components\Pages;
+
+use App\Contracts\Models\AbstractAlbum;
+use App\Exceptions\ConfigurationKeyMissingException;
+use App\Livewire\Components\Menus\LeftMenu;
+use App\Models\AccessPermission;
+use App\Models\BaseAlbumImpl;
+use App\Models\User;
+use App\Policies\AlbumPolicy;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Gate;
+use Illuminate\View\View;
+use Livewire\Component;
+
+/**
+ * Sharing page, allows the user to have a summary of all the sharing rights applied to their albums.
+ * Allows to edit or delete.
+ * Does not allow to add!
+ */
+class Sharing extends Component
+{
+	/**
+	 * return the list of Permissions for current user.
+	 *
+	 * @return array<int,AccessPermission>
+	 */
+	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
+	{
+		$this->dispatch('closeLeftMenu')->to(LeftMenu::class);
+
+		return $this->redirect(route('livewire-gallery'), true);
+	}
+
+	public function delete(int $id): void
+	{
+		$perm = AccessPermission::with('album')->findOrFail($id);
+		Gate::authorize(AlbumPolicy::CAN_SHARE_WITH_USERS, [AbstractAlbum::class, $perm->album]);
+
+		AccessPermission::query()->where('id', '=', $id)->delete();
+	}
+}
diff --git a/app/Livewire/Components/Pages/Users.php b/app/Livewire/Components/Pages/Users.php
new file mode 100644
index 00000000000..c1d3032fb30
--- /dev/null
+++ b/app/Livewire/Components/Pages/Users.php
@@ -0,0 +1,121 @@
+<?php
+
+namespace App\Livewire\Components\Pages;
+
+use App\Actions\User\Create;
+use App\Exceptions\UnauthorizedException;
+use App\Livewire\Components\Menus\LeftMenu;
+use App\Models\User;
+use App\Policies\UserPolicy;
+use Illuminate\Database\Eloquent\Collection;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Gate;
+use Illuminate\View\View;
+use Livewire\Component;
+
+/**
+ * User management page.
+ * Here we create, delete, modify users.
+ */
+class Users extends Component
+{
+	public Collection $users;
+	private Create $create;
+
+	public string $username = '';
+	public string $password = '';
+	public bool $may_upload = false;
+	public bool $may_edit_own_settings = false;
+
+	/**
+	 * Init the private properties.
+	 *
+	 * @return void
+	 */
+	public function boot(): void
+	{
+		$this->create = resolve(Create::class);
+	}
+
+	/**
+	 * Load users.
+	 *
+	 * @return void
+	 */
+	public function mount(): void
+	{
+		Gate::authorize(UserPolicy::CAN_CREATE_OR_EDIT_OR_DELETE, User::class);
+
+		$this->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.
+	 *
+	 * @return void
+	 */
+	public function create(): void
+	{
+		Gate::authorize(UserPolicy::CAN_CREATE_OR_EDIT_OR_DELETE, User::class);
+
+		// Create user
+		$this->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
+	{
+		$this->dispatch('closeLeftMenu')->to(LeftMenu::class);
+
+		return $this->redirect(route('livewire-gallery'), true);
+	}
+
+	/**
+	 * Delete an existing credential.
+	 *
+	 * @param int $id
+	 *
+	 * @return void
+	 */
+	public function delete(int $id): void
+	{
+		if ($id === Auth::id()) {
+			throw new UnauthorizedException('You are not allowed to delete yourself');
+		}
+
+		Gate::authorize(UserPolicy::CAN_CREATE_OR_EDIT_OR_DELETE, [User::class]);
+
+		User::where('id', '=', $id)->delete();
+		$this->loadUsers();
+	}
+}
diff --git a/app/Livewire/DTO/AlbumFlags.php b/app/Livewire/DTO/AlbumFlags.php
new file mode 100644
index 00000000000..0a0add67c14
--- /dev/null
+++ b/app/Livewire/DTO/AlbumFlags.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace App\Livewire\DTO;
+
+use App\Models\Configs;
+use Illuminate\Support\Facades\Auth;
+
+class AlbumFlags
+{
+	public function __construct(
+		public bool $is_accessible = false,
+		public bool $is_password_protected = false,
+		public bool $is_map_accessible = false,
+		public bool $is_base_album = false,
+		public bool $is_mod_frame_enabled = false,
+	) {
+		$this->is_map_accessible = Configs::getValueAsBool('map_display');
+		$this->is_map_accessible = $this->is_map_accessible && (Auth::check() || Configs::getValueAsBool('map_display_public'));
+		$this->is_mod_frame_enabled = Configs::getValueAsBool('mod_frame_enabled');
+	}
+}
\ No newline at end of file
diff --git a/app/Livewire/DTO/AlbumFormatted.php b/app/Livewire/DTO/AlbumFormatted.php
new file mode 100644
index 00000000000..da6e042a0ee
--- /dev/null
+++ b/app/Livewire/DTO/AlbumFormatted.php
@@ -0,0 +1,43 @@
+<?php
+
+namespace App\Livewire\DTO;
+
+use App\Contracts\Models\AbstractAlbum;
+use App\Enum\LicenseType;
+use App\Models\Album;
+use App\Models\Configs;
+use App\Models\Extensions\BaseAlbum;
+
+class AlbumFormatted
+{
+	public ?string $url;
+	public string $title;
+	public ?string $min_taken_at = null;
+	public ?string $max_taken_at = null;
+	public string $album_id;
+	public string $license = '';
+	public int $num_children = 0;
+	public int $num_photos = 0;
+	public bool $can_download;
+	public ?string $created_at = null;
+	public ?string $description = null;
+
+	public function __construct(AbstractAlbum $album, ?string $url)
+	{
+		$min_max_date_format = Configs::getValueAsString('date_format_hero_min_max');
+		$create_date_format = Configs::getValueAsString('date_format_hero_created_at');
+		$this->url = $url;
+		$this->title = $album->title;
+		if ($album instanceof BaseAlbum) {
+			$this->min_taken_at = $album->min_taken_at?->format($min_max_date_format);
+			$this->max_taken_at = $album->max_taken_at?->format($min_max_date_format);
+			$this->created_at = $album->created_at->format($create_date_format);
+			$this->description = $album->description;
+		}
+		if ($album instanceof Album) {
+			$this->num_children = $album->num_children;
+			$this->num_photos = $album->num_photos;
+			$this->license = $album->license === LicenseType::NONE ? '' : $album->license->localization();
+		}
+	}
+}
\ No newline at end of file
diff --git a/app/Livewire/DTO/AlbumRights.php b/app/Livewire/DTO/AlbumRights.php
new file mode 100644
index 00000000000..764aff8f41b
--- /dev/null
+++ b/app/Livewire/DTO/AlbumRights.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace App\Livewire\DTO;
+
+use App\Contracts\Models\AbstractAlbum;
+use App\Livewire\Traits\UseWireable;
+use App\Policies\AlbumPolicy;
+use Illuminate\Support\Facades\Gate;
+use Livewire\Wireable;
+
+class AlbumRights implements Wireable
+{
+	use UseWireable;
+
+	public function __construct(
+		public bool $can_edit = false,
+		public bool $can_share_with_users = false,
+		public bool $can_download = false,
+		public bool $can_upload = false,
+		public bool $can_delete = false,
+	) {
+	}
+
+	/**
+	 * Builder for easy instanciation.
+	 *
+	 * @param AbstractAlbum $abstractAlbum
+	 *
+	 * @return self
+	 */
+	public static function make(?AbstractAlbum $abstractAlbum): AlbumRights
+	{
+		return new self(
+			Gate::check(AlbumPolicy::CAN_EDIT, [AbstractAlbum::class, $abstractAlbum]),
+			Gate::check(AlbumPolicy::CAN_SHARE_WITH_USERS, [AbstractAlbum::class, $abstractAlbum]),
+			Gate::check(AlbumPolicy::CAN_DOWNLOAD, [AbstractAlbum::class, $abstractAlbum]),
+			Gate::check(AlbumPolicy::CAN_UPLOAD, [AbstractAlbum::class, $abstractAlbum]),
+			Gate::check(AlbumPolicy::CAN_DELETE, [AbstractAlbum::class, $abstractAlbum]),
+		);
+	}
+}
diff --git a/app/Livewire/DTO/AlbumsFlags.php b/app/Livewire/DTO/AlbumsFlags.php
new file mode 100644
index 00000000000..567f17b7df8
--- /dev/null
+++ b/app/Livewire/DTO/AlbumsFlags.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace App\Livewire\DTO;
+
+use App\Contracts\Models\AbstractAlbum;
+use App\Livewire\Traits\UseWireable;
+use App\Models\Configs;
+use App\Models\Photo;
+use App\Policies\AlbumPolicy;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Gate;
+use Laragear\WebAuthn\Models\WebAuthnCredential;
+use Livewire\Wireable;
+
+class AlbumsFlags implements Wireable
+{
+	use UseWireable;
+
+	public function __construct(
+		public bool $can_edit = false,
+		public bool $can_use_2fa = false,
+		public bool $is_map_accessible = false,
+		public bool $is_mod_frame_enabled = false,
+		public bool $is_search_accessible = false,
+	) {
+		$count_locations = Photo::whereNotNull('latitude')->whereNotNull('longitude')->count() > 0;
+		$this->is_map_accessible = $count_locations && Configs::getValueAsBool('map_display');
+		$this->is_map_accessible = $this->is_map_accessible && (Auth::check() || Configs::getValueAsBool('map_display_public'));
+		$this->is_mod_frame_enabled = Configs::getValueAsBool('mod_frame_enabled');
+		$this->can_use_2fa = !Auth::check() && (WebAuthnCredential::query()->whereNull('disabled_at')->count() > 0);
+		$this->can_edit = Gate::check(AlbumPolicy::CAN_EDIT, [AbstractAlbum::class]);
+		$this->is_search_accessible = Auth::check() || Configs::getValueAsBool('search_public');
+	}
+}
\ No newline at end of file
diff --git a/app/Livewire/DTO/Layouts.php b/app/Livewire/DTO/Layouts.php
new file mode 100644
index 00000000000..95ed6e9d7b4
--- /dev/null
+++ b/app/Livewire/DTO/Layouts.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace App\Livewire\DTO;
+
+use App\Enum\PhotoLayoutType;
+use App\Models\Configs;
+
+class Layouts
+{
+	public function __construct(
+		public ?string $photos_layout = null,
+		public ?int $photo_layout_justified_row_height = null,
+		public ?int $photo_layout_masonry_column_width = null,
+		public ?int $photo_layout_grid_column_width = null,
+		public ?int $photo_layout_square_column_width = null,
+		public ?int $photo_layout_gap = null,
+	) {
+		$this->photo_layout_justified_row_height ??= Configs::getValueAsInt('photo_layout_justified_row_height');
+		$this->photo_layout_masonry_column_width ??= Configs::getValueAsInt('photo_layout_masonry_column_width');
+		$this->photo_layout_grid_column_width ??= Configs::getValueAsInt('photo_layout_grid_column_width');
+		$this->photo_layout_square_column_width ??= Configs::getValueAsInt('photo_layout_square_column_width');
+		$this->photo_layout_gap ??= Configs::getValueAsInt('photo_layout_gap');
+		$this->photos_layout ??= Configs::getValueAsEnum('layout', PhotoLayoutType::class)->value;
+	}
+
+	public function photos_layout(): PhotoLayoutType
+	{
+		return PhotoLayoutType::from($this->photos_layout);
+	}
+}
diff --git a/app/Livewire/DTO/PhotoFlags.php b/app/Livewire/DTO/PhotoFlags.php
new file mode 100644
index 00000000000..266739b85d9
--- /dev/null
+++ b/app/Livewire/DTO/PhotoFlags.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace App\Livewire\DTO;
+
+use App\Livewire\Traits\UseWireable;
+use Livewire\Wireable;
+
+class PhotoFlags implements Wireable
+{
+	use UseWireable;
+
+	public function __construct(
+		public bool $can_autoplay,
+		public bool $can_rotate,
+		public bool $can_edit,
+	) {
+	}
+}
\ No newline at end of file
diff --git a/app/Livewire/DTO/SessionFlags.php b/app/Livewire/DTO/SessionFlags.php
new file mode 100644
index 00000000000..5f5190a1c29
--- /dev/null
+++ b/app/Livewire/DTO/SessionFlags.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace App\Livewire\DTO;
+
+use App\Models\Configs;
+use Illuminate\Support\Facades\Session;
+
+class SessionFlags
+{
+	public function __construct(
+		public bool $can_fullscreen,
+		public bool $is_fullscreen,
+		public bool $are_photo_details_open,
+		public bool $nsfwAlbumsVisible,
+	) {
+	}
+
+	public static function get(): SessionFlags
+	{
+		$default = new SessionFlags(
+			can_fullscreen: true,
+			is_fullscreen: false,
+			are_photo_details_open: false,
+			nsfwAlbumsVisible: Configs::getValueAsBool('nsfw_visible')
+		);
+
+		return Session::get('session-flags', $default);
+	}
+
+	public function save(): void
+	{
+		Session::put('session-flags', $this);
+	}
+}
\ No newline at end of file
diff --git a/app/Livewire/Forms/AllConfigsForms.php b/app/Livewire/Forms/AllConfigsForms.php
new file mode 100644
index 00000000000..00f9bf6aa7d
--- /dev/null
+++ b/app/Livewire/Forms/AllConfigsForms.php
@@ -0,0 +1,76 @@
+<?php
+
+namespace App\Livewire\Forms;
+
+use App\Exceptions\Internal\LycheeAssertionError;
+use App\Models\Configs;
+use Illuminate\Support\Collection;
+use Illuminate\Validation\ValidationException;
+use Livewire\Attributes\Locked;
+use Livewire\Form;
+
+class AllConfigsForms extends Form
+{
+	/** @var array<int,Configs> */
+	#[Locked]
+	public array $configs;
+
+	/** @var array<int,string> */
+	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<string,string>
+	 */
+	protected $rules = [
+		'values.*' => 'nullable',
+	];
+
+	/**
+	 * Initialize form data.
+	 *
+	 * @param Collection<Configs> $configs
+	 *
+	 * @return void
+	 */
+	public function setConfigs(Collection $configs): void
+	{
+		// ! IMPORTANT, WE MUST use all() to get an array and not use the collections,
+		// ! otherwise this messes up the ordering.
+		$this->configs = $configs->all();
+		$this->values = $configs->map(fn (Configs $c, int $k) => $c->value)->all();
+	}
+
+	/**
+	 * Save form data.
+	 *
+	 * @return void
+	 *
+	 * @throws ValidationException
+	 * @throws LycheeAssertionError
+	 */
+	public function save(): void
+	{
+		$this->validate();
+		$n = count($this->values);
+		if ($n !== count($this->configs)) {
+			throw new LycheeAssertionError('Number of values do not match number of configs');
+		}
+
+		for ($idx = 0; $idx < $n; $idx++) {
+			$c = $this->configs[$idx];
+			$candidateValue = $this->values[$idx];
+			$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.' . $idx, $error_msg);
+			}
+		}
+	}
+}
diff --git a/app/Livewire/Forms/ImportFromServerForm.php b/app/Livewire/Forms/ImportFromServerForm.php
new file mode 100644
index 00000000000..a672b7998f7
--- /dev/null
+++ b/app/Livewire/Forms/ImportFromServerForm.php
@@ -0,0 +1,126 @@
+<?php
+
+namespace App\Livewire\Forms;
+
+use App\Actions\Photo\Strategies\ImportMode;
+use App\Contracts\Http\Requests\RequestAttribute;
+use App\Models\Album;
+use App\Models\Configs;
+use App\Rules\RandomIDRule;
+use Livewire\Form;
+use function Safe\preg_replace;
+use function Safe\preg_split;
+
+class ImportFromServerForm extends Form
+{
+	public ?string $albumID = null;
+	public string $path;
+	/** @var array<int,string> */
+	public array $paths = [];
+	public bool $delete_imported;
+	public bool $skip_duplicates;
+	public bool $import_via_symlink;
+	public bool $resync_metadata;
+
+	/**
+	 * This allows Livewire to know which values of the $configs we
+	 * want to display in the wire:model. Sort of a white listing.
+	 *
+	 * @return array<string,mixed>
+	 */
+	protected function rules(): array
+	{
+		return [
+			RequestAttribute::ALBUM_ID_ATTRIBUTE => ['present', new RandomIDRule(true)],
+			RequestAttribute::PATH_ATTRIBUTE => 'required|array|min:1',
+			RequestAttribute::PATH_ATTRIBUTE . '.*' => 'required|string|distinct',
+			RequestAttribute::DELETE_IMPORTED_ATTRIBUTE => 'sometimes|boolean',
+			RequestAttribute::SKIP_DUPLICATES_ATTRIBUTE => 'sometimes|boolean',
+			RequestAttribute::IMPORT_VIA_SYMLINK_ATTRIBUTE => 'sometimes|boolean',
+			RequestAttribute::RESYNC_METADATA_ATTRIBUTE => 'sometimes|boolean',
+		];
+	}
+
+	/**
+	 * split path into paths array.
+	 *
+	 * @return void
+	 */
+	public function prepare()
+	{
+		$subject = $this->path;
+
+		// 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.
+		$matches = $this->split_escaped(' ', '\\', $subject);
+
+		// drop first element: matched elements start at index 1
+		// array_shift($matches);
+		$this->paths = array_map(fn ($v) => str_replace('\\ ', ' ', $v), $matches);
+
+		// Remove empty elements
+		$this->paths = array_filter($this->paths, fn ($v) => $v === '');
+	}
+
+	/**
+	 * Dark magic code from Stack Overflow
+	 * https://stackoverflow.com/a/27135602.
+	 *
+	 * @param string $delimiter
+	 * @param string $escaper
+	 * @param string $text
+	 *
+	 * @return string[]
+	 */
+	private function split_escaped(string $delimiter, string $escaper, string $text): array
+	{
+		$d = preg_quote($delimiter, '~');
+		$e = preg_quote($escaper, '~');
+		$tokens = preg_split(
+			'~' . $e . '(' . $e . '|' . $d . ')(*SKIP)(*FAIL)|' . $d . '~',
+			$text
+		);
+		$escaperReplacement = str_replace(['\\', '$'], ['\\\\', '\\$'], $escaper);
+		$delimiterReplacement = str_replace(['\\', '$'], ['\\\\', '\\$'], $delimiter);
+
+		return preg_replace(
+			['~' . $e . $e . '~', '~' . $e . $d . '~'],
+			[$escaperReplacement, $delimiterReplacement],
+			$tokens
+		);
+	}
+
+	/**
+	 * Initialize form data.
+	 *
+	 * @param ?string $albumID
+	 *
+	 * @return void
+	 */
+	public function init(?string $albumID): void
+	{
+		$this->albumID = $albumID;
+		$this->path = public_path('uploads/import/');
+		$this->delete_imported = Configs::getValueAsBool('delete_imported');
+		$this->import_via_symlink = !Configs::getValueAsBool('delete_imported') && Configs::getValueAsBool('import_via_symlink');
+		$this->skip_duplicates = Configs::getValueAsBool('skip_duplicates');
+		$this->resync_metadata = false;
+	}
+
+	public function getAlbum(): null|Album
+	{
+		/** @var Album $album */
+		$album = $this->albumID === null ? null : Album::query()->findOrFail($this->albumID);
+
+		return $album;
+	}
+
+	public function getImportMode(): ImportMode
+	{
+		return new ImportMode($this->delete_imported, $this->skip_duplicates, $this->import_via_symlink, $this->resync_metadata);
+	}
+}
diff --git a/app/Livewire/Forms/ImportFromUrlForm.php b/app/Livewire/Forms/ImportFromUrlForm.php
new file mode 100644
index 00000000000..c9427a3d595
--- /dev/null
+++ b/app/Livewire/Forms/ImportFromUrlForm.php
@@ -0,0 +1,77 @@
+<?php
+
+namespace App\Livewire\Forms;
+
+use App\Contracts\Http\Requests\RequestAttribute;
+use App\Models\Album;
+use App\Rules\RandomIDRule;
+use Livewire\Attributes\Locked;
+use Livewire\Form;
+
+class ImportFromUrlForm extends Form
+{
+	#[Locked]
+	public ?string $albumID = null;
+	#[Locked]
+	/** @var array<int,string> */
+	public array $urls = [];
+
+	public string $url = '';
+
+	/**
+	 * This allows Livewire to know which values of the $configs we
+	 * want to display in the wire:model. Sort of a white listing.
+	 *
+	 * @return array<string,mixed>
+	 */
+	protected function rules(): array
+	{
+		return [
+			RequestAttribute::ALBUM_ID_ATTRIBUTE => ['present', new RandomIDRule(true)],
+			RequestAttribute::URLS_ATTRIBUTE => 'required|array|min:1',
+			RequestAttribute::URLS_ATTRIBUTE . '.*' => 'required|string',
+		];
+	}
+
+	/**
+	 * split path into paths array.
+	 *
+	 * @return void
+	 */
+	public function prepare()
+	{
+		$this->urls = [$this->url];
+
+		// 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.
+		// ? We can't use URL encode because we need to preserve :// and ?
+		$this->urls = str_replace(' ', '%20', $this->urls);
+	}
+
+	/**
+	 * Initialize form data.
+	 *
+	 * @param ?string $albumID
+	 *
+	 * @return void
+	 */
+	public function init(?string $albumID): void
+	{
+		$this->albumID = $albumID;
+	}
+
+	public function getAlbum(): null|Album
+	{
+		/** @var Album $album */
+		$album = $this->albumID === null ? null : Album::query()->findOrFail($this->albumID);
+
+		return $album;
+	}
+}
diff --git a/app/Livewire/Forms/PhotoUpdateForm.php b/app/Livewire/Forms/PhotoUpdateForm.php
new file mode 100644
index 00000000000..cb9a3133490
--- /dev/null
+++ b/app/Livewire/Forms/PhotoUpdateForm.php
@@ -0,0 +1,103 @@
+<?php
+
+namespace App\Livewire\Forms;
+
+use App\Contracts\Http\Requests\RequestAttribute;
+use App\Enum\LicenseType;
+use App\Http\RuleSets\Photo\SetPhotoDescriptionRuleSet;
+use App\Models\Photo;
+use App\Rules\TitleRule;
+use Illuminate\Support\Facades\Validator as ValidatorFacade;
+use Illuminate\Validation\Rules\Enum;
+use Illuminate\Validation\Validator;
+use Livewire\Attributes\Locked;
+use Livewire\Drawer\Utils;
+
+class PhotoUpdateForm
+{
+	private ?Photo $photo = null;
+	/** @var array<int,string> */
+	#[Locked] public array $tags = [];
+	#[Locked] public string $date = '';
+	public function __construct(
+		public string $photoID,
+		public string $title,
+		public string $description,
+		public string $tagsWithComma,
+		public string $uploadDate,
+		public string $uploadTz,
+		public string $license,
+	) {
+		$this->tags = collect(explode(',', $this->tagsWithComma))->map(fn ($v) => trim($v))->filter(fn ($v) => $v !== '')->all();
+		$this->date = $this->uploadDate . ':' . $this->uploadTz;
+	}
+
+	/**
+	 * This allows Livewire to know which values of the $configs we
+	 * want to display in the wire:model. Sort of a white listing.
+	 *
+	 * @return array<string,mixed>
+	 */
+	protected function rules(): array
+	{
+		return [
+			RequestAttribute::TITLE_ATTRIBUTE => ['required', new TitleRule()],
+			...SetPhotoDescriptionRuleSet::rules(),
+			RequestAttribute::TAGS_ATTRIBUTE => 'present|array',
+			RequestAttribute::TAGS_ATTRIBUTE . '.*' => 'required|string|min:1',
+			RequestAttribute::LICENSE_ATTRIBUTE => ['required', new Enum(LicenseType::class)],
+			RequestAttribute::DATE_ATTRIBUTE => 'required|date',
+		];
+	}
+
+	/**
+	 * Validate form.
+	 *
+	 * @return array<int,array<string>>
+	 */
+	public function validate(): array
+	{
+		/** @var Validator $validator */
+		$validator = ValidatorFacade::make($this->all(), $this->rules());
+
+		if ($validator->fails()) {
+			return $validator->getMessageBag()->messages();
+		}
+
+		return [];
+	}
+
+	/**
+	 * Fetch photo associated with request.
+	 *
+	 * @return Photo
+	 */
+	public function getPhoto(): Photo
+	{
+		$this->photo = Photo::query()->findOrFail($this->photoID);
+
+		return $this->photo;
+	}
+
+	/**
+	 * Save data in photo.
+	 *
+	 * @return void
+	 */
+	public function save(): void
+	{
+		$photo = Photo::query()->where('id', '=', $this->photoID)->first();
+
+		$photo->title = $this->title;
+		$photo->description = $this->description;
+		$photo->created_at = $this->date;
+		$photo->tags = $this->tags;
+		$photo->license = LicenseType::from($this->license);
+		$photo->save();
+	}
+
+	public function all(): array
+	{
+		return Utils::getPublicProperties($this);
+	}
+}
diff --git a/app/Livewire/Synth/AlbumFlagsSynth.php b/app/Livewire/Synth/AlbumFlagsSynth.php
new file mode 100644
index 00000000000..f98a47633d9
--- /dev/null
+++ b/app/Livewire/Synth/AlbumFlagsSynth.php
@@ -0,0 +1,80 @@
+<?php
+
+namespace App\Livewire\Synth;
+
+use App\Exceptions\Internal\LycheeLogicException;
+use App\Livewire\DTO\AlbumFlags;
+use Livewire\Mechanisms\HandleComponents\Synthesizers\Synth;
+
+class AlbumFlagsSynth extends Synth
+{
+	public static string $key = 'af';
+
+	public static function match(mixed $target): bool
+	{
+		return $target instanceof AlbumFlags;
+	}
+
+	/**
+	 * @param AlbumFlags $target
+	 *
+	 * @return array<int,array<string,bool>>
+	 */
+	public function dehydrate($target): array
+	{
+		$result = [];
+		$cls = new \ReflectionClass(AlbumFlags::class);
+		$props = $cls->getProperties(\ReflectionProperty::IS_PUBLIC);
+		foreach ($props as $prop) {
+			$propertyValue = $prop->getValue($target);
+			if (is_object($propertyValue)) {
+				throw new LycheeLogicException(sprintf('wrong value type for %s', get_class($propertyValue)));
+			}
+			$result[$prop->getName()] = $propertyValue;
+		}
+
+		return [$result, []];
+	}
+
+	/**
+	 * @param array<string,bool> $value
+	 *
+	 * @return AlbumFlags
+	 */
+	public function hydrate($value): AlbumFlags
+	{
+		$cls = new \ReflectionClass(AlbumFlags::class);
+
+		/** @var AlbumFlags $flags */
+		$flags = $cls->newInstanceWithoutConstructor();
+		$props = $cls->getProperties(\ReflectionProperty::IS_PUBLIC);
+		foreach ($props as $prop) {
+			$flags->{$prop->getName()} = $value[$prop->getName()];
+		}
+
+		return $flags;
+	}
+
+	/**
+	 * @param AlbumFlags $target
+	 * @param string     $key
+	 *
+	 * @return string
+	 */
+	public function get(&$target, $key)
+	{
+		return $target->{$key};
+	}
+
+	/**
+	 * @param AlbumFlags $target
+	 * @param string     $key
+	 * @param bool       $value
+	 *
+	 * @return void
+	 */
+	public function set(&$target, $key, $value)
+	{
+		$target->{$key} = $value;
+	}
+}
\ 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 @@
+<?php
+
+namespace App\Livewire\Synth;
+
+use App\Contracts\Models\AbstractAlbum;
+use App\Factories\AlbumFactory;
+use Livewire\Mechanisms\HandleComponents\Synthesizers\Synth;
+
+class AlbumSynth extends Synth
+{
+	public static string $key = 'a';
+
+	public static function match(mixed $target): bool
+	{
+		return $target instanceof AbstractAlbum;
+	}
+
+	/**
+	 * @param AbstractAlbum $target
+	 *
+	 * @return array<int,array<string,string>>
+	 */
+	public function dehydrate($target): array
+	{
+		return [[
+			'id' => $target->id,
+		], []];
+	}
+
+	/**
+	 * @param array<string,string> $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 @@
+<?php
+
+namespace App\Livewire\Synth;
+
+use App\Models\Photo;
+use Livewire\Mechanisms\HandleComponents\Synthesizers\Synth;
+
+class PhotoSynth extends Synth
+{
+	public static string $key = 'p';
+
+	public static function match(mixed $target): bool
+	{
+		return $target instanceof Photo;
+	}
+
+	/**
+	 * @param Photo $target
+	 *
+	 * @return array<int,array<string,string>>
+	 */
+	public function dehydrate($target): array
+	{
+		return [[
+			'id' => $target->id,
+		], []];
+	}
+
+	/**
+	 * @param array<string,string> $value
+	 *
+	 * @return Photo
+	 */
+	public function hydrate($value): Photo
+	{
+		return Photo::findOrFail($value['id']);
+	}
+}
\ No newline at end of file
diff --git a/app/Livewire/Synth/SessionFlagsSynth.php b/app/Livewire/Synth/SessionFlagsSynth.php
new file mode 100644
index 00000000000..a872a7cbf79
--- /dev/null
+++ b/app/Livewire/Synth/SessionFlagsSynth.php
@@ -0,0 +1,81 @@
+<?php
+
+namespace App\Livewire\Synth;
+
+use App\Exceptions\Internal\LycheeLogicException;
+use App\Livewire\DTO\SessionFlags;
+use Livewire\Mechanisms\HandleComponents\Synthesizers\Synth;
+
+class SessionFlagsSynth extends Synth
+{
+	public static string $key = 's';
+
+	public static function match(mixed $target): bool
+	{
+		return $target instanceof SessionFlags;
+	}
+
+	/**
+	 * @param SessionFlags $target
+	 *
+	 * @return array<int,array<string,bool>>
+	 */
+	public function dehydrate($target): array
+	{
+		$result = [];
+		$cls = new \ReflectionClass(SessionFlags::class);
+		$props = $cls->getProperties(\ReflectionProperty::IS_PUBLIC);
+		foreach ($props as $prop) {
+			$propertyValue = $prop->getValue($target);
+			if (is_object($propertyValue)) {
+				throw new LycheeLogicException(sprintf('wrong value type for %s', get_class($propertyValue)));
+			}
+			$result[$prop->getName()] = $propertyValue;
+		}
+
+		return [$result, []];
+	}
+
+	/**
+	 * @param array<string,bool> $value
+	 *
+	 * @return SessionFlags
+	 */
+	public function hydrate($value): SessionFlags
+	{
+		$cls = new \ReflectionClass(SessionFlags::class);
+
+		/** @var SessionFlags $flags */
+		$flags = $cls->newInstanceWithoutConstructor();
+		$props = $cls->getProperties(\ReflectionProperty::IS_PUBLIC);
+		foreach ($props as $prop) {
+			$flags->{$prop->getName()} = $value[$prop->getName()];
+		}
+
+		return $flags;
+	}
+
+	/**
+	 * @param SessionFlags $target
+	 * @param string       $key
+	 *
+	 * @return string
+	 */
+	public function get(&$target, $key)
+	{
+		return $target->{$key};
+	}
+
+	/**
+	 * @param SessionFlags $target
+	 * @param string       $key
+	 * @param 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/Livewire/Traits/AlbumsPhotosContextMenus.php b/app/Livewire/Traits/AlbumsPhotosContextMenus.php
new file mode 100644
index 00000000000..29bae91ad1c
--- /dev/null
+++ b/app/Livewire/Traits/AlbumsPhotosContextMenus.php
@@ -0,0 +1,75 @@
+<?php
+
+namespace App\Livewire\Traits;
+
+use App\Contracts\Livewire\Params;
+use App\Livewire\Components\Base\ContextMenu;
+use Livewire\Attributes\Renderless;
+
+/**
+ * @property string|null $albumId
+ */
+trait AlbumsPhotosContextMenus
+{
+	use InteractWithContextMenu;
+
+	#[Renderless]
+	public function openContextMenu(): void
+	{
+		$this->dispatch(
+			'openContextMenu',
+			'menus.AlbumAdd',
+			[Params::PARENT_ID => $this->albumId],
+			'right: 30px; top: 30px; transform-origin: top right;'
+		)->to(ContextMenu::class);
+	}
+
+	#[Renderless]
+	public function openPhotoDropdown(int $x, int $y, string $photoId): void
+	{
+		$this->dispatch(
+			'openContextMenu',
+			'menus.PhotoDropdown',
+			[Params::ALBUM_ID => $this->albumId, Params::PHOTO_ID => $photoId],
+			$this->getCss($x, $y)
+		)->to(ContextMenu::class);
+	}
+
+	#[Renderless]
+	public function openPhotosDropdown(int $x, int $y, array $photoIds): void
+	{
+		$this->dispatch(
+			'openContextMenu',
+			'menus.PhotosDropdown',
+			[Params::ALBUM_ID => $this->albumId, Params::PHOTO_IDS => $photoIds],
+			$this->getCss($x, $y)
+		)->to(ContextMenu::class);
+	}
+
+	#[Renderless]
+	public function openAlbumDropdown(int $x, int $y, string $albumID): void
+	{
+		$this->dispatch(
+			'openContextMenu',
+			'menus.AlbumDropdown',
+			[Params::PARENT_ID => $this->albumId, Params::ALBUM_ID => $albumID],
+			$this->getCss($x, $y)
+		)->to(ContextMenu::class);
+	}
+
+	#[Renderless]
+	public function openAlbumsDropdown(int $x, int $y, array $albumIds): void
+	{
+		$this->dispatch(
+			'openContextMenu',
+			'menus.AlbumsDropdown',
+			[Params::PARENT_ID => $this->albumId, Params::ALBUM_IDS => $albumIds],
+			$this->getCss($x, $y)
+		)->to(ContextMenu::class);
+	}
+
+	private function getCss(int $x, int $y): string
+	{
+		return sprintf('transform-origin: top left; left: %dpx; top: %dpx;', $x, $y);
+	}
+}
diff --git a/app/Livewire/Traits/InteractWithContextMenu.php b/app/Livewire/Traits/InteractWithContextMenu.php
new file mode 100644
index 00000000000..168942507ca
--- /dev/null
+++ b/app/Livewire/Traits/InteractWithContextMenu.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace App\Livewire\Traits;
+
+use App\Livewire\Components\Base\ContextMenu;
+
+trait InteractWithContextMenu
+{
+	/**
+	 * 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 @@
+<?php
+
+namespace App\Livewire\Traits;
+
+use App\Livewire\Components\Base\Modal;
+
+trait InteractWithModal
+{
+	/**
+	 * Open Modal with form and paramters.
+	 *
+	 * @param string $form   Livewire component to include in the modal
+	 * @param array  $params Parameters for said component
+	 *
+	 * @return void
+	 */
+	protected function openModal(string $form, array $params = []): void
+	{
+		$this->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 @@
+<?php
+
+namespace App\Livewire\Traits;
+
+use App\Enum\Livewire\NotificationType;
+
+/**
+ * Send a notification to the Front End.
+ */
+trait Notify
+{
+	/**
+	 * Send message to front-end, it will be displayed in the top right of the window.
+	 *
+	 * @param string           $message to send
+	 * @param NotificationType $type    type of message to send
+	 *
+	 * @return void
+	 */
+	public function notify(string $message, NotificationType $type = NotificationType::SUCCESS): void
+	{
+		$this->dispatch('notify', ['msg' => $message, 'type' => $type->value]);
+	}
+}
\ No newline at end of file
diff --git a/app/Livewire/Traits/SilentUpdate.php b/app/Livewire/Traits/SilentUpdate.php
new file mode 100644
index 00000000000..03ad78cb1c7
--- /dev/null
+++ b/app/Livewire/Traits/SilentUpdate.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace App\Livewire\Traits;
+
+use Livewire\Attributes\Renderless;
+
+/**
+ * This trait provides an empty function. This is to be called from the front end
+ * when data needs to be synchronized without a rendering (e.g. triggered by computed properties).
+ */
+trait SilentUpdate
+{
+	/**
+	 * Send message to front-end, it will be displayed in the top right of the window.
+	 *
+	 * @return void
+	 */
+	#[Renderless]
+	public function silentUpdate(): void
+	{
+		// DO NOTHING!
+	}
+}
\ 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..41f6df39a09
--- /dev/null
+++ b/app/Livewire/Traits/UseOpenable.php
@@ -0,0 +1,47 @@
+<?php
+
+namespace App\Livewire\Traits;
+
+use Livewire\Attributes\On;
+
+/**
+ * Implementation of the Openable contract.
+ */
+trait UseOpenable
+{
+	/** @var bool status flag which defines whether the component is open or not. */
+	public bool $isOpen = false;
+
+	/**
+	 * Open the Component.
+	 *
+	 * @return void
+	 */
+	#[On('open')]
+	public function open(): void
+	{
+		$this->isOpen = true;
+	}
+
+	/**
+	 * Close the component.
+	 *
+	 * @return void
+	 */
+	#[On('close')]
+	public function close(): void
+	{
+		$this->isOpen = false;
+	}
+
+	/**
+	 * Toggle the component.
+	 *
+	 * @return void
+	 */
+	#[On('toggle')]
+	public function toggle(): void
+	{
+		$this->isOpen = !$this->isOpen;
+	}
+}
\ No newline at end of file
diff --git a/app/Livewire/Traits/UsePhotoViewActions.php b/app/Livewire/Traits/UsePhotoViewActions.php
new file mode 100644
index 00000000000..50137b70ac1
--- /dev/null
+++ b/app/Livewire/Traits/UsePhotoViewActions.php
@@ -0,0 +1,145 @@
+<?php
+
+namespace App\Livewire\Traits;
+
+use App\Actions\Photo\Strategies\RotateStrategy;
+use App\Enum\Livewire\NotificationType;
+use App\Http\Resources\Models\PhotoResource;
+use App\Livewire\Forms\PhotoUpdateForm;
+use App\Models\Configs;
+use App\Models\Photo;
+use App\Policies\PhotoPolicy;
+use Illuminate\Support\Facades\Gate;
+use Livewire\Attributes\Renderless;
+
+/**
+ * Collection of actions accessible from the JS Photo view.
+ */
+trait UsePhotoViewActions
+{
+	/**
+	 * Update data from a form data.
+	 *
+	 * @param array $formData data
+	 *
+	 * @return PhotoResource|null null or error, updated Model otherwise
+	 */
+	#[Renderless]
+	public function updatePhoto(array $formData): ?PhotoResource
+	{
+		$form = new PhotoUpdateForm(...$formData);
+
+		$valdiation = $form->validate();
+		if ($valdiation !== []) {
+			$msg = '';
+			foreach ($valdiation as $value) {
+				$msg .= ($msg !== '' ? '<br>' : '') . implode('<br>', $value);
+			}
+			$this->notify($msg, NotificationType::ERROR);
+
+			return null;
+		}
+
+		Gate::authorize(PhotoPolicy::CAN_EDIT, [Photo::class, $form->getPhoto()]);
+
+		$form->save();
+
+		$this->notify(__('lychee.CHANGE_SUCCESS'));
+
+		return PhotoResource::make($form->getPhoto());
+	}
+
+	/**
+	 * Flip the star of a given photo.
+	 *
+	 * @param array<0,string> $photoIDarg
+	 *
+	 * @return bool
+	 */
+	#[Renderless]
+	public function toggleStar(array $photoIDarg): bool
+	{
+		if (count($photoIDarg) !== 1 || !is_string($photoIDarg[0])) {
+			$this->notify('wrong ID', NotificationType::ERROR);
+
+			return false;
+		}
+		$photo = Photo::query()->findOrFail($photoIDarg[0]);
+
+		Gate::authorize(PhotoPolicy::CAN_EDIT, [Photo::class, $photo]);
+		$photo->is_starred = !$photo->is_starred;
+		$photo->save();
+
+		return true;
+	}
+
+	/**
+	 * Rotate selected photo Counter ClockWise.
+	 *
+	 * @param string $photoID
+	 *
+	 * @return void
+	 */
+	public function rotate_ccw(string $photoID): void
+	{
+		if (!Configs::getValueAsBool('editor_enabled')) {
+			return;
+		}
+
+		$photo = Photo::query()->findOrFail($photoID);
+		Gate::authorize(PhotoPolicy::CAN_EDIT, [Photo::class, $photo]);
+		$rotateStrategy = new RotateStrategy($photo, -1);
+		$photo = $rotateStrategy->do();
+		// Force hard refresh of the page (to load the rotated image)
+		$this->redirect(route('livewire-gallery-photo', ['albumId' => $this->albumId, 'photoId' => $photo->id]));
+	}
+
+	/**
+	 * Rotate selected photo ClockWise.
+	 *
+	 * @param string $photoID
+	 *
+	 * @return void
+	 */
+	public function rotate_cw(string $photoID): void
+	{
+		if (!Configs::getValueAsBool('editor_enabled')) {
+			return;
+		}
+
+		$photo = Photo::query()->findOrFail($photoID);
+		Gate::authorize(PhotoPolicy::CAN_EDIT, [Photo::class, $photo]);
+		$rotateStrategy = new RotateStrategy($photo, 1);
+		$photo = $rotateStrategy->do();
+		// Force hard refresh of the page (to load the rotated image)
+		$this->redirect(route('livewire-gallery-photo', ['albumId' => $this->albumId, 'photoId' => $photo->id]));
+	}
+
+	/**
+	 * Set all photos for given id as starred.
+	 *
+	 * @param array<int,string> $photoIDs
+	 *
+	 * @return void
+	 */
+	#[Renderless]
+	public function setStar(array $photoIDs): void
+	{
+		Gate::authorize(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $photoIDs]);
+		Photo::whereIn('id', $photoIDs)->update(['is_starred' => true]);
+	}
+
+	/**
+	 * Set all photos for given id as NOT starred.
+	 *
+	 * @param array $photoIDs
+	 *
+	 * @return void
+	 */
+	#[Renderless]
+	public function unsetStar(array $photoIDs): void
+	{
+		Gate::authorize(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $photoIDs]);
+		Photo::whereIn('id', $photoIDs)->update(['is_starred' => false]);
+	}
+}
\ 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 @@
+<?php
+
+namespace App\Livewire\Traits;
+
+use Illuminate\Support\Facades\Validator as ValidatorFacade;
+use Illuminate\Validation\Validator;
+
+/**
+ * Send a notification to the Front End.
+ */
+trait UseValidator
+{
+	/**
+	 * Send message to front-end, it will be displayed in the top right of the window.
+	 *
+	 * @param array $rules to apply
+	 *
+	 * @return bool
+	 */
+	public function areValid(array $rules): bool
+	{
+		/** @var Validator $validator */
+		$validator = ValidatorFacade::make($this->all(), $rules);
+
+		if ($validator->fails()) {
+			$msg = '';
+			foreach ($validator->getMessageBag()->messages() as $value) {
+				$msg .= ($msg !== '' ? '<br>' : '') . implode('<br>', $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 @@
+<?php
+
+namespace App\Livewire\Traits;
+
+use App\Exceptions\Internal\LycheeLogicException;
+
+/**
+ * Quick helpers for the serialization and deserialization of livewire components.
+ */
+trait UseWireable
+{
+	public function toLivewire(): array
+	{
+		$result = [];
+		$cls = new \ReflectionClass($this);
+		$props = $cls->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 c1f55cc3854..bcd030ebcdb 100644
--- a/app/Models/Album.php
+++ b/app/Models/Album.php
@@ -16,6 +16,7 @@
 use App\Relations\HasManyChildPhotos;
 use App\Relations\HasManyPhotosRecursively;
 use Illuminate\Database\Eloquent\Collection;
+use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Relations\HasOne;
 use Illuminate\Database\Query\Builder as BaseBuilder;
 use Illuminate\Http\UploadedFile;
@@ -120,6 +121,7 @@ class Album extends BaseAlbum implements Node
 {
 	use NodeTrait;
 	use ToArrayThrowsNotImplemented;
+	use HasFactory;
 
 	/**
 	 * The model's attributes.
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/Extensions/BaseConfigMigration.php b/app/Models/Extensions/BaseConfigMigration.php
new file mode 100644
index 00000000000..beccc0d95e8
--- /dev/null
+++ b/app/Models/Extensions/BaseConfigMigration.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace App\Models\Extensions;
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Support\Facades\DB;
+
+abstract class BaseConfigMigration extends Migration
+{
+	/**
+	 * @return array<int,array{key:string,value:string,confidentiality:string,cat:string,type_range:string,description:string}>
+	 */
+	abstract public function getConfigs(): array;
+
+	/**
+	 * Run the migrations.
+	 */
+	final public function up(): void
+	{
+		DB::table('configs')->insert($this->getConfigs());
+	}
+
+	/**
+	 * Reverse the migrations.
+	 */
+	final public function down(): void
+	{
+		$keys = collect($this->getConfigs())->map(fn ($v) => $v['key'])->all();
+		DB::table('configs')->whereIn('key', $keys)->delete();
+	}
+}
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/Photo.php b/app/Models/Photo.php
index eee9734ec71..23d0ee7c501 100644
--- a/app/Models/Photo.php
+++ b/app/Models/Photo.php
@@ -24,6 +24,7 @@
 use App\Models\Extensions\ToArrayThrowsNotImplemented;
 use App\Models\Extensions\UTCBasedTimes;
 use App\Relations\HasManySizeVariants;
+use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
 use Illuminate\Support\Carbon;
@@ -122,6 +123,7 @@
  */
 class Photo extends Model
 {
+	use HasFactory;
 	use UTCBasedTimes;
 	use HasAttributesPatch;
 	use HasRandomIDAndLegacyTimeBasedID;
@@ -294,6 +296,16 @@ protected function getLicenseAttribute(?string $license): LicenseType
 		return Configs::getValueAsEnum('default_license', LicenseType::class);
 	}
 
+	/**
+	 * This is to avoid loading the license from configs & albums.
+	 *
+	 * @return ?string
+	 */
+	public function getOriginalLicense(): ?string
+	{
+		return $this->attributes['license'];
+	}
+
 	/**
 	 * Accessor for attribute `focal`.
 	 *
diff --git a/app/Models/SizeVariant.php b/app/Models/SizeVariant.php
index 1c2df0c17b8..14dfed37132 100644
--- a/app/Models/SizeVariant.php
+++ b/app/Models/SizeVariant.php
@@ -18,6 +18,7 @@
 use App\Models\Extensions\UTCBasedTimes;
 use App\Relations\HasManyBidirectionally;
 use Illuminate\Database\Eloquent\Collection;
+use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
 use Illuminate\Support\Facades\Auth;
@@ -51,6 +52,7 @@
  * @property string              $full_path
  * @property int                 $width
  * @property int                 $height
+ * @property float               $ratio
  * @property int                 $filesize
  * @property Collection<SymLink> $sym_links
  *
@@ -82,6 +84,7 @@ class SizeVariant extends Model
 	use HasBidirectionalRelationships;
 	use ThrowsConsistentExceptions;
 	use ToArrayThrowsNotImplemented;
+	use HasFactory;
 
 	/**
 	 * This model has no own timestamps as it is inseparably bound to its
@@ -102,6 +105,28 @@ class SizeVariant extends Model
 		'width' => 'integer',
 		'height' => 'integer',
 		'filesize' => 'integer',
+		'ratio' => 'float',
+	];
+
+	/**
+	 * @var array<int,string> 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',
 	];
 
 	/**
@@ -114,6 +139,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<int,string> 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 58caf939bc2..6b48e3dc748 100644
--- a/app/Models/User.php
+++ b/app/Models/User.php
@@ -11,6 +11,7 @@
 use App\Models\Extensions\UTCBasedTimes;
 use Carbon\Exceptions\InvalidFormatException;
 use Illuminate\Database\Eloquent\Collection;
+use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Relations\BelongsToMany;
 use Illuminate\Database\Eloquent\Relations\HasMany;
 use Illuminate\Database\Query\Builder as BaseBuilder;
@@ -74,6 +75,7 @@
  */
 class User extends Authenticatable implements WebAuthnAuthenticatable
 {
+	use HasFactory;
 	use Notifiable;
 	use WebAuthnAuthentication;
 	use UTCBasedTimes;
@@ -103,6 +105,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 57881cb1c24..d6810e87dd1 100644
--- a/app/Policies/AlbumPolicy.php
+++ b/app/Policies/AlbumPolicy.php
@@ -23,6 +23,7 @@ class AlbumPolicy extends BasePolicy
 	public const IS_OWNER = 'isOwner';
 	public const CAN_SEE = 'canSee';
 	public const CAN_ACCESS = 'canAccess';
+	public const CAN_ACCESS_MAP = 'canAccessMap';
 	public const CAN_DOWNLOAD = 'canDownload';
 	public const CAN_DELETE = 'canDelete';
 	public const CAN_UPLOAD = 'canUpload';
@@ -36,12 +37,12 @@ class AlbumPolicy extends BasePolicy
 	/**
 	 * This ensures that current album is owned by current user.
 	 *
-	 * @param User|null $user
-	 * @param BaseAlbum $album
+	 * @param User|null               $user
+	 * @param BaseAlbum|BaseAlbumImpl $album
 	 *
 	 * @return bool
 	 */
-	public function isOwner(?User $user, BaseAlbum $album): bool
+	public function isOwner(?User $user, BaseAlbum|BaseAlbumImpl $album): bool
 	{
 		return $user !== null && $album->owner_id === $user->id;
 	}
@@ -120,6 +121,30 @@ public function canAccess(?User $user, ?AbstractAlbum $album): bool
 		return false;
 	}
 
+	/**
+	 * Check if user can access the map.
+	 * Note that this is not used to determine the visibility of the header button because
+	 * 1. Admin will always return true.
+	 * 2. We also check if there are pictures with location data to be display in the album.
+	 *
+	 * @param User|null          $user
+	 * @param AbstractAlbum|null $album
+	 *
+	 * @return bool
+	 */
+	public function canAccessMap(?User $user, ?AbstractAlbum $album): bool
+	{
+		if (!Configs::getValueAsBool('map_display')) {
+			return false;
+		}
+
+		if ($user === null && !Configs::getValueAsBool('map_display_public')) {
+			return false;
+		}
+
+		return $this->canAccess($user, $album);
+	}
+
 	/**
 	 * Check if current user can download the album.
 	 *
@@ -353,16 +378,14 @@ public function canDeleteById(User $user, array $albumIDs): bool
 	/**
 	 * Check if user can share selected album with another user.
 	 *
-	 * @param User|null     $user
+	 * @param User          $user
 	 * @param AbstractAlbum $abstractAlbum
 	 *
 	 * @return bool
-	 *
-	 * @throws ConfigurationKeyMissingException
 	 */
-	public function canShareWithUsers(?User $user, ?AbstractAlbum $abstractAlbum): bool
+	public function canShareWithUsers(User $user, AbstractAlbum|BaseAlbumImpl|null $abstractAlbum): bool
 	{
-		if ($user?->may_upload !== true) {
+		if ($user->may_upload !== true) {
 			return false;
 		}
 
@@ -371,7 +394,7 @@ public function canShareWithUsers(?User $user, ?AbstractAlbum $abstractAlbum): b
 			return true;
 		}
 
-		if (!$abstractAlbum instanceof BaseAlbum) {
+		if (!$abstractAlbum instanceof BaseAlbum && !$abstractAlbum instanceof BaseAlbumImpl) {
 			return false;
 		}
 
diff --git a/app/Policies/UserPolicy.php b/app/Policies/UserPolicy.php
index b3b64c6fd45..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 false;
-	}
-
 	/**
 	 * This defines if user can edit their settings.
 	 *
diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php
index 78a95a7ba4e..1268e71f478 100644
--- a/app/Providers/AppServiceProvider.php
+++ b/app/Providers/AppServiceProvider.php
@@ -11,6 +11,10 @@
 use App\Factories\AlbumFactory;
 use App\Image\SizeVariantDefaultFactory;
 use App\Image\StreamStatFilter;
+use App\Livewire\Synth\AlbumFlagsSynth;
+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;
@@ -32,6 +36,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 +83,14 @@ class AppServiceProvider extends ServiceProvider
 		GitTags::class => GitTags::class,
 	];
 
+	private array $livewireSynth =
+	[
+		AlbumSynth::class,
+		PhotoSynth::class,
+		SessionFlagsSynth::class,
+		AlbumFlagsSynth::class,
+	];
+
 	/**
 	 * Bootstrap any application services.
 	 *
@@ -139,6 +152,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/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..f2104cafd7a
--- /dev/null
+++ b/app/View/Components/Footer.php
@@ -0,0 +1,74 @@
+<?php
+
+namespace App\View\Components;
+
+use App\Exceptions\ConfigurationKeyMissingException;
+use App\Models\Configs;
+use Illuminate\Contracts\Container\BindingResolutionException;
+use Illuminate\View\Component;
+use Illuminate\View\View;
+
+/**
+ * This is the bottom of the page.
+ * We provides socials etc...
+ */
+class Footer extends Component
+{
+	public bool $show_socials;
+	public ?string $hosted_by = null;
+	public ?string $copyright = null;
+	public string $facebook;
+	public string $flickr;
+	public string $twitter;
+	public string $instagram;
+	public string $youtube;
+	public string $additional_footer_text;
+
+	private string $layout;
+
+	/**
+	 * Initialize the footer once for all.
+	 *
+	 * @throws ConfigurationKeyMissingException
+	 */
+	public function __construct(string $layout = 'footer')
+	{
+		$this->layout = $layout;
+		$this->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')) {
+			$copyright_year = Configs::getValueAsString('site_copyright_begin');
+			$copyright_year_end = Configs::getValueAsString('site_copyright_end');
+			if ($copyright_year !== $copyright_year_end) {
+				$copyright_year = $copyright_year . '-' . $copyright_year_end;
+			}
+
+			$this->copyright = sprintf(
+				__('lychee.FOOTER_COPYRIGHT'),
+				Configs::getValueAsString('site_owner'),
+				$copyright_year
+			);
+		}
+
+		$this->additional_footer_text = Configs::getValueAsString('footer_additional_text');
+	}
+
+	/**
+	 * Render component.
+	 *
+	 * @return View
+	 *
+	 * @throws BindingResolutionException
+	 */
+	public function render(): View
+	{
+		return view('components.' . $this->layout);
+	}
+}
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 @@
+<?php
+
+namespace App\View\Components\Gallery\Album;
+
+use App\Contracts\Models\AbstractAlbum;
+use Illuminate\View\Component;
+use Illuminate\View\View;
+
+class SharingLinks extends Component
+{
+	public string $twitter_link;
+	public string $facebook_link;
+	public string $mailTo_link;
+	public string $url;
+	public string $rawUrl;
+
+	public function __construct(AbstractAlbum $album)
+	{
+		$this->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..3f1d42f0919
--- /dev/null
+++ b/app/View/Components/Gallery/Album/Thumbs/Album.php
@@ -0,0 +1,73 @@
+<?php
+
+namespace App\View\Components\Gallery\Album\Thumbs;
+
+use App\Contracts\Models\AbstractAlbum;
+use App\DTO\AlbumProtectionPolicy;
+use App\Enum\ThumbAlbumSubtitleType;
+use App\Models\Album as AlbumModel;
+use App\Models\Configs;
+use App\Models\Extensions\BaseAlbum;
+use App\Models\Extensions\Thumb;
+use App\Models\TagAlbum;
+use App\SmartAlbums\BaseSmartAlbum;
+use Illuminate\View\Component;
+
+class Album extends Component
+{
+	public string $id;
+	public string $title;
+	public ?Thumb $thumb;
+
+	public bool $is_nsfw;
+	public bool $is_nsfw_blurred;
+	public bool $is_public;
+	public bool $is_link_required;
+	public bool $is_password_required;
+	public string $subType;
+
+	public bool $is_tag_album;
+	public bool $is_cover_id;
+	public bool $has_subalbum;
+
+	public string $created_at = '';
+	public ?string $min_taken_at = null;
+	public ?string $max_taken_at = null;
+
+	public function __construct(AbstractAlbum $data)
+	{
+		$date_format = Configs::getValueAsString('date_format_album_thumb');
+
+		$this->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;
+		// This aims to indicate whether the current thumb is used to determine the parent.
+		$this->is_cover_id = $data instanceof AlbumModel && $data->thumb !== null && $data->parent?->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..1fe15da36e8
--- /dev/null
+++ b/app/View/Components/Gallery/Album/Thumbs/AlbumThumb.php
@@ -0,0 +1,48 @@
+<?php
+
+namespace App\View\Components\Gallery\Album\Thumbs;
+
+use Illuminate\Support\Facades\URL;
+use Illuminate\Support\Str;
+use Illuminate\View\Component;
+
+class AlbumThumb extends Component
+{
+	public string $src = '';
+	public string $dataSrc = '';
+	public string $dataSrcSet = '';
+	public string $class = '';
+
+	public function __construct(
+		string $type = '',
+		string $thumb = '',
+		string $thumb2x = '',
+		string $class = '',
+	) {
+		$this->class = $class;
+		if ($thumb === 'uploads/thumb/') {
+			$this->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..549bc318d41
--- /dev/null
+++ b/app/View/Components/Gallery/Album/Thumbs/Photo.php
@@ -0,0 +1,170 @@
+<?php
+
+namespace App\View\Components\Gallery\Album\Thumbs;
+
+use App\Enum\SizeVariantType;
+use App\Exceptions\ConfigurationKeyMissingException;
+use App\Exceptions\Internal\InvalidSizeVariantException;
+use App\Models\Configs;
+use App\Models\Extensions\SizeVariants;
+use App\Models\Photo as ModelsPhoto;
+use App\Models\SizeVariant;
+use Illuminate\Contracts\Container\BindingResolutionException;
+use Illuminate\Support\Facades\URL;
+use Illuminate\View\Component;
+
+class Photo extends Component
+{
+	public string $album_id = '';
+	public string $photo_id = '';
+
+	public bool $is_lazyload = true;
+	public bool $is_video = false;
+	public bool $is_livephoto = false;
+
+	public int $idx;
+	public string $title;
+	public ?string $taken_at;
+	public string $created_at;
+	public bool $is_cover_id = false;
+
+	public string $src = '';
+	public string $srcset = '';
+	public string $srcset2x = '';
+
+	public int $_w = 200;
+	public int $_h = 200;
+
+	/**
+	 * Create a new component instance.
+	 *
+	 * @return void
+	 *
+	 * @throws ConfigurationKeyMissingException
+	 */
+	public function __construct(ModelsPhoto $data, string $albumId, int $idx)
+	{
+		$this->idx = $idx;
+		$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_video = $data->isVideo();
+		$this->is_livephoto = $data->live_photo_url !== null;
+		$this->is_cover_id = $data->album?->cover_id === $data->id;
+
+		$thumb = $data->size_variants->getSizeVariant(SizeVariantType::THUMB);
+		$thumb2x = $data->size_variants->getSizeVariant(SizeVariantType::THUMB2X);
+
+		$this->set_src($thumb);
+
+		$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).
+			$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) : '';
+	}
+
+	/**
+	 * Define src.
+	 *
+	 * this is what will be first deplayed before loading.
+	 *
+	 * @param SizeVariant|null $thumb
+	 *
+	 * @return void
+	 */
+	private function set_src(?SizeVariant $thumb): 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;
+		}
+
+		// change the png in the other cases.
+		// no need to lazyload too.
+		$this->is_lazyload = false;
+		$this->src = $this->is_video ? URL::asset('img/play-icon.png') : $this->src;
+		$this->src = $this->is_livephoto ? URL::asset('img/live-photo-icon.png') : $this->src;
+		$this->src = sprintf("src='%s'", $this->src);
+	}
+
+	/**
+	 * 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/Download.php b/app/View/Components/Gallery/Photo/Download.php
new file mode 100644
index 00000000000..386232046ee
--- /dev/null
+++ b/app/View/Components/Gallery/Photo/Download.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace App\View\Components\Gallery\Photo;
+
+use App\Enum\SizeVariantType;
+use App\Facades\Helpers;
+use App\Http\Resources\Models\SizeVariantResource;
+use App\Models\Photo;
+use App\Policies\PhotoPolicy;
+use Illuminate\Support\Facades\Gate;
+use Illuminate\View\Component;
+use Illuminate\View\View;
+
+class Download extends Component
+{
+	public string $url_placeholder = 'api/Photo::getArchive?photoIDs=%s&kind%s';
+	public string $photoId;
+	public array $size_variants;
+
+	/**
+	 * Mount the photo model and initialize the Component.
+	 *
+	 * @param Photo $photo
+	 *
+	 * @return void
+	 */
+	public function __construct(Photo $photo)
+	{
+		$this->photoId = $photo->id;
+
+		$downgrade = !Gate::check(PhotoPolicy::CAN_ACCESS_FULL_PHOTO, [Photo::class, $photo]) &&
+		!$photo->isVideo() &&
+		$photo->size_variants->hasMedium() === true;
+
+		$rq = request();
+
+		// TODO: Add Live photo
+		$this->size_variants = collect(SizeVariantType::cases())
+			->map(fn ($v) => $photo->size_variants->getSizeVariant($v))
+			->filter(fn ($e) => $e !== null)
+			->map(fn ($v) => SizeVariantResource::make($v))
+			->map(fn ($v, $k) => $k === 0 ? $v->setNoUrl($downgrade) : $v) // 0 = original
+			->map(fn ($v) => $v->toArray($rq))
+			->map(function ($v) {
+				/** @var array{filesize:int} $v */
+				$v['filesize'] = Helpers::getSymbolByQuantity(intval($v['filesize']));
+
+				return $v;
+			})->all();
+	}
+
+	/**
+	 * Render the component.
+	 *
+	 * @return View
+	 */
+	public function render(): View
+	{
+		return view('components.gallery.photo.downloads');
+	}
+}
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 @@
+<?php
+
+namespace App\View\Components;
+
+use App\Exceptions\ConfigurationKeyMissingException;
+use App\Http\Controllers\IndexController;
+use App\Models\Configs;
+use Illuminate\Contracts\Container\BindingResolutionException;
+use Illuminate\View\Component;
+use Illuminate\View\View;
+
+/**
+ * This is the bottom of the page.
+ * We provides socials etc...
+ */
+class Meta extends Component
+{
+	public string $pageTitle;
+	public string $pageDescription;
+	public string $siteOwner;
+	public string $imageUrl;
+	public string $pageUrl;
+	public bool $rssEnable;
+	public string $userCssUrl;
+	public string $userJsUrl;
+	public string $frame;
+
+	/**
+	 * Initialize the footer once for all.
+	 *
+	 * @throws ConfigurationKeyMissingException
+	 */
+	public function __construct()
+	{
+		$siteTitle = Configs::getValueAsString('site_title');
+		$title = '';
+		$description = '';
+		$imageUrl = '';
+
+		// if ($this->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 ada197ff7b9..d9bc0fadbd3 100644
--- a/composer.json
+++ b/composer.json
@@ -49,9 +49,11 @@
         "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",
         "maennchen/zipstream-php": "^3.1",
@@ -79,7 +81,8 @@
         "mockery/mockery": "^1.5",
         "larastan/larastan": "^2.0",
         "php-parallel-lint/php-parallel-lint": "^1.3",
-        "phpunit/phpunit": "^10.0"
+        "phpunit/phpunit": "^10.0",
+        "fakerphp/faker": "^1.23.0"
     },
     "autoload": {
         "classmap": [
diff --git a/composer.lock b/composer.lock
index 3b562979542..dc5df53efc9 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": "b158ae44fc79994db940f20d61f53fd8",
+    "content-hash": "4e0a59023e0ef37787f242d7b0d54c54",
     "packages": [
         {
             "name": "bepsvpt/secure-headers",
@@ -1220,25 +1220,25 @@
         },
         {
             "name": "geocoder-php/common-http",
-            "version": "4.5.0",
+            "version": "4.6.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/geocoder-php/php-common-http.git",
-                "reference": "4ee2cee60d21631e2a09c196bf6b9fd296bca728"
+                "reference": "15629fd7bf771f525282ad1b60d2106bcf630ce9"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/geocoder-php/php-common-http/zipball/4ee2cee60d21631e2a09c196bf6b9fd296bca728",
-                "reference": "4ee2cee60d21631e2a09c196bf6b9fd296bca728",
+                "url": "https://api.github.com/repos/geocoder-php/php-common-http/zipball/15629fd7bf771f525282ad1b60d2106bcf630ce9",
+                "reference": "15629fd7bf771f525282ad1b60d2106bcf630ce9",
                 "shasum": ""
             },
             "require": {
-                "php": "^7.4 || ^8.0",
+                "php": "^8.0",
                 "php-http/client-implementation": "^1.0",
                 "php-http/discovery": "^1.6",
                 "php-http/httplug": "^1.0 || ^2.0",
                 "php-http/message-factory": "^1.0.2",
-                "psr/http-message": "^1.0",
+                "psr/http-message": "^1.0 || ^2.0",
                 "psr/http-message-implementation": "^1.0",
                 "willdurand/geocoder": "^4.0"
             },
@@ -1247,7 +1247,7 @@
                 "php-http/message": "^1.0",
                 "php-http/mock-client": "^1.0",
                 "phpunit/phpunit": "^9.5",
-                "symfony/stopwatch": "~2.5"
+                "symfony/stopwatch": "~2.5 || ~5.0"
             },
             "type": "library",
             "extra": {
@@ -1279,9 +1279,9 @@
                 "http geocoder"
             ],
             "support": {
-                "source": "https://github.com/geocoder-php/php-common-http/tree/4.5.0"
+                "source": "https://github.com/geocoder-php/php-common-http/tree/4.6.0"
             },
-            "time": "2022-07-30T12:09:30+00:00"
+            "time": "2023-07-31T20:07:24+00:00"
         },
         {
             "name": "geocoder-php/nominatim-provider",
@@ -1342,6 +1342,86 @@
             },
             "time": "2023-03-01T10:18:27+00:00"
         },
+        {
+            "name": "graham-campbell/markdown",
+            "version": "v15.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/GrahamCampbell/Laravel-Markdown.git",
+                "reference": "94917d0d712c26788095ad2b5eafd9b33cd43095"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/GrahamCampbell/Laravel-Markdown/zipball/94917d0d712c26788095ad2b5eafd9b33cd43095",
+                "reference": "94917d0d712c26788095ad2b5eafd9b33cd43095",
+                "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.4.1",
+                "php": "^7.4.15 || ^8.0.2"
+            },
+            "require-dev": {
+                "graham-campbell/analyzer": "^4.1",
+                "graham-campbell/testbench": "^6.1",
+                "mockery/mockery": "^1.6.6",
+                "phpunit/phpunit": "^9.6.15 || ^10.4.2"
+            },
+            "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.1.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/GrahamCampbell",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/graham-campbell/markdown",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-12-04T02:43:19+00:00"
+        },
         {
             "name": "graham-campbell/result-type",
             "version": "v1.1.2",
@@ -2826,6 +2906,80 @@
             ],
             "time": "2023-10-17T14:13:20+00:00"
         },
+        {
+            "name": "livewire/livewire",
+            "version": "v3.3.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/livewire/livewire.git",
+                "reference": "6dd3bec8c711cd792742be4620057637e261e6f7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/livewire/livewire/zipball/6dd3bec8c711cd792742be4620057637e261e6f7",
+                "reference": "6dd3bec8c711cd792742be4620057637e261e6f7",
+                "shasum": ""
+            },
+            "require": {
+                "illuminate/database": "^10.0",
+                "illuminate/support": "^10.0",
+                "illuminate/validation": "^10.0",
+                "league/mime-type-detection": "^1.9",
+                "php": "^8.1",
+                "symfony/http-kernel": "^6.2"
+            },
+            "require-dev": {
+                "calebporzio/sushi": "^2.1",
+                "laravel/framework": "^10.0",
+                "laravel/prompts": "^0.1.6",
+                "mockery/mockery": "^1.3.1",
+                "orchestra/testbench": "^8.0",
+                "orchestra/testbench-dusk": "^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.3.3"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/livewire",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-12-20T05:34:05+00:00"
+        },
         {
             "name": "lychee-org/nestedset",
             "version": "v8.0.0",
@@ -4506,16 +4660,16 @@
         },
         {
             "name": "psr/http-message",
-            "version": "1.1",
+            "version": "2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/php-fig/http-message.git",
-                "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba"
+                "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
-                "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
+                "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+                "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
                 "shasum": ""
             },
             "require": {
@@ -4524,7 +4678,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.1.x-dev"
+                    "dev-master": "2.0.x-dev"
                 }
             },
             "autoload": {
@@ -4539,7 +4693,7 @@
             "authors": [
                 {
                     "name": "PHP-FIG",
-                    "homepage": "http://www.php-fig.org/"
+                    "homepage": "https://www.php-fig.org/"
                 }
             ],
             "description": "Common interface for HTTP messages",
@@ -4553,9 +4707,9 @@
                 "response"
             ],
             "support": {
-                "source": "https://github.com/php-fig/http-message/tree/1.1"
+                "source": "https://github.com/php-fig/http-message/tree/2.0"
             },
-            "time": "2023-04-04T09:50:52+00:00"
+            "time": "2023-04-04T09:54:51+00:00"
         },
         {
             "name": "psr/log",
@@ -8843,6 +8997,74 @@
             ],
             "time": "2023-02-20T08:34:36+00:00"
         },
+        {
+            "name": "fakerphp/faker",
+            "version": "v1.23.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/FakerPHP/Faker.git",
+                "reference": "e3daa170d00fde61ea7719ef47bb09bb8f1d9b01"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e3daa170d00fde61ea7719ef47bb09bb8f1d9b01",
+                "reference": "e3daa170d00fde61ea7719ef47bb09bb8f1d9b01",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.4 || ^8.0",
+                "psr/container": "^1.0 || ^2.0",
+                "symfony/deprecation-contracts": "^2.2 || ^3.0"
+            },
+            "conflict": {
+                "fzaninotto/faker": "*"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.4.1",
+                "doctrine/persistence": "^1.3 || ^2.0",
+                "ext-intl": "*",
+                "phpunit/phpunit": "^9.5.26",
+                "symfony/phpunit-bridge": "^5.4.16"
+            },
+            "suggest": {
+                "doctrine/orm": "Required to use Faker\\ORM\\Doctrine",
+                "ext-curl": "Required by Faker\\Provider\\Image to download images.",
+                "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.",
+                "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.",
+                "ext-mbstring": "Required for multibyte Unicode string functionality."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "v1.21-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Faker\\": "src/Faker/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "François Zaninotto"
+                }
+            ],
+            "description": "Faker is a PHP library that generates fake data for you.",
+            "keywords": [
+                "data",
+                "faker",
+                "fixtures"
+            ],
+            "support": {
+                "issues": "https://github.com/FakerPHP/Faker/issues",
+                "source": "https://github.com/FakerPHP/Faker/tree/v1.23.0"
+            },
+            "time": "2023-06-12T08:44:38+00:00"
+        },
         {
             "name": "filp/whoops",
             "version": "2.15.4",
@@ -10112,23 +10334,23 @@
         },
         {
             "name": "phpunit/php-code-coverage",
-            "version": "10.1.10",
+            "version": "10.1.11",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
-                "reference": "599109c8ca6bae97b23482d557d2874c25a65e59"
+                "reference": "78c3b7625965c2513ee96569a4dbb62601784145"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/599109c8ca6bae97b23482d557d2874c25a65e59",
-                "reference": "599109c8ca6bae97b23482d557d2874c25a65e59",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/78c3b7625965c2513ee96569a4dbb62601784145",
+                "reference": "78c3b7625965c2513ee96569a4dbb62601784145",
                 "shasum": ""
             },
             "require": {
                 "ext-dom": "*",
                 "ext-libxml": "*",
                 "ext-xmlwriter": "*",
-                "nikic/php-parser": "^4.15",
+                "nikic/php-parser": "^4.18 || ^5.0",
                 "php": ">=8.1",
                 "phpunit/php-file-iterator": "^4.0",
                 "phpunit/php-text-template": "^3.0",
@@ -10178,7 +10400,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.10"
+                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.11"
             },
             "funding": [
                 {
@@ -10186,7 +10408,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2023-12-11T06:28:43+00:00"
+            "time": "2023-12-21T15:38:30+00:00"
         },
         {
             "name": "phpunit/php-file-iterator",
@@ -10836,16 +11058,16 @@
         },
         {
             "name": "sebastian/diff",
-            "version": "5.0.3",
+            "version": "5.1.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/diff.git",
-                "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b"
+                "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/912dc2fbe3e3c1e7873313cc801b100b6c68c87b",
-                "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b",
+                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/fbf413a49e54f6b9b17e12d900ac7f6101591b7f",
+                "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f",
                 "shasum": ""
             },
             "require": {
@@ -10858,7 +11080,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "5.0-dev"
+                    "dev-main": "5.1-dev"
                 }
             },
             "autoload": {
@@ -10891,7 +11113,7 @@
             "support": {
                 "issues": "https://github.com/sebastianbergmann/diff/issues",
                 "security": "https://github.com/sebastianbergmann/diff/security/policy",
-                "source": "https://github.com/sebastianbergmann/diff/tree/5.0.3"
+                "source": "https://github.com/sebastianbergmann/diff/tree/5.1.0"
             },
             "funding": [
                 {
@@ -10899,7 +11121,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2023-05-01T07:48:21+00:00"
+            "time": "2023-12-22T10:55:06+00:00"
         },
         {
             "name": "sebastian/environment",
diff --git a/config/app.php b/config/app.php
index a9ad42350de..9dbeaaebd5c 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', true),
+
 	/*
 	|--------------------------------------------------------------------------
 	| Application Debug Mode
@@ -243,5 +255,16 @@
 	'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,
+		'FileStatus' => App\Enum\Livewire\FileStatus::class,
+		'Params' => App\Contracts\Livewire\Params::class,
+		'PhotoLayoutType' => \App\Enum\PhotoLayoutType::class,
 	])->toArray(),
 ];
diff --git a/config/filesystems.php b/config/filesystems.php
index 472d7225589..b857a508b6b 100644
--- a/config/filesystems.php
+++ b/config/filesystems.php
@@ -44,8 +44,8 @@
 		// Lychee uses the disk "images" to store the media files
 		'images' => [
 			'driver' => 'local',
-			'root' => env('LYCHEE_UPLOADS', public_path('uploads/')),
-			'url' => env('LYCHEE_UPLOADS_URL', 'uploads/'),
+			'root' => env('LYCHEE_UPLOADS', public_path(env('LYCHEE_UPLOADS_DIR', 'uploads/'))),
+			'url' => env('LYCHEE_UPLOADS_URL', env('APP_URL', 'http://localhost') . '/' . env('LYCHEE_UPLOADS_DIR', 'uploads/')),
 			'visibility' => env('LYCHEE_IMAGE_VISIBILITY', 'public'),
 			'directory_visibility' => env('LYCHEE_IMAGE_VISIBILITY', 'public'),
 			'permissions' => [
@@ -99,5 +99,11 @@
 			'url' => env('LYCHEE_SYM_URL', 'sym'),
 			'visibility' => 'public',
 		],
+
+		'tmp-for-tests' => [
+			'driver' => 'local',
+			'root' => storage_path('image-tmp/'),
+			'visibility' => 'private',
+		],
 	],
 ];
diff --git a/config/livewire.php b/config/livewire.php
new file mode 100644
index 00000000000..dc056de88f7
--- /dev/null
+++ b/config/livewire.php
@@ -0,0 +1,158 @@
+<?php
+
+return [
+	/*
+	|---------------------------------------------------------------------------
+	| Class Namespace
+	|---------------------------------------------------------------------------
+	|
+	| This value sets the root class namespace for Livewire component classes in
+	| your application. This value will change where component auto-discovery
+	| finds components. It's also referenced by the file creation commands.
+	|
+	*/
+
+	'class_namespace' => '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',
+
+	/*
+	|---------------------------------------------------------------------------
+	| Lazy Loading Placeholder
+	|---------------------------------------------------------------------------
+	| Livewire allows you to lazy load components that would otherwise slow down
+	| the initial page load. Every component can have a custom placeholder or
+	| you can define the default placeholder view for all components below.
+	|
+	*/
+
+	'lazy_placeholder' => null,
+
+	/*
+	|---------------------------------------------------------------------------
+	| 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
+	| <head> and <body> 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,
+		'progress_bar_color' => '#2299dd',
+	],
+
+	/*
+	|---------------------------------------------------------------------------
+	| 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,
+
+	/*
+	|---------------------------------------------------------------------------
+	| Pagination Theme
+	|---------------------------------------------------------------------------
+	|
+	| When enabling Livewire's pagination feature by using the `WithPagination`
+	| trait, Livewire will use Tailwind templates to render pagination views
+	| on the page. If you want Bootstrap CSS, you can specify: "bootstrap"
+	|
+	*/
+
+	'pagination_theme' => 'tailwind',
+];
diff --git a/database/factories/AlbumFactory.php b/database/factories/AlbumFactory.php
new file mode 100644
index 00000000000..e74325b045e
--- /dev/null
+++ b/database/factories/AlbumFactory.php
@@ -0,0 +1,65 @@
+<?php
+
+namespace Database\Factories;
+
+use App\Models\Album;
+use Database\Factories\Traits\OwnedBy;
+use Illuminate\Database\Eloquent\Factories\Factory;
+
+/**
+ * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Album>
+ */
+class AlbumFactory extends Factory
+{
+	use OwnedBy;
+
+	/**
+	 * The name of the factory's corresponding model.
+	 *
+	 * @var string
+	 */
+	protected $model = Album::class;
+
+	/**
+	 * Define the model's default state.
+	 *
+	 * @return array<string, mixed>
+	 */
+	public function definition(): array
+	{
+		return [
+			'title' => fake()->country() . ' ' . fake()->year(),
+			'owner_id' => 1,
+		];
+	}
+
+	/**
+	 * Defines the parent of the create album.
+	 *
+	 * @param Album $parent
+	 *
+	 * @return self
+	 */
+	public function children_of(Album $parent): Factory
+	{
+		return $this->afterMaking(
+			fn (Album $album) => $parent->appendNode($album)
+		)
+			->afterCreating(function (Album $album) use ($parent) {
+				$parent->load('children');
+				$parent->fixOwnershipOfChildren();
+			});
+	}
+
+	/**
+	 * Make the album root.
+	 *
+	 * @return self
+	 */
+	public function as_root(): self
+	{
+		return $this->afterMaking(function (Album $album) {
+			$album->makeRoot();
+		});
+	}
+}
diff --git a/database/factories/PhotoFactory.php b/database/factories/PhotoFactory.php
new file mode 100644
index 00000000000..ebd1c46f66e
--- /dev/null
+++ b/database/factories/PhotoFactory.php
@@ -0,0 +1,136 @@
+<?php
+
+namespace Database\Factories;
+
+use App\Models\Album;
+use App\Models\Photo;
+use App\Models\SizeVariant;
+use Database\Factories\Traits\OwnedBy;
+use Illuminate\Database\Eloquent\Factories\Factory;
+
+/**
+ * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Photo>
+ */
+class PhotoFactory extends Factory
+{
+	use OwnedBy;
+
+	private bool $with_size_variants = true;
+
+	/**
+	 * The name of the factory's corresponding model.
+	 *
+	 * @var string
+	 */
+	protected $model = Photo::class;
+
+	/**
+	 * Define the model's default state.
+	 *
+	 * @return array<string,mixed>
+	 */
+	public function definition(): array
+	{
+		return [
+			'title' => 'CR_' . fake()->numerify('####'),
+			'description' => null,
+			'tags' => '',
+			'is_public' => false,
+			'owner_id' => 1,
+			'type' => 'image/jpeg',
+			'iso' => '100',
+			'aperture' => 'f/2',
+			'make' => 'Canon',
+			'model' => 'Canon EOS R',
+			'lens' => 'EF200mm f/2L IS',
+			'shutter' => '1/320 s',
+			'focal' => '200mm',
+			'taken_at' => now(),
+			'taken_at_orig_tz' => null,
+			'is_starred' => false,
+			'album_id' => null,
+			'checksum' => sha1(rand()),
+			'original_checksum' => sha1(rand()),
+			'license' => 'none',
+			'created_at' => now(),
+			'updated_at' => now(),
+		];
+	}
+
+	/**
+	 * Indicate that the user is suspended.
+	 */
+	public function without_size_variants(): Factory
+	{
+		$this->with_size_variants = false;
+
+		return $this;
+	}
+
+	/**
+	 * Set a bunch of GPS coordinates (in Netherlands).
+	 *
+	 * @return array<string,mixed>
+	 */
+	public function with_GPS_coordinates(): self
+	{
+		return $this->state(function (array $attributes) {
+			return [
+				'latitude' => '51.81738000',
+				'longitude' => '5.86694306',
+				'altitude' => '83.1000',
+			];
+		});
+	}
+
+	/**
+	 * Set a bunch of GPS coordinates (in Netherlands).
+	 *
+	 * @return array<string,mixed>
+	 */
+	public function with_subGPS_coordinates(): self
+	{
+		return $this->state(function (array $attributes) {
+			return [
+				'latitude' => '-51.81738000',
+				'longitude' => '-5.86694306',
+				'altitude' => '83.1000',
+			];
+		});
+	}
+
+	/**
+	 * Set a bunch of GPS coordinates (in Netherlands).
+	 *
+	 * @return self
+	 */
+	public function in(Album $album): self
+	{
+		return $this->state(function (array $attributes) use ($album) {
+			return [
+				'album_id' => $album->id,
+			];
+		})->afterCreating(function (Photo $photo) {
+			$photo->load('album', 'owner');
+		});
+	}
+
+	/**
+	 * Configure the model factory.
+	 * We create 7 random Size Variants.
+	 */
+	public function configure(): static
+	{
+		return $this->afterCreating(function (Photo $photo) {
+			// Creates the size variants
+			if ($this->with_size_variants) {
+				SizeVariant::factory()->count(7)->allSizeVariants()->create(['photo_id' => $photo->id]);
+				$photo->fresh();
+				$photo->load('size_variants');
+			}
+
+			// Reset the value if it was disabled.
+			$this->with_size_variants = true;
+		});
+	}
+}
diff --git a/database/factories/SizeVariantFactory.php b/database/factories/SizeVariantFactory.php
new file mode 100644
index 00000000000..e2a0bcc097a
--- /dev/null
+++ b/database/factories/SizeVariantFactory.php
@@ -0,0 +1,57 @@
+<?php
+
+namespace Database\Factories;
+
+use App\Enum\SizeVariantType;
+use App\Models\SizeVariant;
+use Illuminate\Database\Eloquent\Factories\Factory;
+use Illuminate\Database\Eloquent\Factories\Sequence;
+
+/**
+ * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\SizeVariant>
+ */
+class SizeVariantFactory extends Factory
+{
+	private const H = 360;
+	private const W = 540;
+	private const FS = 141011;
+
+	/**
+	 * The name of the factory's corresponding model.
+	 *
+	 * @var string
+	 */
+	protected $model = SizeVariant::class;
+
+	/**
+	 * Define the model's default state.
+	 *
+	 * @return array<string, mixed>
+	 */
+	public function definition(): array
+	{
+		$hash = fake()->sha1();
+		$url = substr($hash, 0, 2) . '/' . substr($hash, 2, 2) . '/' . substr($hash, 4) . '.jpg';
+
+		return ['type' => SizeVariantType::ORIGINAL, 'short_path' => SizeVariantType::ORIGINAL->name() . '/' . $url, 'ratio' => 1.5, 'height' => self::H * 8, 'width' => self::W * 8, 'filesize' => 64 * self::FS];
+	}
+
+	/**
+	 * Creates 7 size variant with correct type and size,.
+	 */
+	public function allSizeVariants(): Factory
+	{
+		$hash = fake()->sha1();
+		$url = substr($hash, 0, 2) . '/' . substr($hash, 2, 2) . '/' . substr($hash, 4) . '.jpg';
+
+		return $this->state(new Sequence(
+			['type' => SizeVariantType::ORIGINAL, 'short_path' => SizeVariantType::ORIGINAL->name() . '/' . $url, 'ratio' => 1.5, 'height' => self::H * 8, 'width' => self::W * 8, 'filesize' => 64 * self::FS],
+			['type' => SizeVariantType::MEDIUM2X, 'short_path' => SizeVariantType::MEDIUM2X->name() . '/' . $url, 'ratio' => 1.5, 'height' => self::H * 6, 'width' => self::W * 6, 'filesize' => 36 * self::FS],
+			['type' => SizeVariantType::MEDIUM, 'short_path' => SizeVariantType::MEDIUM->name() . '/' . $url, 'ratio' => 1.5, 'height' => self::H * 3, 'width' => self::W * 3, 'filesize' => 9 * self::FS],
+			['type' => SizeVariantType::SMALL2X, 'short_path' => SizeVariantType::SMALL2X->name() . '/' . $url, 'ratio' => 1.5, 'height' => self::H * 2, 'width' => self::W * 2, 'filesize' => 4 * self::FS],
+			['type' => SizeVariantType::SMALL, 'short_path' => SizeVariantType::SMALL->name() . '/' . $url, 'ratio' => 1.5, 'height' => self::H, 'width' => self::W, 'filesize' => self::FS],
+			['type' => SizeVariantType::THUMB2X, 'short_path' => SizeVariantType::THUMB2X->name() . '/' . $url, 'ratio' => 1.5, 'height' => 400, 'width' => 400, 'filesize' => 160_000],
+			['type' => SizeVariantType::THUMB, 'short_path' => SizeVariantType::THUMB->name() . '/' . $url, 'ratio' => 1.5, 'height' => 200, 'width' => 200, 'filesize' => 40_000],
+		));
+	}
+}
diff --git a/database/factories/Traits/OwnedBy.php b/database/factories/Traits/OwnedBy.php
new file mode 100644
index 00000000000..e421626ebdb
--- /dev/null
+++ b/database/factories/Traits/OwnedBy.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace Database\Factories\Traits;
+
+use App\Models\User;
+
+trait OwnedBy
+{
+	abstract public function state($state);
+
+	/**
+	 * Defines the owner of the create albums.
+	 *
+	 * @param User $user
+	 *
+	 * @return self
+	 */
+	public function owned_by(User $user): self
+	{
+		return $this->state(function (array $attributes) use ($user) {
+			return [
+				'owner_id' => $user->id,
+			];
+		});
+	}
+}
\ No newline at end of file
diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php
index 36125fd748e..df30138c27c 100644
--- a/database/factories/UserFactory.php
+++ b/database/factories/UserFactory.php
@@ -4,8 +4,10 @@
 
 use App\Models\User;
 use Illuminate\Database\Eloquent\Factories\Factory;
-use Illuminate\Support\Str;
 
+/**
+ * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User>
+ */
 class UserFactory extends Factory
 {
 	/**
@@ -18,16 +20,59 @@ class UserFactory extends Factory
 	/**
 	 * Define the model's default state.
 	 *
-	 * @return array
+	 * @return array<string,mixed>
 	 */
-	public function definition()
+	public function definition(): array
 	{
 		return [
-			'name' => $this->faker->name,
-			'email' => $this->faker->unique()->safeEmail,
-			'email_verified_at' => now(),
+			'username' => fake()->name(),
 			'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
-			'remember_token' => Str::random(10),
+			'may_administrate' => false,
+			'may_upload' => false,
+			'email' => fake()->email(),
+			'token' => null,
+			'remember_token' => null,
+			'may_edit_own_settings' => true,
 		];
 	}
+
+	/**
+	 * Indicate that user is Admin.
+	 *
+	 * @return Factory
+	 */
+	public function may_administrate(): Factory
+	{
+		return $this->state(function (array $attributes) {
+			return [
+				'may_administrate' => true,
+			];
+		});
+	}
+
+	/**
+	 * Indicate that the user has upload rights.
+	 *
+	 * @return Factory
+	 */
+	public function may_upload(): Factory
+	{
+		return $this->state(function (array $attributes) {
+			return [
+				'may_upload' => true,
+			];
+		});
+	}
+
+	/**
+	 * Indicates the user is locked.
+	 *
+	 * @return Factory
+	 */
+	public function locked(): Factory
+	{
+		return $this->state(function (array $attributes) {
+			return ['may_edit_own_settings' => false];
+		});
+	}
 }
diff --git a/database/migrations/2023_05_04_193000_add_use_last_modified_date_when_no_exit_date_setting.php b/database/migrations/2023_05_04_193000_add_use_last_modified_date_when_no_exit_date_setting.php
index 5d99c451047..fdd150a4bf1 100644
--- a/database/migrations/2023_05_04_193000_add_use_last_modified_date_when_no_exit_date_setting.php
+++ b/database/migrations/2023_05_04_193000_add_use_last_modified_date_when_no_exit_date_setting.php
@@ -1,35 +1,19 @@
 <?php
 
-use Illuminate\Database\Migrations\Migration;
-use Illuminate\Support\Facades\DB;
+use App\Models\Extensions\BaseConfigMigration;
 
-return new class() extends Migration {
-	/**
-	 * Run the migrations.
-	 *
-	 * @return void
-	 */
-	public function up()
+return new class() extends BaseConfigMigration {
+	public function getConfigs(): array
 	{
-		defined('BOOL') or define('BOOL', '0|1');
-
-		DB::table('configs')->insert([
-			'key' => 'use_last_modified_date_when_no_exif_date',
-			'value' => '0',
-			'cat' => 'Image Processing',
-			'type_range' => BOOL,
-			'confidentiality' => '0',
-			'description' => 'Use the file\'s last modified time when Exif data has no creation date',
-		]);
-	}
-
-	/**
-	 * Reverse the migrations.
-	 *
-	 * @return void
-	 */
-	public function down()
-	{
-		DB::table('configs')->where('key', '=', 'use_last_modified_date_when_no_exif_date')->delete();
+		return [
+			[
+				'key' => 'use_last_modified_date_when_no_exif_date',
+				'value' => '0',
+				'cat' => 'Image Processing',
+				'type_range' => '0|1',
+				'confidentiality' => '0',
+				'description' => 'Use the file\'s last modified time when Exif data has no creation date',
+			],
+		];
 	}
 };
diff --git a/database/migrations/2023_09_24_110932_add_date_display_configurations.php b/database/migrations/2023_09_24_110932_add_date_display_configurations.php
new file mode 100644
index 00000000000..833bb304243
--- /dev/null
+++ b/database/migrations/2023_09_24_110932_add_date_display_configurations.php
@@ -0,0 +1,70 @@
+<?php
+
+use App\Models\Extensions\BaseConfigMigration;
+
+return new class() extends BaseConfigMigration {
+	public const GALLERY = 'Gallery';
+	public const STRING_REQ = 'string_required';
+
+	public function getConfigs(): array
+	{
+		return [
+			[
+				'key' => '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',
+			],
+		];
+	}
+};
diff --git a/database/migrations/2023_09_24_223901_add_config_livewire_chunk_size.php b/database/migrations/2023_09_24_223901_add_config_livewire_chunk_size.php
new file mode 100644
index 00000000000..b4b0218b9ad
--- /dev/null
+++ b/database/migrations/2023_09_24_223901_add_config_livewire_chunk_size.php
@@ -0,0 +1,22 @@
+<?php
+
+use App\Models\Extensions\BaseConfigMigration;
+
+return new class() extends BaseConfigMigration {
+	public const IMAGE_PROCESSING = 'Image Processing';
+	public const INT = 'int';
+
+	public function getConfigs(): array
+	{
+		return [
+			[
+				'key' => 'upload_chunk_size',
+				'value' => '0',
+				'confidentiality' => '0',
+				'cat' => self::IMAGE_PROCESSING,
+				'type_range' => self::INT,
+				'description' => 'Size of chunks when uploading in bytes: 0 is auto',
+			],
+		];
+	}
+};
diff --git a/database/migrations/2023_09_24_233717_refactor_type_layout_livewire.php b/database/migrations/2023_09_24_233717_refactor_type_layout_livewire.php
new file mode 100644
index 00000000000..854949f1ef1
--- /dev/null
+++ b/database/migrations/2023_09_24_233717_refactor_type_layout_livewire.php
@@ -0,0 +1,36 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Support\Facades\DB;
+
+return new class() extends Migration {
+	public const SQUARE = 'square';
+	public const JUSTIFIED = 'justified';
+	public const UNJUSTIFIED = 'unjustified'; // ! Legacy
+	public const MASONRY = 'masonry';
+	public const GRID = 'grid';
+
+	/**
+	 * Run the migrations.
+	 */
+	public function up(): void
+	{
+		DB::table('configs')->where('key', '=', 'layout')->update([
+			'type_range' => self::SQUARE . '|' . self::JUSTIFIED . '|' . self::MASONRY . '|' . self::GRID,
+			'description' => 'Layout for pictures',
+		],
+		);
+	}
+
+	/**
+	 * Reverse the migrations.
+	 */
+	public function down(): void
+	{
+		DB::table('configs')->where('key', '=', 'layout')->update([
+			'type_range' => self::SQUARE . '|' . self::JUSTIFIED . '|' . self::UNJUSTIFIED,
+			'description' => 'Layout for pictures',
+		],
+		);
+	}
+};
diff --git a/database/migrations/2023_09_25_123925_config_blur_nsfw.php b/database/migrations/2023_09_25_123925_config_blur_nsfw.php
new file mode 100644
index 00000000000..d0e3f38ce22
--- /dev/null
+++ b/database/migrations/2023_09_25_123925_config_blur_nsfw.php
@@ -0,0 +1,22 @@
+<?php
+
+use App\Models\Extensions\BaseConfigMigration;
+
+return new class() extends BaseConfigMigration {
+	public const MOD_NSFW = 'Mod NSFW';
+	public const BOOL = '0|1';
+
+	public function getConfigs(): array
+	{
+		return [
+			[
+				'key' => 'nsfw_banner_blur_backdrop',
+				'value' => '0',
+				'confidentiality' => '0',
+				'cat' => self::MOD_NSFW,
+				'type_range' => self::BOOL,
+				'description' => 'Blur background instead of dark red opaque.',
+			],
+		];
+	}
+};
diff --git a/database/migrations/2023_12_18_232500_config_pagination_search_limit.php b/database/migrations/2023_12_18_232500_config_pagination_search_limit.php
new file mode 100644
index 00000000000..f1605ef86ea
--- /dev/null
+++ b/database/migrations/2023_12_18_232500_config_pagination_search_limit.php
@@ -0,0 +1,23 @@
+<?php
+
+use App\Models\Extensions\BaseConfigMigration;
+
+return new class() extends BaseConfigMigration {
+	public const MOD_SEARCH = 'Mod Search';
+	public const POSITIVE = 'positive';
+	public const BOOL = 'bool';
+
+	public function getConfigs(): array
+	{
+		return [
+			[
+				'key' => 'search_pagination_limit',
+				'value' => '1000',
+				'confidentiality' => '0',
+				'cat' => self::MOD_SEARCH,
+				'type_range' => self::POSITIVE,
+				'description' => 'Number of results to display per page.',
+			],
+		];
+	}
+};
diff --git a/database/migrations/2023_12_19_115547_search_characters_limit.php b/database/migrations/2023_12_19_115547_search_characters_limit.php
new file mode 100644
index 00000000000..f0ecc93d301
--- /dev/null
+++ b/database/migrations/2023_12_19_115547_search_characters_limit.php
@@ -0,0 +1,23 @@
+<?php
+
+use App\Models\Extensions\BaseConfigMigration;
+
+return new class() extends BaseConfigMigration {
+	public const MOD_SEARCH = 'Mod Search';
+	public const POSITIVE = 'positive';
+	public const BOOL = 'bool';
+
+	public function getConfigs(): array
+	{
+		return [
+			[
+				'key' => 'search_minimum_length_required',
+				'value' => '4',
+				'confidentiality' => '0',
+				'cat' => self::MOD_SEARCH,
+				'type_range' => self::POSITIVE,
+				'description' => 'Number of characters required to trigger search (default: 4).',
+			],
+		];
+	}
+};
diff --git a/database/migrations/2023_12_19_122408_add_positive_requirements.php b/database/migrations/2023_12_19_122408_add_positive_requirements.php
index 13fc1509034..0155379c1ce 100644
--- a/database/migrations/2023_12_19_122408_add_positive_requirements.php
+++ b/database/migrations/2023_12_19_122408_add_positive_requirements.php
@@ -16,6 +16,8 @@
 		'swipe_tolerance_x',
 		'swipe_tolerance_y',
 		'log_max_num_line',
+		'search_pagination_limit',
+		'search_minimum_length_required',
 	];
 
 	/**
diff --git a/database/migrations/2023_12_20_180854_add_setting_height_width_gallery.php b/database/migrations/2023_12_20_180854_add_setting_height_width_gallery.php
new file mode 100644
index 00000000000..749499fc437
--- /dev/null
+++ b/database/migrations/2023_12_20_180854_add_setting_height_width_gallery.php
@@ -0,0 +1,58 @@
+<?php
+
+use App\Models\Extensions\BaseConfigMigration;
+
+return new class() extends BaseConfigMigration {
+	public const GALLERY = 'Gallery';
+	public const POSITIVE = 'positive';
+	public const BOOL = 'bool';
+
+	public function getConfigs(): array
+	{
+		return [
+			[
+				'key' => 'photo_layout_justified_row_height',
+				'value' => '320',
+				'confidentiality' => '0',
+				'cat' => self::GALLERY,
+				'type_range' => self::POSITIVE,
+				'description' => 'Heights of rows in Justified photo layout',
+			],
+			[
+				// md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6 2xl:grid-cols-7
+				'key' => 'photo_layout_masonry_column_width',
+				'value' => '300',
+				'confidentiality' => '0',
+				'cat' => self::GALLERY,
+				'type_range' => self::POSITIVE,
+				'description' => 'Minimum column width in Masonry photo layout.',
+			],
+			[
+				// md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6 2xl:grid-cols-7
+				'key' => 'photo_layout_grid_column_width',
+				'value' => '250',
+				'confidentiality' => '0',
+				'cat' => self::GALLERY,
+				'type_range' => self::POSITIVE,
+				'description' => 'Minimum column width in Grid photo layout.',
+			],
+			[
+				// md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6 2xl:grid-cols-7
+				'key' => 'photo_layout_square_column_width',
+				'value' => '200',
+				'confidentiality' => '0',
+				'cat' => self::GALLERY,
+				'type_range' => self::POSITIVE,
+				'description' => 'Minimum column width in Square photo layout.',
+			],
+			[
+				'key' => 'photo_layout_gap',
+				'value' => '12',
+				'confidentiality' => '0',
+				'cat' => self::GALLERY,
+				'type_range' => self::POSITIVE,
+				'description' => 'Gap between columns in Square/Masonry/Grid photo layout.',
+			],
+		];
+	}
+};
diff --git a/database/migrations/2023_12_23_160356_bump_version050000.php b/database/migrations/2023_12_23_160356_bump_version050000.php
new file mode 100644
index 00000000000..ff784b8cb10
--- /dev/null
+++ b/database/migrations/2023_12_23_160356_bump_version050000.php
@@ -0,0 +1,24 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Support\Facades\DB;
+
+return new class() extends Migration {
+	/**
+	 * Run the migrations.
+	 */
+	public function up(): void
+	{
+		DB::table('configs')->where('key', 'version')->update(['value' => '050000']);
+		DB::table('configs')->where('value', '=', 'Lychee v4')->update(['value' => 'Lychee v5']);
+	}
+
+	/**
+	 * Reverse the migrations.
+	 */
+	public function down(): void
+	{
+		DB::table('configs')->where('key', 'version')->update(['value' => '041300']);
+		DB::table('configs')->where('value', '=', 'Lychee v5')->update(['value' => 'Lychee v4']);
+	}
+};
diff --git a/lang/cz/lychee.php b/lang/cz/lychee.php
index c7ad4546bd3..fd81a2c0254 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.',
@@ -398,6 +402,8 @@
 	'LAYOUT_TYPE' => 'Vzhled fotografií:',
 	'LAYOUT_SQUARES' => 'Čtvercové náhledy',
 	'LAYOUT_JUSTIFIED' => 'V poměru stran, zarovnáno',
+	'LAYOUT_MASONRY' => 'V poměru stran, masonry',
+	'LAYOUT_GRID' => 'V poměru stran, grid',
 	'LAYOUT_UNJUSTIFIED' => 'V poměru stran, nezarovnáno',
 	'SET_LAYOUT' => 'Změnit vzhled',
 
@@ -406,6 +412,9 @@
 	'SETTINGS_SUCCESS_NSFW_VISIBLE' => 'Default sensitive album visibility updated with success.',
 
 	'NSFW_BANNER' => '<h1>Sensitive content</h1><p>This album contains sensitive content which some people may find offensive or disturbing.</p><p>Tap to consent.</p>',
+	'NSFW_HEADER' => 'Sensitive content',
+	'NSFW_EXPLANATION' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+	'TAP_CONSENT' => 'Tap to consent.',
 
 	'VIEW_NO_RESULT' => 'Bez výsledku',
 	'VIEW_NO_PUBLIC_ALBUMS' => 'Veřejná alba nejsou k dispozici',
diff --git a/lang/de/lychee.php b/lang/de/lychee.php
index 514bf4c18ab..056a06a5ee6 100644
--- a/lang/de/lychee.php
+++ b/lang/de/lychee.php
@@ -7,6 +7,7 @@
 	'PASSWORD' => 'Kennwort',
 	'ENTER' => 'Eingabe',
 	'CANCEL' => 'Abbrechen',
+	'CONFIRM' => 'Bestätigen',
 	'SIGN_IN' => 'Anmelden',
 	'CLOSE' => 'Schließen',
 	'SETTINGS' => 'Einstellungen',
@@ -16,6 +17,7 @@
 	'GALLERY' => 'Gallerie',
 
 	'USERS' => 'Benutzer',
+	'PROFILE' => 'Profil',
 	'CREATE' => 'Erstellen',
 	'REMOVE' => 'Entfernen',
 	'SHARE' => 'Freigeben',
@@ -28,6 +30,7 @@
 	'ABOUT_LYCHEE' => 'Über Lychee',
 	'DIAGNOSTICS' => 'Diagnose',
 	'DIAGNOSTICS_GET_SIZE' => 'Speicherplatz-Nutzung abrufen',
+	'JOBS' => 'Job-Verlauf anzeigen',
 	'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' => 'Änderung erfolgreich.',
 	'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.',
@@ -398,6 +402,8 @@
 	'LAYOUT_TYPE' => 'Layout des Fotos:',
 	'LAYOUT_SQUARES' => 'Quadratische Miniaturansichten',
 	'LAYOUT_JUSTIFIED' => 'Seitenverhältnis beibehalten, Blocksatz',
+	'LAYOUT_MASONRY' => 'Seitenverhältnis beibehalten, masonry',
+	'LAYOUT_GRID' => 'Seitenverhältnis beibehalten, Gitter',
 	'LAYOUT_UNJUSTIFIED' => 'Seitenverhältnis beibehalten, Flattersatz',
 	'SET_LAYOUT' => 'Ausgerichtetes Layout benutzen:',
 
@@ -406,6 +412,9 @@
 	'SETTINGS_SUCCESS_NSFW_VISIBLE' => 'Standardmäßige Sichtbarkeit wurde erfolgreich geändert.',
 
 	'NSFW_BANNER' => '<h1>Krititscher Inhalt</h1><p>Diese Album enthält krititsche Inhalte, die manche Personen anstößig oder verstörend finden könnten.</p><p>Zur Einwilligung klicken.</p>',
+	'NSFW_HEADER' => 'Krititscher Inhalt',
+	'NSFW_EXPLANATION' => 'Diese Album enthält krititsche Inhalte, die manche Personen anstößig oder verstörend finden könnten.',
+	'TAP_CONSENT' => 'Zur Einwilligung klicken.',
 
 	'VIEW_NO_RESULT' => 'Keine Ergebnisse',
 	'VIEW_NO_PUBLIC_ALBUMS' => 'Keine öffentlichen Alben',
diff --git a/lang/el/lychee.php b/lang/el/lychee.php
index 4c8b3b9b2cb..f76cb8461af 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.',
@@ -398,6 +402,8 @@
 	'LAYOUT_TYPE' => 'Διάταξη φωτογραφιών:',
 	'LAYOUT_SQUARES' => 'Τετράγωνες μικρογραφίες',
 	'LAYOUT_JUSTIFIED' => 'Με ίσες αναλογίες',
+	'LAYOUT_MASONRY' => 'Με ίσες masonry',
+	'LAYOUT_GRID' => 'Με ίσες grid',
 	'LAYOUT_UNJUSTIFIED' => 'Με άνισες αναλογίες',
 	'SET_LAYOUT' => 'Αλλαγή διάταξης',
 
@@ -406,6 +412,9 @@
 	'SETTINGS_SUCCESS_NSFW_VISIBLE' => 'Default sensitive album visibility updated with success.',
 
 	'NSFW_BANNER' => '<h1>Sensitive content</h1><p>This album contains sensitive content which some people may find offensive or disturbing.</p><p>Tap to consent.</p>',
+	'NSFW_HEADER' => 'Sensitive content',
+	'NSFW_EXPLANATION' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+	'TAP_CONSENT' => 'Tap to consent.',
 
 	'VIEW_NO_RESULT' => 'Κανένα αποτέλεσμα',
 	'VIEW_NO_PUBLIC_ALBUMS' => 'Κανένα δημόσιο λεύκωμα',
diff --git a/lang/en/lychee.php b/lang/en/lychee.php
index fe52f678577..fd6a1c8eb08 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.',
@@ -352,7 +356,7 @@
 	'SORT_CHANGE' => 'Change Sorting',
 
 	'DROPBOX_TITLE' => 'Set Dropbox Key',
-	'DROPBOX_TEXT' => "In order to import photos from your Dropbox, you need a valid drop-ins app key from <a href='https://www.dropbox.com/developers/apps/create'>their website</a>. Generate yourself a personal key and enter it below:",
+	'DROPBOX_TEXT' => "In order to import photos from your Dropbox, you need a valid drop-ins app key from <a href='https://www.dropbox.com/developers/apps/create' class='text-neutral-200 border-b border-dashed border-neutral-400'>their website</a>. Generate yourself a personal key and enter it below:",
 
 	'LANG_TEXT' => 'Change Lychee language for:',
 	'LANG_TITLE' => 'Change Language',
@@ -398,6 +402,8 @@
 	'LAYOUT_TYPE' => 'Layout of photos:',
 	'LAYOUT_SQUARES' => 'Square thumbnails',
 	'LAYOUT_JUSTIFIED' => 'With aspect, justified',
+	'LAYOUT_MASONRY' => 'With aspect, masonry',
+	'LAYOUT_GRID' => 'With aspect, grid',
 	'LAYOUT_UNJUSTIFIED' => 'With aspect, unjustified',
 	'SET_LAYOUT' => 'Change layout',
 
@@ -406,6 +412,9 @@
 	'SETTINGS_SUCCESS_NSFW_VISIBLE' => 'Default sensitive album visibility updated with success.',
 
 	'NSFW_BANNER' => '<h1>Sensitive content</h1><p>This album contains sensitive content which some people may find offensive or disturbing.</p><p>Tap to consent.</p>',
+	'NSFW_HEADER' => 'Sensitive content',
+	'NSFW_EXPLANATION' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+	'TAP_CONSENT' => 'Tap to consent.',
 
 	'VIEW_NO_RESULT' => 'No results',
 	'VIEW_NO_PUBLIC_ALBUMS' => 'No public albums',
diff --git a/lang/es/lychee.php b/lang/es/lychee.php
index 40f2ed59af9..beb23e413c6 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.',
@@ -398,6 +402,8 @@
 	'LAYOUT_TYPE' => 'Diseño de fotos:',
 	'LAYOUT_SQUARES' => 'Miniaturas cuadradas',
 	'LAYOUT_JUSTIFIED' => 'Con aspecto justificado',
+	'LAYOUT_MASONRY' => 'Con aspecto, masonry',
+	'LAYOUT_GRID' => 'Con aspecto, grid',
 	'LAYOUT_UNJUSTIFIED' => 'Con aspecto, injustificado',
 	'SET_LAYOUT' => 'Cambia el diseño',
 
@@ -406,6 +412,9 @@
 	'SETTINGS_SUCCESS_NSFW_VISIBLE' => 'Visibilidad predeterminada del álbum sensible actualizada con éxito.',
 
 	'NSFW_BANNER' => '<h1>Sensitive content</h1><p>This album contains sensitive content which some people may find offensive or disturbing.</p><p>Tap to consent.</p>',
+	'NSFW_HEADER' => 'Sensitive content',
+	'NSFW_EXPLANATION' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+	'TAP_CONSENT' => 'Tap to consent.',
 
 	'VIEW_NO_RESULT' => 'No hay resultados',
 	'VIEW_NO_PUBLIC_ALBUMS' => 'Sin álbumes públicos',
diff --git a/lang/fr/lychee.php b/lang/fr/lychee.php
index 413dab30ef6..bddd4ada718 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.',
@@ -398,6 +402,8 @@
 	'LAYOUT_TYPE' => 'Affichage des photos :',
 	'LAYOUT_SQUARES' => 'Miniatures carrées',
 	'LAYOUT_JUSTIFIED' => 'En proportions, justifiées',
+	'LAYOUT_MASONRY' => 'En proportion, Maçonnerie',
+	'LAYOUT_GRID' => 'En proportion, Grille',
 	'LAYOUT_UNJUSTIFIED' => 'En proportions, non-justifiées',
 	'SET_LAYOUT' => 'Changer l’affichage',
 
@@ -406,6 +412,9 @@
 	'SETTINGS_SUCCESS_NSFW_VISIBLE' => 'Visibilé par default des albums sensible mis à jour.',
 
 	'NSFW_BANNER' => '<h1>Sensitive content</h1><p>This album contains sensitive content which some people may find offensive or disturbing.</p><p>Tap to consent.</p>',
+	'NSFW_HEADER' => 'Contenu Sensible',
+	'NSFW_EXPLANATION' => 'Cet album contient des contenus sensible que certaine personnes peuvent trouver chocant ou troublant.',
+	'TAP_CONSENT' => 'Tap pour consentir.',
 
 	'VIEW_NO_RESULT' => 'Aucun résultat',
 	'VIEW_NO_PUBLIC_ALBUMS' => 'Aucun album public',
diff --git a/lang/hu/lychee.php b/lang/hu/lychee.php
index 7bd89d6bfa1..ddf620e165d 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.',
@@ -396,6 +400,8 @@
 	'LAYOUT_TYPE' => 'Fényképek elrendezése:',
 	'LAYOUT_SQUARES' => 'Négyzet alakú bélyegképek',
 	'LAYOUT_JUSTIFIED' => 'Képaránnyal, igazított',
+	'LAYOUT_MASONRY' => 'Képaránnyal, masonry',
+	'LAYOUT_GRID' => 'Képaránnyal, grid',
 	'LAYOUT_UNJUSTIFIED' => 'Képaránnyal, igazítatlan',
 	'SET_LAYOUT' => 'Elrendezés megváltoztatása',
 
@@ -404,6 +410,9 @@
 	'SETTINGS_SUCCESS_NSFW_VISIBLE' => 'Az alapértelmezett érzékeny album láthatósága sikeresen frissítve.',
 
 	'NSFW_BANNER' => '<h1>Érzékeny tartalom</h1><p>Ez az album érzékeny tartalmat tartalmaz, amit néhány ember zavaró vagy zavarba ejtő lehet. Tapintson az engedélyezéshez.</p>',
+	'NSFW_HEADER' => 'Érzékeny tartalom',
+	'NSFW_EXPLANATION' => 'Ez az album érzékeny tartalmat tartalmaz, amit néhány ember zavaró vagy zavarba ejtő lehet.',
+	'TAP_CONSENT' => 'Tapintson az engedélyezéshez.',
 
 	'VIEW_NO_RESULT' => 'Nincs találat',
 	'VIEW_NO_PUBLIC_ALBUMS' => 'Nincsenek nyilvános albumok',
diff --git a/lang/it/lychee.php b/lang/it/lychee.php
index a562eeb3a8d..e10c01c55dc 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.',
@@ -398,6 +402,8 @@
 	'LAYOUT_TYPE' => 'Layout delle foto:',
 	'LAYOUT_SQUARES' => 'Miniature Quadrate',
 	'LAYOUT_JUSTIFIED' => 'Relativo all’aspetto, giustificate',
+	'LAYOUT_MASONRY' => 'Relativo all’aspetto, masonry',
+	'LAYOUT_GRID' => 'Relativo all’aspetto, grid',
 	'LAYOUT_UNJUSTIFIED' => 'Relativo all’aspetto, non giustificate',
 	'SET_LAYOUT' => 'Cambia layout',
 
@@ -406,6 +412,9 @@
 	'SETTINGS_SUCCESS_NSFW_VISIBLE' => 'Default sensitive album visibility updated with success.',
 
 	'NSFW_BANNER' => '<h1>Sensitive content</h1><p>This album contains sensitive content which some people may find offensive or disturbing.</p><p>Tap to consent.</p>',
+	'NSFW_HEADER' => 'Sensitive content',
+	'NSFW_EXPLANATION' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+	'TAP_CONSENT' => 'Tap to consent.',
 
 	'VIEW_NO_RESULT' => 'Nessun risultato',
 	'VIEW_NO_PUBLIC_ALBUMS' => 'Nessun album pubblico',
diff --git a/lang/nl/lychee.php b/lang/nl/lychee.php
index 92bfc89d8d6..7fa9de15753 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.',
@@ -398,6 +402,8 @@
 	'LAYOUT_TYPE' => 'Layout of photos:',
 	'LAYOUT_SQUARES' => 'Square thumbnails',
 	'LAYOUT_JUSTIFIED' => 'With aspect, justified',
+	'LAYOUT_MASONRY' => 'With aspect, masonry',
+	'LAYOUT_GRID' => 'With aspect, grid',
 	'LAYOUT_UNJUSTIFIED' => 'With aspect, unjustified',
 	'SET_LAYOUT' => 'Change layout',
 
@@ -406,6 +412,9 @@
 	'SETTINGS_SUCCESS_NSFW_VISIBLE' => 'Default sensitive album visibility updated with success.',
 
 	'NSFW_BANNER' => '<h1>Sensitive content</h1><p>This album contains sensitive content which some people may find offensive or disturbing.</p><p>Tap to consent.</p>',
+	'NSFW_HEADER' => 'Sensitive content',
+	'NSFW_EXPLANATION' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+	'TAP_CONSENT' => 'Tap to consent.',
 
 	'VIEW_NO_RESULT' => 'Geen resultaten',
 	'VIEW_NO_PUBLIC_ALBUMS' => 'Geen publieke albums',
diff --git a/lang/no/lychee.php b/lang/no/lychee.php
index 199338b4450..f56dc79e777 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.',
@@ -398,6 +402,8 @@
 	'LAYOUT_TYPE' => 'Oppsett for bilder:',
 	'LAYOUT_SQUARES' => 'Kvadratiske miniatyrbilder',
 	'LAYOUT_JUSTIFIED' => 'Med aspektratio, justert',
+	'LAYOUT_MASONRY' => 'Med aspektratio, masonry',
+	'LAYOUT_GRID' => 'Med aspektratio, grid',
 	'LAYOUT_UNJUSTIFIED' => 'Med aspektratio, ikke justert',
 	'SET_LAYOUT' => 'Lagre oppsett',
 
@@ -406,6 +412,9 @@
 	'SETTINGS_SUCCESS_NSFW_VISIBLE' => 'Default sensitive album visibility updated with success.',
 
 	'NSFW_BANNER' => '<h1>Sensitive content</h1><p>This album contains sensitive content which some people may find offensive or disturbing.</p><p>Tap to consent.</p>',
+	'NSFW_HEADER' => 'Sensitive content',
+	'NSFW_EXPLANATION' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+	'TAP_CONSENT' => 'Tap to consent.',
 
 	'VIEW_NO_RESULT' => 'Ingen resultater',
 	'VIEW_NO_PUBLIC_ALBUMS' => 'Ingen offentlige album',
diff --git a/lang/pl/lychee.php b/lang/pl/lychee.php
index 2b58c23402c..44da0b566a8 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.',
@@ -398,6 +402,8 @@
 	'LAYOUT_TYPE' => 'Układ zdjęć:',
 	'LAYOUT_SQUARES' => 'Kwadratowe miniaturki',
 	'LAYOUT_JUSTIFIED' => 'Aspekt, wyrównane',
+	'LAYOUT_MASONRY' => 'Aspekt, masonry',
+	'LAYOUT_GRID' => 'Aspekt, grid',
 	'LAYOUT_UNJUSTIFIED' => 'Aspekt, bez wyrównania',
 	'SET_LAYOUT' => 'Zmień układ',
 
@@ -406,6 +412,9 @@
 	'SETTINGS_SUCCESS_NSFW_VISIBLE' => 'Domyślne ustawienie dotyczące widoczności albumów poufnych ostało zaktualizowane.',
 
 	'NSFW_BANNER' => '<h1>Sensitive content</h1><p>This album contains sensitive content which some people may find offensive or disturbing.</p><p>Tap to consent.</p>',
+	'NSFW_HEADER' => 'Sensitive content',
+	'NSFW_EXPLANATION' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+	'TAP_CONSENT' => 'Tap to consent.',
 
 	'VIEW_NO_RESULT' => 'Brak wyników',
 	'VIEW_NO_PUBLIC_ALBUMS' => 'Brak albumów publicznych',
diff --git a/lang/pt/lychee.php b/lang/pt/lychee.php
index a2f4e0ab5fc..c1b56ff5c97 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.',
@@ -398,6 +402,8 @@
 	'LAYOUT_TYPE' => 'Disposição das fotografias:',
 	'LAYOUT_SQUARES' => 'Miniaturas quadradas',
 	'LAYOUT_JUSTIFIED' => 'Com formatação, justificada',
+	'LAYOUT_MASONRY' => 'Com formatação, masonry',
+	'LAYOUT_GRID' => 'Com formatação, grid',
 	'LAYOUT_UNJUSTIFIED' => 'Com formatação, não justificada',
 	'SET_LAYOUT' => 'Alterar disposição',
 
@@ -406,6 +412,9 @@
 	'SETTINGS_SUCCESS_NSFW_VISIBLE' => 'Sensibilidade predefinida do álbum visível atualizada com sucesso.',
 
 	'NSFW_BANNER' => '<h1>Sensitive content</h1><p>This album contains sensitive content which some people may find offensive or disturbing.</p><p>Tap to consent.</p>',
+	'NSFW_HEADER' => 'Sensitive content',
+	'NSFW_EXPLANATION' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+	'TAP_CONSENT' => 'Tap to consent.',
 
 	'VIEW_NO_RESULT' => 'Sem resultados',
 	'VIEW_NO_PUBLIC_ALBUMS' => 'Sem álbums públicos',
diff --git a/lang/ru/lychee.php b/lang/ru/lychee.php
index 6621ff5e8af..f74e5f52844 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.',
@@ -398,6 +402,8 @@
 	'LAYOUT_TYPE' => 'Компоновка фото:',
 	'LAYOUT_SQUARES' => 'Квадратные превью',
 	'LAYOUT_JUSTIFIED' => 'По формату, выровнять',
+	'LAYOUT_MASONRY' => 'По формату, masonry',
+	'LAYOUT_GRID' => 'По формату, grid',
 	'LAYOUT_UNJUSTIFIED' => 'По формату, не выравнивать',
 	'SET_LAYOUT' => 'Изменить компоновку',
 
@@ -406,6 +412,9 @@
 	'SETTINGS_SUCCESS_NSFW_VISIBLE' => 'Default sensitive album visibility updated with success.',
 
 	'NSFW_BANNER' => '<h1>Sensitive content</h1><p>This album contains sensitive content which some people may find offensive or disturbing.</p><p>Tap to consent.</p>',
+	'NSFW_HEADER' => 'Sensitive content',
+	'NSFW_EXPLANATION' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+	'TAP_CONSENT' => 'Tap to consent.',
 
 	'VIEW_NO_RESULT' => 'Не найдено',
 	'VIEW_NO_PUBLIC_ALBUMS' => 'Нет публичных альбомов',
diff --git a/lang/sk/lychee.php b/lang/sk/lychee.php
index 197a412f091..76b1d638875 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.',
@@ -398,6 +402,8 @@
 	'LAYOUT_TYPE' => 'Rozmiestnenie obrázkov:',
 	'LAYOUT_SQUARES' => 'Štvorcové náhľady',
 	'LAYOUT_JUSTIFIED' => 'Zachovaný pomer strán, zarovnané',
+	'LAYOUT_MASONRY' => 'Zachovaný pomer strán, masonry',
+	'LAYOUT_GRID' => 'Zachovaný pomer strán, grid',
 	'LAYOUT_UNJUSTIFIED' => 'Zachovaný pomer strán, nezarovnané',
 	'SET_LAYOUT' => 'Zmeniť rozmiestnenie',
 
@@ -406,6 +412,9 @@
 	'SETTINGS_SUCCESS_NSFW_VISIBLE' => 'Default sensitive album visibility updated with success.',
 
 	'NSFW_BANNER' => '<h1>Sensitive content</h1><p>This album contains sensitive content which some people may find offensive or disturbing.</p><p>Tap to consent.</p>',
+	'NSFW_HEADER' => 'Sensitive content',
+	'NSFW_EXPLANATION' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+	'TAP_CONSENT' => 'Tap to consent.',
 
 	'VIEW_NO_RESULT' => 'Žiadny výsledok',
 	'VIEW_NO_PUBLIC_ALBUMS' => 'Žiadne verejné albumy',
diff --git a/lang/sv/lychee.php b/lang/sv/lychee.php
index 8526f335299..65301e9864f 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.',
@@ -398,6 +402,8 @@
 	'LAYOUT_TYPE' => 'Layout of photos:',
 	'LAYOUT_SQUARES' => 'Square thumbnails',
 	'LAYOUT_JUSTIFIED' => 'With aspect, justified',
+	'LAYOUT_MASONRY' => 'With aspect, masonry',
+	'LAYOUT_GRID' => 'With aspect, grid',
 	'LAYOUT_UNJUSTIFIED' => 'With aspect, unjustified',
 	'SET_LAYOUT' => 'Change layout',
 
@@ -406,6 +412,9 @@
 	'SETTINGS_SUCCESS_NSFW_VISIBLE' => 'Default sensitive album visibility updated with success.',
 
 	'NSFW_BANNER' => '<h1>Sensitive content</h1><p>This album contains sensitive content which some people may find offensive or disturbing.</p><p>Tap to consent.</p>',
+	'NSFW_HEADER' => 'Sensitive content',
+	'NSFW_EXPLANATION' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+	'TAP_CONSENT' => 'Tap to consent.',
 
 	'VIEW_NO_RESULT' => 'Inget resultat',
 	'VIEW_NO_PUBLIC_ALBUMS' => 'Inga publika album',
diff --git a/lang/vi/lychee.php b/lang/vi/lychee.php
index 528d87d3263..6eaf3a2edbe 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.',
@@ -398,6 +402,8 @@
 	'LAYOUT_TYPE' => 'Cách trình bày hình ảnh:',
 	'LAYOUT_SQUARES' => 'Ô vuông hình nhỏ',
 	'LAYOUT_JUSTIFIED' => 'Theo tỷ lệ hình, canh đều hai bên',
+	'LAYOUT_MASONRY' => 'Theo tỷ lệ hình, masonry',
+	'LAYOUT_GRID' => 'Theo tỷ lệ hình, grid',
 	'LAYOUT_UNJUSTIFIED' => 'Theo tỷ lệ hình, không canh đều hai bên',
 	'SET_LAYOUT' => 'Thay đổi cách trình bày',
 
@@ -406,6 +412,9 @@
 	'SETTINGS_SUCCESS_NSFW_VISIBLE' => 'Chế độ hiển thị album nhạy cảm được cập nhật thành công.',
 
 	'NSFW_BANNER' => '<h1>Sensitive content</h1><p>This album contains sensitive content which some people may find offensive or disturbing.</p><p>Tap to consent.</p>',
+	'NSFW_HEADER' => 'Sensitive content',
+	'NSFW_EXPLANATION' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+	'TAP_CONSENT' => 'Tap to consent.',
 
 	'VIEW_NO_RESULT' => 'Không có kết quả nào',
 	'VIEW_NO_PUBLIC_ALBUMS' => 'Chưa có album chia sẻ công cộng nào',
diff --git a/lang/zh_CN/lychee.php b/lang/zh_CN/lychee.php
index 8f016fab636..49ab68198e0 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.',
@@ -398,6 +402,8 @@
 	'LAYOUT_TYPE' => '照片布局：',
 	'LAYOUT_SQUARES' => '方形缩略图',
 	'LAYOUT_JUSTIFIED' => '保持长宽比，两端对齐',
+	'LAYOUT_MASONRY' => '保持长宽比, masonry',
+	'LAYOUT_GRID' => '保持长宽比, grid',
 	'LAYOUT_UNJUSTIFIED' => '保持长宽比，不对齐',
 	'SET_LAYOUT' => '更改布局',
 
@@ -406,6 +412,9 @@
 	'SETTINGS_SUCCESS_NSFW_VISIBLE' => '敏感相册的默认可见性成功更新。',
 
 	'NSFW_BANNER' => '<h1>Sensitive content</h1><p>This album contains sensitive content which some people may find offensive or disturbing.</p><p>Tap to consent.</p>',
+	'NSFW_HEADER' => 'Sensitive content',
+	'NSFW_EXPLANATION' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+	'TAP_CONSENT' => 'Tap to consent.',
 
 	'VIEW_NO_RESULT' => '无结果',
 	'VIEW_NO_PUBLIC_ALBUMS' => '没有公开相册',
diff --git a/lang/zh_TW/lychee.php b/lang/zh_TW/lychee.php
index 1a794a6f1f5..ee199722719 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.',
@@ -398,6 +402,8 @@
 	'LAYOUT_TYPE' => '照片佈局:',
 	'LAYOUT_SQUARES' => '方形縮略圖',
 	'LAYOUT_JUSTIFIED' => '有方面，有道理',
+	'LAYOUT_MASONRY' => '有方面, masonry',
+	'LAYOUT_GRID' => '有方面, grid',
 	'LAYOUT_UNJUSTIFIED' => '有方面，沒有道理',
 	'SET_LAYOUT' => '變更版面',
 
@@ -406,6 +412,9 @@
 	'SETTINGS_SUCCESS_NSFW_VISIBLE' => 'Default sensitive album visibility updated with success.',
 
 	'NSFW_BANNER' => '<h1>Sensitive content</h1><p>This album contains sensitive content which some people may find offensive or disturbing.</p><p>Tap to consent.</p>',
+	'NSFW_HEADER' => 'Sensitive content',
+	'NSFW_EXPLANATION' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+	'TAP_CONSENT' => 'Tap to consent.',
 
 	'VIEW_NO_RESULT' => '無結果',
 	'VIEW_NO_PUBLIC_ALBUMS' => '沒有公開相簿',
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 00000000000..b6a9c1c45a0
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,3523 @@
+{
+    "name": "Lychee",
+    "lockfileVersion": 3,
+    "requires": true,
+    "packages": {
+        "": {
+            "dependencies": {
+                "@types/justified-layout": "^4.1.4",
+                "autoprefixer": "^10.4.16",
+                "justified-layout": "^4.1.0",
+                "laravel-vite-plugin": "^0.8.1",
+                "lazysizes": "^5.3.2",
+                "leaflet": "^1.9.4",
+                "leaflet-gpx": "^1.7.0",
+                "leaflet-rotatedmarker": "^0.2.0",
+                "leaflet.markercluster": "^1.4.1",
+                "postcss": "^8.4.32",
+                "prettier": "^3.1.1",
+                "qrcode": "^1.5.3",
+                "tailwindcss": "^3.3.6",
+                "ts-loader": "^9.5.1",
+                "typescript": "^5.3.3",
+                "vite": "^4.5.1",
+                "vite-plugin-checker": "^0.6.2",
+                "vite-plugin-commonjs": "^0.10.0"
+            },
+            "devDependencies": {
+                "@lychee-org/leaflet.photo": "^1.0.0",
+                "@types/alpinejs": "^3.13.5",
+                "@types/leaflet": "^1.9.8",
+                "@types/leaflet-rotatedmarker": "^0.2.5",
+                "@types/leaflet.markercluster": "^1.5.4",
+                "@types/mousetrap": "^1.6.15",
+                "@types/photoswipe": "^4.1.6",
+                "@types/qrcode": "^1.5.5"
+            }
+        },
+        "node_modules/@alloc/quick-lru": {
+            "version": "5.2.0",
+            "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+            "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/@babel/code-frame": {
+            "version": "7.23.5",
+            "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz",
+            "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
+            "dependencies": {
+                "@babel/highlight": "^7.23.4",
+                "chalk": "^2.4.2"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/code-frame/node_modules/ansi-styles": {
+            "version": "3.2.1",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+            "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+            "dependencies": {
+                "color-convert": "^1.9.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/@babel/code-frame/node_modules/chalk": {
+            "version": "2.4.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+            "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+            "dependencies": {
+                "ansi-styles": "^3.2.1",
+                "escape-string-regexp": "^1.0.5",
+                "supports-color": "^5.3.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/@babel/code-frame/node_modules/color-convert": {
+            "version": "1.9.3",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+            "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+            "dependencies": {
+                "color-name": "1.1.3"
+            }
+        },
+        "node_modules/@babel/code-frame/node_modules/color-name": {
+            "version": "1.1.3",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+            "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+        },
+        "node_modules/@babel/code-frame/node_modules/has-flag": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+            "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/@babel/code-frame/node_modules/supports-color": {
+            "version": "5.5.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+            "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+            "dependencies": {
+                "has-flag": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/@babel/helper-validator-identifier": {
+            "version": "7.22.20",
+            "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
+            "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/highlight": {
+            "version": "7.23.4",
+            "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
+            "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
+            "dependencies": {
+                "@babel/helper-validator-identifier": "^7.22.20",
+                "chalk": "^2.4.2",
+                "js-tokens": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/highlight/node_modules/ansi-styles": {
+            "version": "3.2.1",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+            "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+            "dependencies": {
+                "color-convert": "^1.9.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/@babel/highlight/node_modules/chalk": {
+            "version": "2.4.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+            "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+            "dependencies": {
+                "ansi-styles": "^3.2.1",
+                "escape-string-regexp": "^1.0.5",
+                "supports-color": "^5.3.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/@babel/highlight/node_modules/color-convert": {
+            "version": "1.9.3",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+            "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+            "dependencies": {
+                "color-name": "1.1.3"
+            }
+        },
+        "node_modules/@babel/highlight/node_modules/color-name": {
+            "version": "1.1.3",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+            "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+        },
+        "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==",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/@babel/highlight/node_modules/supports-color": {
+            "version": "5.5.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+            "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+            "dependencies": {
+                "has-flag": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/@esbuild/android-arm": {
+            "version": "0.18.20",
+            "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz",
+            "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==",
+            "cpu": [
+                "arm"
+            ],
+            "optional": true,
+            "os": [
+                "android"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/android-arm64": {
+            "version": "0.18.20",
+            "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz",
+            "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==",
+            "cpu": [
+                "arm64"
+            ],
+            "optional": true,
+            "os": [
+                "android"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/android-x64": {
+            "version": "0.18.20",
+            "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz",
+            "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==",
+            "cpu": [
+                "x64"
+            ],
+            "optional": true,
+            "os": [
+                "android"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/darwin-arm64": {
+            "version": "0.18.20",
+            "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz",
+            "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==",
+            "cpu": [
+                "arm64"
+            ],
+            "optional": true,
+            "os": [
+                "darwin"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/darwin-x64": {
+            "version": "0.18.20",
+            "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz",
+            "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==",
+            "cpu": [
+                "x64"
+            ],
+            "optional": true,
+            "os": [
+                "darwin"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/freebsd-arm64": {
+            "version": "0.18.20",
+            "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz",
+            "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==",
+            "cpu": [
+                "arm64"
+            ],
+            "optional": true,
+            "os": [
+                "freebsd"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/freebsd-x64": {
+            "version": "0.18.20",
+            "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz",
+            "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==",
+            "cpu": [
+                "x64"
+            ],
+            "optional": true,
+            "os": [
+                "freebsd"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-arm": {
+            "version": "0.18.20",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz",
+            "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==",
+            "cpu": [
+                "arm"
+            ],
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-arm64": {
+            "version": "0.18.20",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz",
+            "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==",
+            "cpu": [
+                "arm64"
+            ],
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-ia32": {
+            "version": "0.18.20",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz",
+            "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==",
+            "cpu": [
+                "ia32"
+            ],
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-loong64": {
+            "version": "0.18.20",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz",
+            "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==",
+            "cpu": [
+                "loong64"
+            ],
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-mips64el": {
+            "version": "0.18.20",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz",
+            "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==",
+            "cpu": [
+                "mips64el"
+            ],
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-ppc64": {
+            "version": "0.18.20",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz",
+            "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==",
+            "cpu": [
+                "ppc64"
+            ],
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-riscv64": {
+            "version": "0.18.20",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz",
+            "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==",
+            "cpu": [
+                "riscv64"
+            ],
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-s390x": {
+            "version": "0.18.20",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz",
+            "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==",
+            "cpu": [
+                "s390x"
+            ],
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-x64": {
+            "version": "0.18.20",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz",
+            "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==",
+            "cpu": [
+                "x64"
+            ],
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/netbsd-x64": {
+            "version": "0.18.20",
+            "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz",
+            "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==",
+            "cpu": [
+                "x64"
+            ],
+            "optional": true,
+            "os": [
+                "netbsd"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/openbsd-x64": {
+            "version": "0.18.20",
+            "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz",
+            "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==",
+            "cpu": [
+                "x64"
+            ],
+            "optional": true,
+            "os": [
+                "openbsd"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/sunos-x64": {
+            "version": "0.18.20",
+            "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz",
+            "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==",
+            "cpu": [
+                "x64"
+            ],
+            "optional": true,
+            "os": [
+                "sunos"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/win32-arm64": {
+            "version": "0.18.20",
+            "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz",
+            "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==",
+            "cpu": [
+                "arm64"
+            ],
+            "optional": true,
+            "os": [
+                "win32"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/win32-ia32": {
+            "version": "0.18.20",
+            "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz",
+            "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==",
+            "cpu": [
+                "ia32"
+            ],
+            "optional": true,
+            "os": [
+                "win32"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/win32-x64": {
+            "version": "0.18.20",
+            "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz",
+            "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==",
+            "cpu": [
+                "x64"
+            ],
+            "optional": true,
+            "os": [
+                "win32"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@isaacs/cliui": {
+            "version": "8.0.2",
+            "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+            "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+            "dependencies": {
+                "string-width": "^5.1.2",
+                "string-width-cjs": "npm:string-width@^4.2.0",
+                "strip-ansi": "^7.0.1",
+                "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+                "wrap-ansi": "^8.1.0",
+                "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+            },
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@jridgewell/gen-mapping": {
+            "version": "0.3.3",
+            "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+            "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+            "dependencies": {
+                "@jridgewell/set-array": "^1.0.1",
+                "@jridgewell/sourcemap-codec": "^1.4.10",
+                "@jridgewell/trace-mapping": "^0.3.9"
+            },
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/@jridgewell/resolve-uri": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
+            "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/@jridgewell/set-array": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+            "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/@jridgewell/source-map": {
+            "version": "0.3.5",
+            "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz",
+            "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==",
+            "peer": true,
+            "dependencies": {
+                "@jridgewell/gen-mapping": "^0.3.0",
+                "@jridgewell/trace-mapping": "^0.3.9"
+            }
+        },
+        "node_modules/@jridgewell/sourcemap-codec": {
+            "version": "1.4.15",
+            "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+            "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
+        },
+        "node_modules/@jridgewell/trace-mapping": {
+            "version": "0.3.20",
+            "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz",
+            "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==",
+            "dependencies": {
+                "@jridgewell/resolve-uri": "^3.1.0",
+                "@jridgewell/sourcemap-codec": "^1.4.14"
+            }
+        },
+        "node_modules/@lychee-org/leaflet.photo": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/@lychee-org/leaflet.photo/-/leaflet.photo-1.0.0.tgz",
+            "integrity": "sha512-0nUnOvcVxFdwJ7iqdpuZVT7t7ZLwluOTaRGZuGSf0KRd0f1Ebb6fed7uWaSa/TD+mXQIYagsoBtWYG0lxMakKw==",
+            "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==",
+            "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==",
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/@nodelib/fs.walk": {
+            "version": "1.2.8",
+            "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+            "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+            "dependencies": {
+                "@nodelib/fs.scandir": "2.1.5",
+                "fastq": "^1.6.0"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/@pkgjs/parseargs": {
+            "version": "0.11.0",
+            "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+            "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+            "optional": true,
+            "engines": {
+                "node": ">=14"
+            }
+        },
+        "node_modules/@types/alpinejs": {
+            "version": "3.13.5",
+            "resolved": "https://registry.npmjs.org/@types/alpinejs/-/alpinejs-3.13.5.tgz",
+            "integrity": "sha512-BSNTroRhmBkNiyd7ELK/5Boja92hnQMST6H4z1BqXKeMVzHjp9o1j5poqd5Tyhjd8oMFwxYC4I00eghfg2xrTA==",
+            "dev": true
+        },
+        "node_modules/@types/eslint": {
+            "version": "8.56.0",
+            "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.0.tgz",
+            "integrity": "sha512-FlsN0p4FhuYRjIxpbdXovvHQhtlG05O1GG/RNWvdAxTboR438IOTwmrY/vLA+Xfgg06BTkP045M3vpFwTMv1dg==",
+            "peer": true,
+            "dependencies": {
+                "@types/estree": "*",
+                "@types/json-schema": "*"
+            }
+        },
+        "node_modules/@types/eslint-scope": {
+            "version": "3.7.7",
+            "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
+            "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
+            "peer": true,
+            "dependencies": {
+                "@types/eslint": "*",
+                "@types/estree": "*"
+            }
+        },
+        "node_modules/@types/estree": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
+            "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+            "peer": true
+        },
+        "node_modules/@types/geojson": {
+            "version": "7946.0.13",
+            "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.13.tgz",
+            "integrity": "sha512-bmrNrgKMOhM3WsafmbGmC+6dsF2Z308vLFsQ3a/bT8X8Sv5clVYpPars/UPq+sAaJP+5OoLAYgwbkS5QEJdLUQ==",
+            "dev": true
+        },
+        "node_modules/@types/json-schema": {
+            "version": "7.0.15",
+            "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+            "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+            "peer": true
+        },
+        "node_modules/@types/justified-layout": {
+            "version": "4.1.4",
+            "resolved": "https://registry.npmjs.org/@types/justified-layout/-/justified-layout-4.1.4.tgz",
+            "integrity": "sha512-q2ybP0u0NVj87oMnGZOGxY2iUN8ddr48zPOBHBdbOLpsMTA/keGj+93ou+OMCnJk0xewzlNIaVEkxM6VBD3E2w=="
+        },
+        "node_modules/@types/leaflet": {
+            "version": "1.9.8",
+            "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.8.tgz",
+            "integrity": "sha512-EXdsL4EhoUtGm2GC2ZYtXn+Fzc6pluVgagvo2VC1RHWToLGlTRwVYoDpqS/7QXa01rmDyBjJk3Catpf60VMkwg==",
+            "dev": true,
+            "dependencies": {
+                "@types/geojson": "*"
+            }
+        },
+        "node_modules/@types/leaflet-rotatedmarker": {
+            "version": "0.2.5",
+            "resolved": "https://registry.npmjs.org/@types/leaflet-rotatedmarker/-/leaflet-rotatedmarker-0.2.5.tgz",
+            "integrity": "sha512-GaKK1bdQ6NYGkVdZj2cHe8Eu1BVf40Jhtmd8pZj5gQSJcTy5iTog0hsMIhf6QQDKnaEgrRJzm4OES6B9vxi4dw==",
+            "dev": true,
+            "dependencies": {
+                "@types/leaflet": "*"
+            }
+        },
+        "node_modules/@types/leaflet.markercluster": {
+            "version": "1.5.4",
+            "resolved": "https://registry.npmjs.org/@types/leaflet.markercluster/-/leaflet.markercluster-1.5.4.tgz",
+            "integrity": "sha512-tfMP8J62+wfsVLDLGh5Zh1JZxijCaBmVsMAX78MkLPwvPitmZZtSin5aWOVRhZrCS+pEOZwNzexbfWXlY+7yjg==",
+            "dev": true,
+            "dependencies": {
+                "@types/leaflet": "*"
+            }
+        },
+        "node_modules/@types/mousetrap": {
+            "version": "1.6.15",
+            "resolved": "https://registry.npmjs.org/@types/mousetrap/-/mousetrap-1.6.15.tgz",
+            "integrity": "sha512-qL0hyIMNPow317QWW/63RvL1x5MVMV+Ru3NaY9f/CuEpCqrmb7WeuK2071ZY5hczOnm38qExWM2i2WtkXLSqFw==",
+            "dev": true
+        },
+        "node_modules/@types/node": {
+            "version": "20.10.5",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz",
+            "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==",
+            "dependencies": {
+                "undici-types": "~5.26.4"
+            }
+        },
+        "node_modules/@types/photoswipe": {
+            "version": "4.1.6",
+            "resolved": "https://registry.npmjs.org/@types/photoswipe/-/photoswipe-4.1.6.tgz",
+            "integrity": "sha512-6kN4KYjNF4sg79fSwZ46s4Pron4+YJxoW0DQOcHveUZc/3cWd8Q4B9OLlDmEYw9iI6fODU8kyyq8ZBy+8F/+zQ==",
+            "dev": true
+        },
+        "node_modules/@types/qrcode": {
+            "version": "1.5.5",
+            "resolved": "https://registry.npmjs.org/@types/qrcode/-/qrcode-1.5.5.tgz",
+            "integrity": "sha512-CdfBi/e3Qk+3Z/fXYShipBT13OJ2fDO2Q2w5CIP5anLTLIndQG9z6P1cnm+8zCWSpm5dnxMFd/uREtb0EXuQzg==",
+            "dev": true,
+            "dependencies": {
+                "@types/node": "*"
+            }
+        },
+        "node_modules/@webassemblyjs/ast": {
+            "version": "1.11.6",
+            "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz",
+            "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==",
+            "peer": true,
+            "dependencies": {
+                "@webassemblyjs/helper-numbers": "1.11.6",
+                "@webassemblyjs/helper-wasm-bytecode": "1.11.6"
+            }
+        },
+        "node_modules/@webassemblyjs/floating-point-hex-parser": {
+            "version": "1.11.6",
+            "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
+            "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==",
+            "peer": true
+        },
+        "node_modules/@webassemblyjs/helper-api-error": {
+            "version": "1.11.6",
+            "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
+            "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==",
+            "peer": true
+        },
+        "node_modules/@webassemblyjs/helper-buffer": {
+            "version": "1.11.6",
+            "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz",
+            "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==",
+            "peer": true
+        },
+        "node_modules/@webassemblyjs/helper-numbers": {
+            "version": "1.11.6",
+            "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
+            "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
+            "peer": true,
+            "dependencies": {
+                "@webassemblyjs/floating-point-hex-parser": "1.11.6",
+                "@webassemblyjs/helper-api-error": "1.11.6",
+                "@xtuc/long": "4.2.2"
+            }
+        },
+        "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+            "version": "1.11.6",
+            "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
+            "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==",
+            "peer": true
+        },
+        "node_modules/@webassemblyjs/helper-wasm-section": {
+            "version": "1.11.6",
+            "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz",
+            "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==",
+            "peer": true,
+            "dependencies": {
+                "@webassemblyjs/ast": "1.11.6",
+                "@webassemblyjs/helper-buffer": "1.11.6",
+                "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+                "@webassemblyjs/wasm-gen": "1.11.6"
+            }
+        },
+        "node_modules/@webassemblyjs/ieee754": {
+            "version": "1.11.6",
+            "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
+            "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
+            "peer": true,
+            "dependencies": {
+                "@xtuc/ieee754": "^1.2.0"
+            }
+        },
+        "node_modules/@webassemblyjs/leb128": {
+            "version": "1.11.6",
+            "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
+            "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
+            "peer": true,
+            "dependencies": {
+                "@xtuc/long": "4.2.2"
+            }
+        },
+        "node_modules/@webassemblyjs/utf8": {
+            "version": "1.11.6",
+            "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
+            "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==",
+            "peer": true
+        },
+        "node_modules/@webassemblyjs/wasm-edit": {
+            "version": "1.11.6",
+            "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz",
+            "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==",
+            "peer": true,
+            "dependencies": {
+                "@webassemblyjs/ast": "1.11.6",
+                "@webassemblyjs/helper-buffer": "1.11.6",
+                "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+                "@webassemblyjs/helper-wasm-section": "1.11.6",
+                "@webassemblyjs/wasm-gen": "1.11.6",
+                "@webassemblyjs/wasm-opt": "1.11.6",
+                "@webassemblyjs/wasm-parser": "1.11.6",
+                "@webassemblyjs/wast-printer": "1.11.6"
+            }
+        },
+        "node_modules/@webassemblyjs/wasm-gen": {
+            "version": "1.11.6",
+            "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz",
+            "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==",
+            "peer": true,
+            "dependencies": {
+                "@webassemblyjs/ast": "1.11.6",
+                "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+                "@webassemblyjs/ieee754": "1.11.6",
+                "@webassemblyjs/leb128": "1.11.6",
+                "@webassemblyjs/utf8": "1.11.6"
+            }
+        },
+        "node_modules/@webassemblyjs/wasm-opt": {
+            "version": "1.11.6",
+            "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz",
+            "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==",
+            "peer": true,
+            "dependencies": {
+                "@webassemblyjs/ast": "1.11.6",
+                "@webassemblyjs/helper-buffer": "1.11.6",
+                "@webassemblyjs/wasm-gen": "1.11.6",
+                "@webassemblyjs/wasm-parser": "1.11.6"
+            }
+        },
+        "node_modules/@webassemblyjs/wasm-parser": {
+            "version": "1.11.6",
+            "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz",
+            "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==",
+            "peer": true,
+            "dependencies": {
+                "@webassemblyjs/ast": "1.11.6",
+                "@webassemblyjs/helper-api-error": "1.11.6",
+                "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+                "@webassemblyjs/ieee754": "1.11.6",
+                "@webassemblyjs/leb128": "1.11.6",
+                "@webassemblyjs/utf8": "1.11.6"
+            }
+        },
+        "node_modules/@webassemblyjs/wast-printer": {
+            "version": "1.11.6",
+            "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz",
+            "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==",
+            "peer": true,
+            "dependencies": {
+                "@webassemblyjs/ast": "1.11.6",
+                "@xtuc/long": "4.2.2"
+            }
+        },
+        "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==",
+            "peer": 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==",
+            "peer": true
+        },
+        "node_modules/acorn": {
+            "version": "8.11.2",
+            "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz",
+            "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==",
+            "bin": {
+                "acorn": "bin/acorn"
+            },
+            "engines": {
+                "node": ">=0.4.0"
+            }
+        },
+        "node_modules/acorn-import-assertions": {
+            "version": "1.9.0",
+            "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
+            "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
+            "peer": true,
+            "peerDependencies": {
+                "acorn": "^8"
+            }
+        },
+        "node_modules/ajv": {
+            "version": "6.12.6",
+            "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+            "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+            "peer": true,
+            "dependencies": {
+                "fast-deep-equal": "^3.1.1",
+                "fast-json-stable-stringify": "^2.0.0",
+                "json-schema-traverse": "^0.4.1",
+                "uri-js": "^4.2.2"
+            },
+            "funding": {
+                "type": "github",
+                "url": "https://github.com/sponsors/epoberezkin"
+            }
+        },
+        "node_modules/ajv-keywords": {
+            "version": "3.5.2",
+            "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+            "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+            "peer": true,
+            "peerDependencies": {
+                "ajv": "^6.9.1"
+            }
+        },
+        "node_modules/ansi-escapes": {
+            "version": "4.3.2",
+            "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+            "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+            "dependencies": {
+                "type-fest": "^0.21.3"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/ansi-regex": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+            "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+            "engines": {
+                "node": ">=12"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+            }
+        },
+        "node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/any-promise": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+            "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="
+        },
+        "node_modules/anymatch": {
+            "version": "3.1.3",
+            "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+            "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+            "dependencies": {
+                "normalize-path": "^3.0.0",
+                "picomatch": "^2.0.4"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "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=="
+        },
+        "node_modules/autoprefixer": {
+            "version": "10.4.16",
+            "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz",
+            "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==",
+            "funding": [
+                {
+                    "type": "opencollective",
+                    "url": "https://opencollective.com/postcss/"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+                },
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/ai"
+                }
+            ],
+            "dependencies": {
+                "browserslist": "^4.21.10",
+                "caniuse-lite": "^1.0.30001538",
+                "fraction.js": "^4.3.6",
+                "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/balanced-match": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+            "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+        },
+        "node_modules/binary-extensions": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+            "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/brace-expansion": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+            "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+            "dependencies": {
+                "balanced-match": "^1.0.0"
+            }
+        },
+        "node_modules/braces": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+            "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+            "dependencies": {
+                "fill-range": "^7.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/browserslist": {
+            "version": "4.22.2",
+            "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
+            "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
+            "funding": [
+                {
+                    "type": "opencollective",
+                    "url": "https://opencollective.com/browserslist"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/funding/github/npm/browserslist"
+                },
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/ai"
+                }
+            ],
+            "dependencies": {
+                "caniuse-lite": "^1.0.30001565",
+                "electron-to-chromium": "^1.4.601",
+                "node-releases": "^2.0.14",
+                "update-browserslist-db": "^1.0.13"
+            },
+            "bin": {
+                "browserslist": "cli.js"
+            },
+            "engines": {
+                "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+            }
+        },
+        "node_modules/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==",
+            "peer": true
+        },
+        "node_modules/camelcase": {
+            "version": "5.3.1",
+            "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+            "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/camelcase-css": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+            "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/caniuse-lite": {
+            "version": "1.0.30001571",
+            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001571.tgz",
+            "integrity": "sha512-tYq/6MoXhdezDLFZuCO/TKboTzuQ/xR5cFdgXPfDtM7/kchBO3b4VWghE/OAi/DV7tTdhmLjZiZBZi1fA/GheQ==",
+            "funding": [
+                {
+                    "type": "opencollective",
+                    "url": "https://opencollective.com/browserslist"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+                },
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/ai"
+                }
+            ]
+        },
+        "node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/chokidar": {
+            "version": "3.5.3",
+            "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+            "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+            "funding": [
+                {
+                    "type": "individual",
+                    "url": "https://paulmillr.com/funding/"
+                }
+            ],
+            "dependencies": {
+                "anymatch": "~3.1.2",
+                "braces": "~3.0.2",
+                "glob-parent": "~5.1.2",
+                "is-binary-path": "~2.1.0",
+                "is-glob": "~4.0.1",
+                "normalize-path": "~3.0.0",
+                "readdirp": "~3.6.0"
+            },
+            "engines": {
+                "node": ">= 8.10.0"
+            },
+            "optionalDependencies": {
+                "fsevents": "~2.3.2"
+            }
+        },
+        "node_modules/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==",
+            "dependencies": {
+                "is-glob": "^4.0.1"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/chrome-trace-event": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
+            "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
+            "peer": true,
+            "engines": {
+                "node": ">=6.0"
+            }
+        },
+        "node_modules/cliui": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+            "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+            "dependencies": {
+                "string-width": "^4.2.0",
+                "strip-ansi": "^6.0.0",
+                "wrap-ansi": "^6.2.0"
+            }
+        },
+        "node_modules/cliui/node_modules/ansi-regex": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/cliui/node_modules/emoji-regex": {
+            "version": "8.0.0",
+            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+            "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+        },
+        "node_modules/cliui/node_modules/string-width": {
+            "version": "4.2.3",
+            "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+            "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+            "dependencies": {
+                "emoji-regex": "^8.0.0",
+                "is-fullwidth-code-point": "^3.0.0",
+                "strip-ansi": "^6.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/cliui/node_modules/strip-ansi": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+            "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+            "dependencies": {
+                "ansi-regex": "^5.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/cliui/node_modules/wrap-ansi": {
+            "version": "6.2.0",
+            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+            "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+            "dependencies": {
+                "ansi-styles": "^4.0.0",
+                "string-width": "^4.1.0",
+                "strip-ansi": "^6.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+        },
+        "node_modules/commander": {
+            "version": "4.1.1",
+            "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+            "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/concat-map": {
+            "version": "0.0.1",
+            "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+            "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+        },
+        "node_modules/cross-spawn": {
+            "version": "7.0.3",
+            "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+            "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+            "dependencies": {
+                "path-key": "^3.1.0",
+                "shebang-command": "^2.0.0",
+                "which": "^2.0.1"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/cssesc": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+            "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+            "bin": {
+                "cssesc": "bin/cssesc"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/decamelize": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+            "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+            "engines": {
+                "node": ">=0.10.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=="
+        },
+        "node_modules/dijkstrajs": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz",
+            "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA=="
+        },
+        "node_modules/dlv": {
+            "version": "1.1.3",
+            "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+            "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
+        },
+        "node_modules/eastasianwidth": {
+            "version": "0.2.0",
+            "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+            "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
+        },
+        "node_modules/electron-to-chromium": {
+            "version": "1.4.616",
+            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.616.tgz",
+            "integrity": "sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg=="
+        },
+        "node_modules/emoji-regex": {
+            "version": "9.2.2",
+            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+            "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
+        },
+        "node_modules/encode-utf8": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz",
+            "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw=="
+        },
+        "node_modules/enhanced-resolve": {
+            "version": "5.15.0",
+            "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
+            "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==",
+            "dependencies": {
+                "graceful-fs": "^4.2.4",
+                "tapable": "^2.2.0"
+            },
+            "engines": {
+                "node": ">=10.13.0"
+            }
+        },
+        "node_modules/es-module-lexer": {
+            "version": "1.4.1",
+            "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz",
+            "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w=="
+        },
+        "node_modules/esbuild": {
+            "version": "0.18.20",
+            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
+            "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==",
+            "hasInstallScript": true,
+            "bin": {
+                "esbuild": "bin/esbuild"
+            },
+            "engines": {
+                "node": ">=12"
+            },
+            "optionalDependencies": {
+                "@esbuild/android-arm": "0.18.20",
+                "@esbuild/android-arm64": "0.18.20",
+                "@esbuild/android-x64": "0.18.20",
+                "@esbuild/darwin-arm64": "0.18.20",
+                "@esbuild/darwin-x64": "0.18.20",
+                "@esbuild/freebsd-arm64": "0.18.20",
+                "@esbuild/freebsd-x64": "0.18.20",
+                "@esbuild/linux-arm": "0.18.20",
+                "@esbuild/linux-arm64": "0.18.20",
+                "@esbuild/linux-ia32": "0.18.20",
+                "@esbuild/linux-loong64": "0.18.20",
+                "@esbuild/linux-mips64el": "0.18.20",
+                "@esbuild/linux-ppc64": "0.18.20",
+                "@esbuild/linux-riscv64": "0.18.20",
+                "@esbuild/linux-s390x": "0.18.20",
+                "@esbuild/linux-x64": "0.18.20",
+                "@esbuild/netbsd-x64": "0.18.20",
+                "@esbuild/openbsd-x64": "0.18.20",
+                "@esbuild/sunos-x64": "0.18.20",
+                "@esbuild/win32-arm64": "0.18.20",
+                "@esbuild/win32-ia32": "0.18.20",
+                "@esbuild/win32-x64": "0.18.20"
+            }
+        },
+        "node_modules/escalade": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+            "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/escape-string-regexp": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+            "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+            "engines": {
+                "node": ">=0.8.0"
+            }
+        },
+        "node_modules/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==",
+            "peer": 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==",
+            "peer": 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==",
+            "peer": 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==",
+            "peer": true,
+            "engines": {
+                "node": ">=4.0"
+            }
+        },
+        "node_modules/events": {
+            "version": "3.3.0",
+            "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+            "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+            "peer": true,
+            "engines": {
+                "node": ">=0.8.x"
+            }
+        },
+        "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==",
+            "peer": true
+        },
+        "node_modules/fast-glob": {
+            "version": "3.3.2",
+            "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+            "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+            "dependencies": {
+                "@nodelib/fs.stat": "^2.0.2",
+                "@nodelib/fs.walk": "^1.2.3",
+                "glob-parent": "^5.1.2",
+                "merge2": "^1.3.0",
+                "micromatch": "^4.0.4"
+            },
+            "engines": {
+                "node": ">=8.6.0"
+            }
+        },
+        "node_modules/fast-glob/node_modules/glob-parent": {
+            "version": "5.1.2",
+            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+            "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+            "dependencies": {
+                "is-glob": "^4.0.1"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/fast-json-stable-stringify": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+            "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+            "peer": true
+        },
+        "node_modules/fastq": {
+            "version": "1.16.0",
+            "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz",
+            "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==",
+            "dependencies": {
+                "reusify": "^1.0.4"
+            }
+        },
+        "node_modules/fill-range": {
+            "version": "7.0.1",
+            "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+            "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+            "dependencies": {
+                "to-regex-range": "^5.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/find-up": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+            "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+            "dependencies": {
+                "locate-path": "^5.0.0",
+                "path-exists": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/foreground-child": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
+            "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+            "dependencies": {
+                "cross-spawn": "^7.0.0",
+                "signal-exit": "^4.0.1"
+            },
+            "engines": {
+                "node": ">=14"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
+        "node_modules/fraction.js": {
+            "version": "4.3.7",
+            "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+            "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+            "engines": {
+                "node": "*"
+            },
+            "funding": {
+                "type": "patreon",
+                "url": "https://github.com/sponsors/rawify"
+            }
+        },
+        "node_modules/fs-extra": {
+            "version": "11.2.0",
+            "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
+            "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
+            "dependencies": {
+                "graceful-fs": "^4.2.0",
+                "jsonfile": "^6.0.1",
+                "universalify": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=14.14"
+            }
+        },
+        "node_modules/fsevents": {
+            "version": "2.3.3",
+            "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+            "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+            "hasInstallScript": true,
+            "optional": true,
+            "os": [
+                "darwin"
+            ],
+            "engines": {
+                "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+            }
+        },
+        "node_modules/function-bind": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+            "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/get-caller-file": {
+            "version": "2.0.5",
+            "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+            "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+            "engines": {
+                "node": "6.* || 8.* || >= 10.*"
+            }
+        },
+        "node_modules/glob": {
+            "version": "10.3.10",
+            "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
+            "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
+            "dependencies": {
+                "foreground-child": "^3.1.0",
+                "jackspeak": "^2.3.5",
+                "minimatch": "^9.0.1",
+                "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
+                "path-scurry": "^1.10.1"
+            },
+            "bin": {
+                "glob": "dist/esm/bin.mjs"
+            },
+            "engines": {
+                "node": ">=16 || 14 >=14.17"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
+        "node_modules/glob-parent": {
+            "version": "6.0.2",
+            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+            "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+            "dependencies": {
+                "is-glob": "^4.0.3"
+            },
+            "engines": {
+                "node": ">=10.13.0"
+            }
+        },
+        "node_modules/glob-to-regexp": {
+            "version": "0.4.1",
+            "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+            "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+            "peer": true
+        },
+        "node_modules/graceful-fs": {
+            "version": "4.2.11",
+            "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+            "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+        },
+        "node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/hasown": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
+            "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+            "dependencies": {
+                "function-bind": "^1.1.2"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            }
+        },
+        "node_modules/is-binary-path": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+            "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+            "dependencies": {
+                "binary-extensions": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/is-core-module": {
+            "version": "2.13.1",
+            "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
+            "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+            "dependencies": {
+                "hasown": "^2.0.0"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/is-extglob": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+            "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-fullwidth-code-point": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+            "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+            "engines": {
+                "node": ">=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==",
+            "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==",
+            "engines": {
+                "node": ">=0.12.0"
+            }
+        },
+        "node_modules/isexe": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+            "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+        },
+        "node_modules/jackspeak": {
+            "version": "2.3.6",
+            "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
+            "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
+            "dependencies": {
+                "@isaacs/cliui": "^8.0.2"
+            },
+            "engines": {
+                "node": ">=14"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            },
+            "optionalDependencies": {
+                "@pkgjs/parseargs": "^0.11.0"
+            }
+        },
+        "node_modules/jest-worker": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+            "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+            "peer": 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==",
+            "peer": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/supports-color?sponsor=1"
+            }
+        },
+        "node_modules/jiti": {
+            "version": "1.21.0",
+            "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz",
+            "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==",
+            "bin": {
+                "jiti": "bin/jiti.js"
+            }
+        },
+        "node_modules/js-tokens": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+            "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+        },
+        "node_modules/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==",
+            "peer": 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==",
+            "peer": true
+        },
+        "node_modules/jsonfile": {
+            "version": "6.1.0",
+            "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+            "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+            "dependencies": {
+                "universalify": "^2.0.0"
+            },
+            "optionalDependencies": {
+                "graceful-fs": "^4.1.6"
+            }
+        },
+        "node_modules/justified-layout": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/justified-layout/-/justified-layout-4.1.0.tgz",
+            "integrity": "sha512-M5FimNMXgiOYerVRGsXZ2YK9YNCaTtwtYp7Hb2308U1Q9TXXHx5G0p08mcVR5O53qf8bWY4NJcPBxE6zuayXSg=="
+        },
+        "node_modules/laravel-vite-plugin": {
+            "version": "0.8.1",
+            "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-0.8.1.tgz",
+            "integrity": "sha512-fxzUDjOA37kOsYq8dP+3oPIlw8/kJVXwu0hOXLun82R1LpV02shGeWGYKx2lbpKffL5I0sfPPjfqbYxuqBluAA==",
+            "dependencies": {
+                "picocolors": "^1.0.0",
+                "vite-plugin-full-reload": "^1.0.5"
+            },
+            "engines": {
+                "node": ">=14"
+            },
+            "peerDependencies": {
+                "vite": "^3.0.0 || ^4.0.0"
+            }
+        },
+        "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/leaflet": {
+            "version": "1.9.4",
+            "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz",
+            "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA=="
+        },
+        "node_modules/leaflet-gpx": {
+            "version": "1.7.0",
+            "resolved": "https://registry.npmjs.org/leaflet-gpx/-/leaflet-gpx-1.7.0.tgz",
+            "integrity": "sha512-5NS5WKfp5zaAHMB2KM6OUaIng+SZ3e/UHK2++ABl2wELojYlmLqIL8t1Mj6DaZGkIh3kld+mAUvMGdIzC1yGRA=="
+        },
+        "node_modules/leaflet-rotatedmarker": {
+            "version": "0.2.0",
+            "resolved": "https://registry.npmjs.org/leaflet-rotatedmarker/-/leaflet-rotatedmarker-0.2.0.tgz",
+            "integrity": "sha512-yc97gxLXwbZa+Gk9VCcqI0CkvIBC9oNTTjFsHqq4EQvANrvaboib4UdeQLyTnEqDpaXHCqzwwVIDHtvz2mUiDg=="
+        },
+        "node_modules/leaflet.markercluster": {
+            "version": "1.5.3",
+            "resolved": "https://registry.npmjs.org/leaflet.markercluster/-/leaflet.markercluster-1.5.3.tgz",
+            "integrity": "sha512-vPTw/Bndq7eQHjLBVlWpnGeLa3t+3zGiuM7fJwCkiMFq+nmRuG3RI3f7f4N4TDX7T4NpbAXpR2+NTRSEGfCSeA==",
+            "peerDependencies": {
+                "leaflet": "^1.3.1"
+            }
+        },
+        "node_modules/lilconfig": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+            "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/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=="
+        },
+        "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==",
+            "peer": true,
+            "engines": {
+                "node": ">=6.11.5"
+            }
+        },
+        "node_modules/locate-path": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+            "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+            "dependencies": {
+                "p-locate": "^4.1.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/lodash.debounce": {
+            "version": "4.0.8",
+            "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+            "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
+        },
+        "node_modules/lodash.pick": {
+            "version": "4.4.0",
+            "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz",
+            "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q=="
+        },
+        "node_modules/lru-cache": {
+            "version": "10.1.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
+            "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
+            "engines": {
+                "node": "14 || >=16.14"
+            }
+        },
+        "node_modules/magic-string": {
+            "version": "0.30.5",
+            "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz",
+            "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==",
+            "dependencies": {
+                "@jridgewell/sourcemap-codec": "^1.4.15"
+            },
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "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==",
+            "peer": 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==",
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/micromatch": {
+            "version": "4.0.5",
+            "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+            "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+            "dependencies": {
+                "braces": "^3.0.2",
+                "picomatch": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=8.6"
+            }
+        },
+        "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==",
+            "peer": 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==",
+            "peer": true,
+            "dependencies": {
+                "mime-db": "1.52.0"
+            },
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/minimatch": {
+            "version": "9.0.3",
+            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+            "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+            "dependencies": {
+                "brace-expansion": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=16 || 14 >=14.17"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
+        "node_modules/minipass": {
+            "version": "7.0.4",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
+            "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
+            "engines": {
+                "node": ">=16 || 14 >=14.17"
+            }
+        },
+        "node_modules/mz": {
+            "version": "2.7.0",
+            "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+            "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+            "dependencies": {
+                "any-promise": "^1.0.0",
+                "object-assign": "^4.0.1",
+                "thenify-all": "^1.0.0"
+            }
+        },
+        "node_modules/nanoid": {
+            "version": "3.3.7",
+            "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+            "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/ai"
+                }
+            ],
+            "bin": {
+                "nanoid": "bin/nanoid.cjs"
+            },
+            "engines": {
+                "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+            }
+        },
+        "node_modules/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==",
+            "peer": true
+        },
+        "node_modules/node-releases": {
+            "version": "2.0.14",
+            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
+            "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw=="
+        },
+        "node_modules/normalize-path": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+            "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+            "engines": {
+                "node": ">=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==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/npm-run-path": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+            "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+            "dependencies": {
+                "path-key": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/object-assign": {
+            "version": "4.1.1",
+            "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+            "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/object-hash": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+            "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/p-limit": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+            "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+            "dependencies": {
+                "p-try": "^2.0.0"
+            },
+            "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==",
+            "dependencies": {
+                "p-limit": "^2.2.0"
+            },
+            "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==",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/path-exists": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+            "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/path-key": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+            "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+            "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=="
+        },
+        "node_modules/path-scurry": {
+            "version": "1.10.1",
+            "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz",
+            "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==",
+            "dependencies": {
+                "lru-cache": "^9.1.1 || ^10.0.0",
+                "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+            },
+            "engines": {
+                "node": ">=16 || 14 >=14.17"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
+        "node_modules/picocolors": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+            "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+        },
+        "node_modules/picomatch": {
+            "version": "2.3.1",
+            "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+            "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+            "engines": {
+                "node": ">=8.6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/jonschlinkert"
+            }
+        },
+        "node_modules/pify": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+            "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/pirates": {
+            "version": "4.0.6",
+            "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+            "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/pngjs": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz",
+            "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==",
+            "engines": {
+                "node": ">=10.13.0"
+            }
+        },
+        "node_modules/postcss": {
+            "version": "8.4.32",
+            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz",
+            "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==",
+            "funding": [
+                {
+                    "type": "opencollective",
+                    "url": "https://opencollective.com/postcss/"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/funding/github/npm/postcss"
+                },
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/ai"
+                }
+            ],
+            "dependencies": {
+                "nanoid": "^3.3.7",
+                "picocolors": "^1.0.0",
+                "source-map-js": "^1.0.2"
+            },
+            "engines": {
+                "node": "^10 || ^12 || >=14"
+            }
+        },
+        "node_modules/postcss-import": {
+            "version": "15.1.0",
+            "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+            "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+            "dependencies": {
+                "postcss-value-parser": "^4.0.0",
+                "read-cache": "^1.0.0",
+                "resolve": "^1.1.7"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            },
+            "peerDependencies": {
+                "postcss": "^8.0.0"
+            }
+        },
+        "node_modules/postcss-js": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+            "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+            "dependencies": {
+                "camelcase-css": "^2.0.1"
+            },
+            "engines": {
+                "node": "^12 || ^14 || >= 16"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/postcss/"
+            },
+            "peerDependencies": {
+                "postcss": "^8.4.21"
+            }
+        },
+        "node_modules/postcss-load-config": {
+            "version": "4.0.2",
+            "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
+            "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
+            "funding": [
+                {
+                    "type": "opencollective",
+                    "url": "https://opencollective.com/postcss/"
+                },
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/ai"
+                }
+            ],
+            "dependencies": {
+                "lilconfig": "^3.0.0",
+                "yaml": "^2.3.4"
+            },
+            "engines": {
+                "node": ">= 14"
+            },
+            "peerDependencies": {
+                "postcss": ">=8.0.9",
+                "ts-node": ">=9.0.0"
+            },
+            "peerDependenciesMeta": {
+                "postcss": {
+                    "optional": true
+                },
+                "ts-node": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/postcss-load-config/node_modules/lilconfig": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz",
+            "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==",
+            "engines": {
+                "node": ">=14"
+            }
+        },
+        "node_modules/postcss-nested": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",
+            "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",
+            "dependencies": {
+                "postcss-selector-parser": "^6.0.11"
+            },
+            "engines": {
+                "node": ">=12.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/postcss/"
+            },
+            "peerDependencies": {
+                "postcss": "^8.2.14"
+            }
+        },
+        "node_modules/postcss-selector-parser": {
+            "version": "6.0.13",
+            "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
+            "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+            "dependencies": {
+                "cssesc": "^3.0.0",
+                "util-deprecate": "^1.0.2"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/postcss-value-parser": {
+            "version": "4.2.0",
+            "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+            "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
+        },
+        "node_modules/prettier": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz",
+            "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==",
+            "bin": {
+                "prettier": "bin/prettier.cjs"
+            },
+            "engines": {
+                "node": ">=14"
+            },
+            "funding": {
+                "url": "https://github.com/prettier/prettier?sponsor=1"
+            }
+        },
+        "node_modules/punycode": {
+            "version": "2.3.1",
+            "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+            "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+            "peer": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/qrcode": {
+            "version": "1.5.3",
+            "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz",
+            "integrity": "sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==",
+            "dependencies": {
+                "dijkstrajs": "^1.0.1",
+                "encode-utf8": "^1.0.3",
+                "pngjs": "^5.0.0",
+                "yargs": "^15.3.1"
+            },
+            "bin": {
+                "qrcode": "bin/qrcode"
+            },
+            "engines": {
+                "node": ">=10.13.0"
+            }
+        },
+        "node_modules/queue-microtask": {
+            "version": "1.2.3",
+            "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+            "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ]
+        },
+        "node_modules/randombytes": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+            "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+            "peer": true,
+            "dependencies": {
+                "safe-buffer": "^5.1.0"
+            }
+        },
+        "node_modules/read-cache": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+            "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+            "dependencies": {
+                "pify": "^2.3.0"
+            }
+        },
+        "node_modules/readdirp": {
+            "version": "3.6.0",
+            "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+            "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+            "dependencies": {
+                "picomatch": "^2.2.1"
+            },
+            "engines": {
+                "node": ">=8.10.0"
+            }
+        },
+        "node_modules/require-directory": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+            "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/require-main-filename": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+            "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
+        },
+        "node_modules/resolve": {
+            "version": "1.22.8",
+            "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+            "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+            "dependencies": {
+                "is-core-module": "^2.13.0",
+                "path-parse": "^1.0.7",
+                "supports-preserve-symlinks-flag": "^1.0.0"
+            },
+            "bin": {
+                "resolve": "bin/resolve"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/reusify": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+            "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+            "engines": {
+                "iojs": ">=1.0.0",
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/rollup": {
+            "version": "3.29.4",
+            "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz",
+            "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==",
+            "bin": {
+                "rollup": "dist/bin/rollup"
+            },
+            "engines": {
+                "node": ">=14.18.0",
+                "npm": ">=8.0.0"
+            },
+            "optionalDependencies": {
+                "fsevents": "~2.3.2"
+            }
+        },
+        "node_modules/run-parallel": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+            "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ],
+            "dependencies": {
+                "queue-microtask": "^1.2.2"
+            }
+        },
+        "node_modules/safe-buffer": {
+            "version": "5.2.1",
+            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+            "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ],
+            "peer": true
+        },
+        "node_modules/schema-utils": {
+            "version": "3.3.0",
+            "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+            "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+            "peer": true,
+            "dependencies": {
+                "@types/json-schema": "^7.0.8",
+                "ajv": "^6.12.5",
+                "ajv-keywords": "^3.5.2"
+            },
+            "engines": {
+                "node": ">= 10.13.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/webpack"
+            }
+        },
+        "node_modules/semver": {
+            "version": "7.5.4",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+            "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+            "dependencies": {
+                "lru-cache": "^6.0.0"
+            },
+            "bin": {
+                "semver": "bin/semver.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/semver/node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/serialize-javascript": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
+            "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
+            "peer": true,
+            "dependencies": {
+                "randombytes": "^2.1.0"
+            }
+        },
+        "node_modules/set-blocking": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+            "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
+        },
+        "node_modules/shebang-command": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+            "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+            "dependencies": {
+                "shebang-regex": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/shebang-regex": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+            "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/signal-exit": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+            "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+            "engines": {
+                "node": ">=14"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
+        "node_modules/source-map": {
+            "version": "0.7.4",
+            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+            "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/source-map-js": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+            "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+            "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==",
+            "peer": true,
+            "dependencies": {
+                "buffer-from": "^1.0.0",
+                "source-map": "^0.6.0"
+            }
+        },
+        "node_modules/source-map-support/node_modules/source-map": {
+            "version": "0.6.1",
+            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+            "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+            "peer": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/string-width": {
+            "version": "5.1.2",
+            "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+            "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+            "dependencies": {
+                "eastasianwidth": "^0.2.0",
+                "emoji-regex": "^9.2.2",
+                "strip-ansi": "^7.0.1"
+            },
+            "engines": {
+                "node": ">=12"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/string-width-cjs": {
+            "name": "string-width",
+            "version": "4.2.3",
+            "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+            "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+            "dependencies": {
+                "emoji-regex": "^8.0.0",
+                "is-fullwidth-code-point": "^3.0.0",
+                "strip-ansi": "^6.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/string-width-cjs/node_modules/ansi-regex": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/string-width-cjs/node_modules/emoji-regex": {
+            "version": "8.0.0",
+            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+            "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+        },
+        "node_modules/string-width-cjs/node_modules/strip-ansi": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+            "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+            "dependencies": {
+                "ansi-regex": "^5.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/strip-ansi": {
+            "version": "7.1.0",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+            "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+            "dependencies": {
+                "ansi-regex": "^6.0.1"
+            },
+            "engines": {
+                "node": ">=12"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+            }
+        },
+        "node_modules/strip-ansi-cjs": {
+            "name": "strip-ansi",
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+            "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+            "dependencies": {
+                "ansi-regex": "^5.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/sucrase": {
+            "version": "3.35.0",
+            "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
+            "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
+            "dependencies": {
+                "@jridgewell/gen-mapping": "^0.3.2",
+                "commander": "^4.0.0",
+                "glob": "^10.3.10",
+                "lines-and-columns": "^1.1.6",
+                "mz": "^2.7.0",
+                "pirates": "^4.0.1",
+                "ts-interface-checker": "^0.1.9"
+            },
+            "bin": {
+                "sucrase": "bin/sucrase",
+                "sucrase-node": "bin/sucrase-node"
+            },
+            "engines": {
+                "node": ">=16 || 14 >=14.17"
+            }
+        },
+        "node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/supports-preserve-symlinks-flag": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+            "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/tailwindcss": {
+            "version": "3.4.0",
+            "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.0.tgz",
+            "integrity": "sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==",
+            "dependencies": {
+                "@alloc/quick-lru": "^5.2.0",
+                "arg": "^5.0.2",
+                "chokidar": "^3.5.3",
+                "didyoumean": "^1.2.2",
+                "dlv": "^1.1.3",
+                "fast-glob": "^3.3.0",
+                "glob-parent": "^6.0.2",
+                "is-glob": "^4.0.3",
+                "jiti": "^1.19.1",
+                "lilconfig": "^2.1.0",
+                "micromatch": "^4.0.5",
+                "normalize-path": "^3.0.0",
+                "object-hash": "^3.0.0",
+                "picocolors": "^1.0.0",
+                "postcss": "^8.4.23",
+                "postcss-import": "^15.1.0",
+                "postcss-js": "^4.0.1",
+                "postcss-load-config": "^4.0.1",
+                "postcss-nested": "^6.0.1",
+                "postcss-selector-parser": "^6.0.11",
+                "resolve": "^1.22.2",
+                "sucrase": "^3.32.0"
+            },
+            "bin": {
+                "tailwind": "lib/cli.js",
+                "tailwindcss": "lib/cli.js"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/tapable": {
+            "version": "2.2.1",
+            "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+            "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/terser": {
+            "version": "5.26.0",
+            "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz",
+            "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==",
+            "peer": true,
+            "dependencies": {
+                "@jridgewell/source-map": "^0.3.3",
+                "acorn": "^8.8.2",
+                "commander": "^2.20.0",
+                "source-map-support": "~0.5.20"
+            },
+            "bin": {
+                "terser": "bin/terser"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/terser-webpack-plugin": {
+            "version": "5.3.9",
+            "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz",
+            "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==",
+            "peer": true,
+            "dependencies": {
+                "@jridgewell/trace-mapping": "^0.3.17",
+                "jest-worker": "^27.4.5",
+                "schema-utils": "^3.1.1",
+                "serialize-javascript": "^6.0.1",
+                "terser": "^5.16.8"
+            },
+            "engines": {
+                "node": ">= 10.13.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/webpack"
+            },
+            "peerDependencies": {
+                "webpack": "^5.1.0"
+            },
+            "peerDependenciesMeta": {
+                "@swc/core": {
+                    "optional": true
+                },
+                "esbuild": {
+                    "optional": true
+                },
+                "uglify-js": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/terser/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==",
+            "peer": true
+        },
+        "node_modules/thenify": {
+            "version": "3.3.1",
+            "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+            "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+            "dependencies": {
+                "any-promise": "^1.0.0"
+            }
+        },
+        "node_modules/thenify-all": {
+            "version": "1.6.0",
+            "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+            "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+            "dependencies": {
+                "thenify": ">= 3.1.0 < 4"
+            },
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/tiny-invariant": {
+            "version": "1.3.1",
+            "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz",
+            "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw=="
+        },
+        "node_modules/to-regex-range": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+            "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+            "dependencies": {
+                "is-number": "^7.0.0"
+            },
+            "engines": {
+                "node": ">=8.0"
+            }
+        },
+        "node_modules/ts-interface-checker": {
+            "version": "0.1.13",
+            "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+            "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="
+        },
+        "node_modules/ts-loader": {
+            "version": "9.5.1",
+            "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz",
+            "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==",
+            "dependencies": {
+                "chalk": "^4.1.0",
+                "enhanced-resolve": "^5.0.0",
+                "micromatch": "^4.0.0",
+                "semver": "^7.3.4",
+                "source-map": "^0.7.4"
+            },
+            "engines": {
+                "node": ">=12.0.0"
+            },
+            "peerDependencies": {
+                "typescript": "*",
+                "webpack": "^5.0.0"
+            }
+        },
+        "node_modules/type-fest": {
+            "version": "0.21.3",
+            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+            "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/typescript": {
+            "version": "5.3.3",
+            "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz",
+            "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==",
+            "bin": {
+                "tsc": "bin/tsc",
+                "tsserver": "bin/tsserver"
+            },
+            "engines": {
+                "node": ">=14.17"
+            }
+        },
+        "node_modules/undici-types": {
+            "version": "5.26.5",
+            "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+            "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
+        },
+        "node_modules/universalify": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+            "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+            "engines": {
+                "node": ">= 10.0.0"
+            }
+        },
+        "node_modules/update-browserslist-db": {
+            "version": "1.0.13",
+            "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
+            "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+            "funding": [
+                {
+                    "type": "opencollective",
+                    "url": "https://opencollective.com/browserslist"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/funding/github/npm/browserslist"
+                },
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/ai"
+                }
+            ],
+            "dependencies": {
+                "escalade": "^3.1.1",
+                "picocolors": "^1.0.0"
+            },
+            "bin": {
+                "update-browserslist-db": "cli.js"
+            },
+            "peerDependencies": {
+                "browserslist": ">= 4.21.0"
+            }
+        },
+        "node_modules/uri-js": {
+            "version": "4.4.1",
+            "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+            "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+            "peer": true,
+            "dependencies": {
+                "punycode": "^2.1.0"
+            }
+        },
+        "node_modules/util-deprecate": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+            "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+        },
+        "node_modules/vite": {
+            "version": "4.5.1",
+            "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz",
+            "integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==",
+            "dependencies": {
+                "esbuild": "^0.18.10",
+                "postcss": "^8.4.27",
+                "rollup": "^3.27.1"
+            },
+            "bin": {
+                "vite": "bin/vite.js"
+            },
+            "engines": {
+                "node": "^14.18.0 || >=16.0.0"
+            },
+            "funding": {
+                "url": "https://github.com/vitejs/vite?sponsor=1"
+            },
+            "optionalDependencies": {
+                "fsevents": "~2.3.2"
+            },
+            "peerDependencies": {
+                "@types/node": ">= 14",
+                "less": "*",
+                "lightningcss": "^1.21.0",
+                "sass": "*",
+                "stylus": "*",
+                "sugarss": "*",
+                "terser": "^5.4.0"
+            },
+            "peerDependenciesMeta": {
+                "@types/node": {
+                    "optional": true
+                },
+                "less": {
+                    "optional": true
+                },
+                "lightningcss": {
+                    "optional": true
+                },
+                "sass": {
+                    "optional": true
+                },
+                "stylus": {
+                    "optional": true
+                },
+                "sugarss": {
+                    "optional": true
+                },
+                "terser": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/vite-plugin-checker": {
+            "version": "0.6.2",
+            "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.6.2.tgz",
+            "integrity": "sha512-YvvvQ+IjY09BX7Ab+1pjxkELQsBd4rPhWNw8WLBeFVxu/E7O+n6VYAqNsKdK/a2luFlX/sMpoWdGFfg4HvwdJQ==",
+            "dependencies": {
+                "@babel/code-frame": "^7.12.13",
+                "ansi-escapes": "^4.3.0",
+                "chalk": "^4.1.1",
+                "chokidar": "^3.5.1",
+                "commander": "^8.0.0",
+                "fast-glob": "^3.2.7",
+                "fs-extra": "^11.1.0",
+                "lodash.debounce": "^4.0.8",
+                "lodash.pick": "^4.4.0",
+                "npm-run-path": "^4.0.1",
+                "semver": "^7.5.0",
+                "strip-ansi": "^6.0.0",
+                "tiny-invariant": "^1.1.0",
+                "vscode-languageclient": "^7.0.0",
+                "vscode-languageserver": "^7.0.0",
+                "vscode-languageserver-textdocument": "^1.0.1",
+                "vscode-uri": "^3.0.2"
+            },
+            "engines": {
+                "node": ">=14.16"
+            },
+            "peerDependencies": {
+                "eslint": ">=7",
+                "meow": "^9.0.0",
+                "optionator": "^0.9.1",
+                "stylelint": ">=13",
+                "typescript": "*",
+                "vite": ">=2.0.0",
+                "vls": "*",
+                "vti": "*",
+                "vue-tsc": ">=1.3.9"
+            },
+            "peerDependenciesMeta": {
+                "eslint": {
+                    "optional": true
+                },
+                "meow": {
+                    "optional": true
+                },
+                "optionator": {
+                    "optional": true
+                },
+                "stylelint": {
+                    "optional": true
+                },
+                "typescript": {
+                    "optional": true
+                },
+                "vls": {
+                    "optional": true
+                },
+                "vti": {
+                    "optional": true
+                },
+                "vue-tsc": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/vite-plugin-checker/node_modules/ansi-regex": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/vite-plugin-checker/node_modules/commander": {
+            "version": "8.3.0",
+            "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+            "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+            "engines": {
+                "node": ">= 12"
+            }
+        },
+        "node_modules/vite-plugin-checker/node_modules/strip-ansi": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+            "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+            "dependencies": {
+                "ansi-regex": "^5.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/vite-plugin-commonjs": {
+            "version": "0.10.1",
+            "resolved": "https://registry.npmjs.org/vite-plugin-commonjs/-/vite-plugin-commonjs-0.10.1.tgz",
+            "integrity": "sha512-taP8R9kYGlCW5OzkVR0UIWRCnG6rSxeWWuA7tnU5b9t5MniibOnDY219NhisTeDhJAeGT8cEnrhVWZ9A5yD+vg==",
+            "dependencies": {
+                "acorn": "^8.8.2",
+                "fast-glob": "^3.2.12",
+                "magic-string": "^0.30.1",
+                "vite-plugin-dynamic-import": "^1.5.0"
+            }
+        },
+        "node_modules/vite-plugin-dynamic-import": {
+            "version": "1.5.0",
+            "resolved": "https://registry.npmjs.org/vite-plugin-dynamic-import/-/vite-plugin-dynamic-import-1.5.0.tgz",
+            "integrity": "sha512-Qp85c+AVJmLa8MLni74U4BDiWpUeFNx7NJqbGZyR2XJOU7mgW0cb7nwlAMucFyM4arEd92Nfxp4j44xPi6Fu7g==",
+            "dependencies": {
+                "acorn": "^8.8.2",
+                "es-module-lexer": "^1.2.1",
+                "fast-glob": "^3.2.12",
+                "magic-string": "^0.30.1"
+            }
+        },
+        "node_modules/vite-plugin-full-reload": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.1.0.tgz",
+            "integrity": "sha512-3cObNDzX6DdfhD9E7kf6w2mNunFpD7drxyNgHLw+XwIYAgb+Xt16SEXo0Up4VH+TMf3n+DSVJZtW2POBGcBYAA==",
+            "dependencies": {
+                "picocolors": "^1.0.0",
+                "picomatch": "^2.3.1"
+            }
+        },
+        "node_modules/vscode-jsonrpc": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz",
+            "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==",
+            "engines": {
+                "node": ">=8.0.0 || >=10.0.0"
+            }
+        },
+        "node_modules/vscode-languageclient": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz",
+            "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==",
+            "dependencies": {
+                "minimatch": "^3.0.4",
+                "semver": "^7.3.4",
+                "vscode-languageserver-protocol": "3.16.0"
+            },
+            "engines": {
+                "vscode": "^1.52.0"
+            }
+        },
+        "node_modules/vscode-languageclient/node_modules/brace-expansion": {
+            "version": "1.1.11",
+            "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+            "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+            "dependencies": {
+                "balanced-match": "^1.0.0",
+                "concat-map": "0.0.1"
+            }
+        },
+        "node_modules/vscode-languageclient/node_modules/minimatch": {
+            "version": "3.1.2",
+            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+            "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+            "dependencies": {
+                "brace-expansion": "^1.1.7"
+            },
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/vscode-languageserver": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz",
+            "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==",
+            "dependencies": {
+                "vscode-languageserver-protocol": "3.16.0"
+            },
+            "bin": {
+                "installServerIntoExtension": "bin/installServerIntoExtension"
+            }
+        },
+        "node_modules/vscode-languageserver-protocol": {
+            "version": "3.16.0",
+            "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz",
+            "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==",
+            "dependencies": {
+                "vscode-jsonrpc": "6.0.0",
+                "vscode-languageserver-types": "3.16.0"
+            }
+        },
+        "node_modules/vscode-languageserver-textdocument": {
+            "version": "1.0.11",
+            "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz",
+            "integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA=="
+        },
+        "node_modules/vscode-languageserver-types": {
+            "version": "3.16.0",
+            "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz",
+            "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA=="
+        },
+        "node_modules/vscode-uri": {
+            "version": "3.0.8",
+            "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz",
+            "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw=="
+        },
+        "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==",
+            "peer": true,
+            "dependencies": {
+                "glob-to-regexp": "^0.4.1",
+                "graceful-fs": "^4.1.2"
+            },
+            "engines": {
+                "node": ">=10.13.0"
+            }
+        },
+        "node_modules/webpack": {
+            "version": "5.89.0",
+            "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz",
+            "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==",
+            "peer": true,
+            "dependencies": {
+                "@types/eslint-scope": "^3.7.3",
+                "@types/estree": "^1.0.0",
+                "@webassemblyjs/ast": "^1.11.5",
+                "@webassemblyjs/wasm-edit": "^1.11.5",
+                "@webassemblyjs/wasm-parser": "^1.11.5",
+                "acorn": "^8.7.1",
+                "acorn-import-assertions": "^1.9.0",
+                "browserslist": "^4.14.5",
+                "chrome-trace-event": "^1.0.2",
+                "enhanced-resolve": "^5.15.0",
+                "es-module-lexer": "^1.2.1",
+                "eslint-scope": "5.1.1",
+                "events": "^3.2.0",
+                "glob-to-regexp": "^0.4.1",
+                "graceful-fs": "^4.2.9",
+                "json-parse-even-better-errors": "^2.3.1",
+                "loader-runner": "^4.2.0",
+                "mime-types": "^2.1.27",
+                "neo-async": "^2.6.2",
+                "schema-utils": "^3.2.0",
+                "tapable": "^2.1.1",
+                "terser-webpack-plugin": "^5.3.7",
+                "watchpack": "^2.4.0",
+                "webpack-sources": "^3.2.3"
+            },
+            "bin": {
+                "webpack": "bin/webpack.js"
+            },
+            "engines": {
+                "node": ">=10.13.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/webpack"
+            },
+            "peerDependenciesMeta": {
+                "webpack-cli": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/webpack-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==",
+            "peer": true,
+            "engines": {
+                "node": ">=10.13.0"
+            }
+        },
+        "node_modules/which": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+            "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+            "dependencies": {
+                "isexe": "^2.0.0"
+            },
+            "bin": {
+                "node-which": "bin/node-which"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/which-module": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
+            "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ=="
+        },
+        "node_modules/wrap-ansi": {
+            "version": "8.1.0",
+            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+            "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+            "dependencies": {
+                "ansi-styles": "^6.1.0",
+                "string-width": "^5.0.1",
+                "strip-ansi": "^7.0.1"
+            },
+            "engines": {
+                "node": ">=12"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+            }
+        },
+        "node_modules/wrap-ansi-cjs": {
+            "name": "wrap-ansi",
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+            "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+            "dependencies": {
+                "ansi-styles": "^4.0.0",
+                "string-width": "^4.1.0",
+                "strip-ansi": "^6.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+            }
+        },
+        "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+            "version": "8.0.0",
+            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+            "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+        },
+        "node_modules/wrap-ansi-cjs/node_modules/string-width": {
+            "version": "4.2.3",
+            "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+            "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+            "dependencies": {
+                "emoji-regex": "^8.0.0",
+                "is-fullwidth-code-point": "^3.0.0",
+                "strip-ansi": "^6.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+            "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+            "dependencies": {
+                "ansi-regex": "^5.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/wrap-ansi/node_modules/ansi-styles": {
+            "version": "6.2.1",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+            "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+            "engines": {
+                "node": ">=12"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/y18n": {
+            "version": "4.0.3",
+            "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+            "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
+        },
+        "node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        },
+        "node_modules/yaml": {
+            "version": "2.3.4",
+            "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
+            "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
+            "engines": {
+                "node": ">= 14"
+            }
+        },
+        "node_modules/yargs": {
+            "version": "15.4.1",
+            "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+            "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+            "dependencies": {
+                "cliui": "^6.0.0",
+                "decamelize": "^1.2.0",
+                "find-up": "^4.1.0",
+                "get-caller-file": "^2.0.1",
+                "require-directory": "^2.1.1",
+                "require-main-filename": "^2.0.0",
+                "set-blocking": "^2.0.0",
+                "string-width": "^4.2.0",
+                "which-module": "^2.0.0",
+                "y18n": "^4.0.0",
+                "yargs-parser": "^18.1.2"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/yargs-parser": {
+            "version": "18.1.3",
+            "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+            "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+            "dependencies": {
+                "camelcase": "^5.0.0",
+                "decamelize": "^1.2.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/yargs/node_modules/ansi-regex": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/yargs/node_modules/emoji-regex": {
+            "version": "8.0.0",
+            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+            "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+        },
+        "node_modules/yargs/node_modules/string-width": {
+            "version": "4.2.3",
+            "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+            "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+            "dependencies": {
+                "emoji-regex": "^8.0.0",
+                "is-fullwidth-code-point": "^3.0.0",
+                "strip-ansi": "^6.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/yargs/node_modules/strip-ansi": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+            "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+            "dependencies": {
+                "ansi-regex": "^5.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        }
+    }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 00000000000..a6c0cc15e98
--- /dev/null
+++ b/package.json
@@ -0,0 +1,44 @@
+{
+    "private": true,
+    "type": "module",
+    "scripts": {
+        "check": "tsc --noEmit",
+        "dev": "vite",
+        "build": "vite build",
+        "check-formatting": "prettier --check resources/js/ resources/css/",
+        "format": "prettier --write resources/js/ resources/css/"
+    },
+    "devDependencies": {
+        "@lychee-org/leaflet.photo": "^1.0.0",
+        "@types/alpinejs": "^3.13.5",
+        "@types/leaflet": "^1.9.8",
+        "@types/leaflet-rotatedmarker": "^0.2.5",
+        "@types/leaflet.markercluster": "^1.5.4",
+        "@types/mousetrap": "^1.6.15",
+        "@types/photoswipe": "^4.1.6",
+        "@types/qrcode": "^1.5.5"
+    },
+    "dependencies": {
+        "@types/justified-layout": "^4.1.4",
+        "autoprefixer": "^10.4.16",
+        "justified-layout": "^4.1.0",
+        "laravel-vite-plugin": "^0.8.1",
+        "lazysizes": "^5.3.2",
+        "leaflet": "^1.9.4",
+        "leaflet-gpx": "^1.7.0",
+        "leaflet-rotatedmarker": "^0.2.0",
+        "leaflet.markercluster": "^1.4.1",
+        "postcss": "^8.4.32",
+        "prettier": "^3.1.1",
+        "qrcode": "^1.5.3",
+        "tailwindcss": "^3.3.6",
+        "ts-loader": "^9.5.1",
+        "typescript": "^5.3.3",
+        "vite": "^4.5.1",
+        "vite-plugin-checker": "^0.6.2",
+        "vite-plugin-commonjs": "^0.10.0"
+    },
+    "browserslist": [
+        "defaults and fully supports es6-module"
+    ]
+}
diff --git a/phpstan.neon b/phpstan.neon
index d27dbca8118..e2b0081c3d8 100644
--- a/phpstan.neon
+++ b/phpstan.neon
@@ -9,21 +9,20 @@ 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:
 		# False positive php8.2 + phpstan on interface @property
 		- '#Access to an undefined property App\\Contracts\\Models\\AbstractAlbum::\$id#'
 		- '#Access to an undefined property App\\Contracts\\Models\\AbstractAlbum::\$title#'
+		- '#Access to an undefined property App\\Contracts\\Models\\AbstractAlbum::\$thumb#'
 		- '#Access to an undefined property App\\Contracts\\Models\\AbstractAlbum::\$photos#'
 		- '#Access to an undefined property App\\Contracts\\Image\\StreamStats::\$checksum#'
 		- '#Access to an undefined property App\\Contracts\\Image\\StreamStats::\$bytes#'
@@ -40,12 +39,16 @@ 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 (Illuminate\\Database\\Query\\Builder|Illuminate\\Database\\Eloquent\\(Builder|Relations\\.*)|App\\Models\\Builders\\.*|App\\Eloquent\\FixedQueryBuilder)(<.*>)?::groupBy\(\).#'
 		- '#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)?\(\)#'
+		- '#Call to an undefined method App\\Relations\\HasManyPhotosRecursively::whereNotNull\(\)#'
+		- '#Call to an undefined method Illuminate\\Database\\Eloquent\\Builder|Illuminate\\Database\\Eloquent\\Relations\\Relation::whereNotNull\(\).#'
 		- '#Call to private method latest\(\) of parent class Illuminate\\Database\\Eloquent\\Relations\\HasMany<Illuminate\\Database\\Eloquent\\Model>#'
 		- '#Call to protected method asDateTime\(\) of class Illuminate\\Database\\Eloquent\\Model.#'
 
@@ -73,27 +76,51 @@ parameters:
 
 
 		- '#Property .* \(App\\Models\\.*(\|null)?\) does not accept (Illuminate\\Database\\Eloquent\\Collection<int, Illuminate\\Database\\Eloquent\\Model>\|)?Illuminate\\Database\\Eloquent\\Model(\|null)?.#'
+		- '#Access to an undefined property Laragear\\WebAuthn\\Models\\WebAuthnCredential::\$authenticatable_id#'
 
 		# False positive as stub code for PHP has not yet been updated to 2nd parameter, see https://github.com/php/doc-en/issues/1529 and https://www.php.net/imagick.writeimagefile
 		- '#Method Imagick::writeImageFile\(\) invoked with 2 parameters, 1 required#'
 
+		# 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.#'
 			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
+		- 
+			message: '#Dynamic call to static method Illuminate\\Testing\\TestResponse::assert(Forbidden|ViewIs|Unauthorized|Ok|Status)#'
+			paths:
+				- tests
+		- 
+			message: '#Call to an undefined method Illuminate\\Testing\\TestResponse::(assert)?(SeeLivewire|dispatch|call|Set|Count)#'
+			paths:
+				- tests
+		- 
+			message: '#Call to an undefined method Livewire\\Features\\SupportTesting\\Testable::test\(\)#'
+			paths:
+				- tests
 		-
-			message: '#Dynamic call to static method PHPUnit\\Framework\\Assert::assert(Is)?(Not)?(True|False|Equals|Int|Null|Empty)\(\)#'
+			message: '#Dynamic call to static method PHPUnit\\Framework\\Assert::assert(Is)?(Not)?(True|False|Equals|Int|Null|Empty|Count)\(\)#'
 			paths:
 				- tests
 		-
@@ -113,10 +140,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 @@
+<?php
+
+/**
+ * These stubs for the Livewire interfaces which do not provide proper typing
+ */
+
+namespace Livewire;
+
+
+/**
+ * @template TWiredClass
+ */
+interface Wireable
+{
+    public function toLivewire() : string|int;
+
+
+	/**
+	 * @phpstan-return TWiredClass
+	 */
+    public static function fromLivewire(string|int $value);
+}
\ No newline at end of file
diff --git a/phpunit.xml b/phpunit.xml
index 22c108ec0f3..6ad0b548a05 100644
--- a/phpunit.xml
+++ b/phpunit.xml
@@ -19,6 +19,10 @@
       <exclude>./tests/Feature/LibUnitTests/SharingUnitTest.php</exclude>
       <exclude>./tests/Feature/LibUnitTests/UsersUnitTest.php</exclude>
     </testsuite>
+    <testsuite name="Livewire">
+      <directory suffix="Test.php">./tests/Livewire</directory>
+      <exclude>./tests/Livewire/Base/BaseLivewireTest.php</exclude>
+    </testsuite>
   </testsuites>
   <extensions>
     <bootstrap class="Tests\BootExtension"/>
diff --git a/postcss.config.js b/postcss.config.js
new file mode 100644
index 00000000000..2e7af2b7f1a
--- /dev/null
+++ b/postcss.config.js
@@ -0,0 +1,6 @@
+export default {
+  plugins: {
+    tailwindcss: {},
+    autoprefixer: {},
+  },
+}
diff --git a/public/vendor/log-viewer/app.css b/public/vendor/log-viewer/app.css
index 9d9bde50233..333d32d17dd 100644
--- a/public/vendor/log-viewer/app.css
+++ b/public/vendor/log-viewer/app.css
@@ -1,1 +1,1 @@
-/*! tailwindcss v3.1.6 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e4e4e7;box-sizing:border-box}:after,:before{--tw-content:""}html{-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#a1a1aa;opacity:1}input::placeholder,textarea::placeholder{color:#a1a1aa;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.container{width:100%}.\!container{width:100%!important}@media (min-width:640px){.container{max-width:640px}.\!container{max-width:640px!important}}@media (min-width:768px){.container{max-width:768px}.\!container{max-width:768px!important}}@media (min-width:1024px){.container{max-width:1024px}.\!container{max-width:1024px!important}}@media (min-width:1280px){.container{max-width:1280px}.\!container{max-width:1280px!important}}@media (min-width:1536px){.container{max-width:1536px}.\!container{max-width:1536px!important}}.sr-only{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{left:0;right:0}.inset-0,.inset-y-0{bottom:0;top:0}.bottom-0{bottom:0}.left-3{left:.75rem}.right-7{right:1.75rem}.right-0{right:0}.top-9{top:2.25rem}.top-0{top:0}.bottom-10{bottom:2.5rem}.left-0{left:0}.-left-\[200\%\]{left:-200%}.right-\[200\%\]{right:200%}.bottom-4{bottom:1rem}.right-4{right:1rem}.z-20{z-index:20}.z-10{z-index:10}.m-1{margin:.25rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.my-auto{margin-bottom:auto;margin-top:auto}.-my-1{margin-bottom:-.25rem;margin-top:-.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-1\.5{margin-left:.375rem;margin-right:.375rem}.mb-1{margin-bottom:.25rem}.ml-3{margin-left:.75rem}.ml-2{margin-left:.5rem}.mt-0{margin-top:0}.mr-1\.5{margin-right:.375rem}.mr-1{margin-right:.25rem}.mt-2{margin-top:.5rem}.mb-8{margin-bottom:2rem}.mt-6{margin-top:1.5rem}.ml-1{margin-left:.25rem}.mt-1{margin-top:.25rem}.mr-2{margin-right:.5rem}.mb-5{margin-bottom:1.25rem}.mr-5{margin-right:1.25rem}.-mr-2{margin-right:-.5rem}.mr-2\.5{margin-right:.625rem}.mb-4{margin-bottom:1rem}.mt-3{margin-top:.75rem}.ml-5{margin-left:1.25rem}.mb-2{margin-bottom:.5rem}.mr-4{margin-right:1rem}.mr-3{margin-right:.75rem}.-mb-0\.5{margin-bottom:-.125rem}.-mb-0{margin-bottom:0}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-full{height:100%}.h-\[18px\]{height:18px}.h-5{height:1.25rem}.h-3{height:.75rem}.h-4{height:1rem}.h-14{height:3.5rem}.h-7{height:1.75rem}.h-6{height:1.5rem}.h-0{height:0}.max-h-screen{max-height:100vh}.max-h-60{max-height:15rem}.min-h-\[38px\]{min-height:38px}.min-h-screen{min-height:100vh}.w-\[18px\]{width:18px}.w-full{width:100%}.w-5{width:1.25rem}.w-3{width:.75rem}.w-4{width:1rem}.w-48{width:12rem}.w-14{width:3.5rem}.w-screen{width:100vw}.w-6{width:1.5rem}.w-\[120px\]{width:120px}.w-\[180px\]{width:180px}.w-\[110px\]{width:110px}.w-auto{width:auto}.min-w-\[240px\]{min-width:240px}.min-w-full{min-width:100%}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.max-w-\[1px\]{max-width:1px}.flex-1{flex:1 1 0%}.shrink{flex-shrink:1}.table-fixed{table-layout:fixed}.border-separate{border-collapse:separate}.translate-x-full{--tw-translate-x:100%}.translate-x-0,.translate-x-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x:0px}.rotate-90{--tw-rotate:90deg}.rotate-90,.scale-100{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x:1;--tw-scale-y:1}.scale-90{--tw-scale-x:.9;--tw-scale-y:.9}.scale-90,.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.cursor-default{cursor:default}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-flow-col{grid-auto-flow:column}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.items-start{align-items:flex-start}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-y-auto{overflow-y:auto}.overflow-y-scroll{overflow-y:scroll}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-l{border-left-width:1px}.border-t{border-top-width:1px}.border-t-2{border-top-width:2px}.border-yellow-300{--tw-border-opacity:1;border-color:rgb(253 224 71/var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}.border-transparent{border-color:transparent}.border-brand-500{--tw-border-opacity:1;border-color:rgb(14 165 233/var(--tw-border-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.bg-yellow-100{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-brand-600{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}.bg-opacity-75{--tw-bg-opacity:0.75}.bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.from-gray-100{--tw-gradient-from:#f4f4f5;--tw-gradient-to:hsla(240,5%,96%,0);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-transparent{--tw-gradient-to:transparent}.p-1{padding:.25rem}.p-12{padding:3rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-5{padding-bottom:1.25rem;padding-top:1.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-4{padding-left:1rem;padding-right:1rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.py-4{padding-bottom:1rem;padding-top:1rem}.px-8{padding-left:2rem;padding-right:2rem}.pr-4{padding-right:1rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pr-10{padding-right:2.5rem}.pr-2{padding-right:.5rem}.pr-9{padding-right:2.25rem}.pl-10{padding-left:2.5rem}.pl-2{padding-left:.5rem}.pt-2{padding-top:.5rem}.pb-1{padding-bottom:.25rem}.pt-3{padding-top:.75rem}.pb-16{padding-bottom:4rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.text-base{font-size:1rem;line-height:1.5rem}.font-semibold{font-weight:600}.font-normal{font-weight:400}.font-medium{font-weight:500}.italic{font-style:italic}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.text-brand-700{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.text-yellow-700{--tw-text-opacity:1;color:rgb(161 98 7/var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}.text-brand-500{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-brand-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}.text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}.opacity-100{opacity:1}.opacity-0{opacity:0}.opacity-90{opacity:.9}.opacity-75{opacity:.75}.opacity-25{opacity:.25}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-md,.shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.outline-brand-500{outline-color:#0ea5e9}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-opacity-5{--tw-ring-opacity:0.05}.blur{--tw-blur:blur(8px)}.blur,.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.spin{-webkit-animation-duration:1.5s;-moz-animation-duration:1.5s;-ms-animation-duration:1.5s;animation-duration:1.5s;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-ms-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:spin;-moz-animation-name:spin;-ms-animation-name:spin;animation-name:spin;-webkit-animation-timing-function:linear;-moz-animation-timing-function:linear;-ms-animation-timing-function:linear;animation-timing-function:linear}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}html.dark{color-scheme:dark}#bmc-wbtn{height:48px!important;width:48px!important}#bmc-wbtn>img{height:32px!important;width:32px!important}.log-levels-selector .dropdown-toggle{white-space:nowrap}.log-levels-selector .dropdown-toggle:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}.dark .log-levels-selector .dropdown-toggle:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity))}.log-levels-selector .dropdown-toggle>svg{height:1rem;margin-left:.25rem;opacity:.75;width:1rem}.log-levels-selector .dropdown .log-level{font-weight:600}.log-levels-selector .dropdown .log-level.success{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}.dark .log-levels-selector .dropdown .log-level.success{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.log-levels-selector .dropdown .log-level.info{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}.dark .log-levels-selector .dropdown .log-level.info{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.log-levels-selector .dropdown .log-level.warning{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity))}.dark .log-levels-selector .dropdown .log-level.warning{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity))}.log-levels-selector .dropdown .log-level.danger{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}.dark .log-levels-selector .dropdown .log-level.danger{--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity))}.log-levels-selector .dropdown .log-level.none{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}.dark .log-levels-selector .dropdown .log-level.none{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.log-levels-selector .dropdown .log-count{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity));margin-left:2rem;white-space:nowrap}.dark .log-levels-selector .dropdown .log-count{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.log-levels-selector .dropdown button.active .log-level.success{--tw-text-opacity:1;color:rgb(209 250 229/var(--tw-text-opacity))}.log-levels-selector .dropdown button.active .log-level.info{--tw-text-opacity:1;color:rgb(224 242 254/var(--tw-text-opacity))}.log-levels-selector .dropdown button.active .log-level.warning{--tw-text-opacity:1;color:rgb(254 243 199/var(--tw-text-opacity))}.log-levels-selector .dropdown button.active .log-level.danger{--tw-text-opacity:1;color:rgb(255 228 230/var(--tw-text-opacity))}.log-levels-selector .dropdown button.active .log-level.none{--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity))}.log-levels-selector .dropdown button.active .log-count{--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}.dark .log-levels-selector .dropdown button.active .log-count{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.log-levels-selector .dropdown .no-results{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity));font-size:.75rem;line-height:1rem;padding:.25rem 1rem;text-align:center}.dark .log-levels-selector .dropdown .no-results{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.log-item{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));cursor:pointer;transition-duration:.2s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dark .log-item{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.log-item.success.active>td,.log-item.success:focus-within>td,.log-item.success:hover>td{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity))}.dark .log-item.success.active>td,.dark .log-item.success:focus-within>td,.dark .log-item.success:hover>td{--tw-bg-opacity:0.4;background-color:rgb(6 95 70/var(--tw-bg-opacity))}.log-item.success .log-level-indicator{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity))}.dark .log-item.success .log-level-indicator{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.log-item.success .log-level{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}.dark .log-item.success .log-level{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.log-item.info.active>td,.log-item.info:focus-within>td,.log-item.info:hover>td{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity))}.dark .log-item.info.active>td,.dark .log-item.info:focus-within>td,.dark .log-item.info:hover>td{--tw-bg-opacity:0.4;background-color:rgb(7 89 133/var(--tw-bg-opacity))}.log-item.info .log-level-indicator{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity))}.dark .log-item.info .log-level-indicator{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity))}.log-item.info .log-level{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}.dark .log-item.info .log-level{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.log-item.warning.active>td,.log-item.warning:focus-within>td,.log-item.warning:hover>td{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity))}.dark .log-item.warning.active>td,.dark .log-item.warning:focus-within>td,.dark .log-item.warning:hover>td{--tw-bg-opacity:0.4;background-color:rgb(146 64 14/var(--tw-bg-opacity))}.log-item.warning .log-level-indicator{--tw-bg-opacity:1;background-color:rgb(180 83 9/var(--tw-bg-opacity))}.dark .log-item.warning .log-level-indicator{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity))}.log-item.warning .log-level{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity))}.dark .log-item.warning .log-level{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity))}.log-item.danger.active>td,.log-item.danger:focus-within>td,.log-item.danger:hover>td{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}.dark .log-item.danger.active>td,.dark .log-item.danger:focus-within>td,.dark .log-item.danger:hover>td{--tw-bg-opacity:0.4;background-color:rgb(159 18 57/var(--tw-bg-opacity))}.log-item.danger .log-level-indicator{--tw-bg-opacity:1;background-color:rgb(190 18 60/var(--tw-bg-opacity))}.dark .log-item.danger .log-level-indicator{--tw-bg-opacity:1;background-color:rgb(251 113 133/var(--tw-bg-opacity))}.log-item.danger .log-level{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}.dark .log-item.danger .log-level{--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity))}.log-item.none.active>td,.log-item.none:focus-within>td,.log-item.none:hover>td{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.dark .log-item.none.active>td,.dark .log-item.none:focus-within>td,.dark .log-item.none:hover>td{--tw-bg-opacity:0.4;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.log-item.none .log-level-indicator{--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}.dark .log-item.none .log-level-indicator{--tw-bg-opacity:1;background-color:rgb(161 161 170/var(--tw-bg-opacity))}.log-item.none .log-level{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}.dark .log-item.none .log-level{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.log-item:hover .log-level-icon{opacity:1}.badge{align-items:center;border-radius:.375rem;cursor:pointer;display:inline-flex;font-size:.875rem;line-height:1.25rem;margin-right:.5rem;margin-top:.25rem;padding:.25rem .75rem;transition-duration:.2s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.badge.success{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity));border-color:rgb(167 243 208/var(--tw-border-opacity));border-width:1px;color:rgb(82 82 91/var(--tw-text-opacity))}.dark .badge.success{--tw-border-opacity:1;--tw-bg-opacity:0.4;--tw-text-opacity:1;background-color:rgb(6 78 59/var(--tw-bg-opacity));border-color:rgb(6 95 70/var(--tw-border-opacity));color:rgb(161 161 170/var(--tw-text-opacity))}.badge.success:hover{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity))}.dark .badge.success:hover{--tw-bg-opacity:0.75;background-color:rgb(6 78 59/var(--tw-bg-opacity))}.badge.success .checkmark{--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}.dark .badge.success .checkmark{--tw-border-opacity:1;border-color:rgb(6 95 70/var(--tw-border-opacity))}.badge.success.active{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity));border-color:rgb(4 120 87/var(--tw-border-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.dark .badge.success.active{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity));border-color:rgb(5 150 105/var(--tw-border-opacity))}.badge.success.active:hover{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.dark .badge.success.active:hover{--tw-bg-opacity:1;background-color:rgb(6 95 70/var(--tw-bg-opacity))}.badge.success.active .checkmark{--tw-border-opacity:1;border-color:rgb(5 150 105/var(--tw-border-opacity))}.dark .badge.success.active .checkmark{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity));border-color:rgb(4 120 87/var(--tw-border-opacity))}.badge.success.active .checkmark>svg{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity))}.dark .badge.success.active .checkmark>svg{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}.badge.info{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity));border-color:rgb(186 230 253/var(--tw-border-opacity));border-width:1px;color:rgb(82 82 91/var(--tw-text-opacity))}.dark .badge.info{--tw-border-opacity:1;--tw-bg-opacity:0.4;--tw-text-opacity:1;background-color:rgb(12 74 110/var(--tw-bg-opacity));border-color:rgb(7 89 133/var(--tw-border-opacity));color:rgb(161 161 170/var(--tw-text-opacity))}.badge.info:hover{--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity))}.dark .badge.info:hover{--tw-bg-opacity:0.75;background-color:rgb(12 74 110/var(--tw-bg-opacity))}.badge.info .checkmark{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity))}.dark .badge.info .checkmark{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}.badge.info.active{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity));border-color:rgb(3 105 161/var(--tw-border-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.dark .badge.info.active{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity));border-color:rgb(2 132 199/var(--tw-border-opacity))}.badge.info.active:hover{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity))}.dark .badge.info.active:hover{--tw-bg-opacity:1;background-color:rgb(7 89 133/var(--tw-bg-opacity))}.badge.info.active .checkmark{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}.dark .badge.info.active .checkmark{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity));border-color:rgb(3 105 161/var(--tw-border-opacity))}.badge.info.active .checkmark>svg{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}.dark .badge.info.active .checkmark>svg{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}.badge.warning{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity));border-color:rgb(253 230 138/var(--tw-border-opacity));border-width:1px;color:rgb(82 82 91/var(--tw-text-opacity))}.dark .badge.warning{--tw-border-opacity:1;--tw-bg-opacity:0.4;--tw-text-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity));border-color:rgb(146 64 14/var(--tw-border-opacity));color:rgb(161 161 170/var(--tw-text-opacity))}.badge.warning:hover{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}.dark .badge.warning:hover{--tw-bg-opacity:0.75;background-color:rgb(120 53 15/var(--tw-bg-opacity))}.badge.warning .checkmark{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity))}.dark .badge.warning .checkmark{--tw-border-opacity:1;border-color:rgb(146 64 14/var(--tw-border-opacity))}.badge.warning.active{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity));border-color:rgb(180 83 9/var(--tw-border-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.dark .badge.warning.active{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(180 83 9/var(--tw-bg-opacity));border-color:rgb(217 119 6/var(--tw-border-opacity))}.badge.warning.active:hover{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity))}.dark .badge.warning.active:hover{--tw-bg-opacity:1;background-color:rgb(146 64 14/var(--tw-bg-opacity))}.badge.warning.active .checkmark{--tw-border-opacity:1;border-color:rgb(217 119 6/var(--tw-border-opacity))}.dark .badge.warning.active .checkmark{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity));border-color:rgb(180 83 9/var(--tw-border-opacity))}.badge.warning.active .checkmark>svg{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}.dark .badge.warning.active .checkmark>svg{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity))}.badge.danger{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity));border-color:rgb(254 205 211/var(--tw-border-opacity));border-width:1px;color:rgb(82 82 91/var(--tw-text-opacity))}.dark .badge.danger{--tw-border-opacity:1;--tw-bg-opacity:0.4;--tw-text-opacity:1;background-color:rgb(136 19 55/var(--tw-bg-opacity));border-color:rgb(159 18 57/var(--tw-border-opacity));color:rgb(161 161 170/var(--tw-text-opacity))}.badge.danger:hover{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}.dark .badge.danger:hover{--tw-bg-opacity:0.75;background-color:rgb(136 19 55/var(--tw-bg-opacity))}.badge.danger .checkmark{--tw-border-opacity:1;border-color:rgb(254 205 211/var(--tw-border-opacity))}.dark .badge.danger .checkmark{--tw-border-opacity:1;border-color:rgb(159 18 57/var(--tw-border-opacity))}.badge.danger.active{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(225 29 72/var(--tw-bg-opacity));border-color:rgb(190 18 60/var(--tw-border-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.dark .badge.danger.active{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(190 18 60/var(--tw-bg-opacity));border-color:rgb(225 29 72/var(--tw-border-opacity))}.badge.danger.active:hover{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity))}.dark .badge.danger.active:hover{--tw-bg-opacity:1;background-color:rgb(159 18 57/var(--tw-bg-opacity))}.badge.danger.active .checkmark{--tw-border-opacity:1;border-color:rgb(225 29 72/var(--tw-border-opacity))}.dark .badge.danger.active .checkmark{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity));border-color:rgb(190 18 60/var(--tw-border-opacity))}.badge.danger.active .checkmark>svg{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity))}.dark .badge.danger.active .checkmark>svg{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}.badge.none{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity));border-color:rgb(228 228 231/var(--tw-border-opacity));border-width:1px;color:rgb(82 82 91/var(--tw-text-opacity))}.dark .badge.none{--tw-border-opacity:1;--tw-bg-opacity:0.4;--tw-text-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity));border-color:rgb(39 39 42/var(--tw-border-opacity));color:rgb(161 161 170/var(--tw-text-opacity))}.badge.none:hover{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.dark .badge.none:hover{--tw-bg-opacity:0.75;background-color:rgb(24 24 27/var(--tw-bg-opacity))}.badge.none .checkmark{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity))}.dark .badge.none .checkmark{--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity))}.badge.none.active{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:rgb(39 39 42/var(--tw-text-opacity))}.dark .badge.none.active{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity));border-color:rgb(82 82 91/var(--tw-border-opacity));color:rgb(244 244 245/var(--tw-text-opacity))}.badge.none.active:hover{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.dark .badge.none.active:hover{--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity))}.badge.none.active .checkmark{--tw-border-opacity:1;border-color:rgb(82 82 91/var(--tw-border-opacity))}.dark .badge.none.active .checkmark{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity));border-color:rgb(63 63 70/var(--tw-border-opacity))}.badge.none.active .checkmark>svg{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}.dark .badge.none.active .checkmark>svg{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}.log-list table>thead th{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity));color:rgb(113 113 122/var(--tw-text-opacity));font-size:.875rem;font-weight:600;line-height:1.25rem;padding:.5rem;position:sticky;text-align:left;top:0;z-index:10}.file-list .folder-container .folder-item-container.log-list table>thead th{position:sticky}.dark .log-list table>thead th{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity));color:rgb(161 161 170/var(--tw-text-opacity))}.log-list .log-group{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));position:relative}.dark .log-list .log-group{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity));color:rgb(228 228 231/var(--tw-text-opacity))}.log-list .log-group .log-item>td{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity));border-top-width:1px;font-size:.75rem;line-height:1rem;padding:.375rem .25rem}.dark .log-list .log-group .log-item>td{--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}@media (min-width:1024px){.log-list .log-group .log-item>td{font-size:.875rem;line-height:1.25rem;padding:.5rem}}.log-list .log-group.first .log-item>td{border-top-color:transparent}.log-list .log-group .log-stack{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity));font-size:10px;line-height:.75rem;padding:.25rem .5rem;white-space:pre-wrap;word-break:break-all}.dark .log-list .log-group .log-stack{--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}@media (min-width:1024px){.log-list .log-group .log-stack{font-size:.75rem;line-height:1rem;padding:.5rem 2rem}}.log-list .log-group .log-link{align-items:center;border-radius:.25rem;display:flex;justify-content:flex-end;margin-bottom:-.125rem;margin-top:-.125rem;padding-bottom:.125rem;padding-left:.25rem;padding-top:.125rem;width:100%}@media (min-width:640px){.log-list .log-group .log-link{min-width:64px}}.log-list .log-group .log-link>svg{height:1rem;margin-left:.25rem;transition-duration:.2s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:1rem}.log-list .log-group .log-link:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}.dark .log-list .log-group .log-link:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(56 189 248/var(--tw-ring-opacity))}.log-list .log-group code,.log-list .log-group mark{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity));border-radius:.25rem;color:rgb(24 24 27/var(--tw-text-opacity));padding:.125rem .25rem}.dark .log-list .log-group code,.dark .log-list .log-group mark{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(133 77 14/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.pagination{align-items:center;display:flex;justify-content:center;width:100%}@media (min-width:640px){.pagination{margin-top:.5rem;padding-left:1rem;padding-right:1rem}}@media (min-width:1024px){.pagination{padding-left:0;padding-right:0}}.pagination .previous{display:flex;flex:1 1 0%;justify-content:flex-start;margin-top:-1px;width:0}@media (min-width:768px){.pagination .previous{justify-content:flex-end}}.pagination .previous button{--tw-text-opacity:1;align-items:center;border-color:transparent;border-top-width:2px;color:rgb(113 113 122/var(--tw-text-opacity));display:inline-flex;font-size:.875rem;font-weight:500;line-height:1.25rem;padding-right:.25rem;padding-top:.75rem}.dark .pagination .previous button{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.pagination .previous button:hover{--tw-border-opacity:1;--tw-text-opacity:1;border-color:rgb(161 161 170/var(--tw-border-opacity));color:rgb(63 63 70/var(--tw-text-opacity))}.dark .pagination .previous button:hover{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.pagination .previous button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}.dark .pagination .previous button:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(56 189 248/var(--tw-ring-opacity))}.pagination .previous button svg{color:currentColor;height:1.25rem;margin-left:.75rem;margin-right:.75rem;width:1.25rem}.pagination .next{display:flex;flex:1 1 0%;justify-content:flex-end;margin-top:-1px;width:0}@media (min-width:768px){.pagination .next{justify-content:flex-start}}.pagination .next button{--tw-text-opacity:1;align-items:center;border-color:transparent;border-top-width:2px;color:rgb(113 113 122/var(--tw-text-opacity));display:inline-flex;font-size:.875rem;font-weight:500;line-height:1.25rem;padding-left:.25rem;padding-top:.75rem}.dark .pagination .next button{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.pagination .next button:hover{--tw-border-opacity:1;--tw-text-opacity:1;border-color:rgb(161 161 170/var(--tw-border-opacity));color:rgb(63 63 70/var(--tw-text-opacity))}.dark .pagination .next button:hover{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.pagination .next button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}.dark .pagination .next button:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(56 189 248/var(--tw-ring-opacity))}.pagination .next button svg{color:currentColor;height:1.25rem;margin-left:.75rem;margin-right:.75rem;width:1.25rem}.pagination .pages{display:none}@media (min-width:640px){.pagination .pages{display:flex;margin-top:-1px}}.pagination .pages span{--tw-text-opacity:1;align-items:center;border-color:transparent;border-top-width:2px;color:rgb(113 113 122/var(--tw-text-opacity));display:inline-flex;font-size:.875rem;font-weight:500;line-height:1.25rem;padding-left:1rem;padding-right:1rem;padding-top:.75rem}.dark .pagination .pages span{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.pagination .pages button{align-items:center;border-top-width:2px;display:inline-flex;font-size:.875rem;font-weight:500;line-height:1.25rem;padding-left:1rem;padding-right:1rem;padding-top:.75rem}.pagination .pages button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}.dark .pagination .pages button:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(56 189 248/var(--tw-ring-opacity))}.search{--tw-border-opacity:1;--tw-bg-opacity:1;align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(212 212 216/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;display:flex;font-size:.875rem;line-height:1.25rem;position:relative;transition-duration:.2s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:100%}.dark .search{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity));border-color:rgb(82 82 91/var(--tw-border-opacity));color:rgb(244 244 245/var(--tw-text-opacity))}.search .prefix-icon{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity));margin-left:.75rem;margin-right:.25rem}.dark .search .prefix-icon{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.search input{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:transparent;background-color:inherit;border-radius:.25rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);flex:1 1 0%;padding:.25rem;transition-duration:.2s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:100%}.search input:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));border-color:transparent;outline:2px solid transparent;outline-offset:2px}.dark .search input:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity))}.search.has-error{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.search .submit-search button{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(244 244 245/var(--tw-bg-opacity));border-bottom-right-radius:.25rem;border-top-right-radius:.25rem;color:rgb(82 82 91/var(--tw-text-opacity));display:flex;padding:.5rem;transition-duration:.2s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dark .search .submit-search button{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity));color:rgb(212 212 216/var(--tw-text-opacity))}.search .submit-search button:hover{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity))}.dark .search .submit-search button:hover{--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity))}.search .submit-search button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}.dark .search .submit-search button:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity))}.search .submit-search button>svg{height:1.25rem;margin-left:.25rem;opacity:.75;width:1.25rem}.search .clear-search{position:absolute;right:0;top:0}.search .clear-search button{--tw-text-opacity:1;border-radius:.25rem;color:rgb(161 161 170/var(--tw-text-opacity));padding:.25rem;transition-duration:.2s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dark .search .clear-search button{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.search .clear-search button:hover{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}.dark .search .clear-search button:hover{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.search .clear-search button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}.dark .search .clear-search button:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity))}.search .clear-search button>svg{height:1.25rem;width:1.25rem}.search-progress-bar{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity));border-radius:.25rem;height:.125rem;position:absolute;top:.25rem;transition-duration:.3s;transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:linear}.dark .search-progress-bar{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}.dropdown{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(228 228 231/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(24 24 27/var(--tw-text-opacity));margin-top:-.25rem;overflow:hidden;position:absolute;right:.25rem;top:100%;z-index:40}.dark .dropdown{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity));border-color:rgb(63 63 70/var(--tw-border-opacity));color:rgb(228 228 231/var(--tw-text-opacity))}.dropdown{transform-origin:top right!important}.dropdown:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));--tw-ring-opacity:0.5;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}.dark .dropdown:focus{--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity));--tw-ring-opacity:0.5}.dropdown.up{bottom:100%;margin-bottom:-.25rem;margin-top:0;top:auto;transform-origin:bottom right!important}.dropdown.left{left:.25rem;right:auto;transform-origin:top left!important}.dropdown.left.up{transform-origin:bottom left!important}.dropdown a:not(.inline-link),.dropdown button:not(.inline-link){align-items:center;display:block;display:flex;font-size:.875rem;line-height:1.25rem;outline-color:#0ea5e9;padding:.5rem 1rem;text-align:left;width:100%}.dark .dropdown a:not(.inline-link),.dark .dropdown button:not(.inline-link){outline-color:#075985}.dropdown a:not(.inline-link)>svg,.dropdown button:not(.inline-link)>svg{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity));height:1rem;margin-right:.75rem;width:1rem}.dropdown a:not(.inline-link)>svg.spin,.dropdown button:not(.inline-link)>svg.spin{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}.dropdown a.active,.dropdown a:hover,.dropdown button.active,.dropdown button:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.dropdown a.active>.checkmark,.dropdown a:hover>.checkmark,.dropdown button.active>.checkmark,.dropdown button:hover>.checkmark{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}.dark .dropdown a.active>.checkmark,.dark .dropdown a:hover>.checkmark,.dark .dropdown button.active>.checkmark,.dark .dropdown button:hover>.checkmark{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}.dropdown a.active>svg,.dropdown a:hover>svg,.dropdown button.active>svg,.dropdown button:hover>svg{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.dropdown .divider{border-top-width:1px;margin-bottom:.5rem;margin-top:.5rem;width:100%}.dark .dropdown .divider{--tw-border-opacity:1;border-top-color:rgb(63 63 70/var(--tw-border-opacity))}.dropdown .label{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity));font-size:.75rem;font-weight:600;line-height:1rem;margin:.25rem 1rem}.file-list{height:100%;overflow-y:auto;padding-bottom:1rem;padding-left:.75rem;padding-right:.75rem;position:relative}@media (min-width:768px){.file-list{padding-left:0;padding-right:0}}.file-list .file-item-container,.file-list .folder-item-container{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;color:rgb(39 39 42/var(--tw-text-opacity));margin-top:.5rem;position:relative;top:0}.dark .file-list .file-item-container,.dark .file-list .folder-item-container{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity));color:rgb(228 228 231/var(--tw-text-opacity))}.file-list .file-item-container .file-item,.file-list .folder-item-container .file-item{border-color:transparent;border-radius:.375rem;border-width:1px;cursor:pointer;position:relative;transition-duration:.1s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.file-list .file-item-container .file-item,.file-list .file-item-container .file-item .file-item-info,.file-list .folder-item-container .file-item,.file-list .folder-item-container .file-item .file-item-info{align-items:center;display:flex;justify-content:space-between;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter}.file-list .file-item-container .file-item .file-item-info,.file-list .folder-item-container .file-item .file-item-info{border-bottom-left-radius:.375rem;border-top-left-radius:.375rem;flex:1 1 0%;outline-color:#0ea5e9;padding:.5rem .75rem .5rem 1rem;text-align:left;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dark .file-list .file-item-container .file-item .file-item-info,.dark .file-list .folder-item-container .file-item .file-item-info{outline-color:#0369a1}.file-list .file-item-container .file-item .file-item-info:hover,.file-list .folder-item-container .file-item .file-item-info:hover{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity))}.dark .file-list .file-item-container .file-item .file-item-info:hover,.dark .file-list .folder-item-container .file-item .file-item-info:hover{--tw-bg-opacity:1;background-color:rgb(12 74 110/var(--tw-bg-opacity))}.file-list .file-item-container .file-item .file-icon,.file-list .folder-item-container .file-item .file-icon{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity));margin-right:.5rem}.dark .file-list .file-item-container .file-item .file-icon,.dark .file-list .folder-item-container .file-item .file-icon{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.file-list .file-item-container .file-item .file-icon>svg,.file-list .folder-item-container .file-item .file-icon>svg{height:1rem;width:1rem}.file-list .file-item-container .file-item .file-name,.file-list .folder-item-container .file-item .file-name{font-size:.875rem;line-height:1.25rem;margin-right:.75rem;width:100%;word-break:break-word}.file-list .file-item-container .file-item .file-size,.file-list .folder-item-container .file-item .file-size{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity));font-size:.75rem;line-height:1rem;white-space:nowrap}.dark .file-list .file-item-container .file-item .file-size,.dark .file-list .folder-item-container .file-item .file-size{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity));opacity:.9}.file-list .file-item-container.active .file-item,.file-list .folder-item-container.active .file-item{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity));border-color:rgb(14 165 233/var(--tw-border-opacity))}.dark .file-list .file-item-container.active .file-item,.dark .file-list .folder-item-container.active .file-item{--tw-border-opacity:1;--tw-bg-opacity:0.4;background-color:rgb(12 74 110/var(--tw-bg-opacity));border-color:rgb(12 74 110/var(--tw-border-opacity))}.file-list .file-item-container.active-folder .file-item,.file-list .folder-item-container.active-folder .file-item{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}.dark .file-list .file-item-container.active-folder .file-item,.dark .file-list .folder-item-container.active-folder .file-item{--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}.file-list .file-item-container:hover .file-item,.file-list .folder-item-container:hover .file-item{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}.dark .file-list .file-item-container:hover .file-item,.dark .file-list .folder-item-container:hover .file-item{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}.file-list .file-item-container .file-dropdown-toggle,.file-list .folder-item-container .file-dropdown-toggle{--tw-text-opacity:1;align-items:center;align-self:stretch;border-bottom-right-radius:.375rem;border-color:transparent;border-left-width:1px;border-top-right-radius:.375rem;color:rgb(113 113 122/var(--tw-text-opacity));display:flex;justify-content:center;outline-color:#0ea5e9;transition-duration:.2s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:2rem}.dark .file-list .file-item-container .file-dropdown-toggle,.dark .file-list .folder-item-container .file-dropdown-toggle{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity));outline-color:#0369a1}.file-list .file-item-container .file-dropdown-toggle:hover,.file-list .folder-item-container .file-dropdown-toggle:hover{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity));border-color:rgb(2 132 199/var(--tw-border-opacity))}.dark .file-list .file-item-container .file-dropdown-toggle:hover,.dark .file-list .folder-item-container .file-dropdown-toggle:hover{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(12 74 110/var(--tw-bg-opacity));border-color:rgb(7 89 133/var(--tw-border-opacity))}.file-list .folder-container .folder-item-container.sticky{position:sticky}.file-list .folder-container:first-child>.folder-item-container{margin-top:0}.menu-button{--tw-text-opacity:1;border-radius:.375rem;color:rgb(161 161 170/var(--tw-text-opacity));cursor:pointer;outline-color:#0ea5e9;padding:.5rem;position:relative;transition-duration:.2s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.menu-button:hover{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.dark .menu-button:hover{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.menu-button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}.dark .menu-button:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity))}a.button,button.button{--tw-text-opacity:1;align-items:center;border-radius:.375rem;color:rgb(24 24 27/var(--tw-text-opacity));display:block;display:flex;font-size:.875rem;line-height:1.25rem;outline-color:#0ea5e9;padding:.5rem 1rem;text-align:left;width:100%}.dark a.button,.dark button.button{--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity));outline-color:#075985}a.button>svg,button.button>svg{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity));height:1rem;width:1rem}.dark a.button>svg,.dark button.button>svg{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}a.button>svg.spin,button.button>svg.spin{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}a.button:hover,button.button:hover{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.dark a.button:hover,.dark button.button:hover{--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}.select{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity));border-radius:.25rem;color:rgb(63 63 70/var(--tw-text-opacity));font-weight:400;margin-bottom:-.125rem;margin-top:-.125rem;outline:2px solid transparent;outline-offset:2px;padding:.125rem .25rem}.dark .select{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity));color:rgb(212 212 216/var(--tw-text-opacity))}.select:hover{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity))}.dark .select:hover{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.select:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.dark .select:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity))}.keyboard-shortcut{--tw-text-opacity:1;align-items:center;color:rgb(82 82 91/var(--tw-text-opacity));display:flex;font-size:.875rem;justify-content:flex-start;line-height:1.25rem;margin-bottom:.75rem;width:100%}.dark .keyboard-shortcut{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.keyboard-shortcut .shortcut{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(244 244 245/var(--tw-ring-opacity));align-items:center;border-color:rgb(161 161 170/var(--tw-border-opacity));border-radius:.25rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);display:inline-flex;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1rem;height:1.5rem;justify-content:center;line-height:1.5rem;margin-right:.5rem;width:1.5rem}.dark .keyboard-shortcut .shortcut{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(24 24 27/var(--tw-ring-opacity));border-color:rgb(82 82 91/var(--tw-border-opacity))}.hover\:border-brand-600:hover{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}.hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.hover\:text-brand-800:hover{--tw-text-opacity:1;color:rgb(7 89 133/var(--tw-text-opacity))}.hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}.focus\:border-brand-500:focus{--tw-border-opacity:1;border-color:rgb(14 165 233/var(--tw-border-opacity))}.focus\:opacity-100:focus{opacity:1}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-1:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-brand-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity))}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.group:hover .group-hover\:inline-block{display:inline-block}.group:hover .group-hover\:hidden{display:none}.group:hover .group-hover\:border-brand-600{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}.group:hover .group-hover\:underline{-webkit-text-decoration-line:underline;text-decoration-line:underline}.group:hover .group-hover\:opacity-100{opacity:1}.group:focus .group-focus\:inline-block{display:inline-block}.group:focus .group-focus\:hidden{display:none}.dark .dark\:border-gray-600{--tw-border-opacity:1;border-color:rgb(82 82 91/var(--tw-border-opacity))}.dark .dark\:border-yellow-800{--tw-border-opacity:1;border-color:rgb(133 77 14/var(--tw-border-opacity))}.dark .dark\:border-gray-800{--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity))}.dark .dark\:border-gray-700{--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}.dark .dark\:border-brand-600{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}.dark .dark\:bg-gray-900{--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity))}.dark .dark\:bg-gray-800{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.dark .dark\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgb(113 63 18/var(--tw-bg-opacity))}.dark .dark\:bg-gray-700{--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}.dark .dark\:bg-opacity-40{--tw-bg-opacity:0.4}.dark .dark\:from-gray-900{--tw-gradient-from:#18181b;--tw-gradient-to:rgba(24,24,27,0);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.dark .dark\:text-brand-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}.dark .dark\:text-gray-400{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.dark .dark\:text-yellow-400{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity))}.dark .dark\:text-gray-200{--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}.dark .dark\:text-gray-300{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.dark .dark\:text-brand-500{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.dark .dark\:text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.dark .dark\:opacity-90{opacity:.9}.dark .dark\:outline-brand-800{outline-color:#075985}.dark .hover\:dark\:border-brand-800:hover{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}.dark .dark\:hover\:border-brand-700:hover{--tw-border-opacity:1;border-color:rgb(3 105 161/var(--tw-border-opacity))}.dark .dark\:hover\:border-gray-400:hover{--tw-border-opacity:1;border-color:rgb(161 161 170/var(--tw-border-opacity))}.dark .dark\:hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity))}.dark .dark\:hover\:text-brand-600:hover{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}.dark .dark\:hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.dark .dark\:focus\:ring-brand-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity))}.group:hover .dark .group-hover\:dark\:border-brand-800{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}@media (min-width:640px){.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:flex-col-reverse{flex-direction:column-reverse}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:duration-300{transition-duration:.3s}}@media (min-width:768px){.md\:fixed{position:fixed}.md\:inset-y-0{bottom:0;top:0}.md\:left-0{left:0}.md\:left-auto{left:auto}.md\:right-auto{right:auto}.md\:mx-0{margin-left:0;margin-right:0}.md\:mx-3{margin-left:.75rem;margin-right:.75rem}.md\:mt-0{margin-top:0}.md\:block{display:block}.md\:inline{display:inline}.md\:flex{display:flex}.md\:hidden{display:none}.md\:w-88{width:22rem}.md\:flex-col{flex-direction:column}.md\:px-4{padding-left:1rem;padding-right:1rem}.md\:pl-88{padding-left:22rem}.md\:pb-12{padding-bottom:3rem}.md\:opacity-75{opacity:.75}}@media (min-width:1024px){.lg\:absolute{position:absolute}.lg\:left-0{left:0}.lg\:right-0{right:0}.lg\:top-2{top:.5rem}.lg\:right-6{right:1.5rem}.lg\:mx-0{margin-left:0;margin-right:0}.lg\:mx-8{margin-left:2rem;margin-right:2rem}.lg\:mt-0{margin-top:0}.lg\:mb-0{margin-bottom:0}.lg\:block{display:block}.lg\:inline{display:inline}.lg\:table-cell{display:table-cell}.lg\:hidden{display:none}.lg\:w-auto{width:auto}.lg\:flex-row{flex-direction:row}.lg\:px-5{padding-left:1.25rem;padding-right:1.25rem}.lg\:pl-2{padding-left:.5rem}}@media (min-width:1280px){.xl\:inline{display:inline}}
+/*! tailwindcss v3.3.5 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e4e4e7;box-sizing:border-box}:after,:before{--tw-content:""}html{-webkit-text-size-adjust:100%;font-feature-settings:normal;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-variation-settings:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#a1a1aa;opacity:1}input::placeholder,textarea::placeholder{color:#a1a1aa;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.\!container{width:100%!important}.container{width:100%}@media (min-width:640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media (min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width:1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media (min-width:1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media (min-width:1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.sr-only{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-y-0{bottom:0;top:0}.-left-\[200\%\]{left:-200%}.bottom-0{bottom:0}.bottom-10{bottom:2.5rem}.bottom-4{bottom:1rem}.left-0{left:0}.left-3{left:.75rem}.right-0{right:0}.right-4{right:1rem}.right-7{right:1.75rem}.right-\[200\%\]{right:200%}.top-0{top:0}.top-9{top:2.25rem}.z-10{z-index:10}.z-20{z-index:20}.m-1{margin:.25rem}.-my-1{margin-bottom:-.25rem;margin-top:-.25rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-1\.5{margin-left:.375rem;margin-right:.375rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.my-auto{margin-bottom:auto;margin-top:auto}.-mb-0{margin-bottom:0}.-mb-0\.5{margin-bottom:-.125rem}.-mb-px{margin-bottom:-1px}.-mr-2{margin-right:-.5rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-5{margin-left:1.25rem}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mr-2\.5{margin-right:.625rem}.mr-4{margin-right:1rem}.mr-5{margin-right:1.25rem}.mt-0{margin-top:0}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-6{margin-top:1.5rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-0{height:0}.h-14{height:3.5rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-\[18px\]{height:18px}.h-full{height:100%}.max-h-60{max-height:15rem}.max-h-screen{max-height:100vh}.min-h-\[38px\]{min-height:38px}.min-h-screen{min-height:100vh}.w-14{width:3.5rem}.w-3{width:.75rem}.w-4{width:1rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-\[18px\]{width:18px}.w-full{width:100%}.w-screen{width:100vw}.min-w-\[240px\]{min-width:240px}.min-w-full{min-width:100%}.max-w-\[1px\]{max-width:1px}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.flex-1{flex:1 1 0%}.shrink{flex-shrink:1}.table-fixed{table-layout:fixed}.border-separate{border-collapse:separate}.translate-x-0{--tw-translate-x:0px}.translate-x-0,.translate-x-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-full{--tw-translate-x:100%}.rotate-90{--tw-rotate:90deg}.rotate-90,.scale-100{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x:1;--tw-scale-y:1}.scale-90{--tw-scale-x:.9;--tw-scale-y:.9}.scale-90,.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-flow-col{grid-auto-flow:column}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.items-start{align-items:flex-start}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.5rem*var(--tw-space-x-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-y-auto{overflow-y:auto}.overflow-y-scroll{overflow-y:scroll}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-t{border-top-width:1px}.border-t-2{border-top-width:2px}.border-brand-500{--tw-border-opacity:1;border-color:rgb(14 165 233/var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}.border-transparent{border-color:transparent}.border-yellow-300{--tw-border-opacity:1;border-color:rgb(253 224 71/var(--tw-border-opacity))}.bg-brand-600{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-yellow-100{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity))}.bg-opacity-75{--tw-bg-opacity:0.75}.bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.from-gray-100{--tw-gradient-from:#f4f4f5 var(--tw-gradient-from-position);--tw-gradient-to:hsla(240,5%,96%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-transparent{--tw-gradient-to:transparent var(--tw-gradient-to-position)}.p-12{padding:3rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-8{padding-left:2rem;padding-right:2rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-4{padding-bottom:1rem;padding-top:1rem}.py-5{padding-bottom:1.25rem;padding-top:1.25rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.pb-1{padding-bottom:.25rem}.pb-16{padding-bottom:4rem}.pl-10{padding-left:2.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pr-10{padding-right:2.5rem}.pr-2{padding-right:.5rem}.pr-4{padding-right:1rem}.pr-9{padding-right:2.25rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-base{font-size:1rem;line-height:1.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.italic{font-style:italic}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.text-brand-500{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.text-brand-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}.text-brand-700{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity))}.text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-yellow-700{--tw-text-opacity:1;color:rgb(161 98 7/var(--tw-text-opacity))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-25{opacity:.25}.opacity-60{opacity:.6}.opacity-75{opacity:.75}.opacity-90{opacity:.9}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-md,.shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.outline-brand-500{outline-color:#0ea5e9}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-opacity-5{--tw-ring-opacity:0.05}.blur{--tw-blur:blur(8px)}.blur,.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.spin{-webkit-animation-duration:1.5s;-moz-animation-duration:1.5s;-ms-animation-duration:1.5s;animation-duration:1.5s;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-ms-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:spin;-moz-animation-name:spin;-ms-animation-name:spin;animation-name:spin;-webkit-animation-timing-function:linear;-moz-animation-timing-function:linear;-ms-animation-timing-function:linear;animation-timing-function:linear}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}html.dark{color-scheme:dark}#bmc-wbtn{height:48px!important;width:48px!important}#bmc-wbtn>img{height:32px!important;width:32px!important}.log-levels-selector .dropdown-toggle{white-space:nowrap}.log-levels-selector .dropdown-toggle:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}:is(.dark .log-levels-selector .dropdown-toggle:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity))}.log-levels-selector .dropdown-toggle>svg{height:1rem;margin-left:.25rem;opacity:.75;width:1rem}.log-levels-selector .dropdown .log-level{font-weight:600}.log-levels-selector .dropdown .log-level.success{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}:is(.dark .log-levels-selector .dropdown .log-level.success){--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.log-levels-selector .dropdown .log-level.info{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}:is(.dark .log-levels-selector .dropdown .log-level.info){--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.log-levels-selector .dropdown .log-level.warning{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity))}:is(.dark .log-levels-selector .dropdown .log-level.warning){--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity))}.log-levels-selector .dropdown .log-level.danger{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}:is(.dark .log-levels-selector .dropdown .log-level.danger){--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity))}.log-levels-selector .dropdown .log-level.none{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}:is(.dark .log-levels-selector .dropdown .log-level.none){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.log-levels-selector .dropdown .log-count{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity));margin-left:2rem;white-space:nowrap}:is(.dark .log-levels-selector .dropdown .log-count){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.log-levels-selector .dropdown button.active .log-level.success{--tw-text-opacity:1;color:rgb(209 250 229/var(--tw-text-opacity))}.log-levels-selector .dropdown button.active .log-level.info{--tw-text-opacity:1;color:rgb(224 242 254/var(--tw-text-opacity))}.log-levels-selector .dropdown button.active .log-level.warning{--tw-text-opacity:1;color:rgb(254 243 199/var(--tw-text-opacity))}.log-levels-selector .dropdown button.active .log-level.danger{--tw-text-opacity:1;color:rgb(255 228 230/var(--tw-text-opacity))}.log-levels-selector .dropdown button.active .log-level.none{--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity))}.log-levels-selector .dropdown button.active .log-count{--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}:is(.dark .log-levels-selector .dropdown button.active .log-count){--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.log-levels-selector .dropdown .no-results{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity));font-size:.75rem;line-height:1rem;padding:.25rem 1rem;text-align:center}:is(.dark .log-levels-selector .dropdown .no-results){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.log-item{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));cursor:pointer;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}:is(.dark .log-item){--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.log-item.success.active>td,.log-item.success:focus-within>td,.log-item.success:hover>td{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity))}:is(.dark .log-item.success.active>td),:is(.dark .log-item.success:focus-within>td),:is(.dark .log-item.success:hover>td){--tw-bg-opacity:0.4;background-color:rgb(6 95 70/var(--tw-bg-opacity))}.log-item.success .log-level-indicator{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity))}:is(.dark .log-item.success .log-level-indicator){--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.log-item.success .log-level{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}:is(.dark .log-item.success .log-level){--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.log-item.info.active>td,.log-item.info:focus-within>td,.log-item.info:hover>td{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity))}:is(.dark .log-item.info.active>td),:is(.dark .log-item.info:focus-within>td),:is(.dark .log-item.info:hover>td){--tw-bg-opacity:0.4;background-color:rgb(7 89 133/var(--tw-bg-opacity))}.log-item.info .log-level-indicator{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity))}:is(.dark .log-item.info .log-level-indicator){--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity))}.log-item.info .log-level{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}:is(.dark .log-item.info .log-level){--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.log-item.warning.active>td,.log-item.warning:focus-within>td,.log-item.warning:hover>td{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity))}:is(.dark .log-item.warning.active>td),:is(.dark .log-item.warning:focus-within>td),:is(.dark .log-item.warning:hover>td){--tw-bg-opacity:0.4;background-color:rgb(146 64 14/var(--tw-bg-opacity))}.log-item.warning .log-level-indicator{--tw-bg-opacity:1;background-color:rgb(180 83 9/var(--tw-bg-opacity))}:is(.dark .log-item.warning .log-level-indicator){--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity))}.log-item.warning .log-level{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity))}:is(.dark .log-item.warning .log-level){--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity))}.log-item.danger.active>td,.log-item.danger:focus-within>td,.log-item.danger:hover>td{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}:is(.dark .log-item.danger.active>td),:is(.dark .log-item.danger:focus-within>td),:is(.dark .log-item.danger:hover>td){--tw-bg-opacity:0.4;background-color:rgb(159 18 57/var(--tw-bg-opacity))}.log-item.danger .log-level-indicator{--tw-bg-opacity:1;background-color:rgb(190 18 60/var(--tw-bg-opacity))}:is(.dark .log-item.danger .log-level-indicator){--tw-bg-opacity:1;background-color:rgb(251 113 133/var(--tw-bg-opacity))}.log-item.danger .log-level{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}:is(.dark .log-item.danger .log-level){--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity))}.log-item.none.active>td,.log-item.none:focus-within>td,.log-item.none:hover>td{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}:is(.dark .log-item.none.active>td),:is(.dark .log-item.none:focus-within>td),:is(.dark .log-item.none:hover>td){--tw-bg-opacity:0.4;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.log-item.none .log-level-indicator{--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}:is(.dark .log-item.none .log-level-indicator){--tw-bg-opacity:1;background-color:rgb(161 161 170/var(--tw-bg-opacity))}.log-item.none .log-level{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}:is(.dark .log-item.none .log-level){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.log-item:hover .log-level-icon{opacity:1}.badge{align-items:center;border-radius:.375rem;cursor:pointer;display:inline-flex;font-size:.875rem;line-height:1.25rem;margin-right:.5rem;margin-top:.25rem;padding:.25rem .75rem;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.badge.success{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity));border-color:rgb(167 243 208/var(--tw-border-opacity));border-width:1px;color:rgb(82 82 91/var(--tw-text-opacity))}:is(.dark .badge.success){--tw-border-opacity:1;--tw-bg-opacity:0.4;--tw-text-opacity:1;background-color:rgb(6 78 59/var(--tw-bg-opacity));border-color:rgb(6 95 70/var(--tw-border-opacity));color:rgb(161 161 170/var(--tw-text-opacity))}.badge.success:hover{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity))}:is(.dark .badge.success:hover){--tw-bg-opacity:0.75;background-color:rgb(6 78 59/var(--tw-bg-opacity))}.badge.success .checkmark{--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}:is(.dark .badge.success .checkmark){--tw-border-opacity:1;border-color:rgb(6 95 70/var(--tw-border-opacity))}.badge.success.active{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity));border-color:rgb(4 120 87/var(--tw-border-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}:is(.dark .badge.success.active){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity));border-color:rgb(5 150 105/var(--tw-border-opacity))}.badge.success.active:hover{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}:is(.dark .badge.success.active:hover){--tw-bg-opacity:1;background-color:rgb(6 95 70/var(--tw-bg-opacity))}.badge.success.active .checkmark{--tw-border-opacity:1;border-color:rgb(5 150 105/var(--tw-border-opacity))}:is(.dark .badge.success.active .checkmark){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity));border-color:rgb(4 120 87/var(--tw-border-opacity))}.badge.success.active .checkmark>svg{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity))}:is(.dark .badge.success.active .checkmark>svg){--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}.badge.info{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity));border-color:rgb(186 230 253/var(--tw-border-opacity));border-width:1px;color:rgb(82 82 91/var(--tw-text-opacity))}:is(.dark .badge.info){--tw-border-opacity:1;--tw-bg-opacity:0.4;--tw-text-opacity:1;background-color:rgb(12 74 110/var(--tw-bg-opacity));border-color:rgb(7 89 133/var(--tw-border-opacity));color:rgb(161 161 170/var(--tw-text-opacity))}.badge.info:hover{--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity))}:is(.dark .badge.info:hover){--tw-bg-opacity:0.75;background-color:rgb(12 74 110/var(--tw-bg-opacity))}.badge.info .checkmark{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity))}:is(.dark .badge.info .checkmark){--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}.badge.info.active{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity));border-color:rgb(3 105 161/var(--tw-border-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}:is(.dark .badge.info.active){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity));border-color:rgb(2 132 199/var(--tw-border-opacity))}.badge.info.active:hover{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity))}:is(.dark .badge.info.active:hover){--tw-bg-opacity:1;background-color:rgb(7 89 133/var(--tw-bg-opacity))}.badge.info.active .checkmark{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}:is(.dark .badge.info.active .checkmark){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity));border-color:rgb(3 105 161/var(--tw-border-opacity))}.badge.info.active .checkmark>svg{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}:is(.dark .badge.info.active .checkmark>svg){--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}.badge.warning{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity));border-color:rgb(253 230 138/var(--tw-border-opacity));border-width:1px;color:rgb(82 82 91/var(--tw-text-opacity))}:is(.dark .badge.warning){--tw-border-opacity:1;--tw-bg-opacity:0.4;--tw-text-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity));border-color:rgb(146 64 14/var(--tw-border-opacity));color:rgb(161 161 170/var(--tw-text-opacity))}.badge.warning:hover{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}:is(.dark .badge.warning:hover){--tw-bg-opacity:0.75;background-color:rgb(120 53 15/var(--tw-bg-opacity))}.badge.warning .checkmark{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity))}:is(.dark .badge.warning .checkmark){--tw-border-opacity:1;border-color:rgb(146 64 14/var(--tw-border-opacity))}.badge.warning.active{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity));border-color:rgb(180 83 9/var(--tw-border-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}:is(.dark .badge.warning.active){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(180 83 9/var(--tw-bg-opacity));border-color:rgb(217 119 6/var(--tw-border-opacity))}.badge.warning.active:hover{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity))}:is(.dark .badge.warning.active:hover){--tw-bg-opacity:1;background-color:rgb(146 64 14/var(--tw-bg-opacity))}.badge.warning.active .checkmark{--tw-border-opacity:1;border-color:rgb(217 119 6/var(--tw-border-opacity))}:is(.dark .badge.warning.active .checkmark){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity));border-color:rgb(180 83 9/var(--tw-border-opacity))}.badge.warning.active .checkmark>svg{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}:is(.dark .badge.warning.active .checkmark>svg){--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity))}.badge.danger{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity));border-color:rgb(254 205 211/var(--tw-border-opacity));border-width:1px;color:rgb(82 82 91/var(--tw-text-opacity))}:is(.dark .badge.danger){--tw-border-opacity:1;--tw-bg-opacity:0.4;--tw-text-opacity:1;background-color:rgb(136 19 55/var(--tw-bg-opacity));border-color:rgb(159 18 57/var(--tw-border-opacity));color:rgb(161 161 170/var(--tw-text-opacity))}.badge.danger:hover{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}:is(.dark .badge.danger:hover){--tw-bg-opacity:0.75;background-color:rgb(136 19 55/var(--tw-bg-opacity))}.badge.danger .checkmark{--tw-border-opacity:1;border-color:rgb(254 205 211/var(--tw-border-opacity))}:is(.dark .badge.danger .checkmark){--tw-border-opacity:1;border-color:rgb(159 18 57/var(--tw-border-opacity))}.badge.danger.active{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(225 29 72/var(--tw-bg-opacity));border-color:rgb(190 18 60/var(--tw-border-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}:is(.dark .badge.danger.active){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(190 18 60/var(--tw-bg-opacity));border-color:rgb(225 29 72/var(--tw-border-opacity))}.badge.danger.active:hover{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity))}:is(.dark .badge.danger.active:hover){--tw-bg-opacity:1;background-color:rgb(159 18 57/var(--tw-bg-opacity))}.badge.danger.active .checkmark{--tw-border-opacity:1;border-color:rgb(225 29 72/var(--tw-border-opacity))}:is(.dark .badge.danger.active .checkmark){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity));border-color:rgb(190 18 60/var(--tw-border-opacity))}.badge.danger.active .checkmark>svg{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity))}:is(.dark .badge.danger.active .checkmark>svg){--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}.badge.none{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity));border-color:rgb(228 228 231/var(--tw-border-opacity));border-width:1px;color:rgb(82 82 91/var(--tw-text-opacity))}:is(.dark .badge.none){--tw-border-opacity:1;--tw-bg-opacity:0.4;--tw-text-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity));border-color:rgb(39 39 42/var(--tw-border-opacity));color:rgb(161 161 170/var(--tw-text-opacity))}.badge.none:hover{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}:is(.dark .badge.none:hover){--tw-bg-opacity:0.75;background-color:rgb(24 24 27/var(--tw-bg-opacity))}.badge.none .checkmark{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity))}:is(.dark .badge.none .checkmark){--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity))}.badge.none.active{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:rgb(39 39 42/var(--tw-text-opacity))}:is(.dark .badge.none.active){--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity));border-color:rgb(82 82 91/var(--tw-border-opacity));color:rgb(244 244 245/var(--tw-text-opacity))}.badge.none.active:hover{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}:is(.dark .badge.none.active:hover){--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity))}.badge.none.active .checkmark{--tw-border-opacity:1;border-color:rgb(82 82 91/var(--tw-border-opacity))}:is(.dark .badge.none.active .checkmark){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity));border-color:rgb(63 63 70/var(--tw-border-opacity))}.badge.none.active .checkmark>svg{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}:is(.dark .badge.none.active .checkmark>svg){--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}.log-list table>thead th{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity));color:rgb(113 113 122/var(--tw-text-opacity));font-size:.75rem;font-weight:600;line-height:1rem;padding:.5rem .25rem;position:sticky;text-align:left;top:0;z-index:10}.file-list .folder-container .folder-item-container.log-list table>thead th{position:sticky}:is(.dark .log-list table>thead th){--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity));color:rgb(161 161 170/var(--tw-text-opacity))}@media (min-width:1024px){.log-list table>thead th{font-size:.875rem;line-height:1.25rem;padding-left:.5rem;padding-right:.5rem}}.log-list .log-group{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));position:relative}:is(.dark .log-list .log-group){--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity));color:rgb(228 228 231/var(--tw-text-opacity))}.log-list .log-group .log-item>td{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity));border-top-width:1px;font-size:.75rem;line-height:1rem;padding:.375rem .25rem}:is(.dark .log-list .log-group .log-item>td){--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}@media (min-width:1024px){.log-list .log-group .log-item>td{font-size:.875rem;line-height:1.25rem;padding:.5rem}}.log-list .log-group.first .log-item>td{border-top-color:transparent}.log-list .log-group .mail-preview-attributes{--tw-border-opacity:1;background-color:rgba(240,249,255,.3);border-color:rgb(224 242 254/var(--tw-border-opacity));border-radius:.25rem;border-width:1px;font-size:.75rem;line-height:1rem;margin-bottom:1rem;overflow-x:auto;width:100%}:is(.dark .log-list .log-group .mail-preview-attributes){--tw-border-opacity:1;background-color:rgba(12,74,110,.2);border-color:rgb(7 89 133/var(--tw-border-opacity))}@media (min-width:1024px){.log-list .log-group .mail-preview-attributes{font-size:.875rem;line-height:1.25rem;margin-bottom:1.5rem;overflow:hidden}}.log-list .log-group .mail-preview-attributes table{width:100%}.log-list .log-group .mail-preview-attributes td{padding:.25rem .5rem}@media (min-width:1024px){.log-list .log-group .mail-preview-attributes td{padding:.5rem 1.5rem}}.log-list .log-group .mail-preview-attributes td:not(:first-child){overflow-wrap:anywhere}.log-list .log-group .mail-preview-attributes tr:first-child td{padding-top:.375rem}@media (min-width:1024px){.log-list .log-group .mail-preview-attributes tr:first-child td{padding-top:.75rem}}.log-list .log-group .mail-preview-attributes tr:last-child td{padding-bottom:.375rem}@media (min-width:1024px){.log-list .log-group .mail-preview-attributes tr:last-child td{padding-bottom:.75rem}}.log-list .log-group .mail-preview-attributes tr:not(:last-child) td{--tw-border-opacity:1;border-bottom-width:1px;border-color:rgb(224 242 254/var(--tw-border-opacity))}:is(.dark .log-list .log-group .mail-preview-attributes tr:not(:last-child) td){--tw-border-opacity:1;border-color:rgb(12 74 110/var(--tw-border-opacity))}.log-list .log-group .mail-preview-html{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity));border-color:rgb(228 228 231/var(--tw-border-opacity));border-radius:.25rem;border-width:1px;margin-bottom:1rem;overflow:auto;width:100%}:is(.dark .log-list .log-group .mail-preview-html){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity));border-color:rgb(63 63 70/var(--tw-border-opacity))}@media (min-width:1024px){.log-list .log-group .mail-preview-html{margin-bottom:1.5rem}}.log-list .log-group .mail-preview-text{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity));border-color:rgb(228 228 231/var(--tw-border-opacity));border-radius:.25rem;border-width:1px;font-size:.875rem;line-height:1.25rem;margin-bottom:1rem;padding:1rem;white-space:pre-wrap;width:100%}:is(.dark .log-list .log-group .mail-preview-text){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity));border-color:rgb(63 63 70/var(--tw-border-opacity))}@media (min-width:1024px){.log-list .log-group .mail-preview-text{margin-bottom:1.5rem}}.log-list .log-group .mail-attachment-button{--tw-bg-opacity:1;align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.25rem;border-width:1px;display:flex;justify-content:space-between;padding:.25rem .5rem}:is(.dark .log-list .log-group .mail-attachment-button){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity));border-color:rgb(63 63 70/var(--tw-border-opacity))}@media (min-width:1024px){.log-list .log-group .mail-attachment-button{padding:.5rem 1rem}}.log-list .log-group .mail-attachment-button{max-width:460px}.log-list .log-group .mail-attachment-button:not(:last-child){margin-bottom:.5rem}.log-list .log-group .mail-attachment-button a:focus{outline-color:#0ea5e9}.log-list .log-group .tabs-container{font-size:.75rem;line-height:1rem}@media (min-width:1024px){.log-list .log-group .tabs-container{font-size:.875rem;line-height:1.25rem}}.log-list .log-group .log-stack,.log-list .log-group .mail-preview,.log-list .log-group .tabs-container{padding:.25rem .5rem}@media (min-width:1024px){.log-list .log-group .log-stack,.log-list .log-group .mail-preview,.log-list .log-group .tabs-container{padding:.5rem 2rem}}.log-list .log-group .log-stack{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity));font-size:10px;line-height:.75rem;white-space:pre-wrap;word-break:break-all}:is(.dark .log-list .log-group .log-stack){--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}@media (min-width:1024px){.log-list .log-group .log-stack{font-size:.75rem;line-height:1rem}}.log-list .log-group .log-link{align-items:center;border-radius:.25rem;display:flex;justify-content:flex-end;margin-bottom:-.125rem;margin-top:-.125rem;padding-bottom:.125rem;padding-left:.25rem;padding-top:.125rem;width:100%}@media (min-width:640px){.log-list .log-group .log-link{min-width:64px}}.log-list .log-group .log-link>svg{height:1rem;margin-left:.25rem;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:1rem}.log-list .log-group .log-link:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}:is(.dark .log-list .log-group .log-link:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(56 189 248/var(--tw-ring-opacity))}.log-list .log-group code,.log-list .log-group mark{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity));border-radius:.25rem;color:rgb(24 24 27/var(--tw-text-opacity));padding:.125rem .25rem}:is(.dark .log-list .log-group code),:is(.dark .log-list .log-group mark){--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(133 77 14/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.pagination{align-items:center;display:flex;justify-content:center;width:100%}@media (min-width:640px){.pagination{margin-top:.5rem;padding-left:1rem;padding-right:1rem}}@media (min-width:1024px){.pagination{padding-left:0;padding-right:0}}.pagination .previous{display:flex;flex:1 1 0%;justify-content:flex-start;margin-top:-1px;width:0}@media (min-width:768px){.pagination .previous{justify-content:flex-end}}.pagination .previous button{--tw-text-opacity:1;align-items:center;border-color:transparent;border-top-width:2px;color:rgb(113 113 122/var(--tw-text-opacity));display:inline-flex;font-size:.875rem;font-weight:500;line-height:1.25rem;padding-right:.25rem;padding-top:.75rem}:is(.dark .pagination .previous button){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.pagination .previous button:hover{--tw-border-opacity:1;--tw-text-opacity:1;border-color:rgb(161 161 170/var(--tw-border-opacity));color:rgb(63 63 70/var(--tw-text-opacity))}:is(.dark .pagination .previous button:hover){--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.pagination .previous button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}:is(.dark .pagination .previous button:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(56 189 248/var(--tw-ring-opacity))}.pagination .previous button svg{color:currentColor;height:1.25rem;margin-left:.75rem;margin-right:.75rem;width:1.25rem}.pagination .next{display:flex;flex:1 1 0%;justify-content:flex-end;margin-top:-1px;width:0}@media (min-width:768px){.pagination .next{justify-content:flex-start}}.pagination .next button{--tw-text-opacity:1;align-items:center;border-color:transparent;border-top-width:2px;color:rgb(113 113 122/var(--tw-text-opacity));display:inline-flex;font-size:.875rem;font-weight:500;line-height:1.25rem;padding-left:.25rem;padding-top:.75rem}:is(.dark .pagination .next button){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.pagination .next button:hover{--tw-border-opacity:1;--tw-text-opacity:1;border-color:rgb(161 161 170/var(--tw-border-opacity));color:rgb(63 63 70/var(--tw-text-opacity))}:is(.dark .pagination .next button:hover){--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.pagination .next button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}:is(.dark .pagination .next button:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(56 189 248/var(--tw-ring-opacity))}.pagination .next button svg{color:currentColor;height:1.25rem;margin-left:.75rem;margin-right:.75rem;width:1.25rem}.pagination .pages{display:none}@media (min-width:640px){.pagination .pages{display:flex;margin-top:-1px}}.pagination .pages span{--tw-text-opacity:1;align-items:center;border-color:transparent;border-top-width:2px;color:rgb(113 113 122/var(--tw-text-opacity));display:inline-flex;font-size:.875rem;font-weight:500;line-height:1.25rem;padding-left:1rem;padding-right:1rem;padding-top:.75rem}:is(.dark .pagination .pages span){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.pagination .pages button{align-items:center;border-top-width:2px;display:inline-flex;font-size:.875rem;font-weight:500;line-height:1.25rem;padding-left:1rem;padding-right:1rem;padding-top:.75rem}.pagination .pages button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}:is(.dark .pagination .pages button:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(56 189 248/var(--tw-ring-opacity))}.search{--tw-border-opacity:1;--tw-bg-opacity:1;align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(212 212 216/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;display:flex;font-size:.875rem;line-height:1.25rem;position:relative;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:100%}:is(.dark .search){--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity));border-color:rgb(82 82 91/var(--tw-border-opacity));color:rgb(244 244 245/var(--tw-text-opacity))}.search .prefix-icon{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity));margin-left:.75rem;margin-right:.25rem}:is(.dark .search .prefix-icon){--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.search input{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:transparent;background-color:inherit;border-radius:.25rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);flex:1 1 0%;padding:.25rem;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:100%}.search input:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));border-color:transparent;outline:2px solid transparent;outline-offset:2px}:is(.dark .search input:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity))}.search.has-error{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.search .submit-search button{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(244 244 245/var(--tw-bg-opacity));border-bottom-right-radius:.25rem;border-top-right-radius:.25rem;color:rgb(82 82 91/var(--tw-text-opacity));display:flex;padding:.5rem;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}:is(.dark .search .submit-search button){--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity));color:rgb(212 212 216/var(--tw-text-opacity))}.search .submit-search button:hover{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity))}:is(.dark .search .submit-search button:hover){--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity))}.search .submit-search button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}:is(.dark .search .submit-search button:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity))}.search .submit-search button>svg{height:1.25rem;margin-left:.25rem;opacity:.75;width:1.25rem}.search .clear-search{position:absolute;right:0;top:0}.search .clear-search button{--tw-text-opacity:1;border-radius:.25rem;color:rgb(161 161 170/var(--tw-text-opacity));padding:.25rem;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}:is(.dark .search .clear-search button){--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.search .clear-search button:hover{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}:is(.dark .search .clear-search button:hover){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.search .clear-search button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}:is(.dark .search .clear-search button:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity))}.search .clear-search button>svg{height:1.25rem;width:1.25rem}.search-progress-bar{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity));border-radius:.25rem;height:.125rem;position:absolute;top:.25rem;transition-duration:.3s;transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:linear}:is(.dark .search-progress-bar){--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}.dropdown{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(228 228 231/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(24 24 27/var(--tw-text-opacity));margin-top:-.25rem;overflow:hidden;position:absolute;right:.25rem;top:100%;z-index:40}:is(.dark .dropdown){--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity));border-color:rgb(63 63 70/var(--tw-border-opacity));color:rgb(228 228 231/var(--tw-text-opacity))}.dropdown{transform-origin:top right!important}.dropdown:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));--tw-ring-opacity:0.5;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}:is(.dark .dropdown:focus){--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity));--tw-ring-opacity:0.5}.dropdown.up{bottom:100%;margin-bottom:-.25rem;margin-top:0;top:auto;transform-origin:bottom right!important}.dropdown.left{left:.25rem;right:auto;transform-origin:top left!important}.dropdown.left.up{transform-origin:bottom left!important}.dropdown a:not(.inline-link),.dropdown button:not(.inline-link){align-items:center;display:block;display:flex;font-size:.875rem;line-height:1.25rem;outline-color:#0ea5e9;padding:.5rem 1rem;text-align:left;width:100%}:is(.dark .dropdown a:not(.inline-link)),:is(.dark .dropdown button:not(.inline-link)){outline-color:#075985}.dropdown a:not(.inline-link)>svg,.dropdown button:not(.inline-link)>svg{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity));height:1rem;margin-right:.75rem;width:1rem}.dropdown a:not(.inline-link)>svg.spin,.dropdown button:not(.inline-link)>svg.spin{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}.dropdown a.active,.dropdown a:hover,.dropdown button.active,.dropdown button:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.dropdown a.active>.checkmark,.dropdown a:hover>.checkmark,.dropdown button.active>.checkmark,.dropdown button:hover>.checkmark{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}:is(.dark .dropdown a.active>.checkmark),:is(.dark .dropdown a:hover>.checkmark),:is(.dark .dropdown button.active>.checkmark),:is(.dark .dropdown button:hover>.checkmark){--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}.dropdown a.active>svg,.dropdown a:hover>svg,.dropdown button.active>svg,.dropdown button:hover>svg{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.dropdown .divider{border-top-width:1px;margin-bottom:.5rem;margin-top:.5rem;width:100%}:is(.dark .dropdown .divider){--tw-border-opacity:1;border-top-color:rgb(63 63 70/var(--tw-border-opacity))}.dropdown .label{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity));font-size:.75rem;font-weight:600;line-height:1rem;margin:.25rem 1rem}.file-list{height:100%;overflow-y:auto;padding-bottom:1rem;padding-left:.75rem;padding-right:.75rem;position:relative}@media (min-width:768px){.file-list{padding-left:0;padding-right:0}}.file-list .file-item-container,.file-list .folder-item-container{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;color:rgb(39 39 42/var(--tw-text-opacity));margin-top:.5rem;position:relative;top:0}:is(.dark .file-list .file-item-container),:is(.dark .file-list .folder-item-container){--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity));color:rgb(228 228 231/var(--tw-text-opacity))}.file-list .file-item-container .file-item,.file-list .folder-item-container .file-item{border-color:transparent;border-radius:.375rem;border-width:1px;cursor:pointer;position:relative;transition-duration:.1s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.file-list .file-item-container .file-item,.file-list .file-item-container .file-item .file-item-info,.file-list .folder-item-container .file-item,.file-list .folder-item-container .file-item .file-item-info{align-items:center;display:flex;justify-content:space-between;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter}.file-list .file-item-container .file-item .file-item-info,.file-list .folder-item-container .file-item .file-item-info{border-bottom-left-radius:.375rem;border-top-left-radius:.375rem;flex:1 1 0%;outline-color:#0ea5e9;padding:.5rem .75rem .5rem 1rem;text-align:left;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1)}:is(.dark .file-list .file-item-container .file-item .file-item-info),:is(.dark .file-list .folder-item-container .file-item .file-item-info){outline-color:#0369a1}.file-list .file-item-container .file-item .file-item-info:hover,.file-list .folder-item-container .file-item .file-item-info:hover{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity))}:is(.dark .file-list .file-item-container .file-item .file-item-info:hover),:is(.dark .file-list .folder-item-container .file-item .file-item-info:hover){--tw-bg-opacity:1;background-color:rgb(12 74 110/var(--tw-bg-opacity))}.file-list .file-item-container .file-item .file-icon,.file-list .folder-item-container .file-item .file-icon{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity));margin-right:.5rem}:is(.dark .file-list .file-item-container .file-item .file-icon),:is(.dark .file-list .folder-item-container .file-item .file-icon){--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.file-list .file-item-container .file-item .file-icon>svg,.file-list .folder-item-container .file-item .file-icon>svg{height:1rem;width:1rem}.file-list .file-item-container .file-item .file-name,.file-list .folder-item-container .file-item .file-name{font-size:.875rem;line-height:1.25rem;margin-right:.75rem;width:100%;word-break:break-word}.file-list .file-item-container .file-item .file-size,.file-list .folder-item-container .file-item .file-size{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity));font-size:.75rem;line-height:1rem;white-space:nowrap}:is(.dark .file-list .file-item-container .file-item .file-size),:is(.dark .file-list .folder-item-container .file-item .file-size){--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity));opacity:.9}.file-list .file-item-container.active .file-item,.file-list .folder-item-container.active .file-item{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity));border-color:rgb(14 165 233/var(--tw-border-opacity))}:is(.dark .file-list .file-item-container.active .file-item),:is(.dark .file-list .folder-item-container.active .file-item){--tw-border-opacity:1;--tw-bg-opacity:0.4;background-color:rgb(12 74 110/var(--tw-bg-opacity));border-color:rgb(12 74 110/var(--tw-border-opacity))}.file-list .file-item-container.active-folder .file-item,.file-list .folder-item-container.active-folder .file-item{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}:is(.dark .file-list .file-item-container.active-folder .file-item),:is(.dark .file-list .folder-item-container.active-folder .file-item){--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}.file-list .file-item-container:hover .file-item,.file-list .folder-item-container:hover .file-item{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}:is(.dark .file-list .file-item-container:hover .file-item),:is(.dark .file-list .folder-item-container:hover .file-item){--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}.file-list .file-item-container .file-dropdown-toggle,.file-list .folder-item-container .file-dropdown-toggle{--tw-text-opacity:1;align-items:center;align-self:stretch;border-bottom-right-radius:.375rem;border-color:transparent;border-left-width:1px;border-top-right-radius:.375rem;color:rgb(113 113 122/var(--tw-text-opacity));display:flex;justify-content:center;outline-color:#0ea5e9;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:2rem}:is(.dark .file-list .file-item-container .file-dropdown-toggle),:is(.dark .file-list .folder-item-container .file-dropdown-toggle){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity));outline-color:#0369a1}.file-list .file-item-container .file-dropdown-toggle:hover,.file-list .folder-item-container .file-dropdown-toggle:hover{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity));border-color:rgb(2 132 199/var(--tw-border-opacity))}:is(.dark .file-list .file-item-container .file-dropdown-toggle:hover),:is(.dark .file-list .folder-item-container .file-dropdown-toggle:hover){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(12 74 110/var(--tw-bg-opacity));border-color:rgb(7 89 133/var(--tw-border-opacity))}.file-list .folder-container .folder-item-container.sticky{position:sticky}.file-list .folder-container:first-child>.folder-item-container{margin-top:0}.menu-button{--tw-text-opacity:1;border-radius:.375rem;color:rgb(161 161 170/var(--tw-text-opacity));cursor:pointer;outline-color:#0ea5e9;padding:.5rem;position:relative;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.menu-button:hover{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}:is(.dark .menu-button:hover){--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.menu-button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}:is(.dark .menu-button:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity))}a.button,button.button{--tw-text-opacity:1;align-items:center;border-radius:.375rem;color:rgb(24 24 27/var(--tw-text-opacity));display:block;display:flex;font-size:.875rem;line-height:1.25rem;outline-color:#0ea5e9;padding:.5rem 1rem;text-align:left;width:100%}:is(.dark a.button),:is(.dark button.button){--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity));outline-color:#075985}a.button>svg,button.button>svg{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity));height:1rem;width:1rem}:is(.dark a.button>svg),:is(.dark button.button>svg){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}a.button>svg.spin,button.button>svg.spin{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}a.button:hover,button.button:hover{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}:is(.dark a.button:hover),:is(.dark button.button:hover){--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}.select{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity));border-radius:.25rem;color:rgb(63 63 70/var(--tw-text-opacity));font-weight:400;margin-bottom:-.125rem;margin-top:-.125rem;outline:2px solid transparent;outline-offset:2px;padding:.125rem .25rem}:is(.dark .select){--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity));color:rgb(212 212 216/var(--tw-text-opacity))}.select:hover{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity))}:is(.dark .select:hover){--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.select:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}:is(.dark .select:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity))}.keyboard-shortcut{--tw-text-opacity:1;align-items:center;color:rgb(82 82 91/var(--tw-text-opacity));display:flex;font-size:.875rem;justify-content:flex-start;line-height:1.25rem;margin-bottom:.75rem;width:100%}:is(.dark .keyboard-shortcut){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.keyboard-shortcut .shortcut{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(244 244 245/var(--tw-ring-opacity));align-items:center;border-color:rgb(161 161 170/var(--tw-border-opacity));border-radius:.25rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);display:inline-flex;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1rem;height:1.5rem;justify-content:center;line-height:1.5rem;margin-right:.5rem;width:1.5rem}:is(.dark .keyboard-shortcut .shortcut){--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(24 24 27/var(--tw-ring-opacity));border-color:rgb(82 82 91/var(--tw-border-opacity))}.hover\:border-brand-600:hover{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}.hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity))}.hover\:text-brand-800:hover{--tw-text-opacity:1;color:rgb(7 89 133/var(--tw-text-opacity))}.hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}.focus\:border-brand-500:focus{--tw-border-opacity:1;border-color:rgb(14 165 233/var(--tw-border-opacity))}.focus\:opacity-100:focus{opacity:1}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:outline-brand-500:focus{outline-color:#0ea5e9}.focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-1:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-brand-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity))}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.group:hover .group-hover\:inline-block{display:inline-block}.group:hover .group-hover\:hidden{display:none}.group:hover .group-hover\:border-brand-600{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}.group:hover .group-hover\:underline{text-decoration-line:underline}.group:hover .group-hover\:opacity-100{opacity:1}.group:focus .group-focus\:inline-block{display:inline-block}.group:focus .group-focus\:hidden{display:none}:is(.dark .dark\:border-brand-400){--tw-border-opacity:1;border-color:rgb(56 189 248/var(--tw-border-opacity))}:is(.dark .dark\:border-brand-600){--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}:is(.dark .dark\:border-gray-600){--tw-border-opacity:1;border-color:rgb(82 82 91/var(--tw-border-opacity))}:is(.dark .dark\:border-gray-700){--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}:is(.dark .dark\:border-gray-800){--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity))}:is(.dark .dark\:border-yellow-800){--tw-border-opacity:1;border-color:rgb(133 77 14/var(--tw-border-opacity))}:is(.dark .dark\:bg-gray-700){--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}:is(.dark .dark\:bg-gray-800){--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}:is(.dark .dark\:bg-gray-900){--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity))}:is(.dark .dark\:bg-yellow-900){--tw-bg-opacity:1;background-color:rgb(113 63 18/var(--tw-bg-opacity))}:is(.dark .dark\:bg-opacity-40){--tw-bg-opacity:0.4}:is(.dark .dark\:from-gray-900){--tw-gradient-from:#18181b var(--tw-gradient-from-position);--tw-gradient-to:rgba(24,24,27,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}:is(.dark .dark\:text-blue-500){--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}:is(.dark .dark\:text-brand-500){--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}:is(.dark .dark\:text-brand-600){--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}:is(.dark .dark\:text-gray-200){--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}:is(.dark .dark\:text-gray-300){--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}:is(.dark .dark\:text-gray-400){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}:is(.dark .dark\:text-green-500){--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}:is(.dark .dark\:text-yellow-400){--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity))}:is(.dark .dark\:opacity-90){opacity:.9}:is(.dark .dark\:outline-brand-800){outline-color:#075985}:is(.dark .dark\:hover\:border-brand-700:hover){--tw-border-opacity:1;border-color:rgb(3 105 161/var(--tw-border-opacity))}:is(.dark .dark\:hover\:border-gray-400:hover){--tw-border-opacity:1;border-color:rgb(161 161 170/var(--tw-border-opacity))}:is(.dark .hover\:dark\:border-brand-800):hover{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}:is(.dark .dark\:hover\:bg-gray-600:hover){--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:text-blue-400:hover){--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-brand-600:hover){--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-gray-200:hover){--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-gray-300:hover){--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}:is(.dark .dark\:focus\:ring-brand-700:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity))}.group:hover :is(.dark .group-hover\:dark\:border-brand-800){--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}@media (min-width:640px){.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:flex-col-reverse{flex-direction:column-reverse}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:duration-300{transition-duration:.3s}}@media (min-width:768px){.md\:fixed{position:fixed}.md\:inset-y-0{bottom:0;top:0}.md\:left-0{left:0}.md\:left-auto{left:auto}.md\:right-auto{right:auto}.md\:mx-0{margin-left:0;margin-right:0}.md\:mx-3{margin-left:.75rem;margin-right:.75rem}.md\:mt-0{margin-top:0}.md\:block{display:block}.md\:inline{display:inline}.md\:flex{display:flex}.md\:hidden{display:none}.md\:w-88{width:22rem}.md\:flex-col{flex-direction:column}.md\:px-4{padding-left:1rem;padding-right:1rem}.md\:pb-12{padding-bottom:3rem}.md\:pl-88{padding-left:22rem}.md\:opacity-75{opacity:.75}}@media (min-width:1024px){.lg\:absolute{position:absolute}.lg\:left-0{left:0}.lg\:right-0{right:0}.lg\:right-6{right:1.5rem}.lg\:top-2{top:.5rem}.lg\:mx-0{margin-left:0;margin-right:0}.lg\:mx-8{margin-left:2rem;margin-right:2rem}.lg\:mb-0{margin-bottom:0}.lg\:mt-0{margin-top:0}.lg\:block{display:block}.lg\:inline{display:inline}.lg\:table-cell{display:table-cell}.lg\:hidden{display:none}.lg\:w-auto{width:auto}.lg\:flex-row{flex-direction:row}.lg\:px-5{padding-left:1.25rem;padding-right:1.25rem}.lg\:pl-2{padding-left:.5rem}.lg\:text-sm{font-size:.875rem;line-height:1.25rem}}@media (min-width:1280px){.xl\:inline{display:inline}}
diff --git a/public/vendor/log-viewer/app.js b/public/vendor/log-viewer/app.js
index 9d1ae1061bc..bfaf39b4951 100644
--- a/public/vendor/log-viewer/app.js
+++ b/public/vendor/log-viewer/app.js
@@ -1,2 +1,2 @@
 /*! For license information please see app.js.LICENSE.txt */
-(()=>{var e,t={520:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true"},[r("path",{"fill-rule":"evenodd",d:"M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z","clip-rule":"evenodd"})])}},889:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true"},[r("path",{"fill-rule":"evenodd",d:"M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z","clip-rule":"evenodd"})])}},10:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[r("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M10.5 19.5L3 12m0 0l7.5-7.5M3 12h18"})])}},488:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[r("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0l3.181 3.183a8.25 8.25 0 0013.803-3.7M4.031 9.865a8.25 8.25 0 0113.803-3.7l3.181 3.182m0-4.991v4.99"})])}},683:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[r("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M13.5 4.5L21 12m0 0l-7.5 7.5M21 12H3"})])}},69:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[r("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25"})])}},246:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[r("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M19.5 8.25l-7.5 7.5-7.5-7.5"})])}},388:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[r("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M8.25 4.5l7.5 7.5-7.5 7.5"})])}},782:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[r("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M20.25 6.375c0 2.278-3.694 4.125-8.25 4.125S3.75 8.653 3.75 6.375m16.5 0c0-2.278-3.694-4.125-8.25-4.125S3.75 4.097 3.75 6.375m16.5 0v11.25c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125V6.375m16.5 0v3.75m-16.5-3.75v3.75m16.5 0v3.75C20.25 16.153 16.556 18 12 18s-8.25-1.847-8.25-4.125v-3.75m16.5 0c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125"})])}},156:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[r("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M12 9.75v6.75m0 0l-3-3m3 3l3-3m-8.25 6a4.5 4.5 0 01-1.41-8.775 5.25 5.25 0 0110.233-2.33 3 3 0 013.758 3.848A3.752 3.752 0 0118 19.5H6.75z"})])}},904:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[r("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M10.343 3.94c.09-.542.56-.94 1.11-.94h1.093c.55 0 1.02.398 1.11.94l.149.894c.07.424.384.764.78.93.398.164.855.142 1.205-.108l.737-.527a1.125 1.125 0 011.45.12l.773.774c.39.389.44 1.002.12 1.45l-.527.737c-.25.35-.272.806-.107 1.204.165.397.505.71.93.78l.893.15c.543.09.94.56.94 1.109v1.094c0 .55-.397 1.02-.94 1.11l-.893.149c-.425.07-.765.383-.93.78-.165.398-.143.854.107 1.204l.527.738c.32.447.269 1.06-.12 1.45l-.774.773a1.125 1.125 0 01-1.449.12l-.738-.527c-.35-.25-.806-.272-1.203-.107-.397.165-.71.505-.781.929l-.149.894c-.09.542-.56.94-1.11.94h-1.094c-.55 0-1.019-.398-1.11-.94l-.148-.894c-.071-.424-.384-.764-.781-.93-.398-.164-.854-.142-1.204.108l-.738.527c-.447.32-1.06.269-1.45-.12l-.773-.774a1.125 1.125 0 01-.12-1.45l.527-.737c.25-.35.273-.806.108-1.204-.165-.397-.505-.71-.93-.78l-.894-.15c-.542-.09-.94-.56-.94-1.109v-1.094c0-.55.398-1.02.94-1.11l.894-.149c.424-.07.765-.383.93-.78.165-.398.143-.854-.107-1.204l-.527-.738a1.125 1.125 0 01.12-1.45l.773-.773a1.125 1.125 0 011.45-.12l.737.527c.35.25.807.272 1.204.107.397-.165.71-.505.78-.929l.15-.894z"}),r("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"})])}},960:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[r("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M9 17.25v1.007a3 3 0 01-.879 2.122L7.5 21h9l-.621-.621A3 3 0 0115 18.257V17.25m6-12V15a2.25 2.25 0 01-2.25 2.25H5.25A2.25 2.25 0 013 15V5.25m18 0A2.25 2.25 0 0018.75 3H5.25A2.25 2.25 0 003 5.25m18 0V12a2.25 2.25 0 01-2.25 2.25H5.25A2.25 2.25 0 013 12V5.25"})])}},243:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[r("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M12 6.75a.75.75 0 110-1.5.75.75 0 010 1.5zM12 12.75a.75.75 0 110-1.5.75.75 0 010 1.5zM12 18.75a.75.75 0 110-1.5.75.75 0 010 1.5z"})])}},706:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[r("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z"})])}},413:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[r("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M2.25 12.75V12A2.25 2.25 0 014.5 9.75h15A2.25 2.25 0 0121.75 12v.75m-8.69-6.44l-2.12-2.12a1.5 1.5 0 00-1.061-.44H4.5A2.25 2.25 0 002.25 6v12a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9a2.25 2.25 0 00-2.25-2.25h-5.379a1.5 1.5 0 01-1.06-.44z"})])}},199:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[r("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M3.75 9.776c.112-.017.227-.026.344-.026h15.812c.117 0 .232.009.344.026m-16.5 0a2.25 2.25 0 00-1.883 2.542l.857 6a2.25 2.25 0 002.227 1.932H19.05a2.25 2.25 0 002.227-1.932l.857-6a2.25 2.25 0 00-1.883-2.542m-16.5 0V6A2.25 2.25 0 016 3.75h3.879a1.5 1.5 0 011.06.44l2.122 2.12a1.5 1.5 0 001.06.44H18A2.25 2.25 0 0120.25 9v.776"})])}},923:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[r("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M13.19 8.688a4.5 4.5 0 011.242 7.244l-4.5 4.5a4.5 4.5 0 01-6.364-6.364l1.757-1.757m13.35-.622l1.757-1.757a4.5 4.5 0 00-6.364-6.364l-4.5 4.5a4.5 4.5 0 001.242 7.244"})])}},447:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[r("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z"})])}},902:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[r("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M21.752 15.002A9.718 9.718 0 0118 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 003 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 009.002-5.998z"})])}},390:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[r("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9 5.25h.008v.008H12v-.008z"})])}},908:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[r("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M7.217 10.907a2.25 2.25 0 100 2.186m0-2.186c.18.324.283.696.283 1.093s-.103.77-.283 1.093m0-2.186l9.566-5.314m-9.566 7.5l9.566 5.314m0 0a2.25 2.25 0 103.935 2.186 2.25 2.25 0 00-3.935-2.186zm0-12.814a2.25 2.25 0 103.933-2.185 2.25 2.25 0 00-3.933 2.185z"})])}},817:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[r("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M12 3v2.25m6.364.386l-1.591 1.591M21 12h-2.25m-.386 6.364l-1.591-1.591M12 18.75V21m-4.773-4.227l-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0z"})])}},558:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[r("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0"})])}},505:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[r("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M6 18L18 6M6 6l12 12"})])}},598:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true"},[r("path",{"fill-rule":"evenodd",d:"M4.755 10.059a7.5 7.5 0 0112.548-3.364l1.903 1.903h-3.183a.75.75 0 100 1.5h4.992a.75.75 0 00.75-.75V4.356a.75.75 0 00-1.5 0v3.18l-1.9-1.9A9 9 0 003.306 9.67a.75.75 0 101.45.388zm15.408 3.352a.75.75 0 00-.919.53 7.5 7.5 0 01-12.548 3.364l-1.902-1.903h3.183a.75.75 0 000-1.5H2.984a.75.75 0 00-.75.75v4.992a.75.75 0 001.5 0v-3.18l1.9 1.9a9 9 0 0015.059-4.035.75.75 0 00-.53-.918z","clip-rule":"evenodd"})])}},462:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true"},[r("path",{"fill-rule":"evenodd",d:"M3 6.75A.75.75 0 013.75 6h16.5a.75.75 0 010 1.5H3.75A.75.75 0 013 6.75zM3 12a.75.75 0 01.75-.75h16.5a.75.75 0 010 1.5H3.75A.75.75 0 013 12zm0 5.25a.75.75 0 01.75-.75h16.5a.75.75 0 010 1.5H3.75a.75.75 0 01-.75-.75z","clip-rule":"evenodd"})])}},452:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true"},[r("path",{"fill-rule":"evenodd",d:"M16.28 11.47a.75.75 0 010 1.06l-7.5 7.5a.75.75 0 01-1.06-1.06L14.69 12 7.72 5.03a.75.75 0 011.06-1.06l7.5 7.5z","clip-rule":"evenodd"})])}},640:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true"},[r("path",{"fill-rule":"evenodd",d:"M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z","clip-rule":"evenodd"})])}},307:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true"},[r("path",{"fill-rule":"evenodd",d:"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z","clip-rule":"evenodd"})])}},968:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true"},[r("path",{d:"M7.493 18.75c-.425 0-.82-.236-.975-.632A7.48 7.48 0 016 15.375c0-1.75.599-3.358 1.602-4.634.151-.192.373-.309.6-.397.473-.183.89-.514 1.212-.924a9.042 9.042 0 012.861-2.4c.723-.384 1.35-.956 1.653-1.715a4.498 4.498 0 00.322-1.672V3a.75.75 0 01.75-.75 2.25 2.25 0 012.25 2.25c0 1.152-.26 2.243-.723 3.218-.266.558.107 1.282.725 1.282h3.126c1.026 0 1.945.694 2.054 1.715.045.422.068.85.068 1.285a11.95 11.95 0 01-2.649 7.521c-.388.482-.987.729-1.605.729H14.23c-.483 0-.964-.078-1.423-.23l-3.114-1.04a4.501 4.501 0 00-1.423-.23h-.777zM2.331 10.977a11.969 11.969 0 00-.831 4.398 12 12 0 00.52 3.507c.26.85 1.084 1.368 1.973 1.368H4.9c.445 0 .72-.498.523-.898a8.963 8.963 0 01-.924-3.977c0-1.708.476-3.305 1.302-4.666.245-.403-.028-.959-.5-.959H4.25c-.832 0-1.612.453-1.918 1.227z"})])}},36:(e,t,n)=>{const{createElementVNode:r,openBlock:o,createElementBlock:i}=n(821);e.exports=function(e,t){return o(),i("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true"},[r("path",{"fill-rule":"evenodd",d:"M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12zm8.706-1.442c1.146-.573 2.437.463 2.126 1.706l-.709 2.836.042-.02a.75.75 0 01.67 1.34l-.04.022c-1.147.573-2.438-.463-2.127-1.706l.71-2.836-.042.02a.75.75 0 11-.671-1.34l.041-.022zM12 9a.75.75 0 100-1.5.75.75 0 000 1.5z","clip-rule":"evenodd"})])}},500:(e,t,n)=>{"use strict";var r=n(821),o=!1;function i(e,t,n){return Array.isArray(e)?(e.length=Math.max(e.length,t),e.splice(t,1,n),n):(e[t]=n,n)}function a(){return"undefined"!=typeof navigator&&"undefined"!=typeof window?window:void 0!==n.g?n.g:{}}const l="function"==typeof Proxy,s="devtools-plugin:setup";let c,u,f;function d(){return function(){var e;return void 0!==c||("undefined"!=typeof window&&window.performance?(c=!0,u=window.performance):void 0!==n.g&&(null===(e=n.g.perf_hooks)||void 0===e?void 0:e.performance)?(c=!0,u=n.g.perf_hooks.performance):c=!1),c}()?u.now():Date.now()}class p{constructor(e,t){this.target=null,this.targetQueue=[],this.onQueue=[],this.plugin=e,this.hook=t;const n={};if(e.settings)for(const t in e.settings){const r=e.settings[t];n[t]=r.defaultValue}const r=`__vue-devtools-plugin-settings__${e.id}`;let o=Object.assign({},n);try{const e=localStorage.getItem(r),t=JSON.parse(e);Object.assign(o,t)}catch(e){}this.fallbacks={getSettings:()=>o,setSettings(e){try{localStorage.setItem(r,JSON.stringify(e))}catch(e){}o=e},now:()=>d()},t&&t.on("plugin:settings:set",((e,t)=>{e===this.plugin.id&&this.fallbacks.setSettings(t)})),this.proxiedOn=new Proxy({},{get:(e,t)=>this.target?this.target.on[t]:(...e)=>{this.onQueue.push({method:t,args:e})}}),this.proxiedTarget=new Proxy({},{get:(e,t)=>this.target?this.target[t]:"on"===t?this.proxiedOn:Object.keys(this.fallbacks).includes(t)?(...e)=>(this.targetQueue.push({method:t,args:e,resolve:()=>{}}),this.fallbacks[t](...e)):(...e)=>new Promise((n=>{this.targetQueue.push({method:t,args:e,resolve:n})}))})}async setRealTarget(e){this.target=e;for(const e of this.onQueue)this.target.on[e.method](...e.args);for(const e of this.targetQueue)e.resolve(await this.target[e.method](...e.args))}}function h(e,t){const n=e,r=a(),o=a().__VUE_DEVTOOLS_GLOBAL_HOOK__,i=l&&n.enableEarlyProxy;if(!o||!r.__VUE_DEVTOOLS_PLUGIN_API_AVAILABLE__&&i){const e=i?new p(n,o):null;(r.__VUE_DEVTOOLS_PLUGINS__=r.__VUE_DEVTOOLS_PLUGINS__||[]).push({pluginDescriptor:n,setupFn:t,proxy:e}),e&&t(e.proxiedTarget)}else o.emit(s,e,t)}const v=e=>f=e,m=Symbol();function g(e){return e&&"object"==typeof e&&"[object Object]"===Object.prototype.toString.call(e)&&"function"!=typeof e.toJSON}var y;!function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"}(y||(y={}));const b="undefined"!=typeof window,w=!1,C=(()=>"object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof global&&global.global===global?global:"object"==typeof globalThis?globalThis:{HTMLElement:null})();function _(e,t,n){const r=new XMLHttpRequest;r.open("GET",e),r.responseType="blob",r.onload=function(){O(r.response,t,n)},r.onerror=function(){},r.send()}function E(e){const t=new XMLHttpRequest;t.open("HEAD",e,!1);try{t.send()}catch(e){}return t.status>=200&&t.status<=299}function x(e){try{e.dispatchEvent(new MouseEvent("click"))}catch(t){const n=document.createEvent("MouseEvents");n.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),e.dispatchEvent(n)}}const k="object"==typeof navigator?navigator:{userAgent:""},S=(()=>/Macintosh/.test(k.userAgent)&&/AppleWebKit/.test(k.userAgent)&&!/Safari/.test(k.userAgent))(),O=b?"undefined"!=typeof HTMLAnchorElement&&"download"in HTMLAnchorElement.prototype&&!S?function(e,t="download",n){const r=document.createElement("a");r.download=t,r.rel="noopener","string"==typeof e?(r.href=e,r.origin!==location.origin?E(r.href)?_(e,t,n):(r.target="_blank",x(r)):x(r)):(r.href=URL.createObjectURL(e),setTimeout((function(){URL.revokeObjectURL(r.href)}),4e4),setTimeout((function(){x(r)}),0))}:"msSaveOrOpenBlob"in k?function(e,t="download",n){if("string"==typeof e)if(E(e))_(e,t,n);else{const t=document.createElement("a");t.href=e,t.target="_blank",setTimeout((function(){x(t)}))}else navigator.msSaveOrOpenBlob(function(e,{autoBom:t=!1}={}){return t&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)?new Blob([String.fromCharCode(65279),e],{type:e.type}):e}(e,n),t)}:function(e,t,n,r){(r=r||open("","_blank"))&&(r.document.title=r.document.body.innerText="downloading...");if("string"==typeof e)return _(e,t,n);const o="application/octet-stream"===e.type,i=/constructor/i.test(String(C.HTMLElement))||"safari"in C,a=/CriOS\/[\d]+/.test(navigator.userAgent);if((a||o&&i||S)&&"undefined"!=typeof FileReader){const t=new FileReader;t.onloadend=function(){let e=t.result;if("string"!=typeof e)throw r=null,new Error("Wrong reader.result type");e=a?e:e.replace(/^data:[^;]*;/,"data:attachment/file;"),r?r.location.href=e:location.assign(e),r=null},t.readAsDataURL(e)}else{const t=URL.createObjectURL(e);r?r.location.assign(t):location.href=t,r=null,setTimeout((function(){URL.revokeObjectURL(t)}),4e4)}}:()=>{};function N(e,t){"function"==typeof __VUE_DEVTOOLS_TOAST__&&__VUE_DEVTOOLS_TOAST__("🍍 "+e,t)}function P(e){return"_a"in e&&"install"in e}function T(){if(!("clipboard"in navigator))return N("Your browser doesn't support the Clipboard API","error"),!0}function V(e){return!!(e instanceof Error&&e.message.toLowerCase().includes("document is not focused"))&&(N('You need to activate the "Emulate a focused page" setting in the "Rendering" panel of devtools.',"warn"),!0)}let R;async function L(e){try{const t=await(R||(R=document.createElement("input"),R.type="file",R.accept=".json"),function(){return new Promise(((e,t)=>{R.onchange=async()=>{const t=R.files;if(!t)return e(null);const n=t.item(0);return e(n?{text:await n.text(),file:n}:null)},R.oncancel=()=>e(null),R.onerror=t,R.click()}))}),n=await t();if(!n)return;const{text:r,file:o}=n;e.state.value=JSON.parse(r),N(`Global state imported from "${o.name}".`)}catch(e){N("Failed to export the state as JSON. Check the console for more details.","error")}}function A(e){return{_custom:{display:e}}}const j="🍍 Pinia (root)",B="_root";function I(e){return P(e)?{id:B,label:j}:{id:e.$id,label:e.$id}}function M(e){return e?Array.isArray(e)?e.reduce(((e,t)=>(e.keys.push(t.key),e.operations.push(t.type),e.oldValue[t.key]=t.oldValue,e.newValue[t.key]=t.newValue,e)),{oldValue:{},keys:[],operations:[],newValue:{}}):{operation:A(e.type),key:A(e.key),oldValue:e.oldValue,newValue:e.newValue}:{}}function F(e){switch(e){case y.direct:return"mutation";case y.patchFunction:case y.patchObject:return"$patch";default:return"unknown"}}let D=!0;const U=[],$="pinia:mutations",H="pinia",{assign:z}=Object,q=e=>"🍍 "+e;function W(e,t){h({id:"dev.esm.pinia",label:"Pinia 🍍",logo:"https://pinia.vuejs.org/logo.svg",packageName:"pinia",homepage:"https://pinia.vuejs.org",componentStateTypes:U,app:e},(n=>{"function"!=typeof n.now&&N("You seem to be using an outdated version of Vue Devtools. Are you still using the Beta release instead of the stable one? You can find the links at https://devtools.vuejs.org/guide/installation.html."),n.addTimelineLayer({id:$,label:"Pinia 🍍",color:15064968}),n.addInspector({id:H,label:"Pinia 🍍",icon:"storage",treeFilterPlaceholder:"Search stores",actions:[{icon:"content_copy",action:()=>{!async function(e){if(!T())try{await navigator.clipboard.writeText(JSON.stringify(e.state.value)),N("Global state copied to clipboard.")}catch(e){if(V(e))return;N("Failed to serialize the state. Check the console for more details.","error")}}(t)},tooltip:"Serialize and copy the state"},{icon:"content_paste",action:async()=>{await async function(e){if(!T())try{e.state.value=JSON.parse(await navigator.clipboard.readText()),N("Global state pasted from clipboard.")}catch(e){if(V(e))return;N("Failed to deserialize the state from clipboard. Check the console for more details.","error")}}(t),n.sendInspectorTree(H),n.sendInspectorState(H)},tooltip:"Replace the state with the content of your clipboard"},{icon:"save",action:()=>{!async function(e){try{O(new Blob([JSON.stringify(e.state.value)],{type:"text/plain;charset=utf-8"}),"pinia-state.json")}catch(e){N("Failed to export the state as JSON. Check the console for more details.","error")}}(t)},tooltip:"Save the state as a JSON file"},{icon:"folder_open",action:async()=>{await L(t),n.sendInspectorTree(H),n.sendInspectorState(H)},tooltip:"Import the state from a JSON file"}],nodeActions:[{icon:"restore",tooltip:"Reset the state (option store only)",action:e=>{const n=t._s.get(e);n?n._isOptionsAPI?(n.$reset(),N(`Store "${e}" reset.`)):N(`Cannot reset "${e}" store because it's a setup store.`,"warn"):N(`Cannot reset "${e}" store because it wasn't found.`,"warn")}}]}),n.on.inspectComponent(((e,t)=>{const n=e.componentInstance&&e.componentInstance.proxy;if(n&&n._pStores){const t=e.componentInstance.proxy._pStores;Object.values(t).forEach((t=>{e.instanceData.state.push({type:q(t.$id),key:"state",editable:!0,value:t._isOptionsAPI?{_custom:{value:(0,r.toRaw)(t.$state),actions:[{icon:"restore",tooltip:"Reset the state of this store",action:()=>t.$reset()}]}}:Object.keys(t.$state).reduce(((e,n)=>(e[n]=t.$state[n],e)),{})}),t._getters&&t._getters.length&&e.instanceData.state.push({type:q(t.$id),key:"getters",editable:!1,value:t._getters.reduce(((e,n)=>{try{e[n]=t[n]}catch(t){e[n]=t}return e}),{})})}))}})),n.on.getInspectorTree((n=>{if(n.app===e&&n.inspectorId===H){let e=[t];e=e.concat(Array.from(t._s.values())),n.rootNodes=(n.filter?e.filter((e=>"$id"in e?e.$id.toLowerCase().includes(n.filter.toLowerCase()):j.toLowerCase().includes(n.filter.toLowerCase()))):e).map(I)}})),n.on.getInspectorState((n=>{if(n.app===e&&n.inspectorId===H){const e=n.nodeId===B?t:t._s.get(n.nodeId);if(!e)return;e&&(n.state=function(e){if(P(e)){const t=Array.from(e._s.keys()),n=e._s,r={state:t.map((t=>({editable:!0,key:t,value:e.state.value[t]}))),getters:t.filter((e=>n.get(e)._getters)).map((e=>{const t=n.get(e);return{editable:!1,key:e,value:t._getters.reduce(((e,n)=>(e[n]=t[n],e)),{})}}))};return r}const t={state:Object.keys(e.$state).map((t=>({editable:!0,key:t,value:e.$state[t]})))};return e._getters&&e._getters.length&&(t.getters=e._getters.map((t=>({editable:!1,key:t,value:e[t]})))),e._customProperties.size&&(t.customProperties=Array.from(e._customProperties).map((t=>({editable:!0,key:t,value:e[t]})))),t}(e))}})),n.on.editInspectorState(((n,r)=>{if(n.app===e&&n.inspectorId===H){const e=n.nodeId===B?t:t._s.get(n.nodeId);if(!e)return N(`store "${n.nodeId}" not found`,"error");const{path:r}=n;P(e)?r.unshift("state"):1===r.length&&e._customProperties.has(r[0])&&!(r[0]in e.$state)||r.unshift("$state"),D=!1,n.set(e,r,n.state.value),D=!0}})),n.on.editComponentState((e=>{if(e.type.startsWith("🍍")){const n=e.type.replace(/^🍍\s*/,""),r=t._s.get(n);if(!r)return N(`store "${n}" not found`,"error");const{path:o}=e;if("state"!==o[0])return N(`Invalid path for store "${n}":\n${o}\nOnly state can be modified.`);o[0]="$state",D=!1,e.set(r,o,e.state.value),D=!0}}))}))}let K,G=0;function Z(e,t){const n=t.reduce(((t,n)=>(t[n]=(0,r.toRaw)(e)[n],t)),{});for(const t in n)e[t]=function(){const r=G,o=new Proxy(e,{get:(...e)=>(K=r,Reflect.get(...e)),set:(...e)=>(K=r,Reflect.set(...e))});return n[t].apply(o,arguments)}}function Y({app:e,store:t,options:n}){if(!t.$id.startsWith("__hot:")){if(n.state&&(t._isOptionsAPI=!0),"function"==typeof n.state){Z(t,Object.keys(n.actions));const e=t._hotUpdate;(0,r.toRaw)(t)._hotUpdate=function(n){e.apply(this,arguments),Z(t,Object.keys(n._hmrPayload.actions))}}!function(e,t){U.includes(q(t.$id))||U.push(q(t.$id)),h({id:"dev.esm.pinia",label:"Pinia 🍍",logo:"https://pinia.vuejs.org/logo.svg",packageName:"pinia",homepage:"https://pinia.vuejs.org",componentStateTypes:U,app:e,settings:{logStoreChanges:{label:"Notify about new/deleted stores",type:"boolean",defaultValue:!0}}},(e=>{const n="function"==typeof e.now?e.now.bind(e):Date.now;t.$onAction((({after:r,onError:o,name:i,args:a})=>{const l=G++;e.addTimelineEvent({layerId:$,event:{time:n(),title:"🛫 "+i,subtitle:"start",data:{store:A(t.$id),action:A(i),args:a},groupId:l}}),r((r=>{K=void 0,e.addTimelineEvent({layerId:$,event:{time:n(),title:"🛬 "+i,subtitle:"end",data:{store:A(t.$id),action:A(i),args:a,result:r},groupId:l}})})),o((r=>{K=void 0,e.addTimelineEvent({layerId:$,event:{time:n(),logType:"error",title:"💥 "+i,subtitle:"end",data:{store:A(t.$id),action:A(i),args:a,error:r},groupId:l}})}))}),!0),t._customProperties.forEach((o=>{(0,r.watch)((()=>(0,r.unref)(t[o])),((t,r)=>{e.notifyComponentUpdate(),e.sendInspectorState(H),D&&e.addTimelineEvent({layerId:$,event:{time:n(),title:"Change",subtitle:o,data:{newValue:t,oldValue:r},groupId:K}})}),{deep:!0})})),t.$subscribe((({events:r,type:o},i)=>{if(e.notifyComponentUpdate(),e.sendInspectorState(H),!D)return;const a={time:n(),title:F(o),data:z({store:A(t.$id)},M(r)),groupId:K};K=void 0,o===y.patchFunction?a.subtitle="⤵️":o===y.patchObject?a.subtitle="🧩":r&&!Array.isArray(r)&&(a.subtitle=r.type),r&&(a.data["rawEvent(s)"]={_custom:{display:"DebuggerEvent",type:"object",tooltip:"raw DebuggerEvent[]",value:r}}),e.addTimelineEvent({layerId:$,event:a})}),{detached:!0,flush:"sync"});const o=t._hotUpdate;t._hotUpdate=(0,r.markRaw)((r=>{o(r),e.addTimelineEvent({layerId:$,event:{time:n(),title:"🔥 "+t.$id,subtitle:"HMR update",data:{store:A(t.$id),info:A("HMR update")}}}),e.notifyComponentUpdate(),e.sendInspectorTree(H),e.sendInspectorState(H)}));const{$dispose:i}=t;t.$dispose=()=>{i(),e.notifyComponentUpdate(),e.sendInspectorTree(H),e.sendInspectorState(H),e.getSettings().logStoreChanges&&N(`Disposed "${t.$id}" store 🗑`)},e.notifyComponentUpdate(),e.sendInspectorTree(H),e.sendInspectorState(H),e.getSettings().logStoreChanges&&N(`"${t.$id}" store installed 🆕`)}))}(e,t)}}const J=()=>{};function Q(e,t,n,o=J){e.push(t);const i=()=>{const n=e.indexOf(t);n>-1&&(e.splice(n,1),o())};return!n&&(0,r.getCurrentScope)()&&(0,r.onScopeDispose)(i),i}function X(e,...t){e.slice().forEach((e=>{e(...t)}))}function ee(e,t){e instanceof Map&&t instanceof Map&&t.forEach(((t,n)=>e.set(n,t))),e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const n in t){if(!t.hasOwnProperty(n))continue;const o=t[n],i=e[n];g(i)&&g(o)&&e.hasOwnProperty(n)&&!(0,r.isRef)(o)&&!(0,r.isReactive)(o)?e[n]=ee(i,o):e[n]=o}return e}const te=Symbol(),ne=new WeakMap;const{assign:re}=Object;function oe(e,t,n={},a,l,s){let c;const u=re({actions:{}},n);const f={deep:!0};let d,p;let h,m=(0,r.markRaw)([]),b=(0,r.markRaw)([]);const C=a.state.value[e];s||C||(o?i(a.state.value,e,{}):a.state.value[e]={});const _=(0,r.ref)({});let E;function x(t){let n;d=p=!1,"function"==typeof t?(t(a.state.value[e]),n={type:y.patchFunction,storeId:e,events:h}):(ee(a.state.value[e],t),n={type:y.patchObject,payload:t,storeId:e,events:h});const o=E=Symbol();(0,r.nextTick)().then((()=>{E===o&&(d=!0)})),p=!0,X(m,n,a.state.value[e])}const k=J;function S(t,n){return function(){v(a);const r=Array.from(arguments),o=[],i=[];let l;X(b,{args:r,name:t,store:P,after:function(e){o.push(e)},onError:function(e){i.push(e)}});try{l=n.apply(this&&this.$id===e?this:P,r)}catch(e){throw X(i,e),e}return l instanceof Promise?l.then((e=>(X(o,e),e))).catch((e=>(X(i,e),Promise.reject(e)))):(X(o,l),l)}}const O=(0,r.markRaw)({actions:{},getters:{},state:[],hotState:_}),N={_p:a,$id:e,$onAction:Q.bind(null,b),$patch:x,$reset:k,$subscribe(t,n={}){const o=Q(m,t,n.detached,(()=>i())),i=c.run((()=>(0,r.watch)((()=>a.state.value[e]),(r=>{("sync"===n.flush?p:d)&&t({storeId:e,type:y.direct,events:h},r)}),re({},f,n))));return o},$dispose:function(){c.stop(),m=[],b=[],a._s.delete(e)}};o&&(N._r=!1);const P=(0,r.reactive)(w?re({_hmrPayload:O,_customProperties:(0,r.markRaw)(new Set)},N):N);a._s.set(e,P);const T=a._e.run((()=>(c=(0,r.effectScope)(),c.run((()=>t())))));for(const t in T){const n=T[t];if((0,r.isRef)(n)&&(R=n,!(0,r.isRef)(R)||!R.effect)||(0,r.isReactive)(n))s||(!C||(V=n,o?ne.has(V):g(V)&&V.hasOwnProperty(te))||((0,r.isRef)(n)?n.value=C[t]:ee(n,C[t])),o?i(a.state.value[e],t,n):a.state.value[e][t]=n);else if("function"==typeof n){const e=S(t,n);o?i(T,t,e):T[t]=e,u.actions[t]=n}else 0}var V,R;if(o?Object.keys(T).forEach((e=>{i(P,e,T[e])})):(re(P,T),re((0,r.toRaw)(P),T)),Object.defineProperty(P,"$state",{get:()=>a.state.value[e],set:e=>{x((t=>{re(t,e)}))}}),w){const e={writable:!0,configurable:!0,enumerable:!1};["_p","_hmrPayload","_getters","_customProperties"].forEach((t=>{Object.defineProperty(P,t,re({value:P[t]},e))}))}return o&&(P._r=!0),a._p.forEach((e=>{if(w){const t=c.run((()=>e({store:P,app:a._a,pinia:a,options:u})));Object.keys(t||{}).forEach((e=>P._customProperties.add(e))),re(P,t)}else re(P,c.run((()=>e({store:P,app:a._a,pinia:a,options:u}))))})),C&&s&&n.hydrate&&n.hydrate(P.$state,C),d=!0,p=!0,P}function ie(e,t,n){let a,l;const s="function"==typeof t;function c(e,n){const c=(0,r.getCurrentInstance)();(e=e||c&&(0,r.inject)(m,null))&&v(e),(e=f)._s.has(a)||(s?oe(a,t,l,e):function(e,t,n,a){const{state:l,actions:s,getters:c}=t,u=n.state.value[e];let f;f=oe(e,(function(){u||(o?i(n.state.value,e,l?l():{}):n.state.value[e]=l?l():{});const t=(0,r.toRefs)(n.state.value[e]);return re(t,s,Object.keys(c||{}).reduce(((t,i)=>(t[i]=(0,r.markRaw)((0,r.computed)((()=>{v(n);const t=n._s.get(e);if(!o||t._r)return c[i].call(t,t)}))),t)),{}))}),t,n,0,!0),f.$reset=function(){const e=l?l():{};this.$patch((t=>{re(t,e)}))}}(a,l,e));return e._s.get(a)}return"string"==typeof e?(a=e,l=s?n:t):(l=e,a=e.id),c.$id=a,c}function ae(e,t){return function(){return e.apply(t,arguments)}}const{toString:le}=Object.prototype,{getPrototypeOf:se}=Object,ce=(ue=Object.create(null),e=>{const t=le.call(e);return ue[t]||(ue[t]=t.slice(8,-1).toLowerCase())});var ue;const fe=e=>(e=e.toLowerCase(),t=>ce(t)===e),de=e=>t=>typeof t===e,{isArray:pe}=Array,he=de("undefined");const ve=fe("ArrayBuffer");const me=de("string"),ge=de("function"),ye=de("number"),be=e=>null!==e&&"object"==typeof e,we=e=>{if("object"!==ce(e))return!1;const t=se(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||Symbol.toStringTag in e||Symbol.iterator in e)},Ce=fe("Date"),_e=fe("File"),Ee=fe("Blob"),xe=fe("FileList"),ke=fe("URLSearchParams");function Se(e,t,{allOwnKeys:n=!1}={}){if(null==e)return;let r,o;if("object"!=typeof e&&(e=[e]),pe(e))for(r=0,o=e.length;r<o;r++)t.call(null,e[r],r,e);else{const o=n?Object.getOwnPropertyNames(e):Object.keys(e),i=o.length;let a;for(r=0;r<i;r++)a=o[r],t.call(null,e[a],a,e)}}function Oe(e,t){t=t.toLowerCase();const n=Object.keys(e);let r,o=n.length;for(;o-- >0;)if(r=n[o],t===r.toLowerCase())return r;return null}const Ne="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:global,Pe=e=>!he(e)&&e!==Ne;const Te=(Ve="undefined"!=typeof Uint8Array&&se(Uint8Array),e=>Ve&&e instanceof Ve);var Ve;const Re=fe("HTMLFormElement"),Le=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),Ae=fe("RegExp"),je=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};Se(n,((n,o)=>{!1!==t(n,o,e)&&(r[o]=n)})),Object.defineProperties(e,r)},Be="abcdefghijklmnopqrstuvwxyz",Ie="0123456789",Me={DIGIT:Ie,ALPHA:Be,ALPHA_DIGIT:Be+Be.toUpperCase()+Ie};const Fe={isArray:pe,isArrayBuffer:ve,isBuffer:function(e){return null!==e&&!he(e)&&null!==e.constructor&&!he(e.constructor)&&ge(e.constructor.isBuffer)&&e.constructor.isBuffer(e)},isFormData:e=>{const t="[object FormData]";return e&&("function"==typeof FormData&&e instanceof FormData||le.call(e)===t||ge(e.toString)&&e.toString()===t)},isArrayBufferView:function(e){let t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&ve(e.buffer),t},isString:me,isNumber:ye,isBoolean:e=>!0===e||!1===e,isObject:be,isPlainObject:we,isUndefined:he,isDate:Ce,isFile:_e,isBlob:Ee,isRegExp:Ae,isFunction:ge,isStream:e=>be(e)&&ge(e.pipe),isURLSearchParams:ke,isTypedArray:Te,isFileList:xe,forEach:Se,merge:function e(){const{caseless:t}=Pe(this)&&this||{},n={},r=(r,o)=>{const i=t&&Oe(n,o)||o;we(n[i])&&we(r)?n[i]=e(n[i],r):we(r)?n[i]=e({},r):pe(r)?n[i]=r.slice():n[i]=r};for(let e=0,t=arguments.length;e<t;e++)arguments[e]&&Se(arguments[e],r);return n},extend:(e,t,n,{allOwnKeys:r}={})=>(Se(t,((t,r)=>{n&&ge(t)?e[r]=ae(t,n):e[r]=t}),{allOwnKeys:r}),e),trim:e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,""),stripBOM:e=>(65279===e.charCodeAt(0)&&(e=e.slice(1)),e),inherits:(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},toFlatObject:(e,t,n,r)=>{let o,i,a;const l={};if(t=t||{},null==e)return t;do{for(o=Object.getOwnPropertyNames(e),i=o.length;i-- >0;)a=o[i],r&&!r(a,e,t)||l[a]||(t[a]=e[a],l[a]=!0);e=!1!==n&&se(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},kindOf:ce,kindOfTest:fe,endsWith:(e,t,n)=>{e=String(e),(void 0===n||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return-1!==r&&r===n},toArray:e=>{if(!e)return null;if(pe(e))return e;let t=e.length;if(!ye(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},forEachEntry:(e,t)=>{const n=(e&&e[Symbol.iterator]).call(e);let r;for(;(r=n.next())&&!r.done;){const n=r.value;t.call(e,n[0],n[1])}},matchAll:(e,t)=>{let n;const r=[];for(;null!==(n=e.exec(t));)r.push(n);return r},isHTMLForm:Re,hasOwnProperty:Le,hasOwnProp:Le,reduceDescriptors:je,freezeMethods:e=>{je(e,((t,n)=>{if(ge(e)&&-1!==["arguments","caller","callee"].indexOf(n))return!1;const r=e[n];ge(r)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")}))}))},toObjectSet:(e,t)=>{const n={},r=e=>{e.forEach((e=>{n[e]=!0}))};return pe(e)?r(e):r(String(e).split(t)),n},toCamelCase:e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,(function(e,t,n){return t.toUpperCase()+n})),noop:()=>{},toFiniteNumber:(e,t)=>(e=+e,Number.isFinite(e)?e:t),findKey:Oe,global:Ne,isContextDefined:Pe,ALPHABET:Me,generateString:(e=16,t=Me.ALPHA_DIGIT)=>{let n="";const{length:r}=t;for(;e--;)n+=t[Math.random()*r|0];return n},isSpecCompliantForm:function(e){return!!(e&&ge(e.append)&&"FormData"===e[Symbol.toStringTag]&&e[Symbol.iterator])},toJSONObject:e=>{const t=new Array(10),n=(e,r)=>{if(be(e)){if(t.indexOf(e)>=0)return;if(!("toJSON"in e)){t[r]=e;const o=pe(e)?[]:{};return Se(e,((e,t)=>{const i=n(e,r+1);!he(i)&&(o[t]=i)})),t[r]=void 0,o}}return e};return n(e,0)}};function De(e,t,n,r,o){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),o&&(this.response=o)}Fe.inherits(De,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:Fe.toJSONObject(this.config),code:this.code,status:this.response&&this.response.status?this.response.status:null}}});const Ue=De.prototype,$e={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach((e=>{$e[e]={value:e}})),Object.defineProperties(De,$e),Object.defineProperty(Ue,"isAxiosError",{value:!0}),De.from=(e,t,n,r,o,i)=>{const a=Object.create(Ue);return Fe.toFlatObject(e,a,(function(e){return e!==Error.prototype}),(e=>"isAxiosError"!==e)),De.call(a,e.message,t,n,r,o),a.cause=e,a.name=e.name,i&&Object.assign(a,i),a};const He=De,ze=null;var qe=n(764).lW;function We(e){return Fe.isPlainObject(e)||Fe.isArray(e)}function Ke(e){return Fe.endsWith(e,"[]")?e.slice(0,-2):e}function Ge(e,t,n){return e?e.concat(t).map((function(e,t){return e=Ke(e),!n&&t?"["+e+"]":e})).join(n?".":""):t}const Ze=Fe.toFlatObject(Fe,{},null,(function(e){return/^is[A-Z]/.test(e)}));const Ye=function(e,t,n){if(!Fe.isObject(e))throw new TypeError("target must be an object");t=t||new(ze||FormData);const r=(n=Fe.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,(function(e,t){return!Fe.isUndefined(t[e])}))).metaTokens,o=n.visitor||c,i=n.dots,a=n.indexes,l=(n.Blob||"undefined"!=typeof Blob&&Blob)&&Fe.isSpecCompliantForm(t);if(!Fe.isFunction(o))throw new TypeError("visitor must be a function");function s(e){if(null===e)return"";if(Fe.isDate(e))return e.toISOString();if(!l&&Fe.isBlob(e))throw new He("Blob is not supported. Use a Buffer instead.");return Fe.isArrayBuffer(e)||Fe.isTypedArray(e)?l&&"function"==typeof Blob?new Blob([e]):qe.from(e):e}function c(e,n,o){let l=e;if(e&&!o&&"object"==typeof e)if(Fe.endsWith(n,"{}"))n=r?n:n.slice(0,-2),e=JSON.stringify(e);else if(Fe.isArray(e)&&function(e){return Fe.isArray(e)&&!e.some(We)}(e)||(Fe.isFileList(e)||Fe.endsWith(n,"[]"))&&(l=Fe.toArray(e)))return n=Ke(n),l.forEach((function(e,r){!Fe.isUndefined(e)&&null!==e&&t.append(!0===a?Ge([n],r,i):null===a?n:n+"[]",s(e))})),!1;return!!We(e)||(t.append(Ge(o,n,i),s(e)),!1)}const u=[],f=Object.assign(Ze,{defaultVisitor:c,convertValue:s,isVisitable:We});if(!Fe.isObject(e))throw new TypeError("data must be an object");return function e(n,r){if(!Fe.isUndefined(n)){if(-1!==u.indexOf(n))throw Error("Circular reference detected in "+r.join("."));u.push(n),Fe.forEach(n,(function(n,i){!0===(!(Fe.isUndefined(n)||null===n)&&o.call(t,n,Fe.isString(i)?i.trim():i,r,f))&&e(n,r?r.concat(i):[i])})),u.pop()}}(e),t};function Je(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,(function(e){return t[e]}))}function Qe(e,t){this._pairs=[],e&&Ye(e,this,t)}const Xe=Qe.prototype;Xe.append=function(e,t){this._pairs.push([e,t])},Xe.toString=function(e){const t=e?function(t){return e.call(this,t,Je)}:Je;return this._pairs.map((function(e){return t(e[0])+"="+t(e[1])}),"").join("&")};const et=Qe;function tt(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function nt(e,t,n){if(!t)return e;const r=n&&n.encode||tt,o=n&&n.serialize;let i;if(i=o?o(t,n):Fe.isURLSearchParams(t)?t.toString():new et(t,n).toString(r),i){const t=e.indexOf("#");-1!==t&&(e=e.slice(0,t)),e+=(-1===e.indexOf("?")?"?":"&")+i}return e}const rt=class{constructor(){this.handlers=[]}use(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){Fe.forEach(this.handlers,(function(t){null!==t&&e(t)}))}},ot={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},it="undefined"!=typeof URLSearchParams?URLSearchParams:et,at=FormData,lt=(()=>{let e;return("undefined"==typeof navigator||"ReactNative"!==(e=navigator.product)&&"NativeScript"!==e&&"NS"!==e)&&("undefined"!=typeof window&&"undefined"!=typeof document)})(),st="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&"function"==typeof self.importScripts,ct={isBrowser:!0,classes:{URLSearchParams:it,FormData:at,Blob},isStandardBrowserEnv:lt,isStandardBrowserWebWorkerEnv:st,protocols:["http","https","file","blob","url","data"]};const ut=function(e){function t(e,n,r,o){let i=e[o++];const a=Number.isFinite(+i),l=o>=e.length;if(i=!i&&Fe.isArray(r)?r.length:i,l)return Fe.hasOwnProp(r,i)?r[i]=[r[i],n]:r[i]=n,!a;r[i]&&Fe.isObject(r[i])||(r[i]=[]);return t(e,n,r[i],o)&&Fe.isArray(r[i])&&(r[i]=function(e){const t={},n=Object.keys(e);let r;const o=n.length;let i;for(r=0;r<o;r++)i=n[r],t[i]=e[i];return t}(r[i])),!a}if(Fe.isFormData(e)&&Fe.isFunction(e.entries)){const n={};return Fe.forEachEntry(e,((e,r)=>{t(function(e){return Fe.matchAll(/\w+|\[(\w*)]/g,e).map((e=>"[]"===e[0]?"":e[1]||e[0]))}(e),r,n,0)})),n}return null},ft={"Content-Type":void 0};const dt={transitional:ot,adapter:["xhr","http"],transformRequest:[function(e,t){const n=t.getContentType()||"",r=n.indexOf("application/json")>-1,o=Fe.isObject(e);o&&Fe.isHTMLForm(e)&&(e=new FormData(e));if(Fe.isFormData(e))return r&&r?JSON.stringify(ut(e)):e;if(Fe.isArrayBuffer(e)||Fe.isBuffer(e)||Fe.isStream(e)||Fe.isFile(e)||Fe.isBlob(e))return e;if(Fe.isArrayBufferView(e))return e.buffer;if(Fe.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();let i;if(o){if(n.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return Ye(e,new ct.classes.URLSearchParams,Object.assign({visitor:function(e,t,n,r){return ct.isNode&&Fe.isBuffer(e)?(this.append(t,e.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)}},t))}(e,this.formSerializer).toString();if((i=Fe.isFileList(e))||n.indexOf("multipart/form-data")>-1){const t=this.env&&this.env.FormData;return Ye(i?{"files[]":e}:e,t&&new t,this.formSerializer)}}return o||r?(t.setContentType("application/json",!1),function(e,t,n){if(Fe.isString(e))try{return(t||JSON.parse)(e),Fe.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(n||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){const t=this.transitional||dt.transitional,n=t&&t.forcedJSONParsing,r="json"===this.responseType;if(e&&Fe.isString(e)&&(n&&!this.responseType||r)){const n=!(t&&t.silentJSONParsing)&&r;try{return JSON.parse(e)}catch(e){if(n){if("SyntaxError"===e.name)throw He.from(e,He.ERR_BAD_RESPONSE,this,null,this.response);throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:ct.classes.FormData,Blob:ct.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};Fe.forEach(["delete","get","head"],(function(e){dt.headers[e]={}})),Fe.forEach(["post","put","patch"],(function(e){dt.headers[e]=Fe.merge(ft)}));const pt=dt,ht=Fe.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),vt=Symbol("internals");function mt(e){return e&&String(e).trim().toLowerCase()}function gt(e){return!1===e||null==e?e:Fe.isArray(e)?e.map(gt):String(e)}function yt(e,t,n,r){return Fe.isFunction(r)?r.call(this,t,n):Fe.isString(t)?Fe.isString(r)?-1!==t.indexOf(r):Fe.isRegExp(r)?r.test(t):void 0:void 0}class bt{constructor(e){e&&this.set(e)}set(e,t,n){const r=this;function o(e,t,n){const o=mt(t);if(!o)throw new Error("header name must be a non-empty string");const i=Fe.findKey(r,o);(!i||void 0===r[i]||!0===n||void 0===n&&!1!==r[i])&&(r[i||t]=gt(e))}const i=(e,t)=>Fe.forEach(e,((e,n)=>o(e,n,t)));return Fe.isPlainObject(e)||e instanceof this.constructor?i(e,t):Fe.isString(e)&&(e=e.trim())&&!/^[-_a-zA-Z]+$/.test(e.trim())?i((e=>{const t={};let n,r,o;return e&&e.split("\n").forEach((function(e){o=e.indexOf(":"),n=e.substring(0,o).trim().toLowerCase(),r=e.substring(o+1).trim(),!n||t[n]&&ht[n]||("set-cookie"===n?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)})),t})(e),t):null!=e&&o(t,e,n),this}get(e,t){if(e=mt(e)){const n=Fe.findKey(this,e);if(n){const e=this[n];if(!t)return e;if(!0===t)return function(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}(e);if(Fe.isFunction(t))return t.call(this,e,n);if(Fe.isRegExp(t))return t.exec(e);throw new TypeError("parser must be boolean|regexp|function")}}}has(e,t){if(e=mt(e)){const n=Fe.findKey(this,e);return!(!n||void 0===this[n]||t&&!yt(0,this[n],n,t))}return!1}delete(e,t){const n=this;let r=!1;function o(e){if(e=mt(e)){const o=Fe.findKey(n,e);!o||t&&!yt(0,n[o],o,t)||(delete n[o],r=!0)}}return Fe.isArray(e)?e.forEach(o):o(e),r}clear(e){const t=Object.keys(this);let n=t.length,r=!1;for(;n--;){const o=t[n];e&&!yt(0,this[o],o,e)||(delete this[o],r=!0)}return r}normalize(e){const t=this,n={};return Fe.forEach(this,((r,o)=>{const i=Fe.findKey(n,o);if(i)return t[i]=gt(r),void delete t[o];const a=e?function(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,((e,t,n)=>t.toUpperCase()+n))}(o):String(o).trim();a!==o&&delete t[o],t[a]=gt(r),n[a]=!0})),this}concat(...e){return this.constructor.concat(this,...e)}toJSON(e){const t=Object.create(null);return Fe.forEach(this,((n,r)=>{null!=n&&!1!==n&&(t[r]=e&&Fe.isArray(n)?n.join(", "):n)})),t}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map((([e,t])=>e+": "+t)).join("\n")}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(e){return e instanceof this?e:new this(e)}static concat(e,...t){const n=new this(e);return t.forEach((e=>n.set(e))),n}static accessor(e){const t=(this[vt]=this[vt]={accessors:{}}).accessors,n=this.prototype;function r(e){const r=mt(e);t[r]||(!function(e,t){const n=Fe.toCamelCase(" "+t);["get","set","has"].forEach((r=>{Object.defineProperty(e,r+n,{value:function(e,n,o){return this[r].call(this,t,e,n,o)},configurable:!0})}))}(n,e),t[r]=!0)}return Fe.isArray(e)?e.forEach(r):r(e),this}}bt.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]),Fe.freezeMethods(bt.prototype),Fe.freezeMethods(bt);const wt=bt;function Ct(e,t){const n=this||pt,r=t||n,o=wt.from(r.headers);let i=r.data;return Fe.forEach(e,(function(e){i=e.call(n,i,o.normalize(),t?t.status:void 0)})),o.normalize(),i}function _t(e){return!(!e||!e.__CANCEL__)}function Et(e,t,n){He.call(this,null==e?"canceled":e,He.ERR_CANCELED,t,n),this.name="CanceledError"}Fe.inherits(Et,He,{__CANCEL__:!0});const xt=Et;const kt=ct.isStandardBrowserEnv?{write:function(e,t,n,r,o,i){const a=[];a.push(e+"="+encodeURIComponent(t)),Fe.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),Fe.isString(r)&&a.push("path="+r),Fe.isString(o)&&a.push("domain="+o),!0===i&&a.push("secure"),document.cookie=a.join("; ")},read:function(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}};function St(e,t){return e&&!/^([a-z][a-z\d+\-.]*:)?\/\//i.test(t)?function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}(e,t):t}const Ot=ct.isStandardBrowserEnv?function(){const e=/(msie|trident)/i.test(navigator.userAgent),t=document.createElement("a");let n;function r(n){let r=n;return e&&(t.setAttribute("href",r),r=t.href),t.setAttribute("href",r),{href:t.href,protocol:t.protocol?t.protocol.replace(/:$/,""):"",host:t.host,search:t.search?t.search.replace(/^\?/,""):"",hash:t.hash?t.hash.replace(/^#/,""):"",hostname:t.hostname,port:t.port,pathname:"/"===t.pathname.charAt(0)?t.pathname:"/"+t.pathname}}return n=r(window.location.href),function(e){const t=Fe.isString(e)?r(e):e;return t.protocol===n.protocol&&t.host===n.host}}():function(){return!0};const Nt=function(e,t){e=e||10;const n=new Array(e),r=new Array(e);let o,i=0,a=0;return t=void 0!==t?t:1e3,function(l){const s=Date.now(),c=r[a];o||(o=s),n[i]=l,r[i]=s;let u=a,f=0;for(;u!==i;)f+=n[u++],u%=e;if(i=(i+1)%e,i===a&&(a=(a+1)%e),s-o<t)return;const d=c&&s-c;return d?Math.round(1e3*f/d):void 0}};function Pt(e,t){let n=0;const r=Nt(50,250);return o=>{const i=o.loaded,a=o.lengthComputable?o.total:void 0,l=i-n,s=r(l);n=i;const c={loaded:i,total:a,progress:a?i/a:void 0,bytes:l,rate:s||void 0,estimated:s&&a&&i<=a?(a-i)/s:void 0,event:o};c[t?"download":"upload"]=!0,e(c)}}const Tt="undefined"!=typeof XMLHttpRequest&&function(e){return new Promise((function(t,n){let r=e.data;const o=wt.from(e.headers).normalize(),i=e.responseType;let a;function l(){e.cancelToken&&e.cancelToken.unsubscribe(a),e.signal&&e.signal.removeEventListener("abort",a)}Fe.isFormData(r)&&(ct.isStandardBrowserEnv||ct.isStandardBrowserWebWorkerEnv)&&o.setContentType(!1);let s=new XMLHttpRequest;if(e.auth){const t=e.auth.username||"",n=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";o.set("Authorization","Basic "+btoa(t+":"+n))}const c=St(e.baseURL,e.url);function u(){if(!s)return;const r=wt.from("getAllResponseHeaders"in s&&s.getAllResponseHeaders());!function(e,t,n){const r=n.config.validateStatus;n.status&&r&&!r(n.status)?t(new He("Request failed with status code "+n.status,[He.ERR_BAD_REQUEST,He.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n)):e(n)}((function(e){t(e),l()}),(function(e){n(e),l()}),{data:i&&"text"!==i&&"json"!==i?s.response:s.responseText,status:s.status,statusText:s.statusText,headers:r,config:e,request:s}),s=null}if(s.open(e.method.toUpperCase(),nt(c,e.params,e.paramsSerializer),!0),s.timeout=e.timeout,"onloadend"in s?s.onloadend=u:s.onreadystatechange=function(){s&&4===s.readyState&&(0!==s.status||s.responseURL&&0===s.responseURL.indexOf("file:"))&&setTimeout(u)},s.onabort=function(){s&&(n(new He("Request aborted",He.ECONNABORTED,e,s)),s=null)},s.onerror=function(){n(new He("Network Error",He.ERR_NETWORK,e,s)),s=null},s.ontimeout=function(){let t=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded";const r=e.transitional||ot;e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(new He(t,r.clarifyTimeoutError?He.ETIMEDOUT:He.ECONNABORTED,e,s)),s=null},ct.isStandardBrowserEnv){const t=(e.withCredentials||Ot(c))&&e.xsrfCookieName&&kt.read(e.xsrfCookieName);t&&o.set(e.xsrfHeaderName,t)}void 0===r&&o.setContentType(null),"setRequestHeader"in s&&Fe.forEach(o.toJSON(),(function(e,t){s.setRequestHeader(t,e)})),Fe.isUndefined(e.withCredentials)||(s.withCredentials=!!e.withCredentials),i&&"json"!==i&&(s.responseType=e.responseType),"function"==typeof e.onDownloadProgress&&s.addEventListener("progress",Pt(e.onDownloadProgress,!0)),"function"==typeof e.onUploadProgress&&s.upload&&s.upload.addEventListener("progress",Pt(e.onUploadProgress)),(e.cancelToken||e.signal)&&(a=t=>{s&&(n(!t||t.type?new xt(null,e,s):t),s.abort(),s=null)},e.cancelToken&&e.cancelToken.subscribe(a),e.signal&&(e.signal.aborted?a():e.signal.addEventListener("abort",a)));const f=function(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}(c);f&&-1===ct.protocols.indexOf(f)?n(new He("Unsupported protocol "+f+":",He.ERR_BAD_REQUEST,e)):s.send(r||null)}))},Vt={http:ze,xhr:Tt};Fe.forEach(Vt,((e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch(e){}Object.defineProperty(e,"adapterName",{value:t})}}));const Rt={getAdapter:e=>{e=Fe.isArray(e)?e:[e];const{length:t}=e;let n,r;for(let o=0;o<t&&(n=e[o],!(r=Fe.isString(n)?Vt[n.toLowerCase()]:n));o++);if(!r){if(!1===r)throw new He(`Adapter ${n} is not supported by the environment`,"ERR_NOT_SUPPORT");throw new Error(Fe.hasOwnProp(Vt,n)?`Adapter '${n}' is not available in the build`:`Unknown adapter '${n}'`)}if(!Fe.isFunction(r))throw new TypeError("adapter is not a function");return r},adapters:Vt};function Lt(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new xt(null,e)}function At(e){Lt(e),e.headers=wt.from(e.headers),e.data=Ct.call(e,e.transformRequest),-1!==["post","put","patch"].indexOf(e.method)&&e.headers.setContentType("application/x-www-form-urlencoded",!1);return Rt.getAdapter(e.adapter||pt.adapter)(e).then((function(t){return Lt(e),t.data=Ct.call(e,e.transformResponse,t),t.headers=wt.from(t.headers),t}),(function(t){return _t(t)||(Lt(e),t&&t.response&&(t.response.data=Ct.call(e,e.transformResponse,t.response),t.response.headers=wt.from(t.response.headers))),Promise.reject(t)}))}const jt=e=>e instanceof wt?e.toJSON():e;function Bt(e,t){t=t||{};const n={};function r(e,t,n){return Fe.isPlainObject(e)&&Fe.isPlainObject(t)?Fe.merge.call({caseless:n},e,t):Fe.isPlainObject(t)?Fe.merge({},t):Fe.isArray(t)?t.slice():t}function o(e,t,n){return Fe.isUndefined(t)?Fe.isUndefined(e)?void 0:r(void 0,e,n):r(e,t,n)}function i(e,t){if(!Fe.isUndefined(t))return r(void 0,t)}function a(e,t){return Fe.isUndefined(t)?Fe.isUndefined(e)?void 0:r(void 0,e):r(void 0,t)}function l(n,o,i){return i in t?r(n,o):i in e?r(void 0,n):void 0}const s={url:i,method:i,data:i,baseURL:a,transformRequest:a,transformResponse:a,paramsSerializer:a,timeout:a,timeoutMessage:a,withCredentials:a,adapter:a,responseType:a,xsrfCookieName:a,xsrfHeaderName:a,onUploadProgress:a,onDownloadProgress:a,decompress:a,maxContentLength:a,maxBodyLength:a,beforeRedirect:a,transport:a,httpAgent:a,httpsAgent:a,cancelToken:a,socketPath:a,responseEncoding:a,validateStatus:l,headers:(e,t)=>o(jt(e),jt(t),!0)};return Fe.forEach(Object.keys(e).concat(Object.keys(t)),(function(r){const i=s[r]||o,a=i(e[r],t[r],r);Fe.isUndefined(a)&&i!==l||(n[r]=a)})),n}const It="1.3.2",Mt={};["object","boolean","number","function","string","symbol"].forEach(((e,t)=>{Mt[e]=function(n){return typeof n===e||"a"+(t<1?"n ":" ")+e}}));const Ft={};Mt.transitional=function(e,t,n){return(r,o,i)=>{if(!1===e)throw new He(function(e,t){return"[Axios v"+It+"] Transitional option '"+e+"'"+t+(n?". "+n:"")}(o," has been removed"+(t?" in "+t:"")),He.ERR_DEPRECATED);return t&&!Ft[o]&&(Ft[o]=!0),!e||e(r,o,i)}};const Dt={assertOptions:function(e,t,n){if("object"!=typeof e)throw new He("options must be an object",He.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let o=r.length;for(;o-- >0;){const i=r[o],a=t[i];if(a){const t=e[i],n=void 0===t||a(t,i,e);if(!0!==n)throw new He("option "+i+" must be "+n,He.ERR_BAD_OPTION_VALUE)}else if(!0!==n)throw new He("Unknown option "+i,He.ERR_BAD_OPTION)}},validators:Mt},Ut=Dt.validators;class $t{constructor(e){this.defaults=e,this.interceptors={request:new rt,response:new rt}}request(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{},t=Bt(this.defaults,t);const{transitional:n,paramsSerializer:r,headers:o}=t;let i;void 0!==n&&Dt.assertOptions(n,{silentJSONParsing:Ut.transitional(Ut.boolean),forcedJSONParsing:Ut.transitional(Ut.boolean),clarifyTimeoutError:Ut.transitional(Ut.boolean)},!1),void 0!==r&&Dt.assertOptions(r,{encode:Ut.function,serialize:Ut.function},!0),t.method=(t.method||this.defaults.method||"get").toLowerCase(),i=o&&Fe.merge(o.common,o[t.method]),i&&Fe.forEach(["delete","get","head","post","put","patch","common"],(e=>{delete o[e]})),t.headers=wt.concat(i,o);const a=[];let l=!0;this.interceptors.request.forEach((function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(l=l&&e.synchronous,a.unshift(e.fulfilled,e.rejected))}));const s=[];let c;this.interceptors.response.forEach((function(e){s.push(e.fulfilled,e.rejected)}));let u,f=0;if(!l){const e=[At.bind(this),void 0];for(e.unshift.apply(e,a),e.push.apply(e,s),u=e.length,c=Promise.resolve(t);f<u;)c=c.then(e[f++],e[f++]);return c}u=a.length;let d=t;for(f=0;f<u;){const e=a[f++],t=a[f++];try{d=e(d)}catch(e){t.call(this,e);break}}try{c=At.call(this,d)}catch(e){return Promise.reject(e)}for(f=0,u=s.length;f<u;)c=c.then(s[f++],s[f++]);return c}getUri(e){return nt(St((e=Bt(this.defaults,e)).baseURL,e.url),e.params,e.paramsSerializer)}}Fe.forEach(["delete","get","head","options"],(function(e){$t.prototype[e]=function(t,n){return this.request(Bt(n||{},{method:e,url:t,data:(n||{}).data}))}})),Fe.forEach(["post","put","patch"],(function(e){function t(t){return function(n,r,o){return this.request(Bt(o||{},{method:e,headers:t?{"Content-Type":"multipart/form-data"}:{},url:n,data:r}))}}$t.prototype[e]=t(),$t.prototype[e+"Form"]=t(!0)}));const Ht=$t;class zt{constructor(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");let t;this.promise=new Promise((function(e){t=e}));const n=this;this.promise.then((e=>{if(!n._listeners)return;let t=n._listeners.length;for(;t-- >0;)n._listeners[t](e);n._listeners=null})),this.promise.then=e=>{let t;const r=new Promise((e=>{n.subscribe(e),t=e})).then(e);return r.cancel=function(){n.unsubscribe(t)},r},e((function(e,r,o){n.reason||(n.reason=new xt(e,r,o),t(n.reason))}))}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;const t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}static source(){let e;const t=new zt((function(t){e=t}));return{token:t,cancel:e}}}const qt=zt;const Wt={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Wt).forEach((([e,t])=>{Wt[t]=e}));const Kt=Wt;const Gt=function e(t){const n=new Ht(t),r=ae(Ht.prototype.request,n);return Fe.extend(r,Ht.prototype,n,{allOwnKeys:!0}),Fe.extend(r,n,null,{allOwnKeys:!0}),r.create=function(n){return e(Bt(t,n))},r}(pt);Gt.Axios=Ht,Gt.CanceledError=xt,Gt.CancelToken=qt,Gt.isCancel=_t,Gt.VERSION=It,Gt.toFormData=Ye,Gt.AxiosError=He,Gt.Cancel=Gt.CanceledError,Gt.all=function(e){return Promise.all(e)},Gt.spread=function(e){return function(t){return e.apply(null,t)}},Gt.isAxiosError=function(e){return Fe.isObject(e)&&!0===e.isAxiosError},Gt.mergeConfig=Bt,Gt.AxiosHeaders=wt,Gt.formToJSON=e=>ut(Fe.isHTMLForm(e)?new FormData(e):e),Gt.HttpStatusCode=Kt,Gt.default=Gt;const Zt=Gt,Yt="undefined"!=typeof window;function Jt(e){return e.__esModule||"Module"===e[Symbol.toStringTag]}const Qt=Object.assign;function Xt(e,t){const n={};for(const r in t){const o=t[r];n[r]=tn(o)?o.map(e):e(o)}return n}const en=()=>{},tn=Array.isArray;const nn=/\/$/,rn=e=>e.replace(nn,"");function on(e,t,n="/"){let r,o={},i="",a="";const l=t.indexOf("#");let s=t.indexOf("?");return l<s&&l>=0&&(s=-1),s>-1&&(r=t.slice(0,s),i=t.slice(s+1,l>-1?l:t.length),o=e(i)),l>-1&&(r=r||t.slice(0,l),a=t.slice(l,t.length)),r=function(e,t){if(e.startsWith("/"))return e;0;if(!e)return t;const n=t.split("/"),r=e.split("/");let o,i,a=n.length-1;for(o=0;o<r.length;o++)if(i=r[o],"."!==i){if(".."!==i)break;a>1&&a--}return n.slice(0,a).join("/")+"/"+r.slice(o-(o===r.length?1:0)).join("/")}(null!=r?r:t,n),{fullPath:r+(i&&"?")+i+a,path:r,query:o,hash:a}}function an(e,t){return t&&e.toLowerCase().startsWith(t.toLowerCase())?e.slice(t.length)||"/":e}function ln(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function sn(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!cn(e[n],t[n]))return!1;return!0}function cn(e,t){return tn(e)?un(e,t):tn(t)?un(t,e):e===t}function un(e,t){return tn(t)?e.length===t.length&&e.every(((e,n)=>e===t[n])):1===e.length&&e[0]===t}var fn,dn;!function(e){e.pop="pop",e.push="push"}(fn||(fn={})),function(e){e.back="back",e.forward="forward",e.unknown=""}(dn||(dn={}));function pn(e){if(!e)if(Yt){const t=document.querySelector("base");e=(e=t&&t.getAttribute("href")||"/").replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return"/"!==e[0]&&"#"!==e[0]&&(e="/"+e),rn(e)}const hn=/^[^#]+#/;function vn(e,t){return e.replace(hn,"#")+t}const mn=()=>({left:window.pageXOffset,top:window.pageYOffset});function gn(e){let t;if("el"in e){const n=e.el,r="string"==typeof n&&n.startsWith("#");0;const o="string"==typeof n?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=function(e,t){const n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(null!=t.left?t.left:window.pageXOffset,null!=t.top?t.top:window.pageYOffset)}function yn(e,t){return(history.state?history.state.position-t:-1)+e}const bn=new Map;let wn=()=>location.protocol+"//"+location.host;function Cn(e,t){const{pathname:n,search:r,hash:o}=t,i=e.indexOf("#");if(i>-1){let t=o.includes(e.slice(i))?e.slice(i).length:1,n=o.slice(t);return"/"!==n[0]&&(n="/"+n),an(n,"")}return an(n,e)+r+o}function _n(e,t,n,r=!1,o=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:o?mn():null}}function En(e){const t=function(e){const{history:t,location:n}=window,r={value:Cn(e,n)},o={value:t.state};function i(r,i,a){const l=e.indexOf("#"),s=l>-1?(n.host&&document.querySelector("base")?e:e.slice(l))+r:wn()+e+r;try{t[a?"replaceState":"pushState"](i,"",s),o.value=i}catch(e){n[a?"replace":"assign"](s)}}return o.value||i(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0),{location:r,state:o,push:function(e,n){const a=Qt({},o.value,t.state,{forward:e,scroll:mn()});i(a.current,a,!0),i(e,Qt({},_n(r.value,e,null),{position:a.position+1},n),!1),r.value=e},replace:function(e,n){i(e,Qt({},t.state,_n(o.value.back,e,o.value.forward,!0),n,{position:o.value.position}),!0),r.value=e}}}(e=pn(e)),n=function(e,t,n,r){let o=[],i=[],a=null;const l=({state:i})=>{const l=Cn(e,location),s=n.value,c=t.value;let u=0;if(i){if(n.value=l,t.value=i,a&&a===s)return void(a=null);u=c?i.position-c.position:0}else r(l);o.forEach((e=>{e(n.value,s,{delta:u,type:fn.pop,direction:u?u>0?dn.forward:dn.back:dn.unknown})}))};function s(){const{history:e}=window;e.state&&e.replaceState(Qt({},e.state,{scroll:mn()}),"")}return window.addEventListener("popstate",l),window.addEventListener("beforeunload",s),{pauseListeners:function(){a=n.value},listen:function(e){o.push(e);const t=()=>{const t=o.indexOf(e);t>-1&&o.splice(t,1)};return i.push(t),t},destroy:function(){for(const e of i)e();i=[],window.removeEventListener("popstate",l),window.removeEventListener("beforeunload",s)}}}(e,t.state,t.location,t.replace);const r=Qt({location:"",base:e,go:function(e,t=!0){t||n.pauseListeners(),history.go(e)},createHref:vn.bind(null,e)},t,n);return Object.defineProperty(r,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(r,"state",{enumerable:!0,get:()=>t.state.value}),r}function xn(e){return"string"==typeof e||"symbol"==typeof e}const kn={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},Sn=Symbol("");var On;!function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"}(On||(On={}));function Nn(e,t){return Qt(new Error,{type:e,[Sn]:!0},t)}function Pn(e,t){return e instanceof Error&&Sn in e&&(null==t||!!(e.type&t))}const Tn="[^/]+?",Vn={sensitive:!1,strict:!1,start:!0,end:!0},Rn=/[.+*?^${}()[\]/\\]/g;function Ln(e,t){let n=0;for(;n<e.length&&n<t.length;){const r=t[n]-e[n];if(r)return r;n++}return e.length<t.length?1===e.length&&80===e[0]?-1:1:e.length>t.length?1===t.length&&80===t[0]?1:-1:0}function An(e,t){let n=0;const r=e.score,o=t.score;for(;n<r.length&&n<o.length;){const e=Ln(r[n],o[n]);if(e)return e;n++}if(1===Math.abs(o.length-r.length)){if(jn(r))return 1;if(jn(o))return-1}return o.length-r.length}function jn(e){const t=e[e.length-1];return e.length>0&&t[t.length-1]<0}const Bn={type:0,value:""},In=/[a-zA-Z0-9_]/;function Mn(e,t,n){const r=function(e,t){const n=Qt({},Vn,t),r=[];let o=n.start?"^":"";const i=[];for(const t of e){const e=t.length?[]:[90];n.strict&&!t.length&&(o+="/");for(let r=0;r<t.length;r++){const a=t[r];let l=40+(n.sensitive?.25:0);if(0===a.type)r||(o+="/"),o+=a.value.replace(Rn,"\\$&"),l+=40;else if(1===a.type){const{value:e,repeatable:n,optional:s,regexp:c}=a;i.push({name:e,repeatable:n,optional:s});const u=c||Tn;if(u!==Tn){l+=10;try{new RegExp(`(${u})`)}catch(t){throw new Error(`Invalid custom RegExp for param "${e}" (${u}): `+t.message)}}let f=n?`((?:${u})(?:/(?:${u}))*)`:`(${u})`;r||(f=s&&t.length<2?`(?:/${f})`:"/"+f),s&&(f+="?"),o+=f,l+=20,s&&(l+=-8),n&&(l+=-20),".*"===u&&(l+=-50)}e.push(l)}r.push(e)}if(n.strict&&n.end){const e=r.length-1;r[e][r[e].length-1]+=.7000000000000001}n.strict||(o+="/?"),n.end?o+="$":n.strict&&(o+="(?:/|$)");const a=new RegExp(o,n.sensitive?"":"i");return{re:a,score:r,keys:i,parse:function(e){const t=e.match(a),n={};if(!t)return null;for(let e=1;e<t.length;e++){const r=t[e]||"",o=i[e-1];n[o.name]=r&&o.repeatable?r.split("/"):r}return n},stringify:function(t){let n="",r=!1;for(const o of e){r&&n.endsWith("/")||(n+="/"),r=!1;for(const e of o)if(0===e.type)n+=e.value;else if(1===e.type){const{value:i,repeatable:a,optional:l}=e,s=i in t?t[i]:"";if(tn(s)&&!a)throw new Error(`Provided param "${i}" is an array but it is not repeatable (* or + modifiers)`);const c=tn(s)?s.join("/"):s;if(!c){if(!l)throw new Error(`Missing required param "${i}"`);o.length<2&&(n.endsWith("/")?n=n.slice(0,-1):r=!0)}n+=c}}return n||"/"}}}(function(e){if(!e)return[[]];if("/"===e)return[[Bn]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(e){throw new Error(`ERR (${n})/"${c}": ${e}`)}let n=0,r=n;const o=[];let i;function a(){i&&o.push(i),i=[]}let l,s=0,c="",u="";function f(){c&&(0===n?i.push({type:0,value:c}):1===n||2===n||3===n?(i.length>1&&("*"===l||"+"===l)&&t(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),i.push({type:1,value:c,regexp:u,repeatable:"*"===l||"+"===l,optional:"*"===l||"?"===l})):t("Invalid state to consume buffer"),c="")}function d(){c+=l}for(;s<e.length;)if(l=e[s++],"\\"!==l||2===n)switch(n){case 0:"/"===l?(c&&f(),a()):":"===l?(f(),n=1):d();break;case 4:d(),n=r;break;case 1:"("===l?n=2:In.test(l)?d():(f(),n=0,"*"!==l&&"?"!==l&&"+"!==l&&s--);break;case 2:")"===l?"\\"==u[u.length-1]?u=u.slice(0,-1)+l:n=3:u+=l;break;case 3:f(),n=0,"*"!==l&&"?"!==l&&"+"!==l&&s--,u="";break;default:t("Unknown state")}else r=n,n=4;return 2===n&&t(`Unfinished custom RegExp for param "${c}"`),f(),a(),o}(e.path),n);const o=Qt(r,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function Fn(e,t){const n=[],r=new Map;function o(e,n,r){const l=!r,s=function(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:Un(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}}}(e);s.aliasOf=r&&r.record;const c=zn(t,e),u=[s];if("alias"in e){const t="string"==typeof e.alias?[e.alias]:e.alias;for(const e of t)u.push(Qt({},s,{components:r?r.record.components:s.components,path:e,aliasOf:r?r.record:s}))}let f,d;for(const t of u){const{path:u}=t;if(n&&"/"!==u[0]){const e=n.record.path,r="/"===e[e.length-1]?"":"/";t.path=n.record.path+(u&&r+u)}if(f=Mn(t,n,c),r?r.alias.push(f):(d=d||f,d!==f&&d.alias.push(f),l&&e.name&&!$n(f)&&i(e.name)),s.children){const e=s.children;for(let t=0;t<e.length;t++)o(e[t],f,r&&r.children[t])}r=r||f,(f.record.components&&Object.keys(f.record.components).length||f.record.name||f.record.redirect)&&a(f)}return d?()=>{i(d)}:en}function i(e){if(xn(e)){const t=r.get(e);t&&(r.delete(e),n.splice(n.indexOf(t),1),t.children.forEach(i),t.alias.forEach(i))}else{const t=n.indexOf(e);t>-1&&(n.splice(t,1),e.record.name&&r.delete(e.record.name),e.children.forEach(i),e.alias.forEach(i))}}function a(e){let t=0;for(;t<n.length&&An(e,n[t])>=0&&(e.record.path!==n[t].record.path||!qn(e,n[t]));)t++;n.splice(t,0,e),e.record.name&&!$n(e)&&r.set(e.record.name,e)}return t=zn({strict:!1,end:!0,sensitive:!1},t),e.forEach((e=>o(e))),{addRoute:o,resolve:function(e,t){let o,i,a,l={};if("name"in e&&e.name){if(o=r.get(e.name),!o)throw Nn(1,{location:e});0,a=o.record.name,l=Qt(Dn(t.params,o.keys.filter((e=>!e.optional)).map((e=>e.name))),e.params&&Dn(e.params,o.keys.map((e=>e.name)))),i=o.stringify(l)}else if("path"in e)i=e.path,o=n.find((e=>e.re.test(i))),o&&(l=o.parse(i),a=o.record.name);else{if(o=t.name?r.get(t.name):n.find((e=>e.re.test(t.path))),!o)throw Nn(1,{location:e,currentLocation:t});a=o.record.name,l=Qt({},t.params,e.params),i=o.stringify(l)}const s=[];let c=o;for(;c;)s.unshift(c.record),c=c.parent;return{name:a,path:i,params:l,matched:s,meta:Hn(s)}},removeRoute:i,getRoutes:function(){return n},getRecordMatcher:function(e){return r.get(e)}}}function Dn(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function Un(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const r in e.components)t[r]="boolean"==typeof n?n:n[r];return t}function $n(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Hn(e){return e.reduce(((e,t)=>Qt(e,t.meta)),{})}function zn(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}function qn(e,t){return t.children.some((t=>t===e||qn(e,t)))}const Wn=/#/g,Kn=/&/g,Gn=/\//g,Zn=/=/g,Yn=/\?/g,Jn=/\+/g,Qn=/%5B/g,Xn=/%5D/g,er=/%5E/g,tr=/%60/g,nr=/%7B/g,rr=/%7C/g,or=/%7D/g,ir=/%20/g;function ar(e){return encodeURI(""+e).replace(rr,"|").replace(Qn,"[").replace(Xn,"]")}function lr(e){return ar(e).replace(Jn,"%2B").replace(ir,"+").replace(Wn,"%23").replace(Kn,"%26").replace(tr,"`").replace(nr,"{").replace(or,"}").replace(er,"^")}function sr(e){return null==e?"":function(e){return ar(e).replace(Wn,"%23").replace(Yn,"%3F")}(e).replace(Gn,"%2F")}function cr(e){try{return decodeURIComponent(""+e)}catch(e){}return""+e}function ur(e){const t={};if(""===e||"?"===e)return t;const n=("?"===e[0]?e.slice(1):e).split("&");for(let e=0;e<n.length;++e){const r=n[e].replace(Jn," "),o=r.indexOf("="),i=cr(o<0?r:r.slice(0,o)),a=o<0?null:cr(r.slice(o+1));if(i in t){let e=t[i];tn(e)||(e=t[i]=[e]),e.push(a)}else t[i]=a}return t}function fr(e){let t="";for(let n in e){const r=e[n];if(n=lr(n).replace(Zn,"%3D"),null==r){void 0!==r&&(t+=(t.length?"&":"")+n);continue}const o=tn(r)?r.map((e=>e&&lr(e))):[r&&lr(r)];o.forEach((e=>{void 0!==e&&(t+=(t.length?"&":"")+n,null!=e&&(t+="="+e))}))}return t}function dr(e){const t={};for(const n in e){const r=e[n];void 0!==r&&(t[n]=tn(r)?r.map((e=>null==e?null:""+e)):null==r?r:""+r)}return t}const pr=Symbol(""),hr=Symbol(""),vr=Symbol(""),mr=Symbol(""),gr=Symbol("");function yr(){let e=[];return{add:function(t){return e.push(t),()=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)}},list:()=>e,reset:function(){e=[]}}}function br(e,t,n,r,o){const i=r&&(r.enterCallbacks[o]=r.enterCallbacks[o]||[]);return()=>new Promise(((a,l)=>{const s=e=>{var s;!1===e?l(Nn(4,{from:n,to:t})):e instanceof Error?l(e):"string"==typeof(s=e)||s&&"object"==typeof s?l(Nn(2,{from:t,to:e})):(i&&r.enterCallbacks[o]===i&&"function"==typeof e&&i.push(e),a())},c=e.call(r&&r.instances[o],t,n,s);let u=Promise.resolve(c);e.length<3&&(u=u.then(s)),u.catch((e=>l(e)))}))}function wr(e,t,n,r){const o=[];for(const a of e){0;for(const e in a.components){let l=a.components[e];if("beforeRouteEnter"===t||a.instances[e])if("object"==typeof(i=l)||"displayName"in i||"props"in i||"__vccOpts"in i){const i=(l.__vccOpts||l)[t];i&&o.push(br(i,n,r,a,e))}else{let i=l();0,o.push((()=>i.then((o=>{if(!o)return Promise.reject(new Error(`Couldn't resolve component "${e}" at "${a.path}"`));const i=Jt(o)?o.default:o;a.components[e]=i;const l=(i.__vccOpts||i)[t];return l&&br(l,n,r,a,e)()}))))}}}var i;return o}function Cr(e){const t=(0,r.inject)(vr),n=(0,r.inject)(mr),o=(0,r.computed)((()=>t.resolve((0,r.unref)(e.to)))),i=(0,r.computed)((()=>{const{matched:e}=o.value,{length:t}=e,r=e[t-1],i=n.matched;if(!r||!i.length)return-1;const a=i.findIndex(ln.bind(null,r));if(a>-1)return a;const l=Er(e[t-2]);return t>1&&Er(r)===l&&i[i.length-1].path!==l?i.findIndex(ln.bind(null,e[t-2])):a})),a=(0,r.computed)((()=>i.value>-1&&function(e,t){for(const n in t){const r=t[n],o=e[n];if("string"==typeof r){if(r!==o)return!1}else if(!tn(o)||o.length!==r.length||r.some(((e,t)=>e!==o[t])))return!1}return!0}(n.params,o.value.params))),l=(0,r.computed)((()=>i.value>-1&&i.value===n.matched.length-1&&sn(n.params,o.value.params)));return{route:o,href:(0,r.computed)((()=>o.value.href)),isActive:a,isExactActive:l,navigate:function(n={}){return function(e){if(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)return;if(e.defaultPrevented)return;if(void 0!==e.button&&0!==e.button)return;if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}e.preventDefault&&e.preventDefault();return!0}(n)?t[(0,r.unref)(e.replace)?"replace":"push"]((0,r.unref)(e.to)).catch(en):Promise.resolve()}}}const _r=(0,r.defineComponent)({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:Cr,setup(e,{slots:t}){const n=(0,r.reactive)(Cr(e)),{options:o}=(0,r.inject)(vr),i=(0,r.computed)((()=>({[xr(e.activeClass,o.linkActiveClass,"router-link-active")]:n.isActive,[xr(e.exactActiveClass,o.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive})));return()=>{const o=t.default&&t.default(n);return e.custom?o:(0,r.h)("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:i.value},o)}}});function Er(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const xr=(e,t,n)=>null!=e?e:null!=t?t:n;function kr(e,t){if(!e)return null;const n=e(t);return 1===n.length?n[0]:n}const Sr=(0,r.defineComponent)({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const o=(0,r.inject)(gr),i=(0,r.computed)((()=>e.route||o.value)),a=(0,r.inject)(hr,0),l=(0,r.computed)((()=>{let e=(0,r.unref)(a);const{matched:t}=i.value;let n;for(;(n=t[e])&&!n.components;)e++;return e})),s=(0,r.computed)((()=>i.value.matched[l.value]));(0,r.provide)(hr,(0,r.computed)((()=>l.value+1))),(0,r.provide)(pr,s),(0,r.provide)(gr,i);const c=(0,r.ref)();return(0,r.watch)((()=>[c.value,s.value,e.name]),(([e,t,n],[r,o,i])=>{t&&(t.instances[n]=e,o&&o!==t&&e&&e===r&&(t.leaveGuards.size||(t.leaveGuards=o.leaveGuards),t.updateGuards.size||(t.updateGuards=o.updateGuards))),!e||!t||o&&ln(t,o)&&r||(t.enterCallbacks[n]||[]).forEach((t=>t(e)))}),{flush:"post"}),()=>{const o=i.value,a=e.name,l=s.value,u=l&&l.components[a];if(!u)return kr(n.default,{Component:u,route:o});const f=l.props[a],d=f?!0===f?o.params:"function"==typeof f?f(o):f:null,p=(0,r.h)(u,Qt({},d,t,{onVnodeUnmounted:e=>{e.component.isUnmounted&&(l.instances[a]=null)},ref:c}));return kr(n.default,{Component:p,route:o})||p}}});function Or(e){return e.reduce(((e,t)=>e.then((()=>t()))),Promise.resolve())}function Nr(){return(0,r.inject)(vr)}function Pr(){return(0,r.inject)(mr)}function Tr(e,t,...n){if(e in t){let r=t[e];return"function"==typeof r?r(...n):r}let r=new Error(`Tried to handle "${e}" but there is no handler defined. Only defined handlers are: ${Object.keys(t).map((e=>`"${e}"`)).join(", ")}.`);throw Error.captureStackTrace&&Error.captureStackTrace(r,Tr),r}var Vr,Rr=((Vr=Rr||{})[Vr.None=0]="None",Vr[Vr.RenderStrategy=1]="RenderStrategy",Vr[Vr.Static=2]="Static",Vr),Lr=(e=>(e[e.Unmount=0]="Unmount",e[e.Hidden=1]="Hidden",e))(Lr||{});function Ar({visible:e=!0,features:t=0,ourProps:n,theirProps:r,...o}){var i;let a=Ir(r,n),l=Object.assign(o,{props:a});if(e||2&t&&a.static)return jr(l);if(1&t){return Tr(null==(i=a.unmount)||i?0:1,{0:()=>null,1:()=>jr({...o,props:{...a,hidden:!0,style:{display:"none"}}})})}return jr(l)}function jr({props:e,attrs:t,slots:n,slot:o,name:i}){var a,l;let{as:s,...c}=Mr(e,["unmount","static"]),u=null==(a=n.default)?void 0:a.call(n,o),f={};if(o){let e=!1,t=[];for(let[n,r]of Object.entries(o))"boolean"==typeof r&&(e=!0),!0===r&&t.push(n);e&&(f["data-headlessui-state"]=t.join(" "))}if("template"===s){if(u=Br(null!=u?u:[]),Object.keys(c).length>0||Object.keys(t).length>0){let[e,...n]=null!=u?u:[];if(!function(e){return null!=e&&("string"==typeof e.type||"object"==typeof e.type||"function"==typeof e.type)}(e)||n.length>0)throw new Error(['Passing props on "template"!',"",`The current component <${i} /> is rendering a "template".`,"However we need to passthrough the following props:",Object.keys(c).concat(Object.keys(t)).map((e=>e.trim())).filter(((e,t,n)=>n.indexOf(e)===t)).sort(((e,t)=>e.localeCompare(t))).map((e=>`  - ${e}`)).join("\n"),"","You can apply a few solutions:",['Add an `as="..."` prop, to ensure that we render an actual element instead of a "template".',"Render a single element as the child so that we can forward the props onto that element."].map((e=>`  - ${e}`)).join("\n")].join("\n"));let o=Ir(null!=(l=e.props)?l:{},c),a=(0,r.cloneVNode)(e,o);for(let e in o)e.startsWith("on")&&(a.props||(a.props={}),a.props[e]=o[e]);return a}return Array.isArray(u)&&1===u.length?u[0]:u}return(0,r.h)(s,Object.assign({},c,f),{default:()=>u})}function Br(e){return e.flatMap((e=>e.type===r.Fragment?Br(e.children):[e]))}function Ir(...e){if(0===e.length)return{};if(1===e.length)return e[0];let t={},n={};for(let r of e)for(let e in r)e.startsWith("on")&&"function"==typeof r[e]?(null!=n[e]||(n[e]=[]),n[e].push(r[e])):t[e]=r[e];if(t.disabled||t["aria-disabled"])return Object.assign(t,Object.fromEntries(Object.keys(n).map((e=>[e,void 0]))));for(let e in n)Object.assign(t,{[e](t,...r){let o=n[e];for(let e of o){if(t instanceof Event&&t.defaultPrevented)return;e(t,...r)}}});return t}function Mr(e,t=[]){let n=Object.assign({},e);for(let e of t)e in n&&delete n[e];return n}let Fr=0;function Dr(){return++Fr}var Ur=(e=>(e.Space=" ",e.Enter="Enter",e.Escape="Escape",e.Backspace="Backspace",e.Delete="Delete",e.ArrowLeft="ArrowLeft",e.ArrowUp="ArrowUp",e.ArrowRight="ArrowRight",e.ArrowDown="ArrowDown",e.Home="Home",e.End="End",e.PageUp="PageUp",e.PageDown="PageDown",e.Tab="Tab",e))(Ur||{});var $r=(e=>(e[e.First=0]="First",e[e.Previous=1]="Previous",e[e.Next=2]="Next",e[e.Last=3]="Last",e[e.Specific=4]="Specific",e[e.Nothing=5]="Nothing",e))($r||{});function Hr(e,t){let n=t.resolveItems();if(n.length<=0)return null;let r=t.resolveActiveIndex(),o=null!=r?r:-1,i=(()=>{switch(e.focus){case 0:return n.findIndex((e=>!t.resolveDisabled(e)));case 1:{let e=n.slice().reverse().findIndex(((e,n,r)=>!(-1!==o&&r.length-n-1>=o)&&!t.resolveDisabled(e)));return-1===e?e:n.length-1-e}case 2:return n.findIndex(((e,n)=>!(n<=o)&&!t.resolveDisabled(e)));case 3:{let e=n.slice().reverse().findIndex((e=>!t.resolveDisabled(e)));return-1===e?e:n.length-1-e}case 4:return n.findIndex((n=>t.resolveId(n)===e.id));case 5:return null;default:!function(e){throw new Error("Unexpected object: "+e)}(e)}})();return-1===i?r:i}function zr(e){var t;return null==e||null==e.value?null:null!=(t=e.value.$el)?t:e.value}let qr=new class{constructor(){this.current=this.detect(),this.currentId=0}set(e){this.current!==e&&(this.currentId=0,this.current=e)}reset(){this.set(this.detect())}nextId(){return++this.currentId}get isServer(){return"server"===this.current}get isClient(){return"client"===this.current}detect(){return"undefined"==typeof window||"undefined"==typeof document?"server":"client"}};function Wr(e){if(qr.isServer)return null;if(e instanceof Node)return e.ownerDocument;if(null!=e&&e.hasOwnProperty("value")){let t=zr(e);if(t)return t.ownerDocument}return document}let Kr=Symbol("Context");var Gr=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(Gr||{});function Zr(){return(0,r.inject)(Kr,null)}function Yr(e){(0,r.provide)(Kr,e)}function Jr(e,t){if(e)return e;let n=null!=t?t:"button";return"string"==typeof n&&"button"===n.toLowerCase()?"button":void 0}function Qr(e,t){let n=(0,r.ref)(Jr(e.value.type,e.value.as));return(0,r.onMounted)((()=>{n.value=Jr(e.value.type,e.value.as)})),(0,r.watchEffect)((()=>{var e;n.value||!zr(t)||zr(t)instanceof HTMLButtonElement&&(null==(e=zr(t))||!e.hasAttribute("type"))&&(n.value="button")})),n}let Xr=["[contentEditable=true]","[tabindex]","a[href]","area[href]","button:not([disabled])","iframe","input:not([disabled])","select:not([disabled])","textarea:not([disabled])"].map((e=>`${e}:not([tabindex='-1'])`)).join(",");var eo=(e=>(e[e.First=1]="First",e[e.Previous=2]="Previous",e[e.Next=4]="Next",e[e.Last=8]="Last",e[e.WrapAround=16]="WrapAround",e[e.NoScroll=32]="NoScroll",e))(eo||{}),to=(e=>(e[e.Error=0]="Error",e[e.Overflow=1]="Overflow",e[e.Success=2]="Success",e[e.Underflow=3]="Underflow",e))(to||{}),no=(e=>(e[e.Previous=-1]="Previous",e[e.Next=1]="Next",e))(no||{});function ro(e=document.body){return null==e?[]:Array.from(e.querySelectorAll(Xr)).sort(((e,t)=>Math.sign((e.tabIndex||Number.MAX_SAFE_INTEGER)-(t.tabIndex||Number.MAX_SAFE_INTEGER))))}var oo=(e=>(e[e.Strict=0]="Strict",e[e.Loose=1]="Loose",e))(oo||{});function io(e,t=0){var n;return e!==(null==(n=Wr(e))?void 0:n.body)&&Tr(t,{0:()=>e.matches(Xr),1(){let t=e;for(;null!==t;){if(t.matches(Xr))return!0;t=t.parentElement}return!1}})}function ao(e){let t=Wr(e);(0,r.nextTick)((()=>{t&&!io(t.activeElement,0)&&lo(e)}))}function lo(e){null==e||e.focus({preventScroll:!0})}let so=["textarea","input"].join(",");function co(e,t=(e=>e)){return e.slice().sort(((e,n)=>{let r=t(e),o=t(n);if(null===r||null===o)return 0;let i=r.compareDocumentPosition(o);return i&Node.DOCUMENT_POSITION_FOLLOWING?-1:i&Node.DOCUMENT_POSITION_PRECEDING?1:0}))}function uo(e,t){return fo(ro(),t,{relativeTo:e})}function fo(e,t,{sorted:n=!0,relativeTo:r=null,skipElements:o=[]}={}){var i;let a=null!=(i=Array.isArray(e)?e.length>0?e[0].ownerDocument:document:null==e?void 0:e.ownerDocument)?i:document,l=Array.isArray(e)?n?co(e):e:ro(e);o.length>0&&l.length>1&&(l=l.filter((e=>!o.includes(e)))),r=null!=r?r:a.activeElement;let s,c=(()=>{if(5&t)return 1;if(10&t)return-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),u=(()=>{if(1&t)return 0;if(2&t)return Math.max(0,l.indexOf(r))-1;if(4&t)return Math.max(0,l.indexOf(r))+1;if(8&t)return l.length-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),f=32&t?{preventScroll:!0}:{},d=0,p=l.length;do{if(d>=p||d+p<=0)return 0;let e=u+d;if(16&t)e=(e+p)%p;else{if(e<0)return 3;if(e>=p)return 1}s=l[e],null==s||s.focus(f),d+=c}while(s!==a.activeElement);return 6&t&&function(e){var t,n;return null!=(n=null==(t=null==e?void 0:e.matches)?void 0:t.call(e,so))&&n}(s)&&s.select(),s.hasAttribute("tabindex")||s.setAttribute("tabindex","0"),2}function po(e,t,n){qr.isServer||(0,r.watchEffect)((r=>{document.addEventListener(e,t,n),r((()=>document.removeEventListener(e,t,n)))}))}function ho(e,t,n=(0,r.computed)((()=>!0))){function o(r,o){if(!n.value||r.defaultPrevented)return;let i=o(r);if(null===i||!i.getRootNode().contains(i))return;let a=function e(t){return"function"==typeof t?e(t()):Array.isArray(t)||t instanceof Set?t:[t]}(e);for(let e of a){if(null===e)continue;let t=e instanceof HTMLElement?e:zr(e);if(null!=t&&t.contains(i)||r.composed&&r.composedPath().includes(t))return}return!io(i,oo.Loose)&&-1!==i.tabIndex&&r.preventDefault(),t(r,i)}let i=(0,r.ref)(null);po("mousedown",(e=>{var t,r;n.value&&(i.value=(null==(r=null==(t=e.composedPath)?void 0:t.call(e))?void 0:r[0])||e.target)}),!0),po("click",(e=>{!i.value||(o(e,(()=>i.value)),i.value=null)}),!0),po("blur",(e=>o(e,(()=>window.document.activeElement instanceof HTMLIFrameElement?window.document.activeElement:null))),!0)}function vo(e){return[e.screenX,e.screenY]}function mo(){let e=(0,r.ref)([-1,-1]);return{wasMoved(t){let n=vo(t);return(e.value[0]!==n[0]||e.value[1]!==n[1])&&(e.value=n,!0)},update(t){e.value=vo(t)}}}var go=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(go||{}),yo=(e=>(e[e.Pointer=0]="Pointer",e[e.Other=1]="Other",e))(yo||{});let bo=Symbol("MenuContext");function wo(e){let t=(0,r.inject)(bo,null);if(null===t){let t=new Error(`<${e} /> is missing a parent <Menu /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,wo),t}return t}let Co=(0,r.defineComponent)({name:"Menu",props:{as:{type:[Object,String],default:"template"}},setup(e,{slots:t,attrs:n}){let o=(0,r.ref)(1),i=(0,r.ref)(null),a=(0,r.ref)(null),l=(0,r.ref)([]),s=(0,r.ref)(""),c=(0,r.ref)(null),u=(0,r.ref)(1);function f(e=(e=>e)){let t=null!==c.value?l.value[c.value]:null,n=co(e(l.value.slice()),(e=>zr(e.dataRef.domRef))),r=t?n.indexOf(t):null;return-1===r&&(r=null),{items:n,activeItemIndex:r}}let d={menuState:o,buttonRef:i,itemsRef:a,items:l,searchQuery:s,activeItemIndex:c,activationTrigger:u,closeMenu:()=>{o.value=1,c.value=null},openMenu:()=>o.value=0,goToItem(e,t,n){let r=f(),o=Hr(e===$r.Specific?{focus:$r.Specific,id:t}:{focus:e},{resolveItems:()=>r.items,resolveActiveIndex:()=>r.activeItemIndex,resolveId:e=>e.id,resolveDisabled:e=>e.dataRef.disabled});s.value="",c.value=o,u.value=null!=n?n:1,l.value=r.items},search(e){let t=""!==s.value?0:1;s.value+=e.toLowerCase();let n=(null!==c.value?l.value.slice(c.value+t).concat(l.value.slice(0,c.value+t)):l.value).find((e=>e.dataRef.textValue.startsWith(s.value)&&!e.dataRef.disabled)),r=n?l.value.indexOf(n):-1;-1===r||r===c.value||(c.value=r,u.value=1)},clearSearch(){s.value=""},registerItem(e,t){let n=f((n=>[...n,{id:e,dataRef:t}]));l.value=n.items,c.value=n.activeItemIndex,u.value=1},unregisterItem(e){let t=f((t=>{let n=t.findIndex((t=>t.id===e));return-1!==n&&t.splice(n,1),t}));l.value=t.items,c.value=t.activeItemIndex,u.value=1}};return ho([i,a],((e,t)=>{var n;d.closeMenu(),io(t,oo.Loose)||(e.preventDefault(),null==(n=zr(i))||n.focus())}),(0,r.computed)((()=>0===o.value))),(0,r.provide)(bo,d),Yr((0,r.computed)((()=>Tr(o.value,{0:Gr.Open,1:Gr.Closed})))),()=>{let r={open:0===o.value,close:d.closeMenu};return Ar({ourProps:{},theirProps:e,slot:r,slots:t,attrs:n,name:"Menu"})}}}),_o=(0,r.defineComponent)({name:"MenuButton",props:{disabled:{type:Boolean,default:!1},as:{type:[Object,String],default:"button"},id:{type:String,default:()=>`headlessui-menu-button-${Dr()}`}},setup(e,{attrs:t,slots:n,expose:o}){let i=wo("MenuButton");function a(e){switch(e.key){case Ur.Space:case Ur.Enter:case Ur.ArrowDown:e.preventDefault(),e.stopPropagation(),i.openMenu(),(0,r.nextTick)((()=>{var e;null==(e=zr(i.itemsRef))||e.focus({preventScroll:!0}),i.goToItem($r.First)}));break;case Ur.ArrowUp:e.preventDefault(),e.stopPropagation(),i.openMenu(),(0,r.nextTick)((()=>{var e;null==(e=zr(i.itemsRef))||e.focus({preventScroll:!0}),i.goToItem($r.Last)}))}}function l(e){if(e.key===Ur.Space)e.preventDefault()}function s(t){e.disabled||(0===i.menuState.value?(i.closeMenu(),(0,r.nextTick)((()=>{var e;return null==(e=zr(i.buttonRef))?void 0:e.focus({preventScroll:!0})}))):(t.preventDefault(),i.openMenu(),function(e){requestAnimationFrame((()=>requestAnimationFrame(e)))}((()=>{var e;return null==(e=zr(i.itemsRef))?void 0:e.focus({preventScroll:!0})}))))}o({el:i.buttonRef,$el:i.buttonRef});let c=Qr((0,r.computed)((()=>({as:e.as,type:t.type}))),i.buttonRef);return()=>{var r;let o={open:0===i.menuState.value},{id:u,...f}=e;return Ar({ourProps:{ref:i.buttonRef,id:u,type:c.value,"aria-haspopup":"menu","aria-controls":null==(r=zr(i.itemsRef))?void 0:r.id,"aria-expanded":e.disabled?void 0:0===i.menuState.value,onKeydown:a,onKeyup:l,onClick:s},theirProps:f,slot:o,attrs:t,slots:n,name:"MenuButton"})}}}),Eo=(0,r.defineComponent)({name:"MenuItems",props:{as:{type:[Object,String],default:"div"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},id:{type:String,default:()=>`headlessui-menu-items-${Dr()}`}},setup(e,{attrs:t,slots:n,expose:o}){let i=wo("MenuItems"),a=(0,r.ref)(null);function l(e){var t;switch(a.value&&clearTimeout(a.value),e.key){case Ur.Space:if(""!==i.searchQuery.value)return e.preventDefault(),e.stopPropagation(),i.search(e.key);case Ur.Enter:if(e.preventDefault(),e.stopPropagation(),null!==i.activeItemIndex.value){null==(t=zr(i.items.value[i.activeItemIndex.value].dataRef.domRef))||t.click()}i.closeMenu(),ao(zr(i.buttonRef));break;case Ur.ArrowDown:return e.preventDefault(),e.stopPropagation(),i.goToItem($r.Next);case Ur.ArrowUp:return e.preventDefault(),e.stopPropagation(),i.goToItem($r.Previous);case Ur.Home:case Ur.PageUp:return e.preventDefault(),e.stopPropagation(),i.goToItem($r.First);case Ur.End:case Ur.PageDown:return e.preventDefault(),e.stopPropagation(),i.goToItem($r.Last);case Ur.Escape:e.preventDefault(),e.stopPropagation(),i.closeMenu(),(0,r.nextTick)((()=>{var e;return null==(e=zr(i.buttonRef))?void 0:e.focus({preventScroll:!0})}));break;case Ur.Tab:e.preventDefault(),e.stopPropagation(),i.closeMenu(),(0,r.nextTick)((()=>uo(zr(i.buttonRef),e.shiftKey?eo.Previous:eo.Next)));break;default:1===e.key.length&&(i.search(e.key),a.value=setTimeout((()=>i.clearSearch()),350))}}function s(e){if(e.key===Ur.Space)e.preventDefault()}o({el:i.itemsRef,$el:i.itemsRef}),function({container:e,accept:t,walk:n,enabled:o}){(0,r.watchEffect)((()=>{let r=e.value;if(!r||void 0!==o&&!o.value)return;let i=Wr(e);if(!i)return;let a=Object.assign((e=>t(e)),{acceptNode:t}),l=i.createTreeWalker(r,NodeFilter.SHOW_ELEMENT,a,!1);for(;l.nextNode();)n(l.currentNode)}))}({container:(0,r.computed)((()=>zr(i.itemsRef))),enabled:(0,r.computed)((()=>0===i.menuState.value)),accept:e=>"menuitem"===e.getAttribute("role")?NodeFilter.FILTER_REJECT:e.hasAttribute("role")?NodeFilter.FILTER_SKIP:NodeFilter.FILTER_ACCEPT,walk(e){e.setAttribute("role","none")}});let c=Zr(),u=(0,r.computed)((()=>null!==c?c.value===Gr.Open:0===i.menuState.value));return()=>{var r,o;let a={open:0===i.menuState.value},{id:c,...f}=e;return Ar({ourProps:{"aria-activedescendant":null===i.activeItemIndex.value||null==(r=i.items.value[i.activeItemIndex.value])?void 0:r.id,"aria-labelledby":null==(o=zr(i.buttonRef))?void 0:o.id,id:c,onKeydown:l,onKeyup:s,role:"menu",tabIndex:0,ref:i.itemsRef},theirProps:f,slot:a,attrs:t,slots:n,features:Rr.RenderStrategy|Rr.Static,visible:u.value,name:"MenuItems"})}}}),xo=(0,r.defineComponent)({name:"MenuItem",inheritAttrs:!1,props:{as:{type:[Object,String],default:"template"},disabled:{type:Boolean,default:!1},id:{type:String,default:()=>`headlessui-menu-item-${Dr()}`}},setup(e,{slots:t,attrs:n,expose:o}){let i=wo("MenuItem"),a=(0,r.ref)(null);o({el:a,$el:a});let l=(0,r.computed)((()=>null!==i.activeItemIndex.value&&i.items.value[i.activeItemIndex.value].id===e.id)),s=(0,r.computed)((()=>({disabled:e.disabled,textValue:"",domRef:a})));function c(t){if(e.disabled)return t.preventDefault();i.closeMenu(),ao(zr(i.buttonRef))}function u(){if(e.disabled)return i.goToItem($r.Nothing);i.goToItem($r.Specific,e.id)}(0,r.onMounted)((()=>{var e,t;let n=null==(t=null==(e=zr(a))?void 0:e.textContent)?void 0:t.toLowerCase().trim();void 0!==n&&(s.value.textValue=n)})),(0,r.onMounted)((()=>i.registerItem(e.id,s))),(0,r.onUnmounted)((()=>i.unregisterItem(e.id))),(0,r.watchEffect)((()=>{0===i.menuState.value&&(!l.value||0!==i.activationTrigger.value&&(0,r.nextTick)((()=>{var e,t;return null==(t=null==(e=zr(a))?void 0:e.scrollIntoView)?void 0:t.call(e,{block:"nearest"})})))}));let f=mo();function d(e){f.update(e)}function p(t){!f.wasMoved(t)||e.disabled||l.value||i.goToItem($r.Specific,e.id,0)}function h(t){!f.wasMoved(t)||e.disabled||!l.value||i.goToItem($r.Nothing)}return()=>{let{disabled:r}=e,o={active:l.value,disabled:r,close:i.closeMenu},{id:s,...f}=e;return Ar({ourProps:{id:s,ref:a,role:"menuitem",tabIndex:!0===r?void 0:-1,"aria-disabled":!0===r||void 0,disabled:void 0,onClick:c,onFocus:u,onPointerenter:d,onMouseenter:d,onPointermove:p,onMousemove:p,onPointerleave:h,onMouseleave:h},theirProps:{...n,...f},slot:o,attrs:n,slots:t,name:"MenuItem"})}}});var ko=n(505),So=n(10),Oo=n(706),No=n(558),Po=n(413),To=n(199),Vo=n(388),Ro=n(243),Lo=n(782),Ao=n(156),jo=n(488),Bo=ie({id:"hosts",state:function(){return{selectedHostIdentifier:null}},getters:{supportsHosts:function(){return LogViewer.supports_hosts},hosts:function(){return LogViewer.hosts||[]},hasRemoteHosts:function(){return this.hosts.some((function(e){return e.is_remote}))},selectedHost:function(){var e=this;return this.hosts.find((function(t){return t.identifier===e.selectedHostIdentifier}))},localHost:function(){return this.hosts.find((function(e){return!e.is_remote}))},hostQueryParam:function(){return this.selectedHost&&this.selectedHost.is_remote?this.selectedHost.identifier:void 0}},actions:{selectHost:function(e){var t;this.supportsHosts||(e=null),"string"==typeof e&&(e=this.hosts.find((function(t){return t.identifier===e}))),e||(e=this.hosts.find((function(e){return!e.is_remote}))),this.selectedHostIdentifier=(null===(t=e)||void 0===t?void 0:t.identifier)||null}}});var Io;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;const Mo="undefined"!=typeof window,Fo=(Object.prototype.toString,e=>"function"==typeof e),Do=e=>"string"==typeof e,Uo=()=>{};Mo&&(null==(Io=null==window?void 0:window.navigator)?void 0:Io.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent);function $o(e){return"function"==typeof e?e():(0,r.unref)(e)}function Ho(e,t){return function(...n){return new Promise(((r,o)=>{Promise.resolve(e((()=>t.apply(this,n)),{fn:t,thisArg:this,args:n})).then(r).catch(o)}))}}const zo=e=>e();function qo(e){return!!(0,r.getCurrentScope)()&&((0,r.onScopeDispose)(e),!0)}Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;var Wo=Object.getOwnPropertySymbols,Ko=Object.prototype.hasOwnProperty,Go=Object.prototype.propertyIsEnumerable,Zo=(e,t)=>{var n={};for(var r in e)Ko.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&Wo)for(var r of Wo(e))t.indexOf(r)<0&&Go.call(e,r)&&(n[r]=e[r]);return n};function Yo(e,t,n={}){const o=n,{eventFilter:i=zo}=o,a=Zo(o,["eventFilter"]);return(0,r.watch)(e,Ho(i,t),a)}Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;var Jo=Object.defineProperty,Qo=Object.defineProperties,Xo=Object.getOwnPropertyDescriptors,ei=Object.getOwnPropertySymbols,ti=Object.prototype.hasOwnProperty,ni=Object.prototype.propertyIsEnumerable,ri=(e,t,n)=>t in e?Jo(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,oi=(e,t)=>{for(var n in t||(t={}))ti.call(t,n)&&ri(e,n,t[n]);if(ei)for(var n of ei(t))ni.call(t,n)&&ri(e,n,t[n]);return e},ii=(e,t)=>Qo(e,Xo(t)),ai=(e,t)=>{var n={};for(var r in e)ti.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&ei)for(var r of ei(e))t.indexOf(r)<0&&ni.call(e,r)&&(n[r]=e[r]);return n};function li(e,t,n={}){const o=n,{eventFilter:i}=o,a=ai(o,["eventFilter"]),{eventFilter:l,pause:s,resume:c,isActive:u}=function(e=zo){const t=(0,r.ref)(!0);return{isActive:(0,r.readonly)(t),pause:function(){t.value=!1},resume:function(){t.value=!0},eventFilter:(...n)=>{t.value&&e(...n)}}}(i);return{stop:Yo(e,t,ii(oi({},a),{eventFilter:l})),pause:s,resume:c,isActive:u}}Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;function si(e){var t;const n=$o(e);return null!=(t=null==n?void 0:n.$el)?t:n}const ci=Mo?window:void 0;Mo&&window.document,Mo&&window.navigator,Mo&&window.location;function ui(...e){let t,n,o,i;if(Do(e[0])||Array.isArray(e[0])?([n,o,i]=e,t=ci):[t,n,o,i]=e,!t)return Uo;Array.isArray(n)||(n=[n]),Array.isArray(o)||(o=[o]);const a=[],l=()=>{a.forEach((e=>e())),a.length=0},s=(0,r.watch)((()=>si(t)),(e=>{l(),e&&a.push(...n.flatMap((t=>o.map((n=>((e,t,n)=>(e.addEventListener(t,n,i),()=>e.removeEventListener(t,n,i)))(e,t,n))))))}),{immediate:!0,flush:"post"}),c=()=>{s(),l()};return qo(c),c}Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;const fi="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},di="__vueuse_ssr_handlers__";fi[di]=fi[di]||{};const pi=fi[di];function hi(e,t){return pi[e]||t}function vi(e){return null==e?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":"boolean"==typeof e?"boolean":"string"==typeof e?"string":"object"==typeof e?"object":Number.isNaN(e)?"any":"number"}var mi=Object.defineProperty,gi=Object.getOwnPropertySymbols,yi=Object.prototype.hasOwnProperty,bi=Object.prototype.propertyIsEnumerable,wi=(e,t,n)=>t in e?mi(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Ci=(e,t)=>{for(var n in t||(t={}))yi.call(t,n)&&wi(e,n,t[n]);if(gi)for(var n of gi(t))bi.call(t,n)&&wi(e,n,t[n]);return e};const _i={boolean:{read:e=>"true"===e,write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}};function Ei(e,t,n,o={}){var i;const{flush:a="pre",deep:l=!0,listenToStorageChanges:s=!0,writeDefaults:c=!0,mergeDefaults:u=!1,shallow:f,window:d=ci,eventFilter:p,onError:h=(e=>{})}=o,v=(f?r.shallowRef:r.ref)(t);if(!n)try{n=hi("getDefaultStorage",(()=>{var e;return null==(e=ci)?void 0:e.localStorage}))()}catch(e){h(e)}if(!n)return v;const m=$o(t),g=vi(m),y=null!=(i=o.serializer)?i:_i[g],{pause:b,resume:w}=li(v,(()=>function(t){try{if(null==t)n.removeItem(e);else{const r=y.write(t),o=n.getItem(e);o!==r&&(n.setItem(e,r),d&&(null==d||d.dispatchEvent(new StorageEvent("storage",{key:e,oldValue:o,newValue:r,storageArea:n}))))}}catch(e){h(e)}}(v.value)),{flush:a,deep:l,eventFilter:p});return d&&s&&ui(d,"storage",C),C(),v;function C(t){if(!t||t.storageArea===n)if(t&&null==t.key)v.value=m;else if(!t||t.key===e){b();try{v.value=function(t){const r=t?t.newValue:n.getItem(e);if(null==r)return c&&null!==m&&n.setItem(e,y.write(m)),m;if(!t&&u){const e=y.read(r);return Fo(u)?u(e,m):"object"!==g||Array.isArray(e)?e:Ci(Ci({},m),e)}return"string"!=typeof r?r:y.read(r)}(t)}catch(e){h(e)}finally{t?(0,r.nextTick)(w):w()}}}}Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;new Map;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;function xi(e,t,n={}){const{window:r=ci}=n;return Ei(e,t,null==r?void 0:r.localStorage,n)}Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;var ki,Si;(Si=ki||(ki={})).UP="UP",Si.RIGHT="RIGHT",Si.DOWN="DOWN",Si.LEFT="LEFT",Si.NONE="NONE";Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;var Oi=Object.defineProperty,Ni=Object.getOwnPropertySymbols,Pi=Object.prototype.hasOwnProperty,Ti=Object.prototype.propertyIsEnumerable,Vi=(e,t,n)=>t in e?Oi(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;((e,t)=>{for(var n in t||(t={}))Pi.call(t,n)&&Vi(e,n,t[n]);if(Ni)for(var n of Ni(t))Ti.call(t,n)&&Vi(e,n,t[n])})({linear:function(e){return e}},{easeInSine:[.12,0,.39,0],easeOutSine:[.61,1,.88,1],easeInOutSine:[.37,0,.63,1],easeInQuad:[.11,0,.5,0],easeOutQuad:[.5,1,.89,1],easeInOutQuad:[.45,0,.55,1],easeInCubic:[.32,0,.67,0],easeOutCubic:[.33,1,.68,1],easeInOutCubic:[.65,0,.35,1],easeInQuart:[.5,0,.75,0],easeOutQuart:[.25,1,.5,1],easeInOutQuart:[.76,0,.24,1],easeInQuint:[.64,0,.78,0],easeOutQuint:[.22,1,.36,1],easeInOutQuint:[.83,0,.17,1],easeInExpo:[.7,0,.84,0],easeOutExpo:[.16,1,.3,1],easeInOutExpo:[.87,0,.13,1],easeInCirc:[.55,0,1,.45],easeOutCirc:[0,.55,.45,1],easeInOutCirc:[.85,0,.15,1],easeInBack:[.36,0,.66,-.56],easeOutBack:[.34,1.56,.64,1],easeInOutBack:[.68,-.6,.32,1.6]});var Ri=ie({id:"search",state:function(){return{query:"",searchMoreRoute:null,searching:!1,percentScanned:0,error:null}},getters:{hasQuery:function(e){return""!==String(e.query).trim()}},actions:{init:function(){this.checkSearchProgress()},setQuery:function(e){this.query=e},update:function(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0;this.query=e,this.error=t&&""!==t?t:null,this.searchMoreRoute=n,this.searching=r,this.percentScanned=o,this.searching&&this.checkSearchProgress()},checkSearchProgress:function(){var e=this,t=this.query;if(""!==t){var n="?"+new URLSearchParams({query:t});fetch(this.searchMoreRoute+n).then((function(e){return e.json()})).then((function(n){if(e.query===t){var r=e.searching;e.searching=n.hasMoreResults,e.percentScanned=n.percentScanned,e.searching?e.checkSearchProgress():r&&!e.searching&&window.dispatchEvent(new CustomEvent("reload-results"))}}))}}}}),Li=ie({id:"pagination",state:function(){return{page:1,pagination:{}}},getters:{currentPage:function(e){return 1!==e.page?Number(e.page):null},links:function(e){var t;return((null===(t=e.pagination)||void 0===t?void 0:t.links)||[]).slice(1,-1)},linksShort:function(e){var t;return((null===(t=e.pagination)||void 0===t?void 0:t.links_short)||[]).slice(1,-1)},hasPages:function(e){var t;return(null===(t=e.pagination)||void 0===t?void 0:t.last_page)>1},hasMorePages:function(e){var t;return null!==(null===(t=e.pagination)||void 0===t?void 0:t.next_page_url)}},actions:{setPagination:function(e){var t,n;(this.pagination=e,(null===(t=this.pagination)||void 0===t?void 0:t.last_page)<this.page)&&(this.page=null===(n=this.pagination)||void 0===n?void 0:n.last_page)},setPage:function(e){this.page=Number(e)}}}),Ai=["debug","info","notice","warning","error","critical","alert","emergency","processing","processed","failed",""],ji=ie({id:"severity",state:function(){return{selectedLevels:xi("selectedLevels",Ai),levelCounts:[]}},getters:{levelsFound:function(e){return(e.levelCounts||[]).filter((function(e){return e.count>0}))},totalResults:function(){return this.levelsFound.reduce((function(e,t){return e+t.count}),0)},levelsSelected:function(){return this.levelsFound.filter((function(e){return e.selected}))},totalResultsSelected:function(){return this.levelsSelected.reduce((function(e,t){return e+t.count}),0)}},actions:{setLevelCounts:function(e){e.hasOwnProperty("length")?this.levelCounts=e:this.levelCounts=Object.values(e)},selectAllLevels:function(){this.selectedLevels=Ai,this.levelCounts.forEach((function(e){return e.selected=!0}))},deselectAllLevels:function(){this.selectedLevels=[],this.levelCounts.forEach((function(e){return e.selected=!1}))},toggleLevel:function(e){var t=this.levelCounts.find((function(t){return t.level===e}))||{};this.selectedLevels.includes(e)?(this.selectedLevels=this.selectedLevels.filter((function(t){return t!==e})),t.selected=!1):(this.selectedLevels.push(e),t.selected=!0)}}}),Bi=n(486),Ii={System:"System",Light:"Light",Dark:"Dark"},Mi=ie({id:"logViewer",state:function(){return{theme:xi("logViewerTheme",Ii.System),shorterStackTraces:xi("logViewerShorterStackTraces",!1),direction:xi("logViewerDirection","desc"),resultsPerPage:xi("logViewerResultsPerPage",25),helpSlideOverOpen:!1,loading:!1,error:null,logs:[],levelCounts:[],performance:{},hasMoreResults:!1,percentScanned:100,abortController:null,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight,stacksOpen:[],stacksInView:[],stackTops:{},containerTop:0,showLevelsDropdown:!0}},getters:{selectedFile:function(){return Fi().selectedFile},isOpen:function(e){return function(t){return e.stacksOpen.includes(t)}},isMobile:function(e){return e.viewportWidth<=1023},tableRowHeight:function(){return this.isMobile?29:36},headerHeight:function(){return this.isMobile?0:36},shouldBeSticky:function(e){var t=this;return function(n){return t.isOpen(n)&&e.stacksInView.includes(n)}},stickTopPosition:function(){var e=this;return function(t){var n=e.pixelsAboveFold(t);return n<0?Math.max(e.headerHeight-e.tableRowHeight,e.headerHeight+n)+"px":e.headerHeight+"px"}},pixelsAboveFold:function(e){var t=this;return function(n){var r=document.getElementById("tbody-"+n);if(!r)return!1;var o=r.getClientRects()[0];return o.top+o.height-t.tableRowHeight-t.headerHeight-e.containerTop}},isInViewport:function(){var e=this;return function(t){return e.pixelsAboveFold(t)>-e.tableRowHeight}}},actions:{setViewportDimensions:function(e,t){this.viewportWidth=e,this.viewportHeight=t;var n=document.querySelector(".log-item-container");n&&(this.containerTop=n.getBoundingClientRect().top)},toggleTheme:function(){switch(this.theme){case Ii.System:this.theme=Ii.Light;break;case Ii.Light:this.theme=Ii.Dark;break;default:this.theme=Ii.System}this.syncTheme()},syncTheme:function(){var e=this.theme;e===Ii.Dark||e===Ii.System&&window.matchMedia("(prefers-color-scheme: dark)").matches?document.documentElement.classList.add("dark"):document.documentElement.classList.remove("dark")},toggle:function(e){this.isOpen(e)?this.stacksOpen=this.stacksOpen.filter((function(t){return t!==e})):this.stacksOpen.push(e),this.onScroll()},onScroll:function(){var e=this;this.stacksOpen.forEach((function(t){e.isInViewport(t)?(e.stacksInView.includes(t)||e.stacksInView.push(t),e.stackTops[t]=e.stickTopPosition(t)):(e.stacksInView=e.stacksInView.filter((function(e){return e!==t})),delete e.stackTops[t])}))},reset:function(){this.stacksOpen=[],this.stacksInView=[],this.stackTops={};var e=document.querySelector(".log-item-container");e&&(this.containerTop=e.getBoundingClientRect().top,e.scrollTo(0,0))},loadLogs:(0,Bi.debounce)((function(){var e,t=this,n=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).silently,o=void 0!==n&&n,i=Bo(),a=Fi(),l=Ri(),s=Li(),c=ji();if(0!==a.folders.length&&(this.abortController&&this.abortController.abort(),this.selectedFile||l.hasQuery)){this.abortController=new AbortController;var u={host:i.hostQueryParam,file:null===(e=this.selectedFile)||void 0===e?void 0:e.identifier,direction:this.direction,query:l.query,page:s.currentPage,per_page:this.resultsPerPage,levels:(0,r.toRaw)(c.selectedLevels.length>0?c.selectedLevels:"none"),shorter_stack_traces:this.shorterStackTraces};o||(this.loading=!0),Zt.get("".concat(LogViewer.basePath,"/api/logs"),{params:u,signal:this.abortController.signal}).then((function(e){var n=e.data;t.logs=u.host?n.logs.map((function(e){var t={host:u.host,file:e.file_identifier,query:"log-index:".concat(e.index)};return e.url="".concat(window.location.host).concat(LogViewer.basePath,"?").concat(new URLSearchParams(t)),e})):n.logs,t.hasMoreResults=n.hasMoreResults,t.percentScanned=n.percentScanned,t.error=n.error||null,t.performance=n.performance||{},c.setLevelCounts(n.levelCounts),s.setPagination(n.pagination),t.loading=!1,o||(0,r.nextTick)((function(){t.reset(),n.expandAutomatically&&t.stacksOpen.push(0)})),t.hasMoreResults&&t.loadLogs({silently:!0})})).catch((function(e){var n,r;if("ERR_CANCELED"===e.code)return t.hasMoreResults=!1,void(t.percentScanned=100);t.loading=!1,t.error=e.message,null!==(n=e.response)&&void 0!==n&&null!==(r=n.data)&&void 0!==r&&r.message&&(t.error+=": "+e.response.data.message)}))}}),10)}}),Fi=ie({id:"files",state:function(){return{folders:[],direction:xi("fileViewerDirection","desc"),selectedFileIdentifier:null,error:null,clearingCache:{},cacheRecentlyCleared:{},deleting:{},abortController:null,loading:!1,checkBoxesVisibility:!1,filesChecked:[],openFolderIdentifiers:[],foldersInView:[],containerTop:0,sidebarOpen:!1}},getters:{selectedHost:function(){return Bo().selectedHost},hostQueryParam:function(){return Bo().hostQueryParam},files:function(e){return e.folders.flatMap((function(e){return e.files}))},selectedFile:function(e){return e.files.find((function(t){return t.identifier===e.selectedFileIdentifier}))},foldersOpen:function(e){return e.openFolderIdentifiers.map((function(t){return e.folders.find((function(e){return e.identifier===t}))}))},isOpen:function(){var e=this;return function(t){return e.foldersOpen.includes(t)}},isChecked:function(e){return function(t){return e.filesChecked.includes("string"==typeof t?t:t.identifier)}},shouldBeSticky:function(e){var t=this;return function(n){return t.isOpen(n)&&e.foldersInView.includes(n)}},isInViewport:function(){var e=this;return function(t){return e.pixelsAboveFold(t)>-36}},pixelsAboveFold:function(e){return function(t){var n=document.getElementById("folder-"+t);if(!n)return!1;var r=n.getClientRects()[0];return r.top+r.height-e.containerTop}},hasFilesChecked:function(e){return e.filesChecked.length>0}},actions:{setDirection:function(e){this.direction=e},selectFile:function(e){this.selectedFileIdentifier!==e&&(this.selectedFileIdentifier=e,this.openFolderForActiveFile(),this.sidebarOpen=!1)},openFolderForActiveFile:function(){var e=this;if(this.selectedFile){var t=this.folders.find((function(t){return t.files.some((function(t){return t.identifier===e.selectedFile.identifier}))}));t&&!this.isOpen(t)&&this.toggle(t)}},openRootFolderIfNoneOpen:function(){var e=this.folders.find((function(e){return e.is_root}));e&&0===this.openFolderIdentifiers.length&&this.openFolderIdentifiers.push(e.identifier)},loadFolders:function(){var e=this;return this.abortController&&this.abortController.abort(),this.selectedHost?(this.abortController=new AbortController,this.loading=!0,Zt.get("".concat(LogViewer.basePath,"/api/folders"),{params:{host:this.hostQueryParam,direction:this.direction},signal:this.abortController.signal}).then((function(t){var n=t.data;e.folders=n,e.error=n.error||null,e.loading=!1,0===e.openFolderIdentifiers.length&&(e.openFolderForActiveFile(),e.openRootFolderIfNoneOpen()),e.onScroll()})).catch((function(t){var n,r;"ERR_CANCELED"!==t.code&&(e.loading=!1,e.error=t.message,null!==(n=t.response)&&void 0!==n&&null!==(r=n.data)&&void 0!==r&&r.message&&(e.error+=": "+t.response.data.message))}))):(this.folders=[],this.error=null,void(this.loading=!1))},toggle:function(e){this.isOpen(e)?this.openFolderIdentifiers=this.openFolderIdentifiers.filter((function(t){return t!==e.identifier})):this.openFolderIdentifiers.push(e.identifier),this.onScroll()},onScroll:function(){var e=this;this.foldersOpen.forEach((function(t){e.isInViewport(t)?e.foldersInView.includes(t)||e.foldersInView.push(t):e.foldersInView=e.foldersInView.filter((function(e){return e!==t}))}))},reset:function(){this.openFolderIdentifiers=[],this.foldersInView=[];var e=document.getElementById("file-list-container");e&&(this.containerTop=e.getBoundingClientRect().top,e.scrollTo(0,0))},toggleSidebar:function(){this.sidebarOpen=!this.sidebarOpen},checkBoxToggle:function(e){this.isChecked(e)?this.filesChecked=this.filesChecked.filter((function(t){return t!==e})):this.filesChecked.push(e)},toggleCheckboxVisibility:function(){this.checkBoxesVisibility=!this.checkBoxesVisibility},resetChecks:function(){this.filesChecked=[],this.checkBoxesVisibility=!1},clearCacheForFile:function(e){var t=this;return this.clearingCache[e.identifier]=!0,Zt.post("".concat(LogViewer.basePath,"/api/files/").concat(e.identifier,"/clear-cache"),{},{params:{host:this.hostQueryParam}}).then((function(){e.identifier===t.selectedFileIdentifier&&Mi().loadLogs(),t.cacheRecentlyCleared[e.identifier]=!0,setTimeout((function(){return t.cacheRecentlyCleared[e.identifier]=!1}),2e3)})).catch((function(e){})).finally((function(){return t.clearingCache[e.identifier]=!1}))},deleteFile:function(e){var t=this;return Zt.delete("".concat(LogViewer.basePath,"/api/files/").concat(e.identifier),{params:{host:this.hostQueryParam}}).then((function(){return t.loadFolders()}))},clearCacheForFolder:function(e){var t=this;return this.clearingCache[e.identifier]=!0,Zt.post("".concat(LogViewer.basePath,"/api/folders/").concat(e.identifier,"/clear-cache"),{},{params:{host:this.hostQueryParam}}).then((function(){e.files.some((function(e){return e.identifier===t.selectedFileIdentifier}))&&Mi().loadLogs(),t.cacheRecentlyCleared[e.identifier]=!0,setTimeout((function(){return t.cacheRecentlyCleared[e.identifier]=!1}),2e3)})).catch((function(e){})).finally((function(){t.clearingCache[e.identifier]=!1}))},deleteFolder:function(e){var t=this;return this.deleting[e.identifier]=!0,Zt.delete("".concat(LogViewer.basePath,"/api/folders/").concat(e.identifier),{params:{host:this.hostQueryParam}}).then((function(){return t.loadFolders()})).catch((function(e){})).finally((function(){t.deleting[e.identifier]=!1}))},deleteSelectedFiles:function(){return Zt.post("".concat(LogViewer.basePath,"/api/delete-multiple-files"),{files:this.filesChecked},{params:{host:this.hostQueryParam}})},clearCacheForAllFiles:function(){var e=this;this.clearingCache["*"]=!0,Zt.post("".concat(LogViewer.basePath,"/api/clear-cache-all"),{},{params:{host:this.hostQueryParam}}).then((function(){e.cacheRecentlyCleared["*"]=!0,setTimeout((function(){return e.cacheRecentlyCleared["*"]=!1}),2e3),Mi().loadLogs()})).catch((function(e){})).finally((function(){return e.clearingCache["*"]=!1}))}}}),Di=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(t)try{e=e.replace(new RegExp(t,"gi"),"<mark>$&</mark>")}catch(e){}return Ui(e).replace(/&lt;mark&gt;/g,"<mark>").replace(/&lt;\/mark&gt;/g,"</mark>")},Ui=function(e){var t={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#039;"};return e.replace(/[&<>"']/g,(function(e){return t[e]}))},$i=function(e){var t=document.createElement("textarea");t.value=e,t.setAttribute("readonly",""),t.style.position="absolute",t.style.left="-9999px",document.body.appendChild(t);var n=document.getSelection().rangeCount>0&&document.getSelection().getRangeAt(0);t.select(),document.execCommand("copy"),document.body.removeChild(t),n&&(document.getSelection().removeAllRanges(),document.getSelection().addRange(n))},Hi=function(e,t,n){var r=e.currentRoute.value,o={host:r.query.host||void 0,file:r.query.file||void 0,query:r.query.query||void 0,page:r.query.page||void 0};"host"===t?(o.file=void 0,o.page=void 0):"file"===t&&void 0!==o.page&&(o.page=void 0),o[t]=n?String(n):void 0,e.push({name:"home",query:o})},zi=function(){var e=(0,r.ref)({});return{dropdownDirections:e,calculateDropdownDirection:function(t){e.value[t.dataset.toggleId]=function(e){window.innerWidth||document.documentElement.clientWidth;var t=window.innerHeight||document.documentElement.clientHeight;return e.getBoundingClientRect().bottom+190<t?"down":"up"}(t)}}},qi={class:"animate-spin",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},Wi=[(0,r.createElementVNode)("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"},null,-1),(0,r.createElementVNode)("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"},null,-1)];var Ki=n(744);const Gi={},Zi=(0,Ki.Z)(Gi,[["render",function(e,t){return(0,r.openBlock)(),(0,r.createElementBlock)("svg",qi,Wi)}]]);var Yi="file-item-info",Ji="log-level-icon",Qi="log-link.large-screen",Xi={Files:"f",Logs:"l",Hosts:"h",Severity:"s",Settings:"g",Search:"/",Refresh:"r",ShortcutHelp:"?"},ea=function(e,t){for(var n=Array.from(document.querySelectorAll(".".concat(t))),r=n.findIndex((function(t){return t===e}))-1;r>=0&&null===n[r].offsetParent;)r--;return n[r]?n[r]:null},ta=function(e,t){for(var n=Array.from(document.querySelectorAll(".".concat(t))),r=n.findIndex((function(t){return t===e}))+1;r<n.length&&null===n[r].offsetParent;)r++;return n[r]?n[r]:null},na=function(e,t){return Array.from(document.querySelectorAll(".".concat(t))).findIndex((function(t){return t===e}))},ra=function(e){var t;if("INPUT"!==e.target.tagName&&(!e.metaKey&&!e.ctrlKey))if(e.key===Xi.ShortcutHelp){e.preventDefault();var n=Mi();n.helpSlideOverOpen=!n.helpSlideOverOpen}else if(e.key===Xi.Files)e.preventDefault(),function(){var e=document.querySelector(".file-item-container.active .file-item-info");if(e)e.focus();else{var t=document.querySelector(".file-item-container .file-item-info");null==t||t.focus()}}();else if(e.key===Xi.Logs)e.preventDefault(),(t=Array.from(document.querySelectorAll(".".concat(Ji)))).length>0&&t[0].focus();else if(e.key===Xi.Hosts){e.preventDefault();var r=document.getElementById("hosts-toggle-button");null==r||r.click()}else if(e.key===Xi.Severity){e.preventDefault();var o=document.getElementById("severity-dropdown-toggle");null==o||o.click()}else if(e.key===Xi.Settings){e.preventDefault();var i=document.querySelector("#desktop-site-settings .menu-button");null==i||i.click()}else if(e.key===Xi.Search){e.preventDefault();var a=document.getElementById("query");null==a||a.focus()}else if(e.key===Xi.Refresh){e.preventDefault();var l=document.getElementById("reload-logs-button");null==l||l.click()}},oa=function(e){if("ArrowLeft"===e.key)e.preventDefault(),function(){var e=document.querySelector(".file-item-container.active .file-item-info");if(e)e.nextElementSibling.focus();else{var t,n=document.querySelector(".file-item-container .file-item-info");null==n||null===(t=n.nextElementSibling)||void 0===t||t.focus()}}();else if("ArrowRight"===e.key){var t=na(document.activeElement,Ji),n=Array.from(document.querySelectorAll(".".concat(Qi)));n.length>t&&(e.preventDefault(),n[t].focus())}else if("ArrowUp"===e.key){var r=ea(document.activeElement,Ji);r&&(e.preventDefault(),r.focus())}else if("ArrowDown"===e.key){var o=ta(document.activeElement,Ji);o&&(e.preventDefault(),o.focus())}},ia=function(e){if("ArrowLeft"===e.key){var t=na(document.activeElement,Qi),n=Array.from(document.querySelectorAll(".".concat(Ji)));n.length>t&&(e.preventDefault(),n[t].focus())}else if("ArrowUp"===e.key){var r=ea(document.activeElement,Qi);r&&(e.preventDefault(),r.focus())}else if("ArrowDown"===e.key){var o=ta(document.activeElement,Qi);o&&(e.preventDefault(),o.focus())}else if("Enter"===e.key||" "===e.key){e.preventDefault();var i=document.activeElement;i.click(),i.focus()}},aa=function(e){if("ArrowUp"===e.key){var t=ea(document.activeElement,Yi);t&&(e.preventDefault(),t.focus())}else if("ArrowDown"===e.key){var n=ta(document.activeElement,Yi);n&&(e.preventDefault(),n.focus())}else"ArrowRight"===e.key&&(e.preventDefault(),document.activeElement.nextElementSibling.focus())},la=function(e){if("ArrowLeft"===e.key)e.preventDefault(),document.activeElement.previousElementSibling.focus();else if("ArrowRight"===e.key){e.preventDefault();var t=Array.from(document.querySelectorAll(".".concat(Ji)));t.length>0&&t[0].focus()}};function sa(e){return sa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},sa(e)}function ca(){ca=function(){return e};var e={},t=Object.prototype,n=t.hasOwnProperty,r=Object.defineProperty||function(e,t,n){e[t]=n.value},o="function"==typeof Symbol?Symbol:{},i=o.iterator||"@@iterator",a=o.asyncIterator||"@@asyncIterator",l=o.toStringTag||"@@toStringTag";function s(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{s({},"")}catch(e){s=function(e,t,n){return e[t]=n}}function c(e,t,n,o){var i=t&&t.prototype instanceof d?t:d,a=Object.create(i.prototype),l=new k(o||[]);return r(a,"_invoke",{value:C(e,n,l)}),a}function u(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}e.wrap=c;var f={};function d(){}function p(){}function h(){}var v={};s(v,i,(function(){return this}));var m=Object.getPrototypeOf,g=m&&m(m(S([])));g&&g!==t&&n.call(g,i)&&(v=g);var y=h.prototype=d.prototype=Object.create(v);function b(e){["next","throw","return"].forEach((function(t){s(e,t,(function(e){return this._invoke(t,e)}))}))}function w(e,t){function o(r,i,a,l){var s=u(e[r],e,i);if("throw"!==s.type){var c=s.arg,f=c.value;return f&&"object"==sa(f)&&n.call(f,"__await")?t.resolve(f.__await).then((function(e){o("next",e,a,l)}),(function(e){o("throw",e,a,l)})):t.resolve(f).then((function(e){c.value=e,a(c)}),(function(e){return o("throw",e,a,l)}))}l(s.arg)}var i;r(this,"_invoke",{value:function(e,n){function r(){return new t((function(t,r){o(e,n,t,r)}))}return i=i?i.then(r,r):r()}})}function C(e,t,n){var r="suspendedStart";return function(o,i){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===o)throw i;return O()}for(n.method=o,n.arg=i;;){var a=n.delegate;if(a){var l=_(a,n);if(l){if(l===f)continue;return l}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var s=u(e,t,n);if("normal"===s.type){if(r=n.done?"completed":"suspendedYield",s.arg===f)continue;return{value:s.arg,done:n.done}}"throw"===s.type&&(r="completed",n.method="throw",n.arg=s.arg)}}}function _(e,t){var n=t.method,r=e.iterator[n];if(void 0===r)return t.delegate=null,"throw"===n&&e.iterator.return&&(t.method="return",t.arg=void 0,_(e,t),"throw"===t.method)||"return"!==n&&(t.method="throw",t.arg=new TypeError("The iterator does not provide a '"+n+"' method")),f;var o=u(r,e.iterator,t.arg);if("throw"===o.type)return t.method="throw",t.arg=o.arg,t.delegate=null,f;var i=o.arg;return i?i.done?(t[e.resultName]=i.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,f):i:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,f)}function E(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function x(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function k(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(E,this),this.reset(!0)}function S(e){if(e){var t=e[i];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var r=-1,o=function t(){for(;++r<e.length;)if(n.call(e,r))return t.value=e[r],t.done=!1,t;return t.value=void 0,t.done=!0,t};return o.next=o}}return{next:O}}function O(){return{value:void 0,done:!0}}return p.prototype=h,r(y,"constructor",{value:h,configurable:!0}),r(h,"constructor",{value:p,configurable:!0}),p.displayName=s(h,l,"GeneratorFunction"),e.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===p||"GeneratorFunction"===(t.displayName||t.name))},e.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,h):(e.__proto__=h,s(e,l,"GeneratorFunction")),e.prototype=Object.create(y),e},e.awrap=function(e){return{__await:e}},b(w.prototype),s(w.prototype,a,(function(){return this})),e.AsyncIterator=w,e.async=function(t,n,r,o,i){void 0===i&&(i=Promise);var a=new w(c(t,n,r,o),i);return e.isGeneratorFunction(n)?a:a.next().then((function(e){return e.done?e.value:a.next()}))},b(y),s(y,l,"Generator"),s(y,i,(function(){return this})),s(y,"toString",(function(){return"[object Generator]"})),e.keys=function(e){var t=Object(e),n=[];for(var r in t)n.push(r);return n.reverse(),function e(){for(;n.length;){var r=n.pop();if(r in t)return e.value=r,e.done=!1,e}return e.done=!0,e}},e.values=S,k.prototype={constructor:k,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,this.tryEntries.forEach(x),!e)for(var t in this)"t"===t.charAt(0)&&n.call(this,t)&&!isNaN(+t.slice(1))&&(this[t]=void 0)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var t=this;function r(n,r){return a.type="throw",a.arg=e,t.next=n,r&&(t.method="next",t.arg=void 0),!!r}for(var o=this.tryEntries.length-1;o>=0;--o){var i=this.tryEntries[o],a=i.completion;if("root"===i.tryLoc)return r("end");if(i.tryLoc<=this.prev){var l=n.call(i,"catchLoc"),s=n.call(i,"finallyLoc");if(l&&s){if(this.prev<i.catchLoc)return r(i.catchLoc,!0);if(this.prev<i.finallyLoc)return r(i.finallyLoc)}else if(l){if(this.prev<i.catchLoc)return r(i.catchLoc,!0)}else{if(!s)throw new Error("try statement without catch or finally");if(this.prev<i.finallyLoc)return r(i.finallyLoc)}}}},abrupt:function(e,t){for(var r=this.tryEntries.length-1;r>=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev<o.finallyLoc){var i=o;break}}i&&("break"===e||"continue"===e)&&i.tryLoc<=t&&t<=i.finallyLoc&&(i=null);var a=i?i.completion:{};return a.type=e,a.arg=t,i?(this.method="next",this.next=i.finallyLoc,f):this.complete(a)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),f},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),x(n),f}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var o=r.arg;x(n)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:S(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),f}},e}function ua(e,t,n,r,o,i,a){try{var l=e[i](a),s=l.value}catch(e){return void n(e)}l.done?t(s):Promise.resolve(s).then(r,o)}var fa={class:"file-item group"},da={key:0,class:"sr-only"},pa={key:1,class:"sr-only"},ha={key:2,class:"my-auto mr-2"},va=["onClick","checked","value"],ma={class:"file-name"},ga=(0,r.createElementVNode)("span",{class:"sr-only"},"Name:",-1),ya={class:"file-size"},ba=(0,r.createElementVNode)("span",{class:"sr-only"},"Size:",-1),wa={class:"py-2"},Ca={class:"text-brand-500"},_a=["href"],Ea=(0,r.createElementVNode)("div",{class:"divider"},null,-1);const xa={__name:"FileListItem",props:{logFile:{type:Object,required:!0},showSelectToggle:{type:Boolean,default:!1}},emits:["selectForDeletion"],setup:function(e,t){t.emit;var n=e,o=Fi(),i=Nr(),a=zi(),l=a.dropdownDirections,s=a.calculateDropdownDirection,c=(0,r.computed)((function(){return o.selectedFile&&o.selectedFile.identifier===n.logFile.identifier})),u=function(){var e,t=(e=ca().mark((function e(){return ca().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!confirm("Are you sure you want to delete the log file '".concat(n.logFile.name,"'? THIS ACTION CANNOT BE UNDONE."))){e.next=6;break}return e.next=3,o.deleteFile(n.logFile);case 3:return n.logFile.identifier===o.selectedFileIdentifier&&Hi(i,"file",null),e.next=6,o.loadFolders();case 6:case"end":return e.stop()}}),e)})),function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function a(e){ua(i,r,o,a,l,"next",e)}function l(e){ua(i,r,o,a,l,"throw",e)}a(void 0)}))});return function(){return t.apply(this,arguments)}}(),f=function(){o.checkBoxToggle(n.logFile.identifier)},d=function(){o.toggleCheckboxVisibility(),f()};return function(t,n){return(0,r.openBlock)(),(0,r.createElementBlock)("div",{class:(0,r.normalizeClass)(["file-item-container",[(0,r.unref)(c)?"active":""]])},[(0,r.createVNode)((0,r.unref)(Co),null,{default:(0,r.withCtx)((function(){return[(0,r.createElementVNode)("div",fa,[(0,r.createElementVNode)("button",{class:"file-item-info",onKeydown:n[0]||(n[0]=function(){return(0,r.unref)(aa)&&(0,r.unref)(aa).apply(void 0,arguments)})},[(0,r.unref)(c)?(0,r.createCommentVNode)("",!0):((0,r.openBlock)(),(0,r.createElementBlock)("span",da,"Select log file")),(0,r.unref)(c)?((0,r.openBlock)(),(0,r.createElementBlock)("span",pa,"Deselect log file")):(0,r.createCommentVNode)("",!0),e.logFile.can_delete?(0,r.withDirectives)(((0,r.openBlock)(),(0,r.createElementBlock)("span",ha,[(0,r.createElementVNode)("input",{type:"checkbox",onClick:(0,r.withModifiers)(f,["stop"]),checked:(0,r.unref)(o).isChecked(e.logFile),value:(0,r.unref)(o).isChecked(e.logFile)},null,8,va)],512)),[[r.vShow,(0,r.unref)(o).checkBoxesVisibility]]):(0,r.createCommentVNode)("",!0),(0,r.createElementVNode)("span",ma,[ga,(0,r.createTextVNode)((0,r.toDisplayString)(e.logFile.name),1)]),(0,r.createElementVNode)("span",ya,[ba,(0,r.createTextVNode)((0,r.toDisplayString)(e.logFile.size_formatted),1)])],32),(0,r.createVNode)((0,r.unref)(_o),{as:"button",class:"file-dropdown-toggle group-hover:border-brand-600 group-hover:dark:border-brand-800","data-toggle-id":e.logFile.identifier,onKeydown:(0,r.unref)(la),onClick:n[1]||(n[1]=(0,r.withModifiers)((function(e){return(0,r.unref)(s)(e.target)}),["stop"]))},{default:(0,r.withCtx)((function(){return[(0,r.createVNode)((0,r.unref)(Ro),{class:"w-4 h-4 pointer-events-none"})]})),_:1},8,["data-toggle-id","onKeydown"])]),(0,r.createVNode)(r.Transition,{"leave-active-class":"transition ease-in duration-100","leave-from-class":"opacity-100 scale-100","leave-to-class":"opacity-0 scale-90","enter-active-class":"transition ease-out duration-100","enter-from-class":"opacity-0 scale-90","enter-to-class":"opacity-100 scale-100"},{default:(0,r.withCtx)((function(){return[(0,r.createVNode)((0,r.unref)(Eo),{as:"div",class:(0,r.normalizeClass)(["dropdown w-48",[(0,r.unref)(l)[e.logFile.identifier]]])},{default:(0,r.withCtx)((function(){return[(0,r.createElementVNode)("div",wa,[(0,r.createVNode)((0,r.unref)(xo),{onClick:n[2]||(n[2]=(0,r.withModifiers)((function(t){return(0,r.unref)(o).clearCacheForFile(e.logFile)}),["stop","prevent"]))},{default:(0,r.withCtx)((function(t){var n=t.active;return[(0,r.createElementVNode)("button",{class:(0,r.normalizeClass)([n?"active":""])},[(0,r.withDirectives)((0,r.createVNode)((0,r.unref)(Lo),{class:"h-4 w-4 mr-2"},null,512),[[r.vShow,!(0,r.unref)(o).clearingCache[e.logFile.identifier]]]),(0,r.withDirectives)((0,r.createVNode)(Zi,null,null,512),[[r.vShow,(0,r.unref)(o).clearingCache[e.logFile.identifier]]]),(0,r.withDirectives)((0,r.createElementVNode)("span",null,"Clear index",512),[[r.vShow,!(0,r.unref)(o).cacheRecentlyCleared[e.logFile.identifier]&&!(0,r.unref)(o).clearingCache[e.logFile.identifier]]]),(0,r.withDirectives)((0,r.createElementVNode)("span",null,"Clearing...",512),[[r.vShow,!(0,r.unref)(o).cacheRecentlyCleared[e.logFile.identifier]&&(0,r.unref)(o).clearingCache[e.logFile.identifier]]]),(0,r.withDirectives)((0,r.createElementVNode)("span",Ca,"Index cleared",512),[[r.vShow,(0,r.unref)(o).cacheRecentlyCleared[e.logFile.identifier]]])],2)]})),_:1}),e.logFile.can_download?((0,r.openBlock)(),(0,r.createBlock)((0,r.unref)(xo),{key:0,onClick:n[3]||(n[3]=(0,r.withModifiers)((function(){}),["stop"]))},{default:(0,r.withCtx)((function(t){var n=t.active;return[(0,r.createElementVNode)("a",{href:e.logFile.download_url,download:"",class:(0,r.normalizeClass)([n?"active":""])},[(0,r.createVNode)((0,r.unref)(Ao),{class:"w-4 h-4 mr-2"}),(0,r.createTextVNode)(" Download ")],10,_a)]})),_:1})):(0,r.createCommentVNode)("",!0),e.logFile.can_delete?((0,r.openBlock)(),(0,r.createElementBlock)(r.Fragment,{key:1},[Ea,(0,r.createVNode)((0,r.unref)(xo),{onClick:(0,r.withModifiers)(u,["stop","prevent"])},{default:(0,r.withCtx)((function(e){var t=e.active;return[(0,r.createElementVNode)("button",{class:(0,r.normalizeClass)([t?"active":""])},[(0,r.createVNode)((0,r.unref)(No),{class:"w-4 h-4 mr-2"}),(0,r.createTextVNode)(" Delete ")],2)]})),_:1},8,["onClick"]),(0,r.createVNode)((0,r.unref)(xo),{onClick:(0,r.withModifiers)(d,["stop"])},{default:(0,r.withCtx)((function(e){var t=e.active;return[(0,r.createElementVNode)("button",{class:(0,r.normalizeClass)([t?"active":""])},[(0,r.createVNode)((0,r.unref)(No),{class:"w-4 h-4 mr-2"}),(0,r.createTextVNode)(" Delete Multiple ")],2)]})),_:1},8,["onClick"])],64)):(0,r.createCommentVNode)("",!0)])]})),_:1},8,["class"])]})),_:1})]})),_:1})],2)}}},ka=xa;var Sa=n(904),Oa=n(908),Na=n(960),Pa=n(817),Ta=n(902),Va=n(390),Ra=n(69),La=n(520),Aa={class:"checkmark w-[18px] h-[18px] bg-gray-50 dark:bg-gray-800 rounded border dark:border-gray-600 inline-flex items-center justify-center"};const ja={__name:"Checkmark",props:{checked:{type:Boolean,required:!0}},setup:function(e){return function(t,n){return(0,r.openBlock)(),(0,r.createElementBlock)("div",Aa,[e.checked?((0,r.openBlock)(),(0,r.createBlock)((0,r.unref)(La),{key:0,width:"18",height:"18",class:"w-full h-full"})):(0,r.createCommentVNode)("",!0)])}}};var Ba={width:"884",height:"1279",viewBox:"0 0 884 1279",fill:"none",xmlns:"http://www.w3.org/2000/svg"},Ia=[(0,r.createStaticVNode)('<path d="M791.109 297.518L790.231 297.002L788.201 296.383C789.018 297.072 790.04 297.472 791.109 297.518V297.518Z" fill="currentColor"></path><path d="M803.896 388.891L802.916 389.166L803.896 388.891Z" fill="currentColor"></path><path d="M791.484 297.377C791.359 297.361 791.237 297.332 791.118 297.29C791.111 297.371 791.111 297.453 791.118 297.534C791.252 297.516 791.379 297.462 791.484 297.377V297.377Z" fill="currentColor"></path><path d="M791.113 297.529H791.244V297.447L791.113 297.529Z" fill="currentColor"></path><path d="M803.111 388.726L804.591 387.883L805.142 387.573L805.641 387.04C804.702 387.444 803.846 388.016 803.111 388.726V388.726Z" fill="currentColor"></path><path d="M793.669 299.515L792.223 298.138L791.243 297.605C791.77 298.535 792.641 299.221 793.669 299.515V299.515Z" fill="currentColor"></path><path d="M430.019 1186.18C428.864 1186.68 427.852 1187.46 427.076 1188.45L427.988 1187.87C428.608 1187.3 429.485 1186.63 430.019 1186.18Z" fill="currentColor"></path><path d="M641.187 1144.63C641.187 1143.33 640.551 1143.57 640.705 1148.21C640.705 1147.84 640.86 1147.46 640.929 1147.1C641.015 1146.27 641.084 1145.46 641.187 1144.63Z" fill="currentColor"></path><path d="M619.284 1186.18C618.129 1186.68 617.118 1187.46 616.342 1188.45L617.254 1187.87C617.873 1187.3 618.751 1186.63 619.284 1186.18Z" fill="currentColor"></path><path d="M281.304 1196.06C280.427 1195.3 279.354 1194.8 278.207 1194.61C279.136 1195.06 280.065 1195.51 280.684 1195.85L281.304 1196.06Z" fill="currentColor"></path><path d="M247.841 1164.01C247.704 1162.66 247.288 1161.35 246.619 1160.16C247.093 1161.39 247.489 1162.66 247.806 1163.94L247.841 1164.01Z" fill="currentColor"></path><path d="M472.623 590.836C426.682 610.503 374.546 632.802 306.976 632.802C278.71 632.746 250.58 628.868 223.353 621.274L270.086 1101.08C271.74 1121.13 280.876 1139.83 295.679 1153.46C310.482 1167.09 329.87 1174.65 349.992 1174.65C349.992 1174.65 416.254 1178.09 438.365 1178.09C462.161 1178.09 533.516 1174.65 533.516 1174.65C553.636 1174.65 573.019 1167.08 587.819 1153.45C602.619 1139.82 611.752 1121.13 613.406 1101.08L663.459 570.876C641.091 563.237 618.516 558.161 593.068 558.161C549.054 558.144 513.591 573.303 472.623 590.836Z" fill="#FFDD00"></path><path d="M78.6885 386.132L79.4799 386.872L79.9962 387.182C79.5987 386.787 79.1603 386.435 78.6885 386.132V386.132Z" fill="currentColor"></path><path d="M879.567 341.849L872.53 306.352C866.215 274.503 851.882 244.409 819.19 232.898C808.711 229.215 796.821 227.633 788.786 220.01C780.751 212.388 778.376 200.55 776.518 189.572C773.076 169.423 769.842 149.257 766.314 129.143C763.269 111.85 760.86 92.4243 752.928 76.56C742.604 55.2584 721.182 42.8009 699.88 34.559C688.965 30.4844 677.826 27.0375 666.517 24.2352C613.297 10.1947 557.342 5.03277 502.591 2.09047C436.875 -1.53577 370.983 -0.443234 305.422 5.35968C256.625 9.79894 205.229 15.1674 158.858 32.0469C141.91 38.224 124.445 45.6399 111.558 58.7341C95.7448 74.8221 90.5829 99.7026 102.128 119.765C110.336 134.012 124.239 144.078 138.985 150.737C158.192 159.317 178.251 165.846 198.829 170.215C256.126 182.879 315.471 187.851 374.007 189.968C438.887 192.586 503.87 190.464 568.44 183.618C584.408 181.863 600.347 179.758 616.257 177.304C634.995 174.43 647.022 149.928 641.499 132.859C634.891 112.453 617.134 104.538 597.055 107.618C594.095 108.082 591.153 108.512 588.193 108.942L586.06 109.252C579.257 110.113 572.455 110.915 565.653 111.661C551.601 113.175 537.515 114.414 523.394 115.378C491.768 117.58 460.057 118.595 428.363 118.647C397.219 118.647 366.058 117.769 334.983 115.722C320.805 114.793 306.661 113.611 292.552 112.177C286.134 111.506 279.733 110.801 273.333 110.009L267.241 109.235L265.917 109.046L259.602 108.134C246.697 106.189 233.792 103.953 221.025 101.251C219.737 100.965 218.584 100.249 217.758 99.2193C216.932 98.1901 216.482 96.9099 216.482 95.5903C216.482 94.2706 216.932 92.9904 217.758 91.9612C218.584 90.9319 219.737 90.2152 221.025 89.9293H221.266C232.33 87.5721 243.479 85.5589 254.663 83.8038C258.392 83.2188 262.131 82.6453 265.882 82.0832H265.985C272.988 81.6186 280.026 80.3625 286.994 79.5366C347.624 73.2302 408.614 71.0801 469.538 73.1014C499.115 73.9618 528.676 75.6996 558.116 78.6935C564.448 79.3474 570.746 80.0357 577.043 80.8099C579.452 81.1025 581.878 81.4465 584.305 81.7391L589.191 82.4445C603.438 84.5667 617.61 87.1419 631.708 90.1703C652.597 94.7128 679.422 96.1925 688.713 119.077C691.673 126.338 693.015 134.408 694.649 142.03L696.731 151.752C696.786 151.926 696.826 152.105 696.852 152.285C701.773 175.227 706.7 198.169 711.632 221.111C711.994 222.806 712.002 224.557 711.657 226.255C711.312 227.954 710.621 229.562 709.626 230.982C708.632 232.401 707.355 233.6 705.877 234.504C704.398 235.408 702.75 235.997 701.033 236.236H700.895L697.884 236.649L694.908 237.044C685.478 238.272 676.038 239.419 666.586 240.486C647.968 242.608 629.322 244.443 610.648 245.992C573.539 249.077 536.356 251.102 499.098 252.066C480.114 252.57 461.135 252.806 442.162 252.771C366.643 252.712 291.189 248.322 216.173 239.625C208.051 238.662 199.93 237.629 191.808 236.58C198.106 237.389 187.231 235.96 185.029 235.651C179.867 234.928 174.705 234.177 169.543 233.397C152.216 230.798 134.993 227.598 117.7 224.793C96.7944 221.352 76.8005 223.073 57.8906 233.397C42.3685 241.891 29.8055 254.916 21.8776 270.735C13.7217 287.597 11.2956 305.956 7.64786 324.075C4.00009 342.193 -1.67805 361.688 0.472751 380.288C5.10128 420.431 33.165 453.054 73.5313 460.35C111.506 467.232 149.687 472.807 187.971 477.556C338.361 495.975 490.294 498.178 641.155 484.129C653.44 482.982 665.708 481.732 677.959 480.378C681.786 479.958 685.658 480.398 689.292 481.668C692.926 482.938 696.23 485.005 698.962 487.717C701.694 490.429 703.784 493.718 705.08 497.342C706.377 500.967 706.846 504.836 706.453 508.665L702.633 545.797C694.936 620.828 687.239 695.854 679.542 770.874C671.513 849.657 663.431 928.434 655.298 1007.2C653.004 1029.39 650.71 1051.57 648.416 1073.74C646.213 1095.58 645.904 1118.1 641.757 1139.68C635.218 1173.61 612.248 1194.45 578.73 1202.07C548.022 1209.06 516.652 1212.73 485.161 1213.01C450.249 1213.2 415.355 1211.65 380.443 1211.84C343.173 1212.05 297.525 1208.61 268.756 1180.87C243.479 1156.51 239.986 1118.36 236.545 1085.37C231.957 1041.7 227.409 998.039 222.9 954.381L197.607 711.615L181.244 554.538C180.968 551.94 180.693 549.376 180.435 546.76C178.473 528.023 165.207 509.681 144.301 510.627C126.407 511.418 106.069 526.629 108.168 546.76L120.298 663.214L145.385 904.104C152.532 972.528 159.661 1040.96 166.773 1109.41C168.15 1122.52 169.44 1135.67 170.885 1148.78C178.749 1220.43 233.465 1259.04 301.224 1269.91C340.799 1276.28 381.337 1277.59 421.497 1278.24C472.979 1279.07 524.977 1281.05 575.615 1271.72C650.653 1257.95 706.952 1207.85 714.987 1130.13C717.282 1107.69 719.576 1085.25 721.87 1062.8C729.498 988.559 737.115 914.313 744.72 840.061L769.601 597.451L781.009 486.263C781.577 480.749 783.905 475.565 787.649 471.478C791.392 467.391 796.352 464.617 801.794 463.567C823.25 459.386 843.761 452.245 859.023 435.916C883.318 409.918 888.153 376.021 879.567 341.849ZM72.4301 365.835C72.757 365.68 72.1548 368.484 71.8967 369.792C71.8451 367.813 71.9483 366.058 72.4301 365.835ZM74.5121 381.94C74.6842 381.819 75.2003 382.508 75.7337 383.334C74.925 382.576 74.4089 382.009 74.4949 381.94H74.5121ZM76.5597 384.641C77.2996 385.897 77.6953 386.689 76.5597 384.641V384.641ZM80.672 387.979H80.7752C80.7752 388.1 80.9645 388.22 81.0333 388.341C80.9192 388.208 80.7925 388.087 80.6548 387.979H80.672ZM800.796 382.989C793.088 390.319 781.473 393.726 769.996 395.43C641.292 414.529 510.713 424.199 380.597 419.932C287.476 416.749 195.336 406.407 103.144 393.382C94.1102 392.109 84.3197 390.457 78.1082 383.798C66.4078 371.237 72.1548 345.944 75.2003 330.768C77.9878 316.865 83.3218 298.334 99.8572 296.355C125.667 293.327 155.64 304.218 181.175 308.09C211.917 312.781 242.774 316.538 273.745 319.36C405.925 331.405 540.325 329.529 671.92 311.91C695.905 308.686 719.805 304.941 743.619 300.674C764.835 296.871 788.356 289.731 801.175 311.703C809.967 326.673 811.137 346.701 809.778 363.615C809.359 370.984 806.139 377.915 800.779 382.989H800.796Z" fill="currentColor"></path>',14)];const Ma={},Fa=(0,Ki.Z)(Ma,[["render",function(e,t){return(0,r.openBlock)(),(0,r.createElementBlock)("svg",Ba,Ia)}]]);var Da=(0,r.createElementVNode)("span",{class:"sr-only"},"Settings dropdown",-1),Ua={class:"py-2"},$a=(0,r.createElementVNode)("div",{class:"label"},"Settings",-1),Ha=(0,r.createElementVNode)("span",{class:"ml-3"},"Shorter stack traces",-1),za=(0,r.createElementVNode)("div",{class:"divider"},null,-1),qa=(0,r.createElementVNode)("div",{class:"label"},"Actions",-1),Wa={class:"text-brand-500"},Ka={class:"text-brand-500"},Ga=(0,r.createElementVNode)("div",{class:"divider"},null,-1),Za=["innerHTML"],Ya=(0,r.createElementVNode)("div",{class:"divider"},null,-1),Ja={class:"w-4 h-4 mr-3 flex flex-col items-center"};const Qa={__name:"SiteSettingsDropdown",setup:function(e){var t=Mi(),n=Fi(),o=(0,r.ref)(!1),i=function(){$i(window.location.href),o.value=!0,setTimeout((function(){return o.value=!1}),2e3)};return(0,r.watch)((function(){return t.shorterStackTraces}),(function(){return t.loadLogs()})),function(e,a){return(0,r.openBlock)(),(0,r.createBlock)((0,r.unref)(Co),{as:"div",class:"relative"},{default:(0,r.withCtx)((function(){return[(0,r.createVNode)((0,r.unref)(_o),{as:"button",class:"menu-button"},{default:(0,r.withCtx)((function(){return[Da,(0,r.createVNode)((0,r.unref)(Sa),{class:"w-5 h-5"})]})),_:1}),(0,r.createVNode)(r.Transition,{"leave-active-class":"transition ease-in duration-100","leave-from-class":"opacity-100 scale-100","leave-to-class":"opacity-0 scale-90","enter-active-class":"transition ease-out duration-100","enter-from-class":"opacity-0 scale-90","enter-to-class":"opacity-100 scale-100"},{default:(0,r.withCtx)((function(){return[(0,r.createVNode)((0,r.unref)(Eo),{as:"div",style:{"min-width":"250px"},class:"dropdown"},{default:(0,r.withCtx)((function(){return[(0,r.createElementVNode)("div",Ua,[$a,(0,r.createVNode)((0,r.unref)(xo),null,{default:(0,r.withCtx)((function(e){var n=e.active;return[(0,r.createElementVNode)("button",{class:(0,r.normalizeClass)([n?"active":""]),onClick:a[0]||(a[0]=(0,r.withModifiers)((function(e){return(0,r.unref)(t).shorterStackTraces=!(0,r.unref)(t).shorterStackTraces}),["stop","prevent"]))},[(0,r.createVNode)(ja,{checked:(0,r.unref)(t).shorterStackTraces},null,8,["checked"]),Ha],2)]})),_:1}),za,qa,(0,r.createVNode)((0,r.unref)(xo),{onClick:(0,r.withModifiers)((0,r.unref)(n).clearCacheForAllFiles,["stop","prevent"])},{default:(0,r.withCtx)((function(e){var t=e.active;return[(0,r.createElementVNode)("button",{class:(0,r.normalizeClass)([t?"active":""])},[(0,r.withDirectives)((0,r.createVNode)((0,r.unref)(Lo),{class:"w-4 h-4 mr-1.5"},null,512),[[r.vShow,!(0,r.unref)(n).clearingCache["*"]]]),(0,r.withDirectives)((0,r.createVNode)(Zi,{class:"w-4 h-4 mr-1.5"},null,512),[[r.vShow,(0,r.unref)(n).clearingCache["*"]]]),(0,r.withDirectives)((0,r.createElementVNode)("span",null,"Clear indices for all files",512),[[r.vShow,!(0,r.unref)(n).cacheRecentlyCleared["*"]&&!(0,r.unref)(n).clearingCache["*"]]]),(0,r.withDirectives)((0,r.createElementVNode)("span",null,"Please wait...",512),[[r.vShow,!(0,r.unref)(n).cacheRecentlyCleared["*"]&&(0,r.unref)(n).clearingCache["*"]]]),(0,r.withDirectives)((0,r.createElementVNode)("span",Wa,"File indices cleared",512),[[r.vShow,(0,r.unref)(n).cacheRecentlyCleared["*"]]])],2)]})),_:1},8,["onClick"]),(0,r.createVNode)((0,r.unref)(xo),{onClick:(0,r.withModifiers)(i,["stop","prevent"])},{default:(0,r.withCtx)((function(e){var t=e.active;return[(0,r.createElementVNode)("button",{class:(0,r.normalizeClass)([t?"active":""])},[(0,r.createVNode)((0,r.unref)(Oa),{class:"w-4 h-4"}),(0,r.withDirectives)((0,r.createElementVNode)("span",null,"Share this page",512),[[r.vShow,!o.value]]),(0,r.withDirectives)((0,r.createElementVNode)("span",Ka,"Link copied!",512),[[r.vShow,o.value]])],2)]})),_:1},8,["onClick"]),Ga,(0,r.createVNode)((0,r.unref)(xo),{onClick:a[1]||(a[1]=(0,r.withModifiers)((function(e){return(0,r.unref)(t).toggleTheme()}),["stop","prevent"]))},{default:(0,r.withCtx)((function(e){var n=e.active;return[(0,r.createElementVNode)("button",{class:(0,r.normalizeClass)([n?"active":""])},[(0,r.withDirectives)((0,r.createVNode)((0,r.unref)(Na),{class:"w-4 h-4"},null,512),[[r.vShow,(0,r.unref)(t).theme===(0,r.unref)(Ii).System]]),(0,r.withDirectives)((0,r.createVNode)((0,r.unref)(Pa),{class:"w-4 h-4"},null,512),[[r.vShow,(0,r.unref)(t).theme===(0,r.unref)(Ii).Light]]),(0,r.withDirectives)((0,r.createVNode)((0,r.unref)(Ta),{class:"w-4 h-4"},null,512),[[r.vShow,(0,r.unref)(t).theme===(0,r.unref)(Ii).Dark]]),(0,r.createElementVNode)("span",null,[(0,r.createTextVNode)("Theme: "),(0,r.createElementVNode)("span",{innerHTML:(0,r.unref)(t).theme,class:"font-semibold"},null,8,Za)])],2)]})),_:1}),(0,r.createVNode)((0,r.unref)(xo),null,{default:(0,r.withCtx)((function(e){var n=e.active;return[(0,r.createElementVNode)("button",{onClick:a[2]||(a[2]=function(e){return(0,r.unref)(t).helpSlideOverOpen=!0}),class:(0,r.normalizeClass)([n?"active":""])},[(0,r.createVNode)((0,r.unref)(Va),{class:"w-4 h-4"}),(0,r.createTextVNode)(" Keyboard Shortcuts ")],2)]})),_:1}),(0,r.createVNode)((0,r.unref)(xo),null,{default:(0,r.withCtx)((function(e){var t=e.active;return[(0,r.createElementVNode)("a",{href:"https://log-viewer.opcodes.io/docs",target:"_blank",class:(0,r.normalizeClass)([t?"active":""])},[(0,r.createVNode)((0,r.unref)(Va),{class:"w-4 h-4"}),(0,r.createTextVNode)(" Documentation ")],2)]})),_:1}),(0,r.createVNode)((0,r.unref)(xo),null,{default:(0,r.withCtx)((function(e){var t=e.active;return[(0,r.createElementVNode)("a",{href:"https://www.github.com/opcodesio/log-viewer",target:"_blank",class:(0,r.normalizeClass)([t?"active":""])},[(0,r.createVNode)((0,r.unref)(Va),{class:"w-4 h-4"}),(0,r.createTextVNode)(" Help ")],2)]})),_:1}),Ya,(0,r.createVNode)((0,r.unref)(xo),null,{default:(0,r.withCtx)((function(e){var t=e.active;return[(0,r.createElementVNode)("a",{href:"https://www.buymeacoffee.com/arunas",target:"_blank",class:(0,r.normalizeClass)([t?"active":""])},[(0,r.createElementVNode)("div",Ja,[(0,r.createVNode)(Fa,{class:"h-4 w-auto"})]),(0,r.createElementVNode)("strong",{class:(0,r.normalizeClass)([t?"text-white":"text-brand-500"])},"Show your support",2),(0,r.createVNode)((0,r.unref)(Ra),{class:"ml-2 w-4 h-4 opacity-75"})],2)]})),_:1})])]})),_:1})]})),_:1})]})),_:1})}}};var Xa=(e=>(e[e.None=1]="None",e[e.Focusable=2]="Focusable",e[e.Hidden=4]="Hidden",e))(Xa||{});let el=(0,r.defineComponent)({name:"Hidden",props:{as:{type:[Object,String],default:"div"},features:{type:Number,default:1}},setup:(e,{slots:t,attrs:n})=>()=>{let{features:r,...o}=e;return Ar({ourProps:{"aria-hidden":2==(2&r)||void 0,style:{position:"fixed",top:1,left:1,width:1,height:0,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0",...4==(4&r)&&2!=(2&r)&&{display:"none"}}},theirProps:o,slot:{},attrs:n,slots:t,name:"Hidden"})}});function tl(e={},t=null,n=[]){for(let[r,o]of Object.entries(e))rl(n,nl(t,r),o);return n}function nl(e,t){return e?e+"["+t+"]":t}function rl(e,t,n){if(Array.isArray(n))for(let[r,o]of n.entries())rl(e,nl(t,r.toString()),o);else n instanceof Date?e.push([t,n.toISOString()]):"boolean"==typeof n?e.push([t,n?"1":"0"]):"string"==typeof n?e.push([t,n]):"number"==typeof n?e.push([t,`${n}`]):null==n?e.push([t,""]):tl(n,t,e)}function ol(e,t){return e===t}var il=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(il||{}),al=(e=>(e[e.Single=0]="Single",e[e.Multi=1]="Multi",e))(al||{}),ll=(e=>(e[e.Pointer=0]="Pointer",e[e.Other=1]="Other",e))(ll||{});let sl=Symbol("ListboxContext");function cl(e){let t=(0,r.inject)(sl,null);if(null===t){let t=new Error(`<${e} /> is missing a parent <Listbox /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,cl),t}return t}let ul=(0,r.defineComponent)({name:"Listbox",emits:{"update:modelValue":e=>!0},props:{as:{type:[Object,String],default:"template"},disabled:{type:[Boolean],default:!1},by:{type:[String,Function],default:()=>ol},horizontal:{type:[Boolean],default:!1},modelValue:{type:[Object,String,Number,Boolean],default:void 0},defaultValue:{type:[Object,String,Number,Boolean],default:void 0},name:{type:String,optional:!0},multiple:{type:[Boolean],default:!1}},inheritAttrs:!1,setup(e,{slots:t,attrs:n,emit:o}){let i=(0,r.ref)(1),a=(0,r.ref)(null),l=(0,r.ref)(null),s=(0,r.ref)(null),c=(0,r.ref)([]),u=(0,r.ref)(""),f=(0,r.ref)(null),d=(0,r.ref)(1);function p(e=(e=>e)){let t=null!==f.value?c.value[f.value]:null,n=co(e(c.value.slice()),(e=>zr(e.dataRef.domRef))),r=t?n.indexOf(t):null;return-1===r&&(r=null),{options:n,activeOptionIndex:r}}let h=(0,r.computed)((()=>e.multiple?1:0)),[v,m]=function(e,t,n){let o=(0,r.ref)(null==n?void 0:n.value),i=(0,r.computed)((()=>void 0!==e.value));return[(0,r.computed)((()=>i.value?e.value:o.value)),function(e){return i.value||(o.value=e),null==t?void 0:t(e)}]}((0,r.computed)((()=>void 0===e.modelValue?Tr(h.value,{1:[],0:void 0}):e.modelValue)),(e=>o("update:modelValue",e)),(0,r.computed)((()=>e.defaultValue))),g={listboxState:i,value:v,mode:h,compare(t,n){if("string"==typeof e.by){let r=e.by;return(null==t?void 0:t[r])===(null==n?void 0:n[r])}return e.by(t,n)},orientation:(0,r.computed)((()=>e.horizontal?"horizontal":"vertical")),labelRef:a,buttonRef:l,optionsRef:s,disabled:(0,r.computed)((()=>e.disabled)),options:c,searchQuery:u,activeOptionIndex:f,activationTrigger:d,closeListbox(){e.disabled||1!==i.value&&(i.value=1,f.value=null)},openListbox(){e.disabled||0!==i.value&&(i.value=0)},goToOption(t,n,r){if(e.disabled||1===i.value)return;let o=p(),a=Hr(t===$r.Specific?{focus:$r.Specific,id:n}:{focus:t},{resolveItems:()=>o.options,resolveActiveIndex:()=>o.activeOptionIndex,resolveId:e=>e.id,resolveDisabled:e=>e.dataRef.disabled});u.value="",f.value=a,d.value=null!=r?r:1,c.value=o.options},search(t){if(e.disabled||1===i.value)return;let n=""!==u.value?0:1;u.value+=t.toLowerCase();let r=(null!==f.value?c.value.slice(f.value+n).concat(c.value.slice(0,f.value+n)):c.value).find((e=>e.dataRef.textValue.startsWith(u.value)&&!e.dataRef.disabled)),o=r?c.value.indexOf(r):-1;-1===o||o===f.value||(f.value=o,d.value=1)},clearSearch(){e.disabled||1!==i.value&&""!==u.value&&(u.value="")},registerOption(e,t){let n=p((n=>[...n,{id:e,dataRef:t}]));c.value=n.options,f.value=n.activeOptionIndex},unregisterOption(e){let t=p((t=>{let n=t.findIndex((t=>t.id===e));return-1!==n&&t.splice(n,1),t}));c.value=t.options,f.value=t.activeOptionIndex,d.value=1},select(t){e.disabled||m(Tr(h.value,{0:()=>t,1:()=>{let e=(0,r.toRaw)(g.value.value).slice(),n=(0,r.toRaw)(t),o=e.findIndex((e=>g.compare(n,(0,r.toRaw)(e))));return-1===o?e.push(n):e.splice(o,1),e}}))}};ho([l,s],((e,t)=>{var n;g.closeListbox(),io(t,oo.Loose)||(e.preventDefault(),null==(n=zr(l))||n.focus())}),(0,r.computed)((()=>0===i.value))),(0,r.provide)(sl,g),Yr((0,r.computed)((()=>Tr(i.value,{0:Gr.Open,1:Gr.Closed}))));let y=(0,r.computed)((()=>{var e;return null==(e=zr(l))?void 0:e.closest("form")}));return(0,r.onMounted)((()=>{(0,r.watch)([y],(()=>{if(y.value&&void 0!==e.defaultValue)return y.value.addEventListener("reset",t),()=>{var e;null==(e=y.value)||e.removeEventListener("reset",t)};function t(){g.select(e.defaultValue)}}),{immediate:!0})})),()=>{let{name:o,modelValue:a,disabled:l,...s}=e,c={open:0===i.value,disabled:l,value:v.value};return(0,r.h)(r.Fragment,[...null!=o&&null!=v.value?tl({[o]:v.value}).map((([e,t])=>(0,r.h)(el,function(e){let t=Object.assign({},e);for(let e in t)void 0===t[e]&&delete t[e];return t}({features:Xa.Hidden,key:e,as:"input",type:"hidden",hidden:!0,readOnly:!0,name:e,value:t})))):[],Ar({ourProps:{},theirProps:{...n,...Mr(s,["defaultValue","onUpdate:modelValue","horizontal","multiple","by"])},slot:c,slots:t,attrs:n,name:"Listbox"})])}}}),fl=(0,r.defineComponent)({name:"ListboxLabel",props:{as:{type:[Object,String],default:"label"},id:{type:String,default:()=>`headlessui-listbox-label-${Dr()}`}},setup(e,{attrs:t,slots:n}){let r=cl("ListboxLabel");function o(){var e;null==(e=zr(r.buttonRef))||e.focus({preventScroll:!0})}return()=>{let i={open:0===r.listboxState.value,disabled:r.disabled.value},{id:a,...l}=e;return Ar({ourProps:{id:a,ref:r.labelRef,onClick:o},theirProps:l,slot:i,attrs:t,slots:n,name:"ListboxLabel"})}}}),dl=(0,r.defineComponent)({name:"ListboxButton",props:{as:{type:[Object,String],default:"button"},id:{type:String,default:()=>`headlessui-listbox-button-${Dr()}`}},setup(e,{attrs:t,slots:n,expose:o}){let i=cl("ListboxButton");function a(e){switch(e.key){case Ur.Space:case Ur.Enter:case Ur.ArrowDown:e.preventDefault(),i.openListbox(),(0,r.nextTick)((()=>{var e;null==(e=zr(i.optionsRef))||e.focus({preventScroll:!0}),i.value.value||i.goToOption($r.First)}));break;case Ur.ArrowUp:e.preventDefault(),i.openListbox(),(0,r.nextTick)((()=>{var e;null==(e=zr(i.optionsRef))||e.focus({preventScroll:!0}),i.value.value||i.goToOption($r.Last)}))}}function l(e){if(e.key===Ur.Space)e.preventDefault()}function s(e){i.disabled.value||(0===i.listboxState.value?(i.closeListbox(),(0,r.nextTick)((()=>{var e;return null==(e=zr(i.buttonRef))?void 0:e.focus({preventScroll:!0})}))):(e.preventDefault(),i.openListbox(),function(e){requestAnimationFrame((()=>requestAnimationFrame(e)))}((()=>{var e;return null==(e=zr(i.optionsRef))?void 0:e.focus({preventScroll:!0})}))))}o({el:i.buttonRef,$el:i.buttonRef});let c=Qr((0,r.computed)((()=>({as:e.as,type:t.type}))),i.buttonRef);return()=>{var r,o;let u={open:0===i.listboxState.value,disabled:i.disabled.value,value:i.value.value},{id:f,...d}=e;return Ar({ourProps:{ref:i.buttonRef,id:f,type:c.value,"aria-haspopup":"listbox","aria-controls":null==(r=zr(i.optionsRef))?void 0:r.id,"aria-expanded":i.disabled.value?void 0:0===i.listboxState.value,"aria-labelledby":i.labelRef.value?[null==(o=zr(i.labelRef))?void 0:o.id,f].join(" "):void 0,disabled:!0===i.disabled.value||void 0,onKeydown:a,onKeyup:l,onClick:s},theirProps:d,slot:u,attrs:t,slots:n,name:"ListboxButton"})}}}),pl=(0,r.defineComponent)({name:"ListboxOptions",props:{as:{type:[Object,String],default:"ul"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},id:{type:String,default:()=>`headlessui-listbox-options-${Dr()}`}},setup(e,{attrs:t,slots:n,expose:o}){let i=cl("ListboxOptions"),a=(0,r.ref)(null);function l(e){switch(a.value&&clearTimeout(a.value),e.key){case Ur.Space:if(""!==i.searchQuery.value)return e.preventDefault(),e.stopPropagation(),i.search(e.key);case Ur.Enter:if(e.preventDefault(),e.stopPropagation(),null!==i.activeOptionIndex.value){let e=i.options.value[i.activeOptionIndex.value];i.select(e.dataRef.value)}0===i.mode.value&&(i.closeListbox(),(0,r.nextTick)((()=>{var e;return null==(e=zr(i.buttonRef))?void 0:e.focus({preventScroll:!0})})));break;case Tr(i.orientation.value,{vertical:Ur.ArrowDown,horizontal:Ur.ArrowRight}):return e.preventDefault(),e.stopPropagation(),i.goToOption($r.Next);case Tr(i.orientation.value,{vertical:Ur.ArrowUp,horizontal:Ur.ArrowLeft}):return e.preventDefault(),e.stopPropagation(),i.goToOption($r.Previous);case Ur.Home:case Ur.PageUp:return e.preventDefault(),e.stopPropagation(),i.goToOption($r.First);case Ur.End:case Ur.PageDown:return e.preventDefault(),e.stopPropagation(),i.goToOption($r.Last);case Ur.Escape:e.preventDefault(),e.stopPropagation(),i.closeListbox(),(0,r.nextTick)((()=>{var e;return null==(e=zr(i.buttonRef))?void 0:e.focus({preventScroll:!0})}));break;case Ur.Tab:e.preventDefault(),e.stopPropagation();break;default:1===e.key.length&&(i.search(e.key),a.value=setTimeout((()=>i.clearSearch()),350))}}o({el:i.optionsRef,$el:i.optionsRef});let s=Zr(),c=(0,r.computed)((()=>null!==s?s.value===Gr.Open:0===i.listboxState.value));return()=>{var r,o,a,s;let u={open:0===i.listboxState.value},{id:f,...d}=e;return Ar({ourProps:{"aria-activedescendant":null===i.activeOptionIndex.value||null==(r=i.options.value[i.activeOptionIndex.value])?void 0:r.id,"aria-multiselectable":1===i.mode.value||void 0,"aria-labelledby":null!=(s=null==(o=zr(i.labelRef))?void 0:o.id)?s:null==(a=zr(i.buttonRef))?void 0:a.id,"aria-orientation":i.orientation.value,id:f,onKeydown:l,role:"listbox",tabIndex:0,ref:i.optionsRef},theirProps:d,slot:u,attrs:t,slots:n,features:Rr.RenderStrategy|Rr.Static,visible:c.value,name:"ListboxOptions"})}}}),hl=(0,r.defineComponent)({name:"ListboxOption",props:{as:{type:[Object,String],default:"li"},value:{type:[Object,String,Number,Boolean]},disabled:{type:Boolean,default:!1},id:{type:String,default:()=>`headlessui-listbox.option-${Dr()}`}},setup(e,{slots:t,attrs:n,expose:o}){let i=cl("ListboxOption"),a=(0,r.ref)(null);o({el:a,$el:a});let l=(0,r.computed)((()=>null!==i.activeOptionIndex.value&&i.options.value[i.activeOptionIndex.value].id===e.id)),s=(0,r.computed)((()=>Tr(i.mode.value,{0:()=>i.compare((0,r.toRaw)(i.value.value),(0,r.toRaw)(e.value)),1:()=>(0,r.toRaw)(i.value.value).some((t=>i.compare((0,r.toRaw)(t),(0,r.toRaw)(e.value))))}))),c=(0,r.computed)((()=>Tr(i.mode.value,{1:()=>{var t;let n=(0,r.toRaw)(i.value.value);return(null==(t=i.options.value.find((e=>n.some((t=>i.compare((0,r.toRaw)(t),(0,r.toRaw)(e.dataRef.value)))))))?void 0:t.id)===e.id},0:()=>s.value}))),u=(0,r.computed)((()=>({disabled:e.disabled,value:e.value,textValue:"",domRef:a})));function f(t){if(e.disabled)return t.preventDefault();i.select(e.value),0===i.mode.value&&(i.closeListbox(),(0,r.nextTick)((()=>{var e;return null==(e=zr(i.buttonRef))?void 0:e.focus({preventScroll:!0})})))}function d(){if(e.disabled)return i.goToOption($r.Nothing);i.goToOption($r.Specific,e.id)}(0,r.onMounted)((()=>{var e,t;let n=null==(t=null==(e=zr(a))?void 0:e.textContent)?void 0:t.toLowerCase().trim();void 0!==n&&(u.value.textValue=n)})),(0,r.onMounted)((()=>i.registerOption(e.id,u))),(0,r.onUnmounted)((()=>i.unregisterOption(e.id))),(0,r.onMounted)((()=>{(0,r.watch)([i.listboxState,s],(()=>{0===i.listboxState.value&&(!s.value||Tr(i.mode.value,{1:()=>{c.value&&i.goToOption($r.Specific,e.id)},0:()=>{i.goToOption($r.Specific,e.id)}}))}),{immediate:!0})})),(0,r.watchEffect)((()=>{0===i.listboxState.value&&(!l.value||0!==i.activationTrigger.value&&(0,r.nextTick)((()=>{var e,t;return null==(t=null==(e=zr(a))?void 0:e.scrollIntoView)?void 0:t.call(e,{block:"nearest"})})))}));let p=mo();function h(e){p.update(e)}function v(t){!p.wasMoved(t)||e.disabled||l.value||i.goToOption($r.Specific,e.id,0)}function m(t){!p.wasMoved(t)||e.disabled||!l.value||i.goToOption($r.Nothing)}return()=>{let{disabled:r}=e,o={active:l.value,selected:s.value,disabled:r},{id:i,value:c,disabled:u,...p}=e;return Ar({ourProps:{id:i,ref:a,role:"option",tabIndex:!0===r?void 0:-1,"aria-disabled":!0===r||void 0,"aria-selected":s.value,disabled:void 0,onClick:f,onFocus:d,onPointerenter:h,onMouseenter:h,onPointermove:v,onMousemove:v,onPointerleave:m,onMouseleave:m},theirProps:p,slot:o,attrs:n,slots:t,name:"ListboxOption"})}}});var vl=n(889),ml={class:"relative mt-1"},gl={class:"block truncate"},yl={class:"pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2"};const bl={__name:"HostSelector",setup:function(e){var t=Nr(),n=Bo();return(0,r.watch)((function(){return n.selectedHost}),(function(e){Hi(t,"host",null!=e&&e.is_remote?e.identifier:null)})),function(e,t){return(0,r.openBlock)(),(0,r.createBlock)((0,r.unref)(ul),{as:"div",modelValue:(0,r.unref)(n).selectedHostIdentifier,"onUpdate:modelValue":t[0]||(t[0]=function(e){return(0,r.unref)(n).selectedHostIdentifier=e})},{default:(0,r.withCtx)((function(){return[(0,r.createVNode)((0,r.unref)(fl),{class:"ml-1 block text-sm text-gray-500 dark:text-gray-400"},{default:(0,r.withCtx)((function(){return[(0,r.createTextVNode)("Select host")]})),_:1}),(0,r.createElementVNode)("div",ml,[(0,r.createVNode)((0,r.unref)(dl),{id:"hosts-toggle-button",class:"cursor-pointer relative text-gray-800 dark:text-gray-200 w-full cursor-default rounded-md border border-gray-300 dark:border-gray-700 bg-white dark:bg-gray-800 py-2 pl-4 pr-10 text-left hover:border-brand-600 hover:dark:border-brand-800 focus:border-brand-500 focus:outline-none focus:ring-1 focus:ring-brand-500 text-sm"},{default:(0,r.withCtx)((function(){var e;return[(0,r.createElementVNode)("span",gl,(0,r.toDisplayString)((null===(e=(0,r.unref)(n).selectedHost)||void 0===e?void 0:e.name)||"Please select a server"),1),(0,r.createElementVNode)("span",yl,[(0,r.createVNode)((0,r.unref)(vl),{class:"h-5 w-5 text-gray-400","aria-hidden":"true"})])]})),_:1}),(0,r.createVNode)(r.Transition,{"leave-active-class":"transition ease-in duration-100","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:(0,r.withCtx)((function(){return[(0,r.createVNode)((0,r.unref)(pl),{class:"absolute z-20 mt-1 max-h-60 w-full overflow-auto rounded-md shadow-md bg-white dark:bg-gray-800 py-1 border border-gray-200 dark:border-gray-700 ring-1 ring-brand ring-opacity-5 focus:outline-none text-sm"},{default:(0,r.withCtx)((function(){return[((0,r.openBlock)(!0),(0,r.createElementBlock)(r.Fragment,null,(0,r.renderList)((0,r.unref)(n).hosts,(function(e){return(0,r.openBlock)(),(0,r.createBlock)((0,r.unref)(hl),{as:"template",key:e.identifier,value:e.identifier},{default:(0,r.withCtx)((function(t){var n=t.active,o=t.selected;return[(0,r.createElementVNode)("li",{class:(0,r.normalizeClass)([n?"text-white bg-brand-600":"text-gray-900 dark:text-gray-300","relative cursor-default select-none py-2 pl-3 pr-9"])},[(0,r.createElementVNode)("span",{class:(0,r.normalizeClass)([o?"font-semibold":"font-normal","block truncate"])},(0,r.toDisplayString)(e.name),3),o?((0,r.openBlock)(),(0,r.createElementBlock)("span",{key:0,class:(0,r.normalizeClass)([n?"text-white":"text-brand-600","absolute inset-y-0 right-0 flex items-center pr-4"])},[(0,r.createVNode)((0,r.unref)(La),{class:"h-5 w-5","aria-hidden":"true"})],2)):(0,r.createCommentVNode)("",!0)],2)]})),_:2},1032,["value"])})),128))]})),_:1})]})),_:1})])]})),_:1},8,["modelValue"])}}},wl=bl;function Cl(e){return Cl="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Cl(e)}function _l(){_l=function(){return e};var e={},t=Object.prototype,n=t.hasOwnProperty,r=Object.defineProperty||function(e,t,n){e[t]=n.value},o="function"==typeof Symbol?Symbol:{},i=o.iterator||"@@iterator",a=o.asyncIterator||"@@asyncIterator",l=o.toStringTag||"@@toStringTag";function s(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{s({},"")}catch(e){s=function(e,t,n){return e[t]=n}}function c(e,t,n,o){var i=t&&t.prototype instanceof d?t:d,a=Object.create(i.prototype),l=new k(o||[]);return r(a,"_invoke",{value:C(e,n,l)}),a}function u(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}e.wrap=c;var f={};function d(){}function p(){}function h(){}var v={};s(v,i,(function(){return this}));var m=Object.getPrototypeOf,g=m&&m(m(S([])));g&&g!==t&&n.call(g,i)&&(v=g);var y=h.prototype=d.prototype=Object.create(v);function b(e){["next","throw","return"].forEach((function(t){s(e,t,(function(e){return this._invoke(t,e)}))}))}function w(e,t){function o(r,i,a,l){var s=u(e[r],e,i);if("throw"!==s.type){var c=s.arg,f=c.value;return f&&"object"==Cl(f)&&n.call(f,"__await")?t.resolve(f.__await).then((function(e){o("next",e,a,l)}),(function(e){o("throw",e,a,l)})):t.resolve(f).then((function(e){c.value=e,a(c)}),(function(e){return o("throw",e,a,l)}))}l(s.arg)}var i;r(this,"_invoke",{value:function(e,n){function r(){return new t((function(t,r){o(e,n,t,r)}))}return i=i?i.then(r,r):r()}})}function C(e,t,n){var r="suspendedStart";return function(o,i){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===o)throw i;return O()}for(n.method=o,n.arg=i;;){var a=n.delegate;if(a){var l=_(a,n);if(l){if(l===f)continue;return l}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var s=u(e,t,n);if("normal"===s.type){if(r=n.done?"completed":"suspendedYield",s.arg===f)continue;return{value:s.arg,done:n.done}}"throw"===s.type&&(r="completed",n.method="throw",n.arg=s.arg)}}}function _(e,t){var n=t.method,r=e.iterator[n];if(void 0===r)return t.delegate=null,"throw"===n&&e.iterator.return&&(t.method="return",t.arg=void 0,_(e,t),"throw"===t.method)||"return"!==n&&(t.method="throw",t.arg=new TypeError("The iterator does not provide a '"+n+"' method")),f;var o=u(r,e.iterator,t.arg);if("throw"===o.type)return t.method="throw",t.arg=o.arg,t.delegate=null,f;var i=o.arg;return i?i.done?(t[e.resultName]=i.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,f):i:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,f)}function E(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function x(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function k(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(E,this),this.reset(!0)}function S(e){if(e){var t=e[i];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var r=-1,o=function t(){for(;++r<e.length;)if(n.call(e,r))return t.value=e[r],t.done=!1,t;return t.value=void 0,t.done=!0,t};return o.next=o}}return{next:O}}function O(){return{value:void 0,done:!0}}return p.prototype=h,r(y,"constructor",{value:h,configurable:!0}),r(h,"constructor",{value:p,configurable:!0}),p.displayName=s(h,l,"GeneratorFunction"),e.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===p||"GeneratorFunction"===(t.displayName||t.name))},e.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,h):(e.__proto__=h,s(e,l,"GeneratorFunction")),e.prototype=Object.create(y),e},e.awrap=function(e){return{__await:e}},b(w.prototype),s(w.prototype,a,(function(){return this})),e.AsyncIterator=w,e.async=function(t,n,r,o,i){void 0===i&&(i=Promise);var a=new w(c(t,n,r,o),i);return e.isGeneratorFunction(n)?a:a.next().then((function(e){return e.done?e.value:a.next()}))},b(y),s(y,l,"Generator"),s(y,i,(function(){return this})),s(y,"toString",(function(){return"[object Generator]"})),e.keys=function(e){var t=Object(e),n=[];for(var r in t)n.push(r);return n.reverse(),function e(){for(;n.length;){var r=n.pop();if(r in t)return e.value=r,e.done=!1,e}return e.done=!0,e}},e.values=S,k.prototype={constructor:k,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,this.tryEntries.forEach(x),!e)for(var t in this)"t"===t.charAt(0)&&n.call(this,t)&&!isNaN(+t.slice(1))&&(this[t]=void 0)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var t=this;function r(n,r){return a.type="throw",a.arg=e,t.next=n,r&&(t.method="next",t.arg=void 0),!!r}for(var o=this.tryEntries.length-1;o>=0;--o){var i=this.tryEntries[o],a=i.completion;if("root"===i.tryLoc)return r("end");if(i.tryLoc<=this.prev){var l=n.call(i,"catchLoc"),s=n.call(i,"finallyLoc");if(l&&s){if(this.prev<i.catchLoc)return r(i.catchLoc,!0);if(this.prev<i.finallyLoc)return r(i.finallyLoc)}else if(l){if(this.prev<i.catchLoc)return r(i.catchLoc,!0)}else{if(!s)throw new Error("try statement without catch or finally");if(this.prev<i.finallyLoc)return r(i.finallyLoc)}}}},abrupt:function(e,t){for(var r=this.tryEntries.length-1;r>=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev<o.finallyLoc){var i=o;break}}i&&("break"===e||"continue"===e)&&i.tryLoc<=t&&t<=i.finallyLoc&&(i=null);var a=i?i.completion:{};return a.type=e,a.arg=t,i?(this.method="next",this.next=i.finallyLoc,f):this.complete(a)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),f},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),x(n),f}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var o=r.arg;x(n)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:S(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),f}},e}function El(e,t,n,r,o,i,a){try{var l=e[i](a),s=l.value}catch(e){return void n(e)}l.done?t(s):Promise.resolve(s).then(r,o)}function xl(e){return function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function a(e){El(i,r,o,a,l,"next",e)}function l(e){El(i,r,o,a,l,"throw",e)}a(void 0)}))}}var kl={class:"flex flex-col h-full py-5"},Sl={class:"mx-3 md:mx-0 mb-1"},Ol={class:"sm:flex sm:flex-col-reverse"},Nl={class:"font-semibold text-brand-700 dark:text-brand-600 text-2xl flex items-center"},Pl=(0,r.createElementVNode)("a",{href:"https://www.github.com/opcodesio/log-viewer",target:"_blank",class:"rounded ml-3 text-gray-400 hover:text-brand-800 dark:hover:text-brand-600 focus:outline-none focus:ring-2 focus:ring-brand-500 dark:focus:ring-brand-700 p-1"},[(0,r.createElementVNode)("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-5 w-5",viewBox:"0 0 24 24",fill:"currentColor",title:""},[(0,r.createElementVNode)("path",{d:"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"})])],-1),Tl={class:"md:hidden flex-1 flex justify-end"},Vl={type:"button",class:"menu-button"},Rl={key:0},Ll=["href"],Al={key:0,class:"bg-yellow-100 dark:bg-yellow-900 bg-opacity-75 dark:bg-opacity-40 border border-yellow-300 dark:border-yellow-800 rounded-md px-2 py-1 mt-2 text-xs leading-5 text-yellow-700 dark:text-yellow-400"},jl=(0,r.createElementVNode)("code",{class:"font-mono px-2 py-1 bg-gray-100 dark:bg-gray-900 rounded"},"php artisan log-viewer:publish",-1),Bl={key:2,class:"flex justify-between items-baseline mt-6"},Il={class:"ml-1 block text-sm text-gray-500 dark:text-gray-400 truncate"},Ml={class:"text-sm text-gray-500 dark:text-gray-400"},Fl=(0,r.createElementVNode)("label",{for:"file-sort-direction",class:"sr-only"},"Sort direction",-1),Dl=[(0,r.createElementVNode)("option",{value:"desc"},"Newest first",-1),(0,r.createElementVNode)("option",{value:"asc"},"Oldest first",-1)],Ul={key:3,class:"mx-1 mt-1 text-red-600 text-xs"},$l=(0,r.createElementVNode)("p",{class:"text-sm text-gray-600 dark:text-gray-400"},"Please select files to delete and confirm or cancel deletion.",-1),Hl=["onClick"],zl={id:"file-list-container",class:"relative h-full overflow-hidden"},ql=["id"],Wl=["onClick"],Kl={class:"file-item group"},Gl={key:0,class:"sr-only"},Zl={key:1,class:"sr-only"},Yl={class:"file-icon group-hover:hidden group-focus:hidden"},Jl={class:"file-icon hidden group-hover:inline-block group-focus:inline-block"},Ql={class:"file-name"},Xl={key:0},es=(0,r.createElementVNode)("span",{class:"text-gray-500 dark:text-gray-400"},"root",-1),ts={key:1},ns=(0,r.createElementVNode)("span",{class:"sr-only"},"Open folder options",-1),rs={class:"py-2"},os={class:"text-brand-500"},is=["href"],as=(0,r.createElementVNode)("div",{class:"divider"},null,-1),ls=["onClick","disabled"],ss={class:"folder-files pl-3 ml-1 border-l border-gray-200 dark:border-gray-800"},cs={key:0,class:"text-center text-sm text-gray-600 dark:text-gray-400"},us=(0,r.createElementVNode)("p",{class:"mb-5"},"No log files were found.",-1),fs={class:"flex items-center justify-center px-1"},ds=(0,r.createElementVNode)("div",{class:"pointer-events-none absolute z-10 bottom-0 h-4 w-full bg-gradient-to-t from-gray-100 dark:from-gray-900 to-transparent"},null,-1),ps={class:"absolute inset-y-0 left-3 right-7 lg:left-0 lg:right-0 z-10"},hs={class:"rounded-md bg-white text-gray-800 dark:bg-gray-700 dark:text-gray-200 opacity-90 w-full h-full flex items-center justify-center"};const vs={__name:"FileList",setup:function(e){var t=Nr(),n=Pr(),o=Bo(),i=Fi(),a=zi(),l=a.dropdownDirections,s=a.calculateDropdownDirection,c=function(){var e=xl(_l().mark((function e(n){return _l().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!confirm("Are you sure you want to delete the log folder '".concat(n.path,"'? THIS ACTION CANNOT BE UNDONE."))){e.next=4;break}return e.next=3,i.deleteFolder(n);case 3:n.files.some((function(e){return e.identifier===i.selectedFileIdentifier}))&&Hi(t,"file",null);case 4:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),u=function(){var e=xl(_l().mark((function e(){return _l().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!confirm("Are you sure you want to delete selected log files? THIS ACTION CANNOT BE UNDONE.")){e.next=7;break}return e.next=3,i.deleteSelectedFiles();case 3:return i.filesChecked.includes(i.selectedFileIdentifier)&&Hi(t,"file",null),i.resetChecks(),e.next=7,i.loadFolders();case 7:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();return(0,r.onMounted)(xl(_l().mark((function e(){return _l().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:o.selectHost(n.query.host||null);case 1:case"end":return e.stop()}}),e)})))),(0,r.watch)((function(){return i.direction}),(function(){return i.loadFolders()})),function(e,a){var f,d;return(0,r.openBlock)(),(0,r.createElementBlock)("nav",kl,[(0,r.createElementVNode)("div",Sl,[(0,r.createElementVNode)("div",Ol,[(0,r.createElementVNode)("h1",Nl,[(0,r.createTextVNode)(" Log Viewer "),Pl,(0,r.createElementVNode)("span",Tl,[(0,r.createVNode)(Qa,{class:"ml-2"}),(0,r.createElementVNode)("button",Vl,[(0,r.createVNode)((0,r.unref)(ko),{class:"w-5 h-5 ml-2",onClick:(0,r.unref)(i).toggleSidebar},null,8,["onClick"])])])]),e.LogViewer.back_to_system_url?((0,r.openBlock)(),(0,r.createElementBlock)("div",Rl,[(0,r.createElementVNode)("a",{href:e.LogViewer.back_to_system_url,class:"rounded shrink inline-flex items-center text-sm text-gray-500 dark:text-gray-400 hover:text-brand-800 dark:hover:text-brand-600 focus:outline-none focus:ring-2 focus:ring-brand-500 dark:focus:ring-brand-700 mt-0"},[(0,r.createVNode)((0,r.unref)(So),{class:"h-3 w-3 mr-1.5"}),(0,r.createTextVNode)(" "+(0,r.toDisplayString)(e.LogViewer.back_to_system_label||"Back to ".concat(e.LogViewer.app_name)),1)],8,Ll)])):(0,r.createCommentVNode)("",!0)]),e.LogViewer.assets_outdated?((0,r.openBlock)(),(0,r.createElementBlock)("div",Al,[(0,r.createVNode)((0,r.unref)(Oo),{class:"h-4 w-4 mr-1 inline"}),(0,r.createTextVNode)(" Front-end assets are outdated. To update, please run "),jl])):(0,r.createCommentVNode)("",!0),(0,r.unref)(o).supportsHosts&&(0,r.unref)(o).hasRemoteHosts?((0,r.openBlock)(),(0,r.createBlock)(wl,{key:1,class:"mb-8 mt-6"})):(0,r.createCommentVNode)("",!0),(null===(f=(0,r.unref)(i).folders)||void 0===f?void 0:f.length)>0?((0,r.openBlock)(),(0,r.createElementBlock)("div",Bl,[(0,r.createElementVNode)("div",Il,"Log files on "+(0,r.toDisplayString)(null===(d=(0,r.unref)(i).selectedHost)||void 0===d?void 0:d.name),1),(0,r.createElementVNode)("div",Ml,[Fl,(0,r.withDirectives)((0,r.createElementVNode)("select",{id:"file-sort-direction",class:"select","onUpdate:modelValue":a[0]||(a[0]=function(e){return(0,r.unref)(i).direction=e})},Dl,512),[[r.vModelSelect,(0,r.unref)(i).direction]])])])):(0,r.createCommentVNode)("",!0),(0,r.unref)(i).error?((0,r.openBlock)(),(0,r.createElementBlock)("p",Ul,(0,r.toDisplayString)((0,r.unref)(i).error),1)):(0,r.createCommentVNode)("",!0)]),(0,r.withDirectives)((0,r.createElementVNode)("div",null,[$l,(0,r.createElementVNode)("div",{class:(0,r.normalizeClass)(["grid grid-flow-col pr-4 mt-2",[(0,r.unref)(i).hasFilesChecked?"justify-between":"justify-end"]])},[(0,r.withDirectives)((0,r.createElementVNode)("button",{onClick:(0,r.withModifiers)(u,["stop"]),class:"button inline-flex"},[(0,r.createVNode)((0,r.unref)(No),{class:"w-5 mr-1"}),(0,r.createTextVNode)(" Delete selected files ")],8,Hl),[[r.vShow,(0,r.unref)(i).hasFilesChecked]]),(0,r.createElementVNode)("button",{class:"button inline-flex",onClick:a[1]||(a[1]=(0,r.withModifiers)((function(e){return(0,r.unref)(i).resetChecks()}),["stop"]))},[(0,r.createTextVNode)(" Cancel "),(0,r.createVNode)((0,r.unref)(ko),{class:"w-5 ml-1"})])],2)],512),[[r.vShow,(0,r.unref)(i).checkBoxesVisibility]]),(0,r.createElementVNode)("div",zl,[(0,r.createElementVNode)("div",{class:"file-list",onScroll:a[6]||(a[6]=function(e){return(0,r.unref)(i).onScroll(e)})},[((0,r.openBlock)(!0),(0,r.createElementBlock)(r.Fragment,null,(0,r.renderList)((0,r.unref)(i).folders,(function(e){return(0,r.openBlock)(),(0,r.createElementBlock)("div",{key:e.identifier,id:"folder-".concat(e.identifier),class:"relative folder-container"},[(0,r.createVNode)((0,r.unref)(Co),null,{default:(0,r.withCtx)((function(t){var n=t.open;return[(0,r.createElementVNode)("div",{class:(0,r.normalizeClass)(["folder-item-container",[(0,r.unref)(i).isOpen(e)?"active-folder":"",(0,r.unref)(i).shouldBeSticky(e)?"sticky "+(n?"z-20":"z-10"):""]]),onClick:function(t){return(0,r.unref)(i).toggle(e)}},[(0,r.createElementVNode)("div",Kl,[(0,r.createElementVNode)("button",{class:"file-item-info group",onKeydown:a[2]||(a[2]=function(){return(0,r.unref)(aa)&&(0,r.unref)(aa).apply(void 0,arguments)})},[(0,r.unref)(i).isOpen(e)?(0,r.createCommentVNode)("",!0):((0,r.openBlock)(),(0,r.createElementBlock)("span",Gl,"Open folder")),(0,r.unref)(i).isOpen(e)?((0,r.openBlock)(),(0,r.createElementBlock)("span",Zl,"Close folder")):(0,r.createCommentVNode)("",!0),(0,r.createElementVNode)("span",Yl,[(0,r.withDirectives)((0,r.createVNode)((0,r.unref)(Po),{class:"w-5 h-5"},null,512),[[r.vShow,!(0,r.unref)(i).isOpen(e)]]),(0,r.withDirectives)((0,r.createVNode)((0,r.unref)(To),{class:"w-5 h-5"},null,512),[[r.vShow,(0,r.unref)(i).isOpen(e)]])]),(0,r.createElementVNode)("span",Jl,[(0,r.createVNode)((0,r.unref)(Vo),{class:(0,r.normalizeClass)([(0,r.unref)(i).isOpen(e)?"rotate-90":"","transition duration-100"])},null,8,["class"])]),(0,r.createElementVNode)("span",Ql,[String(e.clean_path||"").startsWith("root")?((0,r.openBlock)(),(0,r.createElementBlock)("span",Xl,[es,(0,r.createTextVNode)((0,r.toDisplayString)(String(e.clean_path).substring(4)),1)])):((0,r.openBlock)(),(0,r.createElementBlock)("span",ts,(0,r.toDisplayString)(e.clean_path),1))])],32),(0,r.createVNode)((0,r.unref)(_o),{as:"button",class:"file-dropdown-toggle group-hover:border-brand-600 group-hover:dark:border-brand-800","data-toggle-id":e.identifier,onKeydown:(0,r.unref)(la),onClick:a[3]||(a[3]=(0,r.withModifiers)((function(e){return(0,r.unref)(s)(e.target)}),["stop"]))},{default:(0,r.withCtx)((function(){return[ns,(0,r.createVNode)((0,r.unref)(Ro),{class:"w-4 h-4 pointer-events-none"})]})),_:2},1032,["data-toggle-id","onKeydown"])]),(0,r.createVNode)(r.Transition,{"leave-active-class":"transition ease-in duration-100","leave-from-class":"opacity-100 scale-100","leave-to-class":"opacity-0 scale-90","enter-active-class":"transition ease-out duration-100","enter-from-class":"opacity-0 scale-90","enter-to-class":"opacity-100 scale-100"},{default:(0,r.withCtx)((function(){return[(0,r.withDirectives)((0,r.createVNode)((0,r.unref)(Eo),{static:"",as:"div",class:(0,r.normalizeClass)(["dropdown w-48",[(0,r.unref)(l)[e.identifier]]])},{default:(0,r.withCtx)((function(){return[(0,r.createElementVNode)("div",rs,[(0,r.createVNode)((0,r.unref)(xo),{onClick:(0,r.withModifiers)((function(t){return(0,r.unref)(i).clearCacheForFolder(e)}),["stop","prevent"])},{default:(0,r.withCtx)((function(t){var n=t.active;return[(0,r.createElementVNode)("button",{class:(0,r.normalizeClass)([n?"active":""])},[(0,r.withDirectives)((0,r.createVNode)((0,r.unref)(Lo),{class:"w-4 h-4 mr-2"},null,512),[[r.vShow,!(0,r.unref)(i).clearingCache[e.identifier]]]),(0,r.withDirectives)((0,r.createVNode)(Zi,{class:"w-4 h-4 mr-2"},null,512),[[r.vShow,(0,r.unref)(i).clearingCache[e.identifier]]]),(0,r.withDirectives)((0,r.createElementVNode)("span",null,"Clear indices",512),[[r.vShow,!(0,r.unref)(i).cacheRecentlyCleared[e.identifier]&&!(0,r.unref)(i).clearingCache[e.identifier]]]),(0,r.withDirectives)((0,r.createElementVNode)("span",null,"Clearing...",512),[[r.vShow,!(0,r.unref)(i).cacheRecentlyCleared[e.identifier]&&(0,r.unref)(i).clearingCache[e.identifier]]]),(0,r.withDirectives)((0,r.createElementVNode)("span",os,"Indices cleared",512),[[r.vShow,(0,r.unref)(i).cacheRecentlyCleared[e.identifier]]])],2)]})),_:2},1032,["onClick"]),e.can_download?((0,r.openBlock)(),(0,r.createBlock)((0,r.unref)(xo),{key:0},{default:(0,r.withCtx)((function(t){var n=t.active;return[(0,r.createElementVNode)("a",{href:e.download_url,download:"",onClick:a[4]||(a[4]=(0,r.withModifiers)((function(){}),["stop"])),class:(0,r.normalizeClass)([n?"active":""])},[(0,r.createVNode)((0,r.unref)(Ao),{class:"w-4 h-4 mr-2"}),(0,r.createTextVNode)(" Download ")],10,is)]})),_:2},1024)):(0,r.createCommentVNode)("",!0),e.can_delete?((0,r.openBlock)(),(0,r.createElementBlock)(r.Fragment,{key:1},[as,(0,r.createVNode)((0,r.unref)(xo),null,{default:(0,r.withCtx)((function(t){var n=t.active;return[(0,r.createElementVNode)("button",{onClick:(0,r.withModifiers)((function(t){return c(e)}),["stop"]),disabled:(0,r.unref)(i).deleting[e.identifier],class:(0,r.normalizeClass)([n?"active":""])},[(0,r.withDirectives)((0,r.createVNode)((0,r.unref)(No),{class:"w-4 h-4 mr-2"},null,512),[[r.vShow,!(0,r.unref)(i).deleting[e.identifier]]]),(0,r.withDirectives)((0,r.createVNode)(Zi,null,null,512),[[r.vShow,(0,r.unref)(i).deleting[e.identifier]]]),(0,r.createTextVNode)(" Delete ")],10,ls)]})),_:2},1024)],64)):(0,r.createCommentVNode)("",!0)])]})),_:2},1032,["class"]),[[r.vShow,n]])]})),_:2},1024)],10,Wl)]})),_:2},1024),(0,r.withDirectives)((0,r.createElementVNode)("div",ss,[((0,r.openBlock)(!0),(0,r.createElementBlock)(r.Fragment,null,(0,r.renderList)(e.files||[],(function(e){return(0,r.openBlock)(),(0,r.createBlock)(ka,{key:e.identifier,"log-file":e,onClick:function(r){return o=e.identifier,void(n.query.file&&n.query.file===o?Hi(t,"file",null):Hi(t,"file",o));var o}},null,8,["log-file","onClick"])})),128))],512),[[r.vShow,(0,r.unref)(i).isOpen(e)]])],8,ql)})),128)),0===(0,r.unref)(i).folders.length?((0,r.openBlock)(),(0,r.createElementBlock)("div",cs,[us,(0,r.createElementVNode)("div",fs,[(0,r.createElementVNode)("button",{onClick:a[5]||(a[5]=(0,r.withModifiers)((function(e){return(0,r.unref)(i).loadFolders()}),["prevent"])),class:"inline-flex items-center px-4 py-2 text-left text-sm bg-white hover:bg-gray-50 outline-brand-500 dark:outline-brand-800 text-gray-900 dark:text-gray-200 rounded-md dark:bg-gray-700 dark:hover:bg-gray-600"},[(0,r.createVNode)((0,r.unref)(jo),{class:"w-4 h-4 mr-1.5"}),(0,r.createTextVNode)(" Refresh file list ")])])])):(0,r.createCommentVNode)("",!0)],32),ds,(0,r.withDirectives)((0,r.createElementVNode)("div",ps,[(0,r.createElementVNode)("div",hs,[(0,r.createVNode)(Zi,{class:"w-14 h-14"})])],512),[[r.vShow,(0,r.unref)(i).loading]])])])}}},ms=vs;var gs=n(598),ys=n(462),bs=n(640),ws=n(307),Cs=n(36),_s=n(452),Es=n(683),xs={class:"pagination"},ks={class:"previous"},Ss=["disabled"],Os=(0,r.createElementVNode)("span",{class:"sm:hidden"},"Previous page",-1),Ns={class:"sm:hidden border-transparent text-gray-500 dark:text-gray-400 border-t-2 pt-3 px-4 inline-flex items-center text-sm font-medium"},Ps={class:"pages"},Ts={key:0,class:"border-brand-500 text-brand-600 dark:border-brand-600 dark:text-brand-500","aria-current":"page"},Vs={key:1},Rs=["onClick"],Ls={class:"next"},As=["disabled"],js=(0,r.createElementVNode)("span",{class:"sm:hidden"},"Next page",-1);const Bs={__name:"Pagination",props:{loading:{type:Boolean,required:!0},short:{type:Boolean,default:!1}},setup:function(e){var t=Li(),n=Nr(),o=Pr(),i=((0,r.computed)((function(){return Number(o.query.page)||1})),function(e){e<1&&(e=1),t.pagination&&e>t.pagination.last_page&&(e=t.pagination.last_page),Hi(n,"page",e>1?Number(e):null)}),a=function(){return i(t.page+1)},l=function(){return i(t.page-1)};return function(n,o){return(0,r.openBlock)(),(0,r.createElementBlock)("nav",xs,[(0,r.createElementVNode)("div",ks,[1!==(0,r.unref)(t).page?((0,r.openBlock)(),(0,r.createElementBlock)("button",{key:0,onClick:l,disabled:e.loading,rel:"prev"},[(0,r.createVNode)((0,r.unref)(So),{class:"h-5 w-5"}),Os],8,Ss)):(0,r.createCommentVNode)("",!0)]),(0,r.createElementVNode)("div",Ns,[(0,r.createElementVNode)("span",null,(0,r.toDisplayString)((0,r.unref)(t).page),1)]),(0,r.createElementVNode)("div",Ps,[((0,r.openBlock)(!0),(0,r.createElementBlock)(r.Fragment,null,(0,r.renderList)(e.short?(0,r.unref)(t).linksShort:(0,r.unref)(t).links,(function(e){return(0,r.openBlock)(),(0,r.createElementBlock)(r.Fragment,null,[e.active?((0,r.openBlock)(),(0,r.createElementBlock)("button",Ts,(0,r.toDisplayString)(Number(e.label).toLocaleString()),1)):"..."===e.label?((0,r.openBlock)(),(0,r.createElementBlock)("span",Vs,(0,r.toDisplayString)(e.label),1)):((0,r.openBlock)(),(0,r.createElementBlock)("button",{key:2,onClick:function(t){return i(Number(e.label))},class:"border-transparent text-gray-500 dark:text-gray-400 hover:text-gray-700 hover:border-gray-300 dark:hover:text-gray-300 dark:hover:border-gray-400"},(0,r.toDisplayString)(Number(e.label).toLocaleString()),9,Rs))],64)})),256))]),(0,r.createElementVNode)("div",Ls,[(0,r.unref)(t).hasMorePages?((0,r.openBlock)(),(0,r.createElementBlock)("button",{key:0,onClick:a,disabled:e.loading,rel:"next"},[js,(0,r.createVNode)((0,r.unref)(Es),{class:"h-5 w-5"})],8,As)):(0,r.createCommentVNode)("",!0)])])}}},Is=Bs;var Ms=n(246),Fs={class:"flex items-center"},Ds={class:"opacity-90 mr-1"},Us={class:"font-semibold"},$s={class:"opacity-90 mr-1"},Hs={class:"font-semibold"},zs={key:2,class:"opacity-90"},qs={key:3,class:"opacity-90"},Ws={class:"py-2"},Ks={class:"label flex justify-between"},Gs={key:0,class:"no-results"},Zs={class:"flex-1 inline-flex justify-between"},Ys={class:"log-count"};const Js={__name:"LevelButtons",setup:function(e){var t=Mi(),n=ji();return(0,r.watch)((function(){return n.selectedLevels}),(function(){return t.loadLogs()})),function(e,o){return(0,r.openBlock)(),(0,r.createElementBlock)("div",Fs,[(0,r.createVNode)((0,r.unref)(Co),{as:"div",class:"mr-5 relative log-levels-selector"},{default:(0,r.withCtx)((function(){return[(0,r.createVNode)((0,r.unref)(_o),{as:"button",id:"severity-dropdown-toggle",class:(0,r.normalizeClass)(["dropdown-toggle badge none",(0,r.unref)(n).levelsSelected.length>0?"active":""])},{default:(0,r.withCtx)((function(){return[(0,r.unref)(n).levelsSelected.length>2?((0,r.openBlock)(),(0,r.createElementBlock)(r.Fragment,{key:0},[(0,r.createElementVNode)("span",Ds,(0,r.toDisplayString)((0,r.unref)(n).totalResultsSelected.toLocaleString()+((0,r.unref)(t).hasMoreResults?"+":""))+" entries in",1),(0,r.createElementVNode)("strong",Us,(0,r.toDisplayString)((0,r.unref)(n).levelsSelected[0].level_name)+" + "+(0,r.toDisplayString)((0,r.unref)(n).levelsSelected.length-1)+" more",1)],64)):(0,r.unref)(n).levelsSelected.length>0?((0,r.openBlock)(),(0,r.createElementBlock)(r.Fragment,{key:1},[(0,r.createElementVNode)("span",$s,(0,r.toDisplayString)((0,r.unref)(n).totalResultsSelected.toLocaleString()+((0,r.unref)(t).hasMoreResults?"+":""))+" entries in",1),(0,r.createElementVNode)("strong",Hs,(0,r.toDisplayString)((0,r.unref)(n).levelsSelected.map((function(e){return e.level_name})).join(", ")),1)],64)):(0,r.unref)(n).levelsFound.length>0?((0,r.openBlock)(),(0,r.createElementBlock)("span",zs,(0,r.toDisplayString)((0,r.unref)(n).totalResults.toLocaleString()+((0,r.unref)(t).hasMoreResults?"+":""))+" entries found. None selected",1)):((0,r.openBlock)(),(0,r.createElementBlock)("span",qs,"No entries found")),(0,r.createVNode)((0,r.unref)(Ms),{class:"w-4 h-4"})]})),_:1},8,["class"]),(0,r.createVNode)(r.Transition,{"leave-active-class":"transition ease-in duration-100","leave-from-class":"opacity-100 scale-100","leave-to-class":"opacity-0 scale-90","enter-active-class":"transition ease-out duration-100","enter-from-class":"opacity-0 scale-90","enter-to-class":"opacity-100 scale-100"},{default:(0,r.withCtx)((function(){return[(0,r.createVNode)((0,r.unref)(Eo),{as:"div",class:"dropdown down left min-w-[240px]"},{default:(0,r.withCtx)((function(){return[(0,r.createElementVNode)("div",Ws,[(0,r.createElementVNode)("div",Ks,[(0,r.createTextVNode)(" Severity "),(0,r.unref)(n).levelsFound.length>0?((0,r.openBlock)(),(0,r.createElementBlock)(r.Fragment,{key:0},[(0,r.unref)(n).levelsSelected.length===(0,r.unref)(n).levelsFound.length?((0,r.openBlock)(),(0,r.createBlock)((0,r.unref)(xo),{key:0,onClick:(0,r.withModifiers)((0,r.unref)(n).deselectAllLevels,["stop"])},{default:(0,r.withCtx)((function(e){var t=e.active;return[(0,r.createElementVNode)("a",{class:(0,r.normalizeClass)(["inline-link px-2 -mr-2 py-1 -my-1 rounded-md cursor-pointer text-brand-700 dark:text-brand-500 font-normal",[t?"active":""]])}," Deselect all ",2)]})),_:1},8,["onClick"])):((0,r.openBlock)(),(0,r.createBlock)((0,r.unref)(xo),{key:1,onClick:(0,r.withModifiers)((0,r.unref)(n).selectAllLevels,["stop"])},{default:(0,r.withCtx)((function(e){var t=e.active;return[(0,r.createElementVNode)("a",{class:(0,r.normalizeClass)(["inline-link px-2 -mr-2 py-1 -my-1 rounded-md cursor-pointer text-brand-700 dark:text-brand-500 font-normal",[t?"active":""]])}," Select all ",2)]})),_:1},8,["onClick"]))],64)):(0,r.createCommentVNode)("",!0)]),0===(0,r.unref)(n).levelsFound.length?((0,r.openBlock)(),(0,r.createElementBlock)("div",Gs,"There are no severity filters to display because no entries have been found.")):((0,r.openBlock)(!0),(0,r.createElementBlock)(r.Fragment,{key:1},(0,r.renderList)((0,r.unref)(n).levelsFound,(function(e){return(0,r.openBlock)(),(0,r.createBlock)((0,r.unref)(xo),{onClick:(0,r.withModifiers)((function(t){return(0,r.unref)(n).toggleLevel(e.level)}),["stop","prevent"])},{default:(0,r.withCtx)((function(t){var n=t.active;return[(0,r.createElementVNode)("button",{class:(0,r.normalizeClass)([n?"active":""])},[(0,r.createVNode)(ja,{class:"checkmark mr-2.5",checked:e.selected},null,8,["checked"]),(0,r.createElementVNode)("span",Zs,[(0,r.createElementVNode)("span",{class:(0,r.normalizeClass)(["log-level",e.level_class])},(0,r.toDisplayString)(e.level_name),3),(0,r.createElementVNode)("span",Ys,(0,r.toDisplayString)(Number(e.count).toLocaleString()),1)])],2)]})),_:2},1032,["onClick"])})),256))])]})),_:1})]})),_:1})]})),_:1})])}}};var Qs=n(447),Xs={class:"flex-1"},ec={class:"prefix-icon"},tc=(0,r.createElementVNode)("label",{for:"query",class:"sr-only"},"Search",-1),nc={class:"relative flex-1 m-1"},rc=["onKeydown"],oc={class:"clear-search"},ic={class:"submit-search"},ac={key:0,disabled:"disabled"},lc={class:"hidden xl:inline ml-1"},sc={class:"hidden xl:inline ml-1"},cc={class:"relative h-0 w-full overflow-visible"},uc=["innerHTML"];const fc={__name:"SearchInput",setup:function(e){var t=Ri(),n=Mi(),o=Nr(),i=Pr(),a=(0,r.computed)((function(){return n.selectedFile})),l=(0,r.ref)(i.query.query||""),s=function(){var e;Hi(o,"query",""===l.value?null:l.value),null===(e=document.getElementById("query-submit"))||void 0===e||e.focus()},c=function(){l.value="",s()};return(0,r.watch)((function(){return i.query.query}),(function(e){return l.value=e||""})),function(e,o){return(0,r.openBlock)(),(0,r.createElementBlock)("div",Xs,[(0,r.createElementVNode)("div",{class:(0,r.normalizeClass)(["search",{"has-error":(0,r.unref)(n).error}])},[(0,r.createElementVNode)("div",ec,[tc,(0,r.withDirectives)((0,r.createVNode)((0,r.unref)(Qs),{class:"h-4 w-4"},null,512),[[r.vShow,!(0,r.unref)(n).hasMoreResults]]),(0,r.withDirectives)((0,r.createVNode)(Zi,{class:"w-4 h-4"},null,512),[[r.vShow,(0,r.unref)(n).hasMoreResults]])]),(0,r.createElementVNode)("div",nc,[(0,r.withDirectives)((0,r.createElementVNode)("input",{"onUpdate:modelValue":o[0]||(o[0]=function(e){return l.value=e}),name:"query",id:"query",type:"text",onKeydown:[(0,r.withKeys)(s,["enter"]),o[1]||(o[1]=(0,r.withKeys)((function(e){return e.target.blur()}),["esc"]))]},null,40,rc),[[r.vModelText,l.value]]),(0,r.withDirectives)((0,r.createElementVNode)("div",oc,[(0,r.createElementVNode)("button",{onClick:c},[(0,r.createVNode)((0,r.unref)(ko),{class:"h-4 w-4"})])],512),[[r.vShow,(0,r.unref)(t).hasQuery]])]),(0,r.createElementVNode)("div",ic,[(0,r.unref)(n).hasMoreResults?((0,r.openBlock)(),(0,r.createElementBlock)("button",ac,[(0,r.createElementVNode)("span",null,[(0,r.createTextVNode)("Searching"),(0,r.createElementVNode)("span",lc,(0,r.toDisplayString)((0,r.unref)(a)?(0,r.unref)(a).name:"all files"),1),(0,r.createTextVNode)("...")])])):((0,r.openBlock)(),(0,r.createElementBlock)("button",{key:1,onClick:s,id:"query-submit"},[(0,r.createElementVNode)("span",null,[(0,r.createTextVNode)("Search"),(0,r.createElementVNode)("span",sc,(0,r.toDisplayString)((0,r.unref)(a)?'in "'+(0,r.unref)(a).name+'"':"all files"),1)]),(0,r.createVNode)((0,r.unref)(Es),{class:"h-4 w-4"})]))])],2),(0,r.createElementVNode)("div",cc,[(0,r.withDirectives)((0,r.createElementVNode)("div",{class:"search-progress-bar",style:(0,r.normalizeStyle)({width:(0,r.unref)(n).percentScanned+"%"})},null,4),[[r.vShow,(0,r.unref)(n).hasMoreResults]])]),(0,r.withDirectives)((0,r.createElementVNode)("p",{class:"mt-1 text-red-600 text-xs",innerHTML:(0,r.unref)(n).error},null,8,uc),[[r.vShow,(0,r.unref)(n).error]])])}}},dc=fc;var pc=n(923),hc=n(968),vc=["onClick"],mc={class:"sr-only"},gc={class:"text-green-600 dark:text-green-500 hidden md:inline"};const yc={__name:"LogCopyButton",props:{log:{type:Object,required:!0}},setup:function(e){var t=e,n=(0,r.ref)(!1),o=function(){$i(t.log.url),n.value=!0,setTimeout((function(){return n.value=!1}),1e3)};return function(t,i){return(0,r.openBlock)(),(0,r.createElementBlock)("button",{class:"log-link group",onClick:(0,r.withModifiers)(o,["stop"]),onKeydown:i[0]||(i[0]=function(){return(0,r.unref)(ia)&&(0,r.unref)(ia).apply(void 0,arguments)}),title:"Copy link to this log entry"},[(0,r.createElementVNode)("span",mc,"Log index "+(0,r.toDisplayString)(e.log.index)+". Click the button to copy link to this log entry.",1),(0,r.withDirectives)((0,r.createElementVNode)("span",{class:"hidden md:inline group-hover:underline"},(0,r.toDisplayString)(Number(e.log.index).toLocaleString()),513),[[r.vShow,!n.value]]),(0,r.withDirectives)((0,r.createVNode)((0,r.unref)(pc),{class:"md:opacity-75 group-hover:opacity-100"},null,512),[[r.vShow,!n.value]]),(0,r.withDirectives)((0,r.createVNode)((0,r.unref)(hc),{class:"text-green-600 dark:text-green-500 md:hidden"},null,512),[[r.vShow,n.value]]),(0,r.withDirectives)((0,r.createElementVNode)("span",gc,"Copied!",512),[[r.vShow,n.value]])],40,vc)}}};var bc={class:"h-full w-full py-5 log-list"},wc={class:"flex flex-col h-full w-full md:mx-3 mb-4"},Cc={class:"md:px-4 mb-4 flex flex-col-reverse lg:flex-row items-start"},_c={key:0,class:"flex items-center mr-5 mt-3 md:mt-0"},Ec={class:"w-full lg:w-auto flex-1 flex justify-end min-h-[38px]"},xc={class:"hidden md:block ml-5"},kc={class:"hidden md:block"},Sc={class:"md:hidden"},Oc={type:"button",class:"menu-button"},Nc={key:0,class:"relative overflow-hidden h-full text-sm"},Pc={class:"mx-2 mt-1 mb-2 text-right lg:mx-0 lg:mt-0 lg:mb-0 lg:absolute lg:top-2 lg:right-6 z-20 text-sm text-gray-500 dark:text-gray-400"},Tc=(0,r.createElementVNode)("label",{for:"log-sort-direction",class:"sr-only"},"Sort direction",-1),Vc=[(0,r.createElementVNode)("option",{value:"desc"},"Newest first",-1),(0,r.createElementVNode)("option",{value:"asc"},"Oldest first",-1)],Rc=(0,r.createElementVNode)("label",{for:"items-per-page",class:"sr-only"},"Items per page",-1),Lc=[(0,r.createStaticVNode)('<option value="10">10 items per page</option><option value="25">25 items per page</option><option value="50">50 items per page</option><option value="100">100 items per page</option><option value="250">250 items per page</option><option value="500">500 items per page</option>',6)],Ac={class:"inline-block min-w-full max-w-full align-middle"},jc={class:"table-fixed min-w-full max-w-full border-separate",style:{"border-spacing":"0"}},Bc=(0,r.createElementVNode)("thead",{class:"bg-gray-50"},[(0,r.createElementVNode)("tr",null,[(0,r.createElementVNode)("th",{scope:"col",class:"w-[120px] hidden lg:table-cell"},[(0,r.createElementVNode)("div",{class:"pl-2"},"Level")]),(0,r.createElementVNode)("th",{scope:"col",class:"w-[180px] hidden lg:table-cell"},"Time"),(0,r.createElementVNode)("th",{scope:"col",class:"w-[110px] hidden lg:table-cell"},"Env"),(0,r.createElementVNode)("th",{scope:"col",class:"hidden lg:table-cell"},"Description"),(0,r.createElementVNode)("th",{scope:"col",class:"hidden lg:table-cell"},[(0,r.createElementVNode)("span",{class:"sr-only"},"Log index")])])],-1),Ic=["id","data-index"],Mc=["onClick"],Fc={class:"log-level truncate"},Dc={class:"flex items-center lg:pl-2"},Uc=["aria-expanded"],$c={key:0,class:"sr-only"},Hc={key:1,class:"sr-only"},zc={class:"w-full h-full group-hover:hidden group-focus:hidden"},qc={class:"w-full h-full hidden group-hover:inline-block group-focus:inline-block"},Wc={class:"whitespace-nowrap text-gray-900 dark:text-gray-200"},Kc=["innerHTML"],Gc={class:"lg:hidden"},Zc=["innerHTML"],Yc=["innerHTML"],Jc={class:"whitespace-nowrap text-gray-500 dark:text-gray-300 dark:opacity-90 text-xs hidden lg:table-cell"},Qc={colspan:"6"},Xc={class:"lg:hidden flex justify-between px-2 pt-2 pb-1 text-xs"},eu={class:"flex-1"},tu=(0,r.createElementVNode)("span",{class:"font-semibold"},"Time:",-1),nu={class:"flex-1"},ru=(0,r.createElementVNode)("span",{class:"font-semibold"},"Env:",-1),ou=["innerHTML"],iu=(0,r.createElementVNode)("p",{class:"mx-2 lg:mx-8 pt-2 border-t font-semibold text-gray-700 dark:text-gray-400"},"Context:",-1),au=["innerHTML"],lu={key:1,class:"py-4 px-8 text-gray-500 italic"},su={key:1,class:"log-group"},cu={colspan:"6"},uu={class:"bg-white text-gray-600 dark:bg-gray-800 dark:text-gray-200 p-12"},fu=(0,r.createElementVNode)("div",{class:"text-center font-semibold"},"No results",-1),du={class:"text-center mt-6"},pu=["onClick"],hu={class:"absolute inset-0 top-9 md:px-4 z-20"},vu={class:"rounded-md bg-white text-gray-800 dark:bg-gray-700 dark:text-gray-200 opacity-90 w-full h-full flex items-center justify-center"},mu={key:1,class:"flex h-full items-center justify-center text-gray-600 dark:text-gray-400"},gu={key:0},yu={key:1},bu={key:2,class:"md:px-4"},wu={class:"hidden lg:block"},Cu={class:"lg:hidden"};const _u={__name:"LogList",setup:function(e){var t=Nr(),n=Fi(),o=Mi(),i=Ri(),a=Li(),l=ji(),s=(0,r.computed)((function(){return n.selectedFile||String(i.query||"").trim().length>0})),c=(0,r.computed)((function(){return o.logs&&(o.logs.length>0||!o.hasMoreResults)&&(o.selectedFile||i.hasQuery)})),u=function(e){return JSON.stringify(e,(function(e,t){return"string"==typeof t?t.replaceAll("\n","<br/>"):t}),2)},f=function(){Hi(t,"file",null)},d=function(){Hi(t,"query",null)};return(0,r.watch)([function(){return o.direction},function(){return o.resultsPerPage}],(function(){return o.loadLogs()})),function(e,t){var p,h;return(0,r.openBlock)(),(0,r.createElementBlock)("div",bc,[(0,r.createElementVNode)("div",wc,[(0,r.createElementVNode)("div",Cc,[(0,r.unref)(s)?((0,r.openBlock)(),(0,r.createElementBlock)("div",_c,[(0,r.createVNode)(Js)])):(0,r.createCommentVNode)("",!0),(0,r.createElementVNode)("div",Ec,[(0,r.createVNode)(dc),(0,r.createElementVNode)("div",xc,[(0,r.createElementVNode)("button",{onClick:t[0]||(t[0]=function(e){return(0,r.unref)(o).loadLogs()}),id:"reload-logs-button",title:"Reload current results",class:"menu-button"},[(0,r.createVNode)((0,r.unref)(gs),{class:"w-5 h-5"})])]),(0,r.createElementVNode)("div",kc,[(0,r.createVNode)(Qa,{class:"ml-2",id:"desktop-site-settings"})]),(0,r.createElementVNode)("div",Sc,[(0,r.createElementVNode)("button",Oc,[(0,r.createVNode)((0,r.unref)(ys),{class:"w-5 h-5 ml-2",onClick:(0,r.unref)(n).toggleSidebar},null,8,["onClick"])])])])]),(0,r.unref)(c)?((0,r.openBlock)(),(0,r.createElementBlock)("div",Nc,[(0,r.createElementVNode)("div",Pc,[Tc,(0,r.withDirectives)((0,r.createElementVNode)("select",{id:"log-sort-direction","onUpdate:modelValue":t[1]||(t[1]=function(e){return(0,r.unref)(o).direction=e}),class:"select mr-4"},Vc,512),[[r.vModelSelect,(0,r.unref)(o).direction]]),Rc,(0,r.withDirectives)((0,r.createElementVNode)("select",{id:"items-per-page","onUpdate:modelValue":t[2]||(t[2]=function(e){return(0,r.unref)(o).resultsPerPage=e}),class:"select"},Lc,512),[[r.vModelSelect,(0,r.unref)(o).resultsPerPage]])]),(0,r.createElementVNode)("div",{class:"log-item-container h-full overflow-y-auto md:px-4",onScroll:t[5]||(t[5]=function(e){return(0,r.unref)(o).onScroll(e)})},[(0,r.createElementVNode)("div",Ac,[(0,r.createElementVNode)("table",jc,[Bc,(0,r.unref)(o).logs&&(0,r.unref)(o).logs.length>0?((0,r.openBlock)(!0),(0,r.createElementBlock)(r.Fragment,{key:0},(0,r.renderList)((0,r.unref)(o).logs,(function(n,a){return(0,r.openBlock)(),(0,r.createElementBlock)("tbody",{key:a,class:(0,r.normalizeClass)([0===a?"first":"","log-group"]),id:"tbody-".concat(a),"data-index":a},[(0,r.createElementVNode)("tr",{onClick:function(e){return(0,r.unref)(o).toggle(a)},class:(0,r.normalizeClass)(["log-item group",n.level_class,(0,r.unref)(o).isOpen(a)?"active":"",(0,r.unref)(o).shouldBeSticky(a)?"sticky z-2":""]),style:(0,r.normalizeStyle)({top:(0,r.unref)(o).stackTops[a]||0})},[(0,r.createElementVNode)("td",Fc,[(0,r.createElementVNode)("div",Dc,[(0,r.createElementVNode)("button",{"aria-expanded":(0,r.unref)(o).isOpen(a),onKeydown:t[3]||(t[3]=function(){return(0,r.unref)(oa)&&(0,r.unref)(oa).apply(void 0,arguments)}),class:"log-level-icon mr-2 opacity-75 w-5 h-5 hidden lg:block group focus:opacity-100 focus:outline-none focus:ring-2 focus:ring-brand-500 rounded-md"},[(0,r.unref)(o).isOpen(a)?(0,r.createCommentVNode)("",!0):((0,r.openBlock)(),(0,r.createElementBlock)("span",$c,"Expand log entry")),(0,r.unref)(o).isOpen(a)?((0,r.openBlock)(),(0,r.createElementBlock)("span",Hc,"Collapse log entry")):(0,r.createCommentVNode)("",!0),(0,r.createElementVNode)("span",zc,["danger"===n.level_class?((0,r.openBlock)(),(0,r.createBlock)((0,r.unref)(bs),{key:0})):"warning"===n.level_class?((0,r.openBlock)(),(0,r.createBlock)((0,r.unref)(ws),{key:1})):((0,r.openBlock)(),(0,r.createBlock)((0,r.unref)(Cs),{key:2}))]),(0,r.createElementVNode)("span",qc,[(0,r.createVNode)((0,r.unref)(_s),{class:(0,r.normalizeClass)([(0,r.unref)(o).isOpen(a)?"rotate-90":"","transition duration-100"])},null,8,["class"])])],40,Uc),(0,r.createElementVNode)("span",null,(0,r.toDisplayString)(n.level_name),1)])]),(0,r.createElementVNode)("td",Wc,[(0,r.createElementVNode)("span",{class:"hidden lg:inline",innerHTML:(0,r.unref)(Di)(n.datetime,(0,r.unref)(i).query)},null,8,Kc),(0,r.createElementVNode)("span",Gc,(0,r.toDisplayString)(n.time),1)]),(0,r.createElementVNode)("td",{class:"whitespace-nowrap text-gray-500 dark:text-gray-300 dark:opacity-90 hidden lg:table-cell",innerHTML:(0,r.unref)(Di)(n.environment,(0,r.unref)(i).query)},null,8,Zc),(0,r.createElementVNode)("td",{class:"max-w-[1px] w-full truncate text-gray-500 dark:text-gray-300 dark:opacity-90",innerHTML:(0,r.unref)(Di)(n.text,(0,r.unref)(i).query)},null,8,Yc),(0,r.createElementVNode)("td",Jc,[(0,r.createVNode)(yc,{log:n,class:"pr-2 large-screen"},null,8,["log"])])],14,Mc),(0,r.withDirectives)((0,r.createElementVNode)("tr",null,[(0,r.createElementVNode)("td",Qc,[(0,r.createElementVNode)("div",Xc,[(0,r.createElementVNode)("div",eu,[tu,(0,r.createTextVNode)(" "+(0,r.toDisplayString)(n.datetime),1)]),(0,r.createElementVNode)("div",nu,[ru,(0,r.createTextVNode)(" "+(0,r.toDisplayString)(n.environment),1)]),(0,r.createElementVNode)("div",null,[(0,r.createVNode)(yc,{log:n},null,8,["log"])])]),(0,r.createElementVNode)("pre",{class:"log-stack",innerHTML:(0,r.unref)(Di)(n.full_text,(0,r.unref)(i).query)},null,8,ou),n.contexts&&n.contexts.length>0?((0,r.openBlock)(),(0,r.createElementBlock)(r.Fragment,{key:0},[iu,((0,r.openBlock)(!0),(0,r.createElementBlock)(r.Fragment,null,(0,r.renderList)(n.contexts,(function(e){return(0,r.openBlock)(),(0,r.createElementBlock)("pre",{class:"log-stack",innerHTML:u(e)},null,8,au)})),256))],64)):(0,r.createCommentVNode)("",!0),n.full_text_incomplete?((0,r.openBlock)(),(0,r.createElementBlock)("div",lu,[(0,r.createTextVNode)(" The contents of this log have been cut short to the first "+(0,r.toDisplayString)(e.LogViewer.max_log_size_formatted)+". The full size of this log entry is ",1),(0,r.createElementVNode)("strong",null,(0,r.toDisplayString)(n.full_text_length_formatted),1)])):(0,r.createCommentVNode)("",!0)])],512),[[r.vShow,(0,r.unref)(o).isOpen(a)]])],10,Ic)})),128)):((0,r.openBlock)(),(0,r.createElementBlock)("tbody",su,[(0,r.createElementVNode)("tr",null,[(0,r.createElementVNode)("td",cu,[(0,r.createElementVNode)("div",uu,[fu,(0,r.createElementVNode)("div",du,[(null===(p=(0,r.unref)(i).query)||void 0===p?void 0:p.length)>0?((0,r.openBlock)(),(0,r.createElementBlock)("button",{key:0,class:"px-3 py-2 border dark:border-gray-700 text-gray-800 dark:text-gray-200 hover:border-brand-600 dark:hover:border-brand-700 rounded-md",onClick:d},"Clear search query ")):(0,r.createCommentVNode)("",!0),(null===(h=(0,r.unref)(i).query)||void 0===h?void 0:h.length)>0&&(0,r.unref)(n).selectedFile?((0,r.openBlock)(),(0,r.createElementBlock)("button",{key:1,class:"px-3 ml-3 py-2 border dark:border-gray-700 text-gray-800 dark:text-gray-200 hover:border-brand-600 dark:hover:border-brand-700 rounded-md",onClick:(0,r.withModifiers)(f,["prevent"])},"Search all files ",8,pu)):(0,r.createCommentVNode)("",!0),(0,r.unref)(l).levelsFound.length>0&&0===(0,r.unref)(l).levelsSelected.length?((0,r.openBlock)(),(0,r.createElementBlock)("button",{key:2,class:"px-3 ml-3 py-2 border dark:border-gray-700 text-gray-800 dark:text-gray-200 hover:border-brand-600 dark:hover:border-brand-700 rounded-md",onClick:t[4]||(t[4]=function(){var e;return(0,r.unref)(l).selectAllLevels&&(e=(0,r.unref)(l)).selectAllLevels.apply(e,arguments)})},"Select all severities ")):(0,r.createCommentVNode)("",!0)])])])])]))])])],32),(0,r.withDirectives)((0,r.createElementVNode)("div",hu,[(0,r.createElementVNode)("div",vu,[(0,r.createVNode)(Zi,{class:"w-14 h-14"})])],512),[[r.vShow,(0,r.unref)(o).loading&&(!(0,r.unref)(o).isMobile||!(0,r.unref)(n).sidebarOpen)]])])):((0,r.openBlock)(),(0,r.createElementBlock)("div",mu,[(0,r.unref)(o).hasMoreResults?((0,r.openBlock)(),(0,r.createElementBlock)("span",gu,"Searching...")):((0,r.openBlock)(),(0,r.createElementBlock)("span",yu,"Select a file or start searching..."))])),(0,r.unref)(c)&&(0,r.unref)(a).hasPages?((0,r.openBlock)(),(0,r.createElementBlock)("div",bu,[(0,r.createElementVNode)("div",wu,[(0,r.createVNode)(Is,{loading:(0,r.unref)(o).loading},null,8,["loading"])]),(0,r.createElementVNode)("div",Cu,[(0,r.createVNode)(Is,{loading:(0,r.unref)(o).loading,short:!0},null,8,["loading"])])])):(0,r.createCommentVNode)("",!0)])])}}},Eu=_u;var xu={width:"4169",height:"913",viewBox:"0 0 4169 913",fill:"none",xmlns:"http://www.w3.org/2000/svg"},ku=[(0,r.createStaticVNode)('<path d="M564.724 212.38L564.098 212.012L562.648 211.569C563.232 212.062 563.962 212.347 564.724 212.38V212.38Z" fill="currentColor"></path><path d="M573.852 277.606L573.152 277.802L573.852 277.606Z" fill="currentColor"></path><path d="M564.992 212.279C564.903 212.268 564.815 212.247 564.731 212.217C564.726 212.275 564.726 212.333 564.731 212.391C564.827 212.379 564.917 212.34 564.992 212.279V212.279Z" fill="currentColor"></path><path d="M564.727 212.388H564.821V212.33L564.727 212.388Z" fill="currentColor"></path><path d="M573.292 277.488L574.348 276.886L574.741 276.665L575.098 276.284C574.428 276.573 573.816 276.981 573.292 277.488V277.488Z" fill="currentColor"></path><path d="M566.552 213.805L565.52 212.823L564.82 212.442C565.196 213.106 565.818 213.595 566.552 213.805V213.805Z" fill="currentColor"></path><path d="M306.964 846.743C306.14 847.099 305.418 847.657 304.864 848.364L305.515 847.946C305.957 847.541 306.583 847.062 306.964 846.743Z" fill="currentColor"></path><path d="M457.704 817.085C457.704 816.151 457.25 816.323 457.361 819.64C457.361 819.369 457.471 819.099 457.52 818.841C457.582 818.252 457.631 817.674 457.704 817.085Z" fill="currentColor"></path><path d="M442.069 846.743C441.245 847.099 440.523 847.657 439.969 848.364L440.62 847.946C441.062 847.541 441.688 847.062 442.069 846.743Z" fill="currentColor"></path><path d="M200.806 853.794C200.18 853.25 199.414 852.892 198.595 852.762C199.258 853.082 199.921 853.401 200.363 853.647L200.806 853.794Z" fill="currentColor"></path><path d="M176.918 830.918C176.821 829.95 176.524 829.014 176.046 828.167C176.385 829.049 176.668 829.951 176.894 830.869L176.918 830.918Z" fill="currentColor"></path><path d="M337.376 421.762C304.582 435.801 267.365 451.719 219.132 451.719C198.954 451.679 178.874 448.91 159.438 443.49L192.798 785.991C193.978 800.306 200.5 813.654 211.067 823.384C221.634 833.114 235.474 838.513 249.838 838.511C249.838 838.511 297.139 840.968 312.922 840.968C329.909 840.968 380.845 838.511 380.845 838.511C395.207 838.51 409.044 833.109 419.608 823.38C430.173 813.65 436.692 800.304 437.873 785.991L473.603 407.514C457.636 402.06 441.521 398.437 423.355 398.437C391.936 398.424 366.621 409.246 337.376 421.762Z" fill="#FFDD00"></path><path d="M56.1709 275.636L56.7359 276.165L57.1044 276.386C56.8206 276.104 56.5077 275.852 56.1709 275.636V275.636Z" fill="currentColor"></path><path d="M627.869 244.025L622.846 218.686C618.338 195.951 608.107 174.469 584.77 166.251C577.289 163.623 568.802 162.493 563.066 157.052C557.33 151.611 555.635 143.16 554.309 135.324C551.852 120.941 549.543 106.546 547.025 92.1872C544.851 79.8431 543.131 65.9761 537.469 54.6515C530.1 39.4456 514.808 30.553 499.602 24.6696C491.81 21.7609 483.858 19.3004 475.786 17.3C437.796 7.27737 397.852 3.59259 358.769 1.49226C311.858 -1.09629 264.822 -0.316398 218.022 3.82595C183.189 6.99487 146.501 10.8271 113.399 22.8763C101.301 27.2858 88.8338 32.5796 79.6341 41.9267C68.3464 53.4109 64.6616 71.1716 72.9033 85.4931C78.7621 95.6632 88.6864 102.848 99.2126 107.602C112.923 113.727 127.242 118.387 141.932 121.506C182.833 130.546 225.196 134.096 266.981 135.606C313.294 137.475 359.682 135.961 405.775 131.074C417.173 129.821 428.551 128.319 439.908 126.566C453.284 124.515 461.87 107.025 457.927 94.8402C453.21 80.273 440.535 74.623 426.201 76.8216C424.088 77.1532 421.988 77.4603 419.875 77.7674L418.352 77.9885C413.496 78.6026 408.641 79.1758 403.785 79.708C393.754 80.7889 383.699 81.6733 373.619 82.3611C351.043 83.9333 328.406 84.6579 305.782 84.6948C283.55 84.6948 261.307 84.0683 239.124 82.6067C229.003 81.9435 218.907 81.1 208.835 80.0765C204.254 79.5975 199.685 79.0939 195.115 78.5289L190.767 77.9762L189.822 77.8411L185.314 77.1901C176.102 75.8022 166.89 74.2054 157.776 72.2771C156.857 72.073 156.034 71.5613 155.444 70.8266C154.855 70.0919 154.533 69.1781 154.533 68.2361C154.533 67.294 154.855 66.3802 155.444 65.6455C156.034 64.9107 156.857 64.3991 157.776 64.1951H157.948C165.846 62.5123 173.805 61.0753 181.789 59.8225C184.45 59.4048 187.119 58.9954 189.797 58.5942H189.871C194.87 58.2626 199.893 57.3659 204.868 56.7763C248.148 52.2745 291.685 50.7397 335.174 52.1827C356.288 52.7968 377.39 54.0373 398.405 56.1745C402.925 56.6413 407.421 57.1326 411.916 57.6853C413.636 57.8941 415.367 58.1397 417.099 58.3485L420.588 58.8521C430.758 60.367 440.874 62.2053 450.938 64.367C465.849 67.6097 484.998 68.6659 491.63 85.0018C493.743 90.1851 494.701 95.9457 495.868 101.387L497.354 108.327C497.393 108.451 497.422 108.578 497.44 108.707C500.953 125.084 504.47 141.461 507.991 157.838C508.249 159.048 508.255 160.298 508.009 161.51C507.762 162.722 507.269 163.871 506.559 164.884C505.849 165.897 504.938 166.753 503.882 167.398C502.827 168.043 501.65 168.464 500.425 168.634H500.326L498.177 168.929L496.052 169.212C489.321 170.088 482.582 170.907 475.835 171.668C462.545 173.183 449.235 174.493 435.904 175.599C409.415 177.801 382.872 179.246 356.276 179.934C342.724 180.295 329.176 180.462 315.633 180.438C261.724 180.395 207.862 177.262 154.312 171.054C148.515 170.366 142.718 169.629 136.92 168.88C141.416 169.457 133.653 168.438 132.081 168.217C128.396 167.701 124.711 167.164 121.027 166.608C108.658 164.753 96.3631 162.468 84.019 160.466C69.0956 158.01 54.8232 159.238 41.3246 166.608C30.2443 172.671 21.2763 181.969 15.6171 193.261C9.7951 205.298 8.06326 218.403 5.45934 231.337C2.85542 244.271 -1.19786 258.187 0.337468 271.464C3.6415 300.12 23.6745 323.408 52.4895 328.616C79.5973 333.529 106.852 337.508 134.181 340.898C241.535 354.046 349.991 355.619 457.681 345.59C466.451 344.771 475.208 343.879 483.954 342.913C486.685 342.612 489.449 342.927 492.043 343.834C494.637 344.74 496.996 346.215 498.946 348.151C500.896 350.087 502.389 352.435 503.314 355.022C504.239 357.61 504.574 360.372 504.294 363.105L501.567 389.611C496.073 443.172 490.578 496.728 485.084 550.28C479.352 606.518 473.583 662.752 467.777 718.982C466.14 734.818 464.502 750.651 462.864 766.479C461.292 782.066 461.071 798.144 458.111 813.546C453.444 837.767 437.046 852.642 413.12 858.083C391.2 863.071 368.807 865.69 346.327 865.895C321.405 866.03 296.496 864.924 271.575 865.059C244.971 865.207 212.385 862.75 191.848 842.951C173.805 825.558 171.312 798.328 168.855 774.782C165.58 743.609 162.333 712.439 159.115 681.274L141.06 507.979L129.379 395.851C129.182 393.996 128.986 392.166 128.802 390.299C127.401 376.923 117.931 363.83 103.008 364.505C90.2341 365.07 75.716 375.928 77.2145 390.299L85.8737 473.428L103.782 645.385C108.883 694.228 113.972 743.081 119.049 791.941C120.032 801.3 120.953 810.684 121.985 820.043C127.598 871.188 166.657 898.751 215.026 906.513C243.276 911.058 272.213 911.991 300.881 912.458C337.631 913.048 374.749 914.46 410.897 907.803C464.461 897.977 504.65 862.21 510.386 806.729C512.024 790.713 513.661 774.692 515.299 758.667C520.744 705.672 526.181 652.672 531.61 599.669L549.371 426.483L557.514 347.113C557.92 343.178 559.582 339.477 562.254 336.559C564.927 333.642 568.467 331.662 572.352 330.912C587.668 327.928 602.309 322.83 613.204 311.174C630.547 292.615 633.998 268.418 627.869 244.025ZM51.7034 261.147C51.9368 261.036 51.5069 263.039 51.3227 263.972C51.2858 262.56 51.3595 261.307 51.7034 261.147ZM53.1897 272.644C53.3125 272.558 53.6809 273.049 54.0617 273.638C53.4844 273.098 53.116 272.693 53.1774 272.644H53.1897ZM54.6513 274.572C55.1794 275.469 55.4619 276.034 54.6513 274.572V274.572ZM57.5868 276.955H57.6605C57.6605 277.041 57.7956 277.127 57.8447 277.213C57.7633 277.118 57.6728 277.032 57.5746 276.955H57.5868ZM571.639 273.393C566.137 278.625 557.846 281.057 549.653 282.273C457.779 295.907 364.567 302.81 271.685 299.764C205.212 297.491 139.438 290.109 73.6279 280.812C67.1795 279.903 60.1907 278.723 55.7567 273.97C47.4045 265.004 51.5069 246.948 53.6809 236.115C55.6707 226.191 59.4783 212.962 71.2819 211.55C89.7059 209.388 111.102 217.163 129.33 219.927C151.275 223.276 173.301 225.957 195.41 227.972C289.765 236.569 385.705 235.231 479.642 222.653C496.764 220.352 513.825 217.679 530.824 214.633C545.969 211.918 562.759 206.821 571.91 222.506C578.186 233.192 579.021 247.489 578.051 259.563C577.752 264.823 575.454 269.771 571.627 273.393H571.639Z" fill="currentColor"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M1128.89 528.658C1123.53 538.898 1116.15 547.814 1106.77 555.381C1097.38 562.953 1086.43 569.118 1073.91 573.865C1061.4 578.623 1048.8 581.815 1036.14 583.443C1023.47 585.076 1011.17 584.935 999.256 582.996C987.335 581.069 977.194 577.136 968.858 571.192L978.249 473.648C986.887 470.681 997.758 467.635 1010.88 464.516C1023.99 461.403 1037.47 459.171 1051.33 457.837C1065.19 456.498 1078.3 456.656 1090.68 458.283C1103.03 459.916 1112.8 463.849 1119.95 470.088C1123.82 473.648 1127.11 477.507 1129.79 481.666C1132.47 485.825 1134.11 490.131 1134.71 494.584C1136.19 507.055 1134.26 518.413 1128.89 528.658ZM992.546 320.873C998.808 317.014 1006.33 313.595 1015.12 310.623C1023.91 307.662 1032.93 305.576 1042.17 304.39C1051.4 303.209 1060.42 303.051 1069.22 303.943C1078 304.836 1085.76 307.283 1092.46 311.289C1099.17 315.301 1104.16 321.094 1107.43 328.66C1110.71 336.238 1111.61 345.816 1110.12 357.394C1108.93 366.599 1105.27 374.397 1099.17 380.777C1093.06 387.168 1085.6 392.508 1076.82 396.814C1068.02 401.126 1058.71 404.539 1048.88 407.053C1039.04 409.585 1029.57 411.444 1020.49 412.625C1011.4 413.817 1003.5 414.563 996.8 414.851C990.091 415.151 985.69 415.298 983.609 415.298L992.546 320.873ZM1177.17 465.629C1172.4 455.243 1166 446.112 1157.95 438.234C1149.91 430.369 1140.36 424.656 1129.34 421.09C1134.11 417.23 1138.8 411.145 1143.42 402.827C1148.04 394.52 1151.99 385.456 1155.27 375.658C1158.54 365.853 1160.78 355.987 1161.97 346.036C1163.16 336.091 1162.71 327.552 1160.64 320.421C1155.56 302.61 1147.59 288.652 1136.71 278.554C1125.83 268.462 1113.17 261.483 1098.72 257.618C1084.26 253.77 1068.32 252.945 1050.89 255.171C1033.45 257.398 1015.64 261.777 997.469 268.31C997.469 266.829 997.617 265.269 997.917 263.636C998.206 262.009 998.359 260.297 998.359 258.511C998.359 254.058 996.125 250.204 991.656 246.933C987.187 243.666 982.043 241.74 976.236 241.141C970.423 240.553 964.757 241.807 959.245 244.927C953.727 248.046 949.927 253.77 947.846 262.071C945.458 288.799 943.076 316.567 940.694 345.364C938.307 374.171 935.777 403.273 933.095 432.674C930.412 462.069 927.73 491.244 925.047 520.193C922.365 549.148 919.682 576.984 917 603.706C917.896 611.725 920.131 617.963 923.709 622.416C927.282 626.875 931.456 629.548 936.225 630.435C940.989 631.328 945.986 630.502 951.198 627.982C956.409 625.468 960.958 621.077 964.837 614.844C976.752 621.376 990.165 625.609 1005.07 627.541C1019.97 629.468 1035.09 629.468 1050.44 627.541C1065.78 625.609 1080.91 621.975 1095.81 616.624C1110.71 611.284 1124.27 604.599 1136.49 596.586C1148.71 588.568 1158.99 579.431 1167.34 569.191C1175.68 558.941 1181.19 547.882 1183.88 536.01C1186.56 523.833 1187.3 511.661 1186.11 499.483C1184.92 487.312 1181.94 476.033 1177.17 465.629Z" fill="currentColor"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M1613.27 700.802C1611.63 710.601 1609.31 720.919 1606.34 731.763C1603.35 742.595 1599.85 752.473 1595.83 761.384C1591.81 770.29 1587.34 777.483 1582.43 782.982C1577.5 788.474 1572.21 790.78 1566.55 789.892C1562.08 789.288 1559.25 786.468 1558.06 781.428C1556.87 776.37 1556.87 770.137 1558.06 762.718C1559.25 755.293 1561.56 746.901 1564.99 737.549C1568.41 728.197 1572.59 718.913 1577.5 709.713C1582.43 700.503 1588.01 691.676 1594.27 683.211C1600.53 674.752 1607.08 667.694 1613.94 662.055C1615.43 663.835 1616.1 668.287 1615.95 675.419C1615.79 682.544 1614.9 691.009 1613.27 700.802ZM1764.81 507.494C1760.79 503.041 1755.87 500.521 1750.06 499.922C1744.25 499.329 1738.36 502.595 1732.4 509.721C1728.52 516.846 1723.61 523.678 1717.65 530.21C1711.68 536.748 1705.5 542.682 1699.09 548.027C1692.69 553.367 1686.58 557.978 1680.77 561.832C1674.96 565.697 1670.41 568.517 1667.13 570.297C1665.94 560.798 1665.27 550.553 1665.12 539.562C1664.96 528.577 1665.19 517.445 1665.79 506.161C1666.68 490.124 1668.54 473.946 1671.38 457.609C1674.21 441.278 1678.31 425.241 1683.67 409.498C1683.67 401.192 1681.73 394.433 1677.86 389.235C1673.98 384.041 1669.29 380.77 1663.78 379.436C1658.26 378.102 1652.61 378.843 1646.79 381.662C1640.98 384.488 1635.99 389.613 1631.82 397.027C1628.24 406.831 1624.14 417.816 1619.53 429.988C1614.9 442.165 1609.69 454.563 1603.88 467.182C1598.07 479.811 1591.58 492.056 1584.43 503.929C1577.28 515.812 1569.46 526.357 1560.96 535.556C1552.47 544.761 1543.23 551.966 1533.25 557.159C1523.26 562.358 1512.47 564.658 1500.84 564.064C1495.47 562.578 1491.6 558.572 1489.21 552.034C1486.83 545.507 1485.41 537.336 1484.97 527.538C1484.52 517.739 1484.97 506.974 1486.31 495.243C1487.65 483.518 1489.44 471.86 1491.67 460.282C1493.91 448.698 1496.37 437.713 1499.05 427.321C1501.73 416.929 1504.26 408.165 1506.65 401.039C1510.23 392.433 1510.23 385.222 1506.65 379.436C1503.07 373.644 1498.16 369.79 1491.9 367.852C1485.64 365.925 1479.08 366.004 1472.23 368.078C1465.37 370.157 1460.45 374.757 1457.48 381.883C1452.41 394.066 1447.79 407.718 1443.62 422.862C1439.44 438.007 1436.09 453.676 1433.56 469.854C1431.02 486.044 1429.6 502.081 1429.31 517.965C1429.29 518.999 1429.34 519.982 1429.34 521.011C1422.84 538.274 1416.64 551.322 1410.76 560.052C1403.16 571.343 1394.59 576.242 1385.06 574.75C1380.88 572.97 1378.13 568.817 1376.79 562.279C1375.44 555.752 1374.99 547.734 1375.44 538.223C1375.9 528.73 1377.01 517.965 1378.79 505.935C1380.59 493.91 1382.82 481.438 1385.5 468.521C1388.19 455.597 1391.02 442.618 1393.99 429.547C1396.97 416.483 1399.65 404.158 1402.05 392.574C1401.75 382.182 1398.69 374.243 1392.88 368.745C1387.07 363.258 1378.94 361.105 1368.52 362.286C1361.37 365.258 1356.07 369.123 1352.64 373.87C1349.21 378.617 1346.46 384.708 1344.38 392.128C1343.18 395.993 1341.39 403.712 1339.01 415.296C1336.62 426.869 1333.57 440.165 1329.85 455.157C1326.12 470.159 1321.73 485.818 1316.66 502.149C1311.59 518.479 1305.93 533.262 1299.68 546.468C1293.41 559.679 1286.56 570.297 1279.11 578.316C1271.66 586.328 1263.61 589.6 1254.97 588.114C1250.2 587.221 1247.15 582.322 1245.81 573.416C1244.47 564.505 1244.24 553.526 1245.14 540.455C1246.03 527.391 1247.82 513.06 1250.5 497.475C1253.18 481.885 1255.93 467.114 1258.77 453.151C1261.6 439.199 1264.21 426.869 1266.6 416.183C1268.98 405.492 1270.62 398.366 1271.51 394.806C1271.51 386.194 1269.57 379.295 1265.7 374.09C1261.82 368.903 1257.13 365.631 1251.62 364.292C1246.1 362.958 1240.44 363.699 1234.63 366.518C1228.82 369.344 1223.83 374.469 1219.65 381.883C1218.16 389.901 1216.22 399.186 1213.84 409.724C1211.45 420.263 1209.15 431.101 1206.92 442.239C1204.68 453.377 1202.59 464.288 1200.66 474.98C1198.72 485.671 1197.3 495.023 1196.41 503.041C1195.81 509.274 1195.14 516.925 1194.4 525.978C1193.65 535.042 1193.28 544.614 1193.28 554.707C1193.28 564.81 1194.02 574.829 1195.52 584.774C1197 594.725 1199.69 603.857 1203.56 612.164C1207.43 620.482 1212.87 627.308 1219.88 632.654C1226.88 637.999 1235.75 640.966 1246.48 641.565C1257.5 642.153 1267.11 641.344 1275.31 639.112C1283.51 636.886 1290.95 633.394 1297.66 628.642C1304.37 623.9 1310.47 618.255 1315.99 611.717C1321.5 605.191 1326.94 598.065 1332.31 590.34C1337.37 601.631 1343.93 610.384 1351.98 616.622C1360.02 622.855 1368.52 626.573 1377.46 627.754C1386.39 628.935 1395.49 627.687 1404.73 623.968C1413.96 620.261 1422.3 613.949 1429.76 605.038C1434.67 599.574 1439.3 593.364 1443.64 586.498C1445.48 589.713 1447.44 592.816 1449.65 595.68C1456.96 605.191 1466.87 611.717 1479.39 615.283C1492.79 618.849 1505.9 619.448 1518.72 617.069C1531.53 614.695 1543.75 610.384 1555.37 604.151C1567 597.913 1577.8 590.42 1587.79 581.655C1597.77 572.896 1606.48 563.77 1613.94 554.26C1613.63 561.092 1613.49 567.556 1613.49 573.637C1613.49 579.728 1613.34 586.328 1613.04 593.46C1598.14 603.857 1584.06 616.328 1570.8 630.874C1557.53 645.419 1545.91 660.936 1535.93 677.419C1525.95 693.897 1518.12 710.601 1512.47 727.525C1506.8 744.46 1504.04 760.265 1504.19 774.969C1504.34 789.666 1507.84 802.505 1514.69 813.49C1521.55 824.481 1532.72 832.347 1548.22 837.099C1564.32 842.151 1578.47 842.292 1590.69 837.546C1602.91 832.793 1613.56 824.922 1622.65 813.937C1631.74 802.951 1639.19 789.666 1645.01 774.076C1650.82 758.485 1655.44 742.228 1658.86 725.304C1662.29 708.38 1664.45 691.738 1665.34 675.419C1666.24 659.082 1666.24 644.526 1665.34 631.761C1690.97 621.075 1711.98 607.564 1728.37 591.228C1744.76 574.908 1758.32 557.679 1769.05 539.562C1772.33 535.11 1773.45 529.764 1772.41 523.531C1771.36 517.293 1768.83 511.947 1764.81 507.494Z" fill="currentColor"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M2328.72 478.992C2329.61 472.166 2330.95 464.961 2332.74 457.389C2334.52 449.817 2336.76 442.466 2339.45 435.34C2342.12 428.214 2345.25 422.055 2348.83 416.856C2352.41 411.663 2356.21 407.951 2360.23 405.719C2364.26 403.498 2368.35 403.718 2372.53 406.385C2377 409.064 2379.75 414.703 2380.8 423.309C2381.83 431.933 2380.8 441.132 2377.67 450.93C2374.53 460.735 2368.95 469.934 2360.9 478.546C2352.86 487.163 2341.98 492.797 2328.27 495.47C2327.67 491.322 2327.82 485.824 2328.72 478.992ZM2483.61 497.25C2478.69 495.775 2474 495.623 2469.53 496.809C2465.06 497.996 2462.22 501.115 2461.04 506.167C2458.64 515.666 2454.85 525.391 2449.63 535.336C2444.42 545.287 2438.01 554.713 2430.42 563.624C2422.82 572.53 2414.24 580.401 2404.71 587.227C2395.17 594.059 2385.19 598.959 2374.76 601.925C2364.32 605.197 2355.68 605.564 2348.83 603.038C2341.98 600.524 2336.54 596.212 2332.52 590.126C2328.5 584.04 2325.59 576.689 2323.8 568.077C2322.01 559.465 2320.96 550.56 2320.67 541.349C2337.65 542.541 2352.78 539.501 2366.05 532.217C2379.3 524.95 2390.55 515.293 2399.79 503.268C2409.03 491.243 2416.03 477.732 2420.8 462.735C2425.56 447.743 2428.25 432.82 2428.85 417.969C2429.14 404.012 2427.06 392.213 2422.59 382.562C2418.12 372.916 2412.08 365.406 2404.48 360.066C2396.89 354.72 2388.17 351.601 2378.33 350.714C2368.51 349.821 2358.51 351.16 2348.38 354.72C2336.16 358.879 2325.81 365.632 2317.32 374.99C2308.82 384.342 2301.74 395.185 2296.08 407.504C2290.42 419.829 2285.95 433.114 2282.67 447.365C2279.39 461.622 2277.01 475.653 2275.52 489.463C2274.18 501.855 2273.46 513.705 2273.21 525.142C2272.57 526.595 2271.95 527.99 2271.27 529.544C2266.65 540.094 2261.28 550.413 2255.18 560.505C2249.07 570.603 2242.29 579.068 2234.84 585.894C2227.39 592.726 2219.64 595.099 2211.59 593.02C2206.83 591.839 2204.22 586.335 2203.77 576.542C2203.33 566.738 2203.84 554.566 2205.33 540.015C2206.83 525.47 2208.54 509.721 2210.48 492.797C2212.41 475.873 2213.38 459.695 2213.38 444.251C2213.38 430.887 2210.85 418.049 2205.78 405.719C2200.71 393.405 2193.78 383.155 2185 374.99C2176.2 366.818 2166 361.399 2154.38 358.732C2142.75 356.054 2130.24 357.839 2116.83 364.072C2103.41 370.311 2092.76 379.069 2084.87 390.354C2076.96 401.644 2069.73 413.517 2063.18 425.988C2060.79 416.483 2057.3 407.657 2052.68 399.486C2048.05 391.32 2042.4 384.195 2035.69 378.103C2028.98 372.023 2021.45 367.271 2013.12 363.852C2004.77 360.444 1995.97 358.732 1986.74 358.732C1977.8 358.732 1969.53 360.444 1961.93 363.852C1954.33 367.271 1947.4 371.644 1941.14 376.99C1934.88 382.341 1929.22 388.348 1924.15 395.033C1919.09 401.712 1914.61 408.324 1910.75 414.85C1910.14 407.131 1909.47 400.379 1908.73 394.581C1907.99 388.794 1906.64 383.895 1904.71 379.889C1902.77 375.877 1900.02 372.837 1896.44 370.757C1892.86 368.683 1887.8 367.638 1881.25 367.638C1877.96 367.638 1874.68 368.305 1871.41 369.638C1868.12 370.977 1865.21 372.837 1862.69 375.21C1860.15 377.595 1858.22 380.482 1856.88 383.895C1855.53 387.308 1855.17 391.247 1855.76 395.7C1856.05 398.971 1856.88 402.899 1858.22 407.504C1859.56 412.11 1860.82 418.128 1862.02 425.541C1863.21 432.967 1864.18 441.951 1864.92 452.49C1865.67 463.034 1865.89 475.952 1865.59 491.243C1865.29 506.54 1864.18 524.425 1862.24 544.914C1860.3 565.404 1857.24 589.16 1853.08 616.177C1852.48 622.415 1854.86 627.467 1860.23 631.326C1865.59 635.18 1871.7 637.406 1878.56 638.005C1885.41 638.599 1891.9 637.406 1898 634.445C1904.11 631.468 1907.62 626.274 1908.51 618.855C1909.4 604.898 1911.12 590.053 1913.65 574.31C1916.18 558.578 1919.31 542.987 1923.04 527.544C1926.76 512.106 1931 497.408 1935.78 483.445C1940.54 469.488 1945.84 457.169 1951.65 446.478C1957.46 435.786 1963.5 427.254 1969.75 420.868C1976.01 414.483 1982.56 411.29 1989.42 411.29C1997.77 411.29 2004.24 415.071 2008.87 422.643C2013.48 430.22 2016.76 439.951 2018.7 451.818C2020.64 463.701 2021.53 476.698 2021.39 490.797C2021.23 504.901 2020.64 518.486 2019.6 531.55C2018.55 544.621 2017.36 556.272 2016.02 566.517C2014.68 576.762 2013.71 583.82 2013.12 587.674C2013.12 594.506 2015.72 599.919 2020.93 603.931C2026.15 607.938 2031.96 610.317 2038.37 611.057C2044.78 611.803 2050.81 610.61 2056.48 607.491C2062.14 604.372 2065.41 599.111 2066.31 591.68C2069.29 570.303 2073.39 548.853 2078.6 527.323C2083.81 505.794 2089.78 486.497 2096.49 469.42C2103.19 452.343 2110.64 438.386 2118.84 427.548C2127.03 416.715 2135.75 411.29 2144.99 411.29C2149.75 411.29 2153.41 414.562 2155.94 421.089C2158.47 427.621 2159.74 436.527 2159.74 447.811C2159.74 456.129 2159.07 464.668 2157.73 473.426C2156.39 482.185 2154.83 491.243 2153.03 500.595C2151.25 509.953 2149.68 519.525 2148.34 529.324C2147 539.128 2146.33 549.367 2146.33 560.058C2146.33 567.484 2147.07 576.095 2148.56 585.894C2150.05 595.687 2152.88 604.977 2157.05 613.73C2161.23 622.494 2166.96 629.914 2174.27 635.999C2181.57 642.085 2190.88 645.131 2202.2 645.131C2219.19 645.131 2234.24 641.492 2247.36 634.219C2260.47 626.947 2271.72 617.448 2281.11 605.717C2281.59 605.101 2282.04 604.445 2282.51 603.835C2283.23 605.57 2283.87 607.406 2284.68 609.057C2291.09 622.121 2299.81 632.213 2310.84 639.345C2321.85 646.47 2334.82 650.403 2349.73 651.149C2364.63 651.884 2380.86 649.138 2398.46 642.905C2411.56 638.152 2422.96 632.213 2432.65 625.088C2442.33 617.962 2451.05 609.277 2458.8 599.032C2466.55 588.787 2473.62 576.983 2480.04 563.624C2486.45 550.254 2492.92 534.969 2499.48 517.74C2500.67 512.999 2499.55 508.766 2496.13 505.048C2492.7 501.341 2488.53 498.742 2483.61 497.25Z" fill="currentColor"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M2726.57 447.574C2725.07 456.338 2723.06 465.995 2720.53 476.528C2717.99 487.073 2714.79 497.984 2710.92 509.269C2707.04 520.554 2702.28 530.725 2696.62 539.778C2690.95 548.841 2684.47 556.035 2677.17 561.381C2669.86 566.726 2661.45 568.953 2651.91 568.06C2647.14 567.472 2643.49 564.206 2640.96 558.261C2638.42 552.328 2637.08 544.75 2636.93 535.545C2636.78 526.346 2637.6 516.248 2639.39 505.257C2641.18 494.277 2643.94 483.507 2647.67 472.963C2651.39 462.43 2655.94 452.699 2661.29 443.788C2666.66 434.882 2672.84 427.977 2679.85 423.078C2686.85 418.178 2694.53 415.884 2702.87 416.172C2711.21 416.472 2720.15 420.625 2729.7 428.644C2729.09 432.509 2728.06 438.821 2726.57 447.574ZM2885.48 481.648C2880.86 479.275 2876.09 478.76 2871.18 480.094C2866.26 481.428 2862.75 485.96 2860.67 493.678C2859.48 501.996 2856.8 511.789 2852.63 523.074C2848.45 534.359 2843.31 545.055 2837.21 555.142C2831.09 565.24 2824.09 573.631 2816.19 580.311C2808.29 586.996 2799.88 590.041 2790.94 589.437C2783.48 588.849 2778.26 585.063 2775.29 578.084C2772.3 571.106 2770.74 562.353 2770.6 551.802C2770.44 541.269 2771.49 529.391 2773.72 516.174C2775.96 502.963 2778.64 489.825 2781.77 476.749C2784.9 463.69 2788.1 451.139 2791.39 439.114C2794.66 427.09 2797.34 416.918 2799.43 408.606C2801.82 401.181 2801.07 394.874 2797.19 389.67C2793.32 384.483 2788.48 380.764 2782.67 378.538C2776.85 376.312 2770.97 375.718 2765 376.758C2759.04 377.798 2755.18 380.99 2753.38 386.33C2735.8 371.186 2718.89 363.021 2702.65 361.834C2686.4 360.648 2671.42 364.213 2657.72 372.526C2644.01 380.838 2631.87 392.863 2621.29 408.606C2610.71 424.349 2602.14 441.493 2595.58 460.051C2589.03 478.608 2584.93 497.544 2583.29 516.841C2581.65 536.144 2582.91 553.741 2587.09 569.625C2591.27 585.509 2598.63 598.506 2609.22 608.593C2619.79 618.691 2634.18 623.743 2652.36 623.743C2660.4 623.743 2668.15 622.11 2675.6 618.843C2683.05 615.572 2689.91 611.712 2696.17 607.259C2702.42 602.807 2707.94 598.128 2712.71 593.228C2717.47 588.329 2721.2 584.249 2723.88 580.978C2725.96 591.669 2729.4 600.733 2734.16 608.152C2738.93 615.572 2744.37 621.669 2750.48 626.41C2756.58 631.157 2763 634.649 2769.7 636.881C2776.41 639.107 2782.89 640.22 2789.15 640.22C2803.16 640.22 2816.26 635.468 2828.49 625.963C2840.7 616.47 2851.66 604.807 2861.35 591.002C2871.03 577.191 2879 562.646 2885.26 547.35C2891.52 532.059 2895.69 518.474 2897.77 506.591C2899.86 502.138 2899.49 497.465 2896.66 492.565C2893.82 487.666 2890.1 484.033 2885.48 481.648Z" fill="currentColor"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M3690.14 727.546C3687.61 737.639 3683.66 746.183 3678.3 753.156C3672.94 760.135 3666.23 763.774 3658.18 764.073C3653.12 764.367 3649.24 761.694 3646.56 756.055C3643.88 750.41 3642.02 743.137 3640.97 734.231C3639.92 725.32 3639.48 715.369 3639.63 704.384C3639.78 693.399 3640.23 682.561 3640.97 671.869C3641.71 661.184 3642.61 651.227 3643.66 642.027C3644.69 632.817 3645.51 625.702 3646.11 620.651C3656.24 621.837 3664.67 626.211 3671.37 633.789C3678.08 641.361 3683.21 650.34 3686.79 660.737C3690.37 671.129 3692.45 682.34 3693.05 694.365C3693.64 706.39 3692.67 717.449 3690.14 727.546ZM3528.32 727.546C3525.79 737.639 3521.84 746.183 3516.47 753.156C3511.11 760.135 3504.41 763.774 3496.36 764.073C3491.29 764.367 3487.42 761.694 3484.74 756.055C3482.05 750.41 3480.19 743.137 3479.15 734.231C3478.1 725.32 3477.65 715.369 3477.81 704.384C3477.95 693.399 3478.4 682.561 3479.15 671.869C3479.89 661.184 3480.78 651.227 3481.83 642.027C3482.87 632.817 3483.69 625.702 3484.29 620.651C3494.42 621.837 3502.85 626.211 3509.54 633.789C3516.25 641.361 3521.39 650.34 3524.97 660.737C3528.55 671.129 3530.63 682.34 3531.23 694.365C3531.82 706.39 3530.85 717.449 3528.32 727.546ZM3362.26 474.555C3361.95 481.675 3361.28 487.987 3360.24 493.48C3359.19 498.983 3357.78 502.464 3355.99 503.95C3352.71 502.165 3348.68 497.571 3343.92 490.14C3339.15 482.72 3335.43 474.323 3332.74 464.971C3330.07 455.619 3329.24 446.42 3330.29 437.356C3331.32 428.303 3336.03 421.257 3344.37 416.199C3347.64 414.419 3350.47 415.086 3352.86 418.205C3355.25 421.325 3357.18 425.851 3358.68 431.79C3360.16 437.734 3361.2 444.561 3361.8 452.28C3362.4 460.004 3362.54 467.424 3362.26 474.555ZM3322.69 563.414C3318.07 568.307 3312.92 572.54 3307.27 576.105C3301.6 579.671 3295.79 582.344 3289.83 584.124C3283.87 585.909 3278.5 586.35 3273.74 585.457C3260.33 582.79 3250.04 576.993 3242.9 568.087C3235.74 559.181 3231.19 548.716 3229.26 536.691C3227.32 524.661 3227.54 511.816 3229.93 498.158C3232.31 484.5 3236.33 471.809 3242 460.078C3247.66 448.347 3254.52 438.249 3262.56 429.789C3270.61 421.325 3279.39 416.058 3288.94 413.973C3285.36 429.117 3284.17 444.787 3285.36 460.965C3286.55 477.149 3290.43 492.366 3296.99 506.618C3301.15 515.241 3306.15 523.101 3311.96 530.227C3317.77 537.358 3324.85 543.444 3333.2 548.49C3330.81 553.542 3327.3 558.514 3322.69 563.414ZM3817.33 479.008C3818.22 472.182 3819.56 464.971 3821.35 457.399C3823.13 449.833 3825.37 442.481 3828.05 435.355C3830.73 428.224 3833.86 422.065 3837.44 416.872C3841.02 411.679 3844.82 407.96 3848.84 405.734C3852.86 403.508 3856.96 403.728 3861.13 406.401C3865.6 409.079 3868.36 414.719 3869.4 423.325C3870.44 431.942 3869.4 441.142 3866.27 450.946C3863.14 460.744 3857.56 469.95 3849.51 478.556C3841.47 487.179 3830.59 492.813 3816.88 495.486C3816.28 491.332 3816.43 485.84 3817.33 479.008ZM3997.48 479.008C3998.37 472.182 3999.71 464.971 4001.5 457.399C4003.29 449.833 4005.53 442.481 4008.21 435.355C4010.89 428.224 4014.02 422.065 4017.59 416.872C4021.17 411.679 4024.97 407.96 4028.99 405.734C4033.02 403.508 4037.12 403.728 4041.29 406.401C4045.76 409.079 4048.51 414.719 4049.56 423.325C4050.6 431.942 4049.56 441.142 4046.43 450.946C4043.3 460.744 4037.71 469.95 4029.66 478.556C4021.62 487.179 4010.74 492.813 3997.03 495.486C3996.44 491.332 3996.58 485.84 3997.48 479.008ZM4164.89 505.064C4161.46 501.357 4157.29 498.757 4152.38 497.266C4147.46 495.785 4142.77 495.638 4138.29 496.825C4133.82 498.011 4130.99 501.131 4129.8 506.177C4127.41 515.681 4123.61 525.406 4118.4 535.346C4113.18 545.303 4106.78 554.728 4099.18 563.634C4091.58 572.54 4083.01 580.417 4073.48 587.243C4063.93 594.075 4053.95 598.974 4043.53 601.935C4033.09 605.213 4024.45 605.58 4017.59 603.054C4010.74 600.534 4005.3 596.228 4001.28 590.142C3997.26 584.05 3994.35 576.704 3992.56 568.087C3990.78 559.481 3989.73 550.575 3989.43 541.364C4006.42 542.557 4021.55 539.516 4034.81 532.233C4048.06 524.96 4059.32 515.303 4068.56 503.278C4077.79 491.259 4084.8 477.748 4089.57 462.751C4094.33 447.753 4097.01 432.835 4097.62 417.985C4097.9 404.028 4095.82 392.223 4091.35 382.571C4086.89 372.926 4080.85 365.421 4073.25 360.081C4065.65 354.73 4056.94 351.616 4047.1 350.724C4037.27 349.831 4027.28 351.176 4017.15 354.73C4004.93 358.895 3994.58 365.647 3986.09 374.999C3977.59 384.357 3970.51 395.201 3964.85 407.514C3959.18 419.844 3954.71 433.123 3951.43 447.38C3948.15 461.632 3945.77 475.668 3944.29 489.473C3942.84 502.871 3942.05 515.693 3941.87 527.966C3940.74 530.413 3939.54 532.871 3938.24 535.346C3933.03 545.303 3926.62 554.728 3919.02 563.634C3911.43 572.54 3902.85 580.417 3893.32 587.243C3883.78 594.075 3873.8 598.974 3863.37 601.935C3852.93 605.213 3844.29 605.58 3837.44 603.054C3830.59 600.534 3825.15 596.228 3821.13 590.142C3817.11 584.05 3814.2 576.704 3812.41 568.087C3810.62 559.481 3809.57 550.575 3809.28 541.364C3826.26 542.557 3841.39 539.516 3854.65 532.233C3867.91 524.96 3879.16 515.303 3888.4 503.278C3897.64 491.259 3904.64 477.748 3909.41 462.751C3914.17 447.753 3916.86 432.835 3917.46 417.985C3917.75 404.028 3915.67 392.223 3911.2 382.571C3906.73 372.926 3900.69 365.421 3893.09 360.081C3885.49 354.73 3876.78 351.616 3866.94 350.724C3857.11 349.831 3847.12 351.176 3836.99 354.73C3824.77 358.895 3814.42 365.647 3805.93 374.999C3797.43 384.357 3790.35 395.201 3784.69 407.514C3779.03 419.844 3774.56 433.123 3771.28 447.38C3768 461.632 3765.62 475.668 3764.13 489.473C3763.29 497.26 3762.72 504.809 3762.3 512.223C3759.42 514.664 3756.62 517.122 3753.62 519.535C3743.35 527.853 3732.54 535.346 3721.22 542.031C3709.88 548.716 3698.11 554.209 3685.9 558.514C3673.67 562.82 3661.16 565.42 3648.35 566.307L3676.07 270.55C3677.85 264.312 3676.96 258.825 3673.39 254.073C3669.81 249.32 3665.18 246.054 3659.52 244.274C3653.86 242.488 3647.82 242.641 3641.42 244.715C3635.01 246.8 3629.72 251.552 3625.55 258.966C3623.46 270.256 3621.3 285.694 3619.07 305.291C3616.83 324.888 3614.6 346.271 3612.36 369.433C3610.13 392.596 3607.89 416.499 3605.66 441.142C3603.42 465.796 3601.48 488.806 3599.85 510.183C3599.77 511.133 3599.71 511.991 3599.64 512.93C3597.03 515.133 3594.5 517.354 3591.8 519.535C3581.52 527.853 3570.71 535.346 3559.39 542.031C3548.06 548.716 3536.29 554.209 3524.08 558.514C3511.85 562.82 3499.33 565.42 3486.52 566.307L3514.24 270.55C3516.03 264.312 3515.14 258.825 3511.56 254.073C3507.98 249.32 3503.36 246.054 3497.7 244.274C3492.04 242.488 3486 242.641 3479.59 244.715C3473.18 246.8 3467.9 251.552 3463.73 258.966C3461.64 270.256 3459.48 285.694 3457.25 305.291C3455.01 324.888 3452.77 346.271 3450.54 369.433C3448.3 392.596 3446.07 416.499 3443.83 441.142C3441.6 465.796 3439.66 488.806 3438.02 510.183C3437.99 510.613 3437.96 511.003 3437.93 511.432C3433.24 513.596 3428.14 515.495 3422.6 517.089C3416.93 518.727 3410.53 519.694 3403.38 519.987C3404.57 514.636 3405.53 508.697 3406.28 502.165C3407.02 495.638 3407.63 488.806 3408.07 481.675C3408.52 474.555 3408.66 467.424 3408.52 460.298C3408.36 453.167 3407.99 446.64 3407.4 440.695C3405.91 427.936 3403.16 415.832 3399.14 404.395C3395.11 392.969 3389.67 383.396 3382.82 375.666C3375.96 367.947 3367.39 362.749 3357.11 360.081C3346.83 357.409 3334.83 358.296 3321.13 362.749C3300.85 360.081 3282.6 361.94 3266.36 368.32C3250.12 374.711 3236.04 383.984 3224.12 396.156C3212.2 408.339 3202.44 422.658 3194.84 439.142C3187.24 455.619 3182.17 472.549 3179.64 489.914C3178.56 497.277 3178.04 504.606 3177.88 511.918C3173.27 521.332 3168.22 529.56 3162.65 536.465C3154.76 546.264 3146.56 554.282 3138.07 560.515C3129.57 566.753 3121.15 571.506 3112.81 574.772C3104.46 578.044 3097.01 580.27 3090.46 581.451C3082.71 582.937 3075.26 583.09 3068.11 581.897C3060.96 580.716 3054.39 577.298 3048.44 571.653C3043.67 567.499 3040.02 560.814 3037.49 551.609C3034.95 542.404 3033.47 531.944 3033.02 520.208C3032.57 508.477 3033.02 496.226 3034.36 483.461C3035.7 470.696 3038 458.592 3041.29 447.16C3044.56 435.728 3048.73 425.484 3053.8 416.42C3058.86 407.373 3064.82 400.908 3071.68 397.049C3075.55 397.648 3077.95 399.942 3078.84 403.948C3079.73 407.96 3079.95 412.713 3079.51 418.205C3079.06 423.704 3078.39 429.343 3077.5 435.129C3076.6 440.922 3076.15 445.753 3076.15 449.607C3077.65 457.625 3080.55 463.864 3084.87 468.317C3089.19 472.769 3094.04 475.374 3099.4 476.109C3104.76 476.855 3110.05 475.595 3115.27 472.323C3120.48 469.062 3124.73 463.864 3128.01 456.732C3128.31 457.032 3128.75 457.179 3129.35 457.179L3135.61 400.614C3137.4 392.89 3136.2 386.064 3132.03 380.125C3127.86 374.186 3122.35 370.767 3115.49 369.88C3106.85 357.409 3095.15 350.803 3080.4 350.057C3065.65 349.317 3050.52 354.142 3035.03 364.534C3025.49 371.372 3017.07 380.791 3009.77 392.816C3002.46 404.847 2996.51 418.205 2991.89 432.903C2987.26 447.601 2983.99 463.123 2982.06 479.454C2980.12 495.785 2979.74 511.675 2980.93 527.107C2982.12 542.557 2984.89 557.107 2989.21 570.76C2993.52 584.423 2999.56 595.855 3007.32 605.054C3013.87 613.073 3021.31 618.944 3029.66 622.657C3038 626.369 3046.72 628.663 3055.81 629.556C3064.9 630.443 3073.92 630.07 3082.86 628.443C3091.8 626.816 3100.3 624.516 3108.34 621.538C3118.77 617.684 3129.5 612.779 3140.53 606.84C3151.55 600.907 3162.13 593.775 3172.27 585.457C3177.59 581.084 3182.73 576.314 3187.69 571.2C3189.95 576.783 3192.47 582.186 3195.51 587.243C3203.56 600.602 3214.43 611.445 3228.14 619.758C3241.84 628.07 3258.69 632.071 3278.66 631.783C3300.12 631.483 3319.93 626.07 3338.11 615.525C3356.29 604.992 3371.19 589.464 3382.82 568.98C3400.23 568.98 3417.35 566.12 3434.19 560.441C3434.05 562.238 3433.91 564.131 3433.78 565.866C3432.59 581.604 3431.98 592.289 3431.98 597.934C3431.69 607.733 3431.03 619.831 3429.98 634.229C3428.93 648.633 3428.26 663.777 3427.97 679.662C3427.67 695.546 3428.26 711.583 3429.75 727.773C3431.25 743.951 3434.37 758.654 3439.14 771.871C3443.9 785.077 3450.68 796.288 3459.48 805.499C3468.27 814.699 3479.82 820.197 3494.13 821.977C3509.32 824.051 3522.43 821.378 3533.46 813.958C3544.48 806.533 3553.43 796.367 3560.29 783.45C3567.14 770.526 3571.98 755.608 3574.81 738.684C3577.64 721.76 3578.46 704.757 3577.27 687.68C3576.08 670.604 3572.95 654.499 3567.88 639.36C3562.81 624.211 3555.81 611.739 3546.87 601.935C3552.24 600.46 3558.64 597.641 3566.1 593.476C3573.54 589.323 3581.22 584.644 3589.12 579.445C3591.06 578.168 3592.97 576.823 3594.91 575.512C3594.18 586.034 3593.81 593.538 3593.81 597.934C3593.52 607.733 3592.85 619.831 3591.8 634.229C3590.76 648.633 3590.09 663.777 3589.79 679.662C3589.5 695.546 3590.09 711.583 3591.58 727.773C3593.07 743.951 3596.2 758.654 3600.96 771.871C3605.73 785.077 3612.51 796.288 3621.3 805.499C3630.09 814.699 3641.64 820.197 3655.95 821.977C3671.14 824.051 3684.26 821.378 3695.29 813.958C3706.31 806.533 3715.25 796.367 3722.11 783.45C3728.96 770.526 3733.8 755.608 3736.64 738.684C3739.47 721.76 3740.28 704.757 3739.1 687.68C3737.9 670.604 3734.77 654.499 3729.71 639.36C3724.64 624.211 3717.64 611.739 3708.69 601.935C3714.06 600.46 3720.47 597.641 3727.92 593.476C3735.37 589.323 3743.04 584.644 3750.94 579.445C3755.05 576.744 3759.13 573.958 3763.19 571.093C3764.73 585.616 3768.03 598.353 3773.29 609.066C3779.7 622.137 3788.41 632.229 3799.44 639.36C3810.46 646.48 3823.43 650.419 3838.34 651.159C3853.24 651.894 3869.47 649.153 3887.07 642.915C3900.17 638.168 3911.57 632.229 3921.26 625.103C3930.94 617.972 3939.66 609.287 3947.41 599.048C3947.86 598.454 3948.28 597.81 3948.72 597.211C3950.1 601.37 3951.63 605.365 3953.45 609.066C3959.86 622.137 3968.57 632.229 3979.6 639.36C3990.62 646.48 4003.59 650.419 4018.49 651.159C4033.39 651.894 4049.63 649.153 4067.22 642.915C4080.33 638.168 4091.73 632.229 4101.42 625.103C4111.1 617.972 4119.81 609.287 4127.57 599.048C4135.31 588.797 4142.38 576.993 4148.8 563.634C4155.21 550.27 4161.68 534.985 4168.25 517.755C4169.44 513.009 4168.31 508.776 4164.89 505.064Z" fill="currentColor"></path>',19)];const Su={},Ou=(0,Ki.Z)(Su,[["render",function(e,t){return(0,r.openBlock)(),(0,r.createElementBlock)("svg",xu,ku)}]]);function Nu(){let e=[],t=[],n={enqueue(e){t.push(e)},addEventListener:(e,t,r,o)=>(e.addEventListener(t,r,o),n.add((()=>e.removeEventListener(t,r,o)))),requestAnimationFrame(...e){let t=requestAnimationFrame(...e);n.add((()=>cancelAnimationFrame(t)))},nextFrame(...e){n.requestAnimationFrame((()=>{n.requestAnimationFrame(...e)}))},setTimeout(...e){let t=setTimeout(...e);n.add((()=>clearTimeout(t)))},add(t){e.push(t)},style(e,t,n){let r=e.style.getPropertyValue(t);return Object.assign(e.style,{[t]:n}),this.add((()=>{Object.assign(e.style,{[t]:r})}))},dispose(){for(let t of e.splice(0))t()},async workQueue(){for(let e of t.splice(0))await e()}};return n}function Pu(e,...t){e&&t.length>0&&e.classList.add(...t)}function Tu(e,...t){e&&t.length>0&&e.classList.remove(...t)}var Vu=(e=>(e.Finished="finished",e.Cancelled="cancelled",e))(Vu||{});function Ru(e,t,n,r,o,i){let a=Nu(),l=void 0!==i?function(e){let t={called:!1};return(...n)=>{if(!t.called)return t.called=!0,e(...n)}}(i):()=>{};return Tu(e,...o),Pu(e,...t,...n),a.nextFrame((()=>{Tu(e,...n),Pu(e,...r),a.add(function(e,t){let n=Nu();if(!e)return n.dispose;let{transitionDuration:r,transitionDelay:o}=getComputedStyle(e),[i,a]=[r,o].map((e=>{let[t=0]=e.split(",").filter(Boolean).map((e=>e.includes("ms")?parseFloat(e):1e3*parseFloat(e))).sort(((e,t)=>t-e));return t}));return 0!==i?n.setTimeout((()=>t("finished")),i+a):t("finished"),n.add((()=>t("cancelled"))),n.dispose}(e,(n=>(Tu(e,...r,...t),Pu(e,...o),l(n)))))})),a.add((()=>Tu(e,...t,...n,...r,...o))),a.add((()=>l("cancelled"))),a.dispose}function Lu(e=""){return e.split(" ").filter((e=>e.trim().length>1))}let Au=Symbol("TransitionContext");var ju=(e=>(e.Visible="visible",e.Hidden="hidden",e))(ju||{});let Bu=Symbol("NestingContext");function Iu(e){return"children"in e?Iu(e.children):e.value.filter((({state:e})=>"visible"===e)).length>0}function Mu(e){let t=(0,r.ref)([]),n=(0,r.ref)(!1);function o(r,o=Lr.Hidden){let i=t.value.findIndex((({id:e})=>e===r));-1!==i&&(Tr(o,{[Lr.Unmount](){t.value.splice(i,1)},[Lr.Hidden](){t.value[i].state="hidden"}}),!Iu(t)&&n.value&&(null==e||e()))}return(0,r.onMounted)((()=>n.value=!0)),(0,r.onUnmounted)((()=>n.value=!1)),{children:t,register:function(e){let n=t.value.find((({id:t})=>t===e));return n?"visible"!==n.state&&(n.state="visible"):t.value.push({id:e,state:"visible"}),()=>o(e,Lr.Unmount)},unregister:o}}let Fu=Rr.RenderStrategy,Du=(0,r.defineComponent)({props:{as:{type:[Object,String],default:"div"},show:{type:[Boolean],default:null},unmount:{type:[Boolean],default:!0},appear:{type:[Boolean],default:!1},enter:{type:[String],default:""},enterFrom:{type:[String],default:""},enterTo:{type:[String],default:""},entered:{type:[String],default:""},leave:{type:[String],default:""},leaveFrom:{type:[String],default:""},leaveTo:{type:[String],default:""}},emits:{beforeEnter:()=>!0,afterEnter:()=>!0,beforeLeave:()=>!0,afterLeave:()=>!0},setup(e,{emit:t,attrs:n,slots:o,expose:i}){if(null===(0,r.inject)(Au,null)&&null!==Zr())return()=>(0,r.h)($u,{...e,onBeforeEnter:()=>t("beforeEnter"),onAfterEnter:()=>t("afterEnter"),onBeforeLeave:()=>t("beforeLeave"),onAfterLeave:()=>t("afterLeave")},o);let a=(0,r.ref)(null),l=(0,r.ref)("visible"),s=(0,r.computed)((()=>e.unmount?Lr.Unmount:Lr.Hidden));i({el:a,$el:a});let{show:c,appear:u}=function(){let e=(0,r.inject)(Au,null);if(null===e)throw new Error("A <TransitionChild /> is used but it is missing a parent <TransitionRoot />.");return e}(),{register:f,unregister:d}=function(){let e=(0,r.inject)(Bu,null);if(null===e)throw new Error("A <TransitionChild /> is used but it is missing a parent <TransitionRoot />.");return e}(),p={value:!0},h=Dr(),v={value:!1},m=Mu((()=>{v.value||(l.value="hidden",d(h),t("afterLeave"))}));(0,r.onMounted)((()=>{let e=f(h);(0,r.onUnmounted)(e)})),(0,r.watchEffect)((()=>{if(s.value===Lr.Hidden&&h){if(c&&"visible"!==l.value)return void(l.value="visible");Tr(l.value,{hidden:()=>d(h),visible:()=>f(h)})}}));let g=Lu(e.enter),y=Lu(e.enterFrom),b=Lu(e.enterTo),w=Lu(e.entered),C=Lu(e.leave),_=Lu(e.leaveFrom),E=Lu(e.leaveTo);return(0,r.onMounted)((()=>{(0,r.watchEffect)((()=>{if("visible"===l.value){let e=zr(a);if(e instanceof Comment&&""===e.data)throw new Error("Did you forget to passthrough the `ref` to the actual DOM node?")}}))})),(0,r.onMounted)((()=>{(0,r.watch)([c],((e,n,r)=>{(function(e){let n=p.value&&!u.value,r=zr(a);!r||!(r instanceof HTMLElement)||n||(v.value=!0,c.value&&t("beforeEnter"),c.value||t("beforeLeave"),e(c.value?Ru(r,g,y,b,w,(e=>{v.value=!1,e===Vu.Finished&&t("afterEnter")})):Ru(r,C,_,E,w,(e=>{v.value=!1,e===Vu.Finished&&(Iu(m)||(l.value="hidden",d(h),t("afterLeave")))}))))})(r),p.value=!1}),{immediate:!0})})),(0,r.provide)(Bu,m),Yr((0,r.computed)((()=>Tr(l.value,{visible:Gr.Open,hidden:Gr.Closed})))),()=>{let{appear:t,show:i,enter:s,enterFrom:f,enterTo:d,entered:p,leave:h,leaveFrom:v,leaveTo:m,...b}=e,w={ref:a};return Ar({theirProps:{...b,...u&&c&&qr.isServer?{class:(0,r.normalizeClass)([b.class,...g,...y])}:{}},ourProps:w,slot:{},slots:o,attrs:n,features:Fu,visible:"visible"===l.value,name:"TransitionChild"})}}}),Uu=Du,$u=(0,r.defineComponent)({inheritAttrs:!1,props:{as:{type:[Object,String],default:"div"},show:{type:[Boolean],default:null},unmount:{type:[Boolean],default:!0},appear:{type:[Boolean],default:!1},enter:{type:[String],default:""},enterFrom:{type:[String],default:""},enterTo:{type:[String],default:""},entered:{type:[String],default:""},leave:{type:[String],default:""},leaveFrom:{type:[String],default:""},leaveTo:{type:[String],default:""}},emits:{beforeEnter:()=>!0,afterEnter:()=>!0,beforeLeave:()=>!0,afterLeave:()=>!0},setup(e,{emit:t,attrs:n,slots:o}){let i=Zr(),a=(0,r.computed)((()=>null===e.show&&null!==i?Tr(i.value,{[Gr.Open]:!0,[Gr.Closed]:!1}):e.show));(0,r.watchEffect)((()=>{if(![!0,!1].includes(a.value))throw new Error('A <Transition /> is used but it is missing a `:show="true | false"` prop.')}));let l=(0,r.ref)(a.value?"visible":"hidden"),s=Mu((()=>{l.value="hidden"})),c=(0,r.ref)(!0),u={show:a,appear:(0,r.computed)((()=>e.appear||!c.value))};return(0,r.onMounted)((()=>{(0,r.watchEffect)((()=>{c.value=!1,a.value?l.value="visible":Iu(s)||(l.value="hidden")}))})),(0,r.provide)(Bu,s),(0,r.provide)(Au,u),()=>{let i=Mr(e,["show","appear","unmount","onBeforeEnter","onBeforeLeave","onAfterEnter","onAfterLeave"]),a={unmount:e.unmount};return Ar({ourProps:{...a,as:"template"},theirProps:{},slot:{},slots:{...o,default:()=>[(0,r.h)(Uu,{onBeforeEnter:()=>t("beforeEnter"),onAfterEnter:()=>t("afterEnter"),onBeforeLeave:()=>t("beforeLeave"),onAfterLeave:()=>t("afterLeave"),...n,...a,...i},o.default)]},attrs:{},features:Fu,visible:"visible"===l.value,name:"Transition"})}}});var Hu=(e=>(e[e.Forwards=0]="Forwards",e[e.Backwards=1]="Backwards",e))(Hu||{});function zu(){let e=(0,r.ref)(0);return function(e,t,n){qr.isServer||(0,r.watchEffect)((r=>{window.addEventListener(e,t,n),r((()=>window.removeEventListener(e,t,n)))}))}("keydown",(t=>{"Tab"===t.key&&(e.value=t.shiftKey?1:0)})),e}function qu(e,t,n,o){qr.isServer||(0,r.watchEffect)((r=>{(e=null!=e?e:window).addEventListener(t,n,o),r((()=>e.removeEventListener(t,n,o)))}))}var Wu=(e=>(e[e.None=1]="None",e[e.InitialFocus=2]="InitialFocus",e[e.TabLock=4]="TabLock",e[e.FocusLock=8]="FocusLock",e[e.RestoreFocus=16]="RestoreFocus",e[e.All=30]="All",e))(Wu||{});let Ku=Object.assign((0,r.defineComponent)({name:"FocusTrap",props:{as:{type:[Object,String],default:"div"},initialFocus:{type:Object,default:null},features:{type:Number,default:30},containers:{type:Object,default:(0,r.ref)(new Set)}},inheritAttrs:!1,setup(e,{attrs:t,slots:n,expose:o}){let i=(0,r.ref)(null);o({el:i,$el:i});let a=(0,r.computed)((()=>Wr(i)));!function({ownerDocument:e},t){let n=(0,r.ref)(null);function o(){var t;n.value||(n.value=null==(t=e.value)?void 0:t.activeElement)}function i(){!n.value||(lo(n.value),n.value=null)}(0,r.onMounted)((()=>{(0,r.watch)(t,((e,t)=>{e!==t&&(e?o():i())}),{immediate:!0})})),(0,r.onUnmounted)(i)}({ownerDocument:a},(0,r.computed)((()=>Boolean(16&e.features))));let l=function({ownerDocument:e,container:t,initialFocus:n},o){let i=(0,r.ref)(null),a=(0,r.ref)(!1);return(0,r.onMounted)((()=>a.value=!0)),(0,r.onUnmounted)((()=>a.value=!1)),(0,r.onMounted)((()=>{(0,r.watch)([t,n,o],((r,l)=>{if(r.every(((e,t)=>(null==l?void 0:l[t])===e))||!o.value)return;let s=zr(t);!s||function(e){"function"==typeof queueMicrotask?queueMicrotask(e):Promise.resolve().then(e).catch((e=>setTimeout((()=>{throw e}))))}((()=>{var t,r;if(!a.value)return;let o=zr(n),l=null==(t=e.value)?void 0:t.activeElement;if(o){if(o===l)return void(i.value=l)}else if(s.contains(l))return void(i.value=l);o?lo(o):(fo(s,eo.First|eo.NoScroll),to.Error),i.value=null==(r=e.value)?void 0:r.activeElement}))}),{immediate:!0,flush:"post"})})),i}({ownerDocument:a,container:i,initialFocus:(0,r.computed)((()=>e.initialFocus))},(0,r.computed)((()=>Boolean(2&e.features))));!function({ownerDocument:e,container:t,containers:n,previousActiveElement:r},o){var i;qu(null==(i=e.value)?void 0:i.defaultView,"focus",(e=>{if(!o.value)return;let i=new Set(null==n?void 0:n.value);i.add(t);let a=r.value;if(!a)return;let l=e.target;l&&l instanceof HTMLElement?Gu(i,l)?(r.value=l,lo(l)):(e.preventDefault(),e.stopPropagation(),lo(a)):lo(r.value)}),!0)}({ownerDocument:a,container:i,containers:e.containers,previousActiveElement:l},(0,r.computed)((()=>Boolean(8&e.features))));let s=zu();function c(e){let t=zr(i);t&&Tr(s.value,{[Hu.Forwards]:()=>{fo(t,eo.First,{skipElements:[e.relatedTarget]})},[Hu.Backwards]:()=>{fo(t,eo.Last,{skipElements:[e.relatedTarget]})}})}let u=(0,r.ref)(!1);function f(e){"Tab"===e.key&&(u.value=!0,requestAnimationFrame((()=>{u.value=!1})))}function d(t){var n;let r=new Set(null==(n=e.containers)?void 0:n.value);r.add(i);let o=t.relatedTarget;o instanceof HTMLElement&&"true"!==o.dataset.headlessuiFocusGuard&&(Gu(r,o)||(u.value?fo(zr(i),Tr(s.value,{[Hu.Forwards]:()=>eo.Next,[Hu.Backwards]:()=>eo.Previous})|eo.WrapAround,{relativeTo:t.target}):t.target instanceof HTMLElement&&lo(t.target)))}return()=>{let o={ref:i,onKeydown:f,onFocusout:d},{features:a,initialFocus:l,containers:s,...u}=e;return(0,r.h)(r.Fragment,[Boolean(4&a)&&(0,r.h)(el,{as:"button",type:"button","data-headlessui-focus-guard":!0,onFocus:c,features:Xa.Focusable}),Ar({ourProps:o,theirProps:{...t,...u},slot:{},attrs:t,slots:n,name:"FocusTrap"}),Boolean(4&a)&&(0,r.h)(el,{as:"button",type:"button","data-headlessui-focus-guard":!0,onFocus:c,features:Xa.Focusable})])}}}),{features:Wu});function Gu(e,t){var n;for(let r of e)if(null!=(n=r.value)&&n.contains(t))return!0;return!1}let Zu="body > *",Yu=new Set,Ju=new Map;function Qu(e){e.setAttribute("aria-hidden","true"),e.inert=!0}function Xu(e){let t=Ju.get(e);!t||(null===t["aria-hidden"]?e.removeAttribute("aria-hidden"):e.setAttribute("aria-hidden",t["aria-hidden"]),e.inert=t.inert)}function ef(e,t=(0,r.ref)(!0)){(0,r.watchEffect)((n=>{if(!t.value||!e.value)return;let r=e.value,o=Wr(r);if(o){Yu.add(r);for(let e of Ju.keys())e.contains(r)&&(Xu(e),Ju.delete(e));o.querySelectorAll(Zu).forEach((e=>{if(e instanceof HTMLElement){for(let t of Yu)if(e.contains(t))return;1===Yu.size&&(Ju.set(e,{"aria-hidden":e.getAttribute("aria-hidden"),inert:e.inert}),Qu(e))}})),n((()=>{if(Yu.delete(r),Yu.size>0)o.querySelectorAll(Zu).forEach((e=>{if(e instanceof HTMLElement&&!Ju.has(e)){for(let t of Yu)if(e.contains(t))return;Ju.set(e,{"aria-hidden":e.getAttribute("aria-hidden"),inert:e.inert}),Qu(e)}}));else for(let e of Ju.keys())Xu(e),Ju.delete(e)}))}}))}let tf=Symbol("ForcePortalRootContext");let nf=(0,r.defineComponent)({name:"ForcePortalRoot",props:{as:{type:[Object,String],default:"template"},force:{type:Boolean,default:!1}},setup:(e,{slots:t,attrs:n})=>((0,r.provide)(tf,e.force),()=>{let{force:r,...o}=e;return Ar({theirProps:o,ourProps:{},slot:{},slots:t,attrs:n,name:"ForcePortalRoot"})})});let rf=(0,r.defineComponent)({name:"Portal",props:{as:{type:[Object,String],default:"div"}},setup(e,{slots:t,attrs:n}){let o=(0,r.ref)(null),i=(0,r.computed)((()=>Wr(o))),a=(0,r.inject)(tf,!1),l=(0,r.inject)(of,null),s=(0,r.ref)(!0===a||null==l?function(e){let t=Wr(e);if(!t){if(null===e)return null;throw new Error(`[Headless UI]: Cannot find ownerDocument for contextElement: ${e}`)}let n=t.getElementById("headlessui-portal-root");if(n)return n;let r=t.createElement("div");return r.setAttribute("id","headlessui-portal-root"),t.body.appendChild(r)}(o.value):l.resolveTarget());return(0,r.watchEffect)((()=>{a||null!=l&&(s.value=l.resolveTarget())})),(0,r.onUnmounted)((()=>{var e,t;let n=null==(e=i.value)?void 0:e.getElementById("headlessui-portal-root");!n||s.value===n&&s.value.children.length<=0&&(null==(t=s.value.parentElement)||t.removeChild(s.value))})),()=>{if(null===s.value)return null;let i={ref:o,"data-headlessui-portal":""};return(0,r.h)(r.Teleport,{to:s.value},Ar({ourProps:i,theirProps:e,slot:{},attrs:n,slots:t,name:"Portal"}))}}}),of=Symbol("PortalGroupContext"),af=(0,r.defineComponent)({name:"PortalGroup",props:{as:{type:[Object,String],default:"template"},target:{type:Object,default:null}},setup(e,{attrs:t,slots:n}){let o=(0,r.reactive)({resolveTarget:()=>e.target});return(0,r.provide)(of,o),()=>{let{target:r,...o}=e;return Ar({theirProps:o,ourProps:{},slot:{},attrs:t,slots:n,name:"PortalGroup"})}}}),lf=Symbol("StackContext");var sf=(e=>(e[e.Add=0]="Add",e[e.Remove=1]="Remove",e))(sf||{});function cf({type:e,enabled:t,element:n,onUpdate:o}){let i=(0,r.inject)(lf,(()=>{}));function a(...e){null==o||o(...e),i(...e)}(0,r.onMounted)((()=>{(0,r.watch)(t,((t,r)=>{t?a(0,e,n):!0===r&&a(1,e,n)}),{immediate:!0,flush:"sync"})})),(0,r.onUnmounted)((()=>{t.value&&a(1,e,n)})),(0,r.provide)(lf,a)}let uf=Symbol("DescriptionContext");(0,r.defineComponent)({name:"Description",props:{as:{type:[Object,String],default:"p"},id:{type:String,default:()=>`headlessui-description-${Dr()}`}},setup(e,{attrs:t,slots:n}){let o=function(){let e=(0,r.inject)(uf,null);if(null===e)throw new Error("Missing parent");return e}();return(0,r.onMounted)((()=>(0,r.onUnmounted)(o.register(e.id)))),()=>{let{name:i="Description",slot:a=(0,r.ref)({}),props:l={}}=o,{id:s,...c}=e,u={...Object.entries(l).reduce(((e,[t,n])=>Object.assign(e,{[t]:(0,r.unref)(n)})),{}),id:s};return Ar({ourProps:u,theirProps:c,slot:a.value,attrs:t,slots:n,name:i})}}});function ff(){let e;return{before({doc:t}){var n;let r=t.documentElement;e=(null!=(n=t.defaultView)?n:window).innerWidth-r.clientWidth},after({doc:t,d:n}){let r=t.documentElement,o=r.clientWidth-r.offsetWidth,i=e-o;n.style(r,"paddingRight",`${i}px`)}}}function df(){if(!(/iPhone/gi.test(window.navigator.platform)||/Mac/gi.test(window.navigator.platform)&&window.navigator.maxTouchPoints>0))return{};let e;return{before(){e=window.pageYOffset},after({doc:t,d:n,meta:r}){function o(e){return r.containers.flatMap((e=>e())).some((t=>t.contains(e)))}n.style(t.body,"marginTop",`-${e}px`),window.scrollTo(0,0);let i=null;n.addEventListener(t,"click",(e=>{if(e.target instanceof HTMLElement)try{let n=e.target.closest("a");if(!n)return;let{hash:r}=new URL(n.href),a=t.querySelector(r);a&&!o(a)&&(i=a)}catch{}}),!0),n.addEventListener(t,"touchmove",(e=>{e.target instanceof HTMLElement&&!o(e.target)&&e.preventDefault()}),{passive:!1}),n.add((()=>{window.scrollTo(0,window.pageYOffset+e),i&&i.isConnected&&(i.scrollIntoView({block:"nearest"}),i=null)}))}}}function pf(e){let t={};for(let n of e)Object.assign(t,n(t));return t}let hf=function(e,t){let n=e(),r=new Set;return{getSnapshot:()=>n,subscribe:e=>(r.add(e),()=>r.delete(e)),dispatch(e,...o){let i=t[e].call(n,...o);i&&(n=i,r.forEach((e=>e())))}}}((()=>new Map),{PUSH(e,t){var n;let r=null!=(n=this.get(e))?n:{doc:e,count:0,d:Nu(),meta:new Set};return r.count++,r.meta.add(t),this.set(e,r),this},POP(e,t){let n=this.get(e);return n&&(n.count--,n.meta.delete(t)),this},SCROLL_PREVENT({doc:e,d:t,meta:n}){let r={doc:e,d:t,meta:pf(n)},o=[df(),ff(),{before({doc:e,d:t}){t.style(e.documentElement,"overflow","hidden")}}];o.forEach((({before:e})=>null==e?void 0:e(r))),o.forEach((({after:e})=>null==e?void 0:e(r)))},SCROLL_ALLOW({d:e}){e.dispose()},TEARDOWN({doc:e}){this.delete(e)}});function vf(e,t,n){let o=function(e){let t=(0,r.shallowRef)(e.getSnapshot());return(0,r.onUnmounted)(e.subscribe((()=>{t.value=e.getSnapshot()}))),t}(hf),i=(0,r.computed)((()=>{let t=e.value?o.value.get(e.value):void 0;return!!t&&t.count>0}));return(0,r.watch)([e,t],(([e,t],[r],o)=>{if(!e||!t)return;hf.dispatch("PUSH",e,n);let i=!1;o((()=>{i||(hf.dispatch("POP",null!=r?r:e,n),i=!0)}))}),{immediate:!0}),i}hf.subscribe((()=>{let e=hf.getSnapshot(),t=new Map;for(let[n]of e)t.set(n,n.documentElement.style.overflow);for(let n of e.values()){let e="hidden"===t.get(n.doc),r=0!==n.count;(r&&!e||!r&&e)&&hf.dispatch(n.count>0?"SCROLL_PREVENT":"SCROLL_ALLOW",n),0===n.count&&hf.dispatch("TEARDOWN",n)}}));var mf=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(mf||{});let gf=Symbol("DialogContext");function yf(e){let t=(0,r.inject)(gf,null);if(null===t){let t=new Error(`<${e} /> is missing a parent <Dialog /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,yf),t}return t}let bf="DC8F892D-2EBD-447C-A4C8-A03058436FF4",wf=(0,r.defineComponent)({name:"Dialog",inheritAttrs:!1,props:{as:{type:[Object,String],default:"div"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},open:{type:[Boolean,String],default:bf},initialFocus:{type:Object,default:null},id:{type:String,default:()=>`headlessui-dialog-${Dr()}`}},emits:{close:e=>!0},setup(e,{emit:t,attrs:n,slots:o,expose:i}){var a;let l=(0,r.ref)(!1);(0,r.onMounted)((()=>{l.value=!0}));let s=(0,r.ref)(0),c=Zr(),u=(0,r.computed)((()=>e.open===bf&&null!==c?Tr(c.value,{[Gr.Open]:!0,[Gr.Closed]:!1}):e.open)),f=(0,r.ref)(new Set),d=(0,r.ref)(null),p=(0,r.ref)(null),h=(0,r.computed)((()=>Wr(d)));if(i({el:d,$el:d}),e.open===bf&&null===c)throw new Error("You forgot to provide an `open` prop to the `Dialog`.");if("boolean"!=typeof u.value)throw new Error(`You provided an \`open\` prop to the \`Dialog\`, but the value is not a boolean. Received: ${u.value===bf?void 0:e.open}`);let v=(0,r.computed)((()=>l.value&&u.value?0:1)),m=(0,r.computed)((()=>0===v.value)),g=(0,r.computed)((()=>s.value>1)),y=((0,r.inject)(gf,null),(0,r.computed)((()=>g.value?"parent":"leaf")));ef(d,(0,r.computed)((()=>!!g.value&&m.value))),cf({type:"Dialog",enabled:(0,r.computed)((()=>0===v.value)),element:d,onUpdate:(e,t,n)=>{if("Dialog"===t)return Tr(e,{[sf.Add](){f.value.add(n),s.value+=1},[sf.Remove](){f.value.delete(n),s.value-=1}})}});let b=function({slot:e=(0,r.ref)({}),name:t="Description",props:n={}}={}){let o=(0,r.ref)([]);return(0,r.provide)(uf,{register:function(e){return o.value.push(e),()=>{let t=o.value.indexOf(e);-1!==t&&o.value.splice(t,1)}},slot:e,name:t,props:n}),(0,r.computed)((()=>o.value.length>0?o.value.join(" "):void 0))}({name:"DialogDescription",slot:(0,r.computed)((()=>({open:u.value})))}),w=(0,r.ref)(null),C={titleId:w,panelRef:(0,r.ref)(null),dialogState:v,setTitleId(e){w.value!==e&&(w.value=e)},close(){t("close",!1)}};function _(){var e,t,n;return[...Array.from(null!=(t=null==(e=h.value)?void 0:e.querySelectorAll("html > *, body > *, [data-headlessui-portal]"))?t:[]).filter((e=>!(e===document.body||e===document.head||!(e instanceof HTMLElement)||e.contains(zr(p))||C.panelRef.value&&e.contains(C.panelRef.value)))),null!=(n=C.panelRef.value)?n:d.value]}return(0,r.provide)(gf,C),ho((()=>_()),((e,t)=>{C.close(),(0,r.nextTick)((()=>null==t?void 0:t.focus()))}),(0,r.computed)((()=>0===v.value&&!g.value))),qu(null==(a=h.value)?void 0:a.defaultView,"keydown",(e=>{e.defaultPrevented||e.key===Ur.Escape&&0===v.value&&(g.value||(e.preventDefault(),e.stopPropagation(),C.close()))})),vf(h,m,(e=>{var t;return{containers:[...null!=(t=e.containers)?t:[],_]}})),(0,r.watchEffect)((e=>{if(0!==v.value)return;let t=zr(d);if(!t)return;let n=new IntersectionObserver((e=>{for(let t of e)0===t.boundingClientRect.x&&0===t.boundingClientRect.y&&0===t.boundingClientRect.width&&0===t.boundingClientRect.height&&C.close()}));n.observe(t),e((()=>n.disconnect()))})),()=>{let{id:t,open:i,initialFocus:a,...l}=e,s={...n,ref:d,id:t,role:"dialog","aria-modal":0===v.value||void 0,"aria-labelledby":w.value,"aria-describedby":b.value},c={open:0===v.value};return(0,r.h)(nf,{force:!0},(()=>[(0,r.h)(rf,(()=>(0,r.h)(af,{target:d.value},(()=>(0,r.h)(nf,{force:!1},(()=>(0,r.h)(Ku,{initialFocus:a,containers:f,features:m.value?Tr(y.value,{parent:Ku.features.RestoreFocus,leaf:Ku.features.All&~Ku.features.FocusLock}):Ku.features.None},(()=>Ar({ourProps:s,theirProps:l,slot:c,attrs:n,slots:o,visible:0===v.value,features:Rr.RenderStrategy|Rr.Static,name:"Dialog"}))))))))),(0,r.h)(el,{features:Xa.Hidden,ref:p})]))}}}),Cf=((0,r.defineComponent)({name:"DialogOverlay",props:{as:{type:[Object,String],default:"div"},id:{type:String,default:()=>`headlessui-dialog-overlay-${Dr()}`}},setup(e,{attrs:t,slots:n}){let r=yf("DialogOverlay");function o(e){e.target===e.currentTarget&&(e.preventDefault(),e.stopPropagation(),r.close())}return()=>{let{id:i,...a}=e;return Ar({ourProps:{id:i,"aria-hidden":!0,onClick:o},theirProps:a,slot:{open:0===r.dialogState.value},attrs:t,slots:n,name:"DialogOverlay"})}}}),(0,r.defineComponent)({name:"DialogBackdrop",props:{as:{type:[Object,String],default:"div"},id:{type:String,default:()=>`headlessui-dialog-backdrop-${Dr()}`}},inheritAttrs:!1,setup(e,{attrs:t,slots:n,expose:o}){let i=yf("DialogBackdrop"),a=(0,r.ref)(null);return o({el:a,$el:a}),(0,r.onMounted)((()=>{if(null===i.panelRef.value)throw new Error("A <DialogBackdrop /> component is being used, but a <DialogPanel /> component is missing.")})),()=>{let{id:o,...l}=e,s={id:o,ref:a,"aria-hidden":!0};return(0,r.h)(nf,{force:!0},(()=>(0,r.h)(rf,(()=>Ar({ourProps:s,theirProps:{...t,...l},slot:{open:0===i.dialogState.value},attrs:t,slots:n,name:"DialogBackdrop"})))))}}}),(0,r.defineComponent)({name:"DialogPanel",props:{as:{type:[Object,String],default:"div"},id:{type:String,default:()=>`headlessui-dialog-panel-${Dr()}`}},setup(e,{attrs:t,slots:n,expose:r}){let o=yf("DialogPanel");function i(e){e.stopPropagation()}return r({el:o.panelRef,$el:o.panelRef}),()=>{let{id:r,...a}=e;return Ar({ourProps:{id:r,ref:o.panelRef,onClick:i},theirProps:a,slot:{open:0===o.dialogState.value},attrs:t,slots:n,name:"DialogPanel"})}}})),_f=(0,r.defineComponent)({name:"DialogTitle",props:{as:{type:[Object,String],default:"h2"},id:{type:String,default:()=>`headlessui-dialog-title-${Dr()}`}},setup(e,{attrs:t,slots:n}){let o=yf("DialogTitle");return(0,r.onMounted)((()=>{o.setTitleId(e.id),(0,r.onUnmounted)((()=>o.setTitleId(null)))})),()=>{let{id:r,...i}=e;return Ar({ourProps:{id:r},theirProps:i,slot:{open:0===o.dialogState.value},attrs:t,slots:n,name:"DialogTitle"})}}});var Ef=(0,r.createElementVNode)("div",{class:"fixed inset-0"},null,-1),xf={class:"fixed inset-0 overflow-hidden"},kf={class:"absolute inset-0 overflow-hidden"},Sf={class:"pointer-events-none fixed inset-y-0 right-0 flex max-w-full pl-10"},Of={class:"flex h-full flex-col overflow-y-scroll bg-white py-6 shadow-xl"},Nf={class:"px-4 sm:px-6"},Pf={class:"flex items-start justify-between"},Tf={class:"ml-3 flex h-7 items-center"},Vf=(0,r.createElementVNode)("span",{class:"sr-only"},"Close panel",-1),Rf={class:"relative mt-6 flex-1 px-4 sm:px-6"},Lf={class:"keyboard-shortcut"},Af={class:"shortcut"},jf=(0,r.createElementVNode)("span",{class:"description"},"Select a host",-1),Bf={class:"keyboard-shortcut"},If={class:"shortcut"},Mf=(0,r.createElementVNode)("span",{class:"description"},"Jump to file selection",-1),Ff={class:"keyboard-shortcut"},Df={class:"shortcut"},Uf=(0,r.createElementVNode)("span",{class:"description"},"Jump to logs",-1),$f={class:"keyboard-shortcut"},Hf={class:"shortcut"},zf=(0,r.createElementVNode)("span",{class:"description"},"Severity selection",-1),qf={class:"keyboard-shortcut"},Wf={class:"shortcut"},Kf=(0,r.createElementVNode)("span",{class:"description"},"Settings",-1),Gf={class:"keyboard-shortcut"},Zf={class:"shortcut"},Yf=(0,r.createElementVNode)("span",{class:"description"},"Search",-1),Jf={class:"keyboard-shortcut"},Qf={class:"shortcut"},Xf=(0,r.createElementVNode)("span",{class:"description"},"Refresh logs",-1),ed={class:"keyboard-shortcut"},td={class:"shortcut"},nd=(0,r.createElementVNode)("span",{class:"description"},"Keyboard shortcuts help",-1);const rd={__name:"KeyboardShortcutsOverlay",setup:function(e){var t=Mi();return function(e,n){return(0,r.openBlock)(),(0,r.createBlock)((0,r.unref)($u),{as:"template",show:(0,r.unref)(t).helpSlideOverOpen},{default:(0,r.withCtx)((function(){return[(0,r.createVNode)((0,r.unref)(wf),{as:"div",class:"relative z-20",onClose:n[1]||(n[1]=function(e){return(0,r.unref)(t).helpSlideOverOpen=!1})},{default:(0,r.withCtx)((function(){return[Ef,(0,r.createElementVNode)("div",xf,[(0,r.createElementVNode)("div",kf,[(0,r.createElementVNode)("div",Sf,[(0,r.createVNode)((0,r.unref)(Du),{as:"template",enter:"transform transition ease-in-out duration-200 sm:duration-300","enter-from":"translate-x-full","enter-to":"translate-x-0",leave:"transform transition ease-in-out duration-200 sm:duration-300","leave-from":"translate-x-0","leave-to":"translate-x-full"},{default:(0,r.withCtx)((function(){return[(0,r.createVNode)((0,r.unref)(Cf),{class:"pointer-events-auto w-screen max-w-md"},{default:(0,r.withCtx)((function(){return[(0,r.createElementVNode)("div",Of,[(0,r.createElementVNode)("div",Nf,[(0,r.createElementVNode)("div",Pf,[(0,r.createVNode)((0,r.unref)(_f),{class:"text-base font-semibold leading-6 text-gray-900"},{default:(0,r.withCtx)((function(){return[(0,r.createTextVNode)("Keyboard Shortcuts")]})),_:1}),(0,r.createElementVNode)("div",Tf,[(0,r.createElementVNode)("button",{type:"button",class:"rounded-md bg-white text-gray-400 hover:text-gray-500 focus:outline-none focus:ring-2 focus:ring-brand-500 focus:ring-offset-2",onClick:n[0]||(n[0]=function(e){return(0,r.unref)(t).helpSlideOverOpen=!1})},[Vf,(0,r.createVNode)((0,r.unref)(ko),{class:"h-6 w-6","aria-hidden":"true"})])])])]),(0,r.createElementVNode)("div",Rf,[(0,r.createElementVNode)("div",Lf,[(0,r.createElementVNode)("span",Af,(0,r.toDisplayString)((0,r.unref)(Xi).Hosts),1),jf]),(0,r.createElementVNode)("div",Bf,[(0,r.createElementVNode)("span",If,(0,r.toDisplayString)((0,r.unref)(Xi).Files),1),Mf]),(0,r.createElementVNode)("div",Ff,[(0,r.createElementVNode)("span",Df,(0,r.toDisplayString)((0,r.unref)(Xi).Logs),1),Uf]),(0,r.createElementVNode)("div",$f,[(0,r.createElementVNode)("span",Hf,(0,r.toDisplayString)((0,r.unref)(Xi).Severity),1),zf]),(0,r.createElementVNode)("div",qf,[(0,r.createElementVNode)("span",Wf,(0,r.toDisplayString)((0,r.unref)(Xi).Settings),1),Kf]),(0,r.createElementVNode)("div",Gf,[(0,r.createElementVNode)("span",Zf,(0,r.toDisplayString)((0,r.unref)(Xi).Search),1),Yf]),(0,r.createElementVNode)("div",Jf,[(0,r.createElementVNode)("span",Qf,(0,r.toDisplayString)((0,r.unref)(Xi).Refresh),1),Xf]),(0,r.createElementVNode)("div",ed,[(0,r.createElementVNode)("span",td,(0,r.toDisplayString)((0,r.unref)(Xi).ShortcutHelp),1),nd])])])]})),_:1})]})),_:1})])])])]})),_:1})]})),_:1},8,["show"])}}};function od(e){return od="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},od(e)}function id(){id=function(){return e};var e={},t=Object.prototype,n=t.hasOwnProperty,r=Object.defineProperty||function(e,t,n){e[t]=n.value},o="function"==typeof Symbol?Symbol:{},i=o.iterator||"@@iterator",a=o.asyncIterator||"@@asyncIterator",l=o.toStringTag||"@@toStringTag";function s(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{s({},"")}catch(e){s=function(e,t,n){return e[t]=n}}function c(e,t,n,o){var i=t&&t.prototype instanceof d?t:d,a=Object.create(i.prototype),l=new k(o||[]);return r(a,"_invoke",{value:C(e,n,l)}),a}function u(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}e.wrap=c;var f={};function d(){}function p(){}function h(){}var v={};s(v,i,(function(){return this}));var m=Object.getPrototypeOf,g=m&&m(m(S([])));g&&g!==t&&n.call(g,i)&&(v=g);var y=h.prototype=d.prototype=Object.create(v);function b(e){["next","throw","return"].forEach((function(t){s(e,t,(function(e){return this._invoke(t,e)}))}))}function w(e,t){function o(r,i,a,l){var s=u(e[r],e,i);if("throw"!==s.type){var c=s.arg,f=c.value;return f&&"object"==od(f)&&n.call(f,"__await")?t.resolve(f.__await).then((function(e){o("next",e,a,l)}),(function(e){o("throw",e,a,l)})):t.resolve(f).then((function(e){c.value=e,a(c)}),(function(e){return o("throw",e,a,l)}))}l(s.arg)}var i;r(this,"_invoke",{value:function(e,n){function r(){return new t((function(t,r){o(e,n,t,r)}))}return i=i?i.then(r,r):r()}})}function C(e,t,n){var r="suspendedStart";return function(o,i){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===o)throw i;return O()}for(n.method=o,n.arg=i;;){var a=n.delegate;if(a){var l=_(a,n);if(l){if(l===f)continue;return l}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var s=u(e,t,n);if("normal"===s.type){if(r=n.done?"completed":"suspendedYield",s.arg===f)continue;return{value:s.arg,done:n.done}}"throw"===s.type&&(r="completed",n.method="throw",n.arg=s.arg)}}}function _(e,t){var n=t.method,r=e.iterator[n];if(void 0===r)return t.delegate=null,"throw"===n&&e.iterator.return&&(t.method="return",t.arg=void 0,_(e,t),"throw"===t.method)||"return"!==n&&(t.method="throw",t.arg=new TypeError("The iterator does not provide a '"+n+"' method")),f;var o=u(r,e.iterator,t.arg);if("throw"===o.type)return t.method="throw",t.arg=o.arg,t.delegate=null,f;var i=o.arg;return i?i.done?(t[e.resultName]=i.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,f):i:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,f)}function E(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function x(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function k(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(E,this),this.reset(!0)}function S(e){if(e){var t=e[i];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var r=-1,o=function t(){for(;++r<e.length;)if(n.call(e,r))return t.value=e[r],t.done=!1,t;return t.value=void 0,t.done=!0,t};return o.next=o}}return{next:O}}function O(){return{value:void 0,done:!0}}return p.prototype=h,r(y,"constructor",{value:h,configurable:!0}),r(h,"constructor",{value:p,configurable:!0}),p.displayName=s(h,l,"GeneratorFunction"),e.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===p||"GeneratorFunction"===(t.displayName||t.name))},e.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,h):(e.__proto__=h,s(e,l,"GeneratorFunction")),e.prototype=Object.create(y),e},e.awrap=function(e){return{__await:e}},b(w.prototype),s(w.prototype,a,(function(){return this})),e.AsyncIterator=w,e.async=function(t,n,r,o,i){void 0===i&&(i=Promise);var a=new w(c(t,n,r,o),i);return e.isGeneratorFunction(n)?a:a.next().then((function(e){return e.done?e.value:a.next()}))},b(y),s(y,l,"Generator"),s(y,i,(function(){return this})),s(y,"toString",(function(){return"[object Generator]"})),e.keys=function(e){var t=Object(e),n=[];for(var r in t)n.push(r);return n.reverse(),function e(){for(;n.length;){var r=n.pop();if(r in t)return e.value=r,e.done=!1,e}return e.done=!0,e}},e.values=S,k.prototype={constructor:k,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,this.tryEntries.forEach(x),!e)for(var t in this)"t"===t.charAt(0)&&n.call(this,t)&&!isNaN(+t.slice(1))&&(this[t]=void 0)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var t=this;function r(n,r){return a.type="throw",a.arg=e,t.next=n,r&&(t.method="next",t.arg=void 0),!!r}for(var o=this.tryEntries.length-1;o>=0;--o){var i=this.tryEntries[o],a=i.completion;if("root"===i.tryLoc)return r("end");if(i.tryLoc<=this.prev){var l=n.call(i,"catchLoc"),s=n.call(i,"finallyLoc");if(l&&s){if(this.prev<i.catchLoc)return r(i.catchLoc,!0);if(this.prev<i.finallyLoc)return r(i.finallyLoc)}else if(l){if(this.prev<i.catchLoc)return r(i.catchLoc,!0)}else{if(!s)throw new Error("try statement without catch or finally");if(this.prev<i.finallyLoc)return r(i.finallyLoc)}}}},abrupt:function(e,t){for(var r=this.tryEntries.length-1;r>=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev<o.finallyLoc){var i=o;break}}i&&("break"===e||"continue"===e)&&i.tryLoc<=t&&t<=i.finallyLoc&&(i=null);var a=i?i.completion:{};return a.type=e,a.arg=t,i?(this.method="next",this.next=i.finallyLoc,f):this.complete(a)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),f},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),x(n),f}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var o=r.arg;x(n)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:S(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),f}},e}function ad(e,t,n,r,o,i,a){try{var l=e[i](a),s=l.value}catch(e){return void n(e)}l.done?t(s):Promise.resolve(s).then(r,o)}var ld={class:"md:pl-88 flex flex-col flex-1 min-h-screen max-h-screen max-w-full"},sd={class:"absolute bottom-4 right-4 flex items-center"},cd={class:"text-xs text-gray-500 dark:text-gray-400 mr-5 -mb-0.5"},ud=(0,r.createElementVNode)("span",{class:"hidden md:inline"},"Memory: ",-1),fd={class:"font-semibold"},dd=(0,r.createElementVNode)("span",{class:"mx-1.5"},"·",-1),pd=(0,r.createElementVNode)("span",{class:"hidden md:inline"},"Duration: ",-1),hd={class:"font-semibold"},vd=(0,r.createElementVNode)("span",{class:"mx-1.5"},"·",-1),md=(0,r.createElementVNode)("span",{class:"hidden md:inline"},"Version: ",-1),gd={class:"font-semibold"},yd={key:0,href:"https://www.buymeacoffee.com/arunas",target:"_blank"};const bd={__name:"Home",setup:function(e){var t=Bo(),n=Mi(),o=Fi(),i=Ri(),a=Li(),l=Pr(),s=Nr();return(0,r.onBeforeMount)((function(){n.syncTheme(),document.addEventListener("keydown",ra)})),(0,r.onBeforeUnmount)((function(){document.removeEventListener("keydown",ra)})),(0,r.onMounted)((function(){setInterval(n.syncTheme,1e3)})),(0,r.watch)((function(){return l.query}),(function(e){o.selectFile(e.file||null),a.setPage(e.page||1),i.setQuery(e.query||""),n.loadLogs()}),{immediate:!0}),(0,r.watch)((function(){return l.query.host}),function(){var e,r=(e=id().mark((function e(r){return id().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t.selectHost(r||null),r&&!t.selectedHostIdentifier&&Hi(s,"host",null),o.reset(),e.next=5,o.loadFolders();case 5:n.loadLogs();case 6:case"end":return e.stop()}}),e)})),function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function a(e){ad(i,r,o,a,l,"next",e)}function l(e){ad(i,r,o,a,l,"throw",e)}a(void 0)}))});return function(e){return r.apply(this,arguments)}}(),{immediate:!0}),(0,r.onMounted)((function(){window.onresize=function(){n.setViewportDimensions(window.innerWidth,window.innerHeight)}})),function(e,t){var i;return(0,r.openBlock)(),(0,r.createElementBlock)(r.Fragment,null,[(0,r.createElementVNode)("div",{class:(0,r.normalizeClass)(["absolute z-20 top-0 bottom-10 bg-gray-100 dark:bg-gray-900 md:left-0 md:flex md:w-88 md:flex-col md:fixed md:inset-y-0",[(0,r.unref)(o).sidebarOpen?"left-0 right-0 md:left-auto md:right-auto":"-left-[200%] right-[200%] md:left-auto md:right-auto"]])},[(0,r.createVNode)(ms)],2),(0,r.createElementVNode)("div",ld,[(0,r.createVNode)(Eu,{class:"pb-16 md:pb-12"})]),(0,r.createElementVNode)("div",sd,[(0,r.createElementVNode)("p",cd,[null!==(i=(0,r.unref)(n).performance)&&void 0!==i&&i.requestTime?((0,r.openBlock)(),(0,r.createElementBlock)(r.Fragment,{key:0},[(0,r.createElementVNode)("span",null,[ud,(0,r.createElementVNode)("span",fd,(0,r.toDisplayString)((0,r.unref)(n).performance.memoryUsage),1)]),dd,(0,r.createElementVNode)("span",null,[pd,(0,r.createElementVNode)("span",hd,(0,r.toDisplayString)((0,r.unref)(n).performance.requestTime),1)]),vd],64)):(0,r.createCommentVNode)("",!0),(0,r.createElementVNode)("span",null,[md,(0,r.createElementVNode)("span",gd,(0,r.toDisplayString)(e.LogViewer.version),1)])]),e.LogViewer.show_support_link?((0,r.openBlock)(),(0,r.createElementBlock)("a",yd,[(0,r.createVNode)(Ou,{class:"h-6 w-auto",title:"Support me by buying me a cup of coffee ❤️"})])):(0,r.createCommentVNode)("",!0)]),(0,r.createVNode)(rd)],64)}}},wd=bd;function Cd(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,i,a,l=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=i.call(n)).done)&&(l.push(r.value),l.length!==t);s=!0);}catch(e){c=!0,o=e}finally{try{if(!s&&null!=n.return&&(a=n.return(),Object(a)!==a))return}finally{if(c)throw o}}return l}}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return _d(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _d(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function _d(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var Ed=document.head.querySelector('meta[name="csrf-token"]');Zt.defaults.headers.common["X-Requested-With"]="XMLHttpRequest",Ed&&(Zt.defaults.headers.common["X-CSRF-TOKEN"]=Ed.content);for(var xd=0,kd=Object.entries(window.LogViewer.headers||{});xd<kd.length;xd++){var Sd=Cd(kd[xd],2),Od=Sd[0],Nd=Sd[1];Zt.defaults.headers.common[Od]=Nd}window.LogViewer.basePath="/"+window.LogViewer.path,window.location.pathname.startsWith(window.LogViewer.basePath)||(window.LogViewer.basePath=window.location.pathname);var Pd=window.LogViewer.basePath+"/";""!==window.LogViewer.path&&"/"!==window.LogViewer.path||(Pd="/",window.LogViewer.basePath="");var Td=function(e){const t=Fn(e.routes,e),n=e.parseQuery||ur,o=e.stringifyQuery||fr,i=e.history,a=yr(),l=yr(),s=yr(),c=(0,r.shallowRef)(kn);let u=kn;Yt&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const f=Xt.bind(null,(e=>""+e)),d=Xt.bind(null,sr),p=Xt.bind(null,cr);function h(e,r){if(r=Qt({},r||c.value),"string"==typeof e){const o=on(n,e,r.path),a=t.resolve({path:o.path},r),l=i.createHref(o.fullPath);return Qt(o,a,{params:p(a.params),hash:cr(o.hash),redirectedFrom:void 0,href:l})}let a;if("path"in e)a=Qt({},e,{path:on(n,e.path,r.path).path});else{const t=Qt({},e.params);for(const e in t)null==t[e]&&delete t[e];a=Qt({},e,{params:d(e.params)}),r.params=d(r.params)}const l=t.resolve(a,r),s=e.hash||"";l.params=f(p(l.params));const u=function(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}(o,Qt({},e,{hash:(h=s,ar(h).replace(nr,"{").replace(or,"}").replace(er,"^")),path:l.path}));var h;const v=i.createHref(u);return Qt({fullPath:u,hash:s,query:o===fr?dr(e.query):e.query||{}},l,{redirectedFrom:void 0,href:v})}function v(e){return"string"==typeof e?on(n,e,c.value.path):Qt({},e)}function m(e,t){if(u!==e)return Nn(8,{from:t,to:e})}function g(e){return b(e)}function y(e){const t=e.matched[e.matched.length-1];if(t&&t.redirect){const{redirect:n}=t;let r="function"==typeof n?n(e):n;return"string"==typeof r&&(r=r.includes("?")||r.includes("#")?r=v(r):{path:r},r.params={}),Qt({query:e.query,hash:e.hash,params:"path"in r?{}:e.params},r)}}function b(e,t){const n=u=h(e),r=c.value,i=e.state,a=e.force,l=!0===e.replace,s=y(n);if(s)return b(Qt(v(s),{state:"object"==typeof s?Qt({},i,s.state):i,force:a,replace:l}),t||n);const f=n;let d;return f.redirectedFrom=t,!a&&function(e,t,n){const r=t.matched.length-1,o=n.matched.length-1;return r>-1&&r===o&&ln(t.matched[r],n.matched[o])&&sn(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}(o,r,n)&&(d=Nn(16,{to:f,from:r}),V(r,r,!0,!1)),(d?Promise.resolve(d):C(f,r)).catch((e=>Pn(e)?Pn(e,2)?e:T(e):P(e,f,r))).then((e=>{if(e){if(Pn(e,2))return b(Qt({replace:l},v(e.to),{state:"object"==typeof e.to?Qt({},i,e.to.state):i,force:a}),t||f)}else e=E(f,r,!0,l,i);return _(f,r,e),e}))}function w(e,t){const n=m(e,t);return n?Promise.reject(n):Promise.resolve()}function C(e,t){let n;const[r,o,i]=function(e,t){const n=[],r=[],o=[],i=Math.max(t.matched.length,e.matched.length);for(let a=0;a<i;a++){const i=t.matched[a];i&&(e.matched.find((e=>ln(e,i)))?r.push(i):n.push(i));const l=e.matched[a];l&&(t.matched.find((e=>ln(e,l)))||o.push(l))}return[n,r,o]}(e,t);n=wr(r.reverse(),"beforeRouteLeave",e,t);for(const o of r)o.leaveGuards.forEach((r=>{n.push(br(r,e,t))}));const s=w.bind(null,e,t);return n.push(s),Or(n).then((()=>{n=[];for(const r of a.list())n.push(br(r,e,t));return n.push(s),Or(n)})).then((()=>{n=wr(o,"beforeRouteUpdate",e,t);for(const r of o)r.updateGuards.forEach((r=>{n.push(br(r,e,t))}));return n.push(s),Or(n)})).then((()=>{n=[];for(const r of e.matched)if(r.beforeEnter&&!t.matched.includes(r))if(tn(r.beforeEnter))for(const o of r.beforeEnter)n.push(br(o,e,t));else n.push(br(r.beforeEnter,e,t));return n.push(s),Or(n)})).then((()=>(e.matched.forEach((e=>e.enterCallbacks={})),n=wr(i,"beforeRouteEnter",e,t),n.push(s),Or(n)))).then((()=>{n=[];for(const r of l.list())n.push(br(r,e,t));return n.push(s),Or(n)})).catch((e=>Pn(e,8)?e:Promise.reject(e)))}function _(e,t,n){for(const r of s.list())r(e,t,n)}function E(e,t,n,r,o){const a=m(e,t);if(a)return a;const l=t===kn,s=Yt?history.state:{};n&&(r||l?i.replace(e.fullPath,Qt({scroll:l&&s&&s.scroll},o)):i.push(e.fullPath,o)),c.value=e,V(e,t,n,l),T()}let x;function k(){x||(x=i.listen(((e,t,n)=>{if(!j.listening)return;const r=h(e),o=y(r);if(o)return void b(Qt(o,{replace:!0}),r).catch(en);u=r;const a=c.value;Yt&&function(e,t){bn.set(e,t)}(yn(a.fullPath,n.delta),mn()),C(r,a).catch((e=>Pn(e,12)?e:Pn(e,2)?(b(e.to,r).then((e=>{Pn(e,20)&&!n.delta&&n.type===fn.pop&&i.go(-1,!1)})).catch(en),Promise.reject()):(n.delta&&i.go(-n.delta,!1),P(e,r,a)))).then((e=>{(e=e||E(r,a,!1))&&(n.delta&&!Pn(e,8)?i.go(-n.delta,!1):n.type===fn.pop&&Pn(e,20)&&i.go(-1,!1)),_(r,a,e)})).catch(en)})))}let S,O=yr(),N=yr();function P(e,t,n){T(e);const r=N.list();return r.length&&r.forEach((r=>r(e,t,n))),Promise.reject(e)}function T(e){return S||(S=!e,k(),O.list().forEach((([t,n])=>e?n(e):t())),O.reset()),e}function V(t,n,o,i){const{scrollBehavior:a}=e;if(!Yt||!a)return Promise.resolve();const l=!o&&function(e){const t=bn.get(e);return bn.delete(e),t}(yn(t.fullPath,0))||(i||!o)&&history.state&&history.state.scroll||null;return(0,r.nextTick)().then((()=>a(t,n,l))).then((e=>e&&gn(e))).catch((e=>P(e,t,n)))}const R=e=>i.go(e);let L;const A=new Set,j={currentRoute:c,listening:!0,addRoute:function(e,n){let r,o;return xn(e)?(r=t.getRecordMatcher(e),o=n):o=e,t.addRoute(o,r)},removeRoute:function(e){const n=t.getRecordMatcher(e);n&&t.removeRoute(n)},hasRoute:function(e){return!!t.getRecordMatcher(e)},getRoutes:function(){return t.getRoutes().map((e=>e.record))},resolve:h,options:e,push:g,replace:function(e){return g(Qt(v(e),{replace:!0}))},go:R,back:()=>R(-1),forward:()=>R(1),beforeEach:a.add,beforeResolve:l.add,afterEach:s.add,onError:N.add,isReady:function(){return S&&c.value!==kn?Promise.resolve():new Promise(((e,t)=>{O.add([e,t])}))},install(e){e.component("RouterLink",_r),e.component("RouterView",Sr),e.config.globalProperties.$router=this,Object.defineProperty(e.config.globalProperties,"$route",{enumerable:!0,get:()=>(0,r.unref)(c)}),Yt&&!L&&c.value===kn&&(L=!0,g(i.location).catch((e=>{0})));const t={};for(const e in kn)t[e]=(0,r.computed)((()=>c.value[e]));e.provide(vr,this),e.provide(mr,(0,r.reactive)(t)),e.provide(gr,c);const n=e.unmount;A.add(e),e.unmount=function(){A.delete(e),A.size<1&&(u=kn,x&&x(),x=null,c.value=kn,L=!1,S=!1),n()}}};return j}({routes:[{path:LogViewer.basePath,name:"home",component:wd}],history:En(),base:Pd}),Vd=function(){const e=(0,r.effectScope)(!0),t=e.run((()=>(0,r.ref)({})));let n=[],i=[];const a=(0,r.markRaw)({install(e){v(a),o||(a._a=e,e.provide(m,a),e.config.globalProperties.$pinia=a,w&&W(e,a),i.forEach((e=>n.push(e))),i=[])},use(e){return this._a||o?n.push(e):i.push(e),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return w&&"undefined"!=typeof Proxy&&a.use(Y),a}(),Rd=(0,r.createApp)({router:Td});Rd.use(Td),Rd.use(Vd),Rd.mixin({computed:{LogViewer:function(){return window.LogViewer}}}),Rd.mount("#log-viewer")},742:(e,t)=>{"use strict";t.byteLength=function(e){var t=s(e),n=t[0],r=t[1];return 3*(n+r)/4-r},t.toByteArray=function(e){var t,n,i=s(e),a=i[0],l=i[1],c=new o(function(e,t,n){return 3*(t+n)/4-n}(0,a,l)),u=0,f=l>0?a-4:a;for(n=0;n<f;n+=4)t=r[e.charCodeAt(n)]<<18|r[e.charCodeAt(n+1)]<<12|r[e.charCodeAt(n+2)]<<6|r[e.charCodeAt(n+3)],c[u++]=t>>16&255,c[u++]=t>>8&255,c[u++]=255&t;2===l&&(t=r[e.charCodeAt(n)]<<2|r[e.charCodeAt(n+1)]>>4,c[u++]=255&t);1===l&&(t=r[e.charCodeAt(n)]<<10|r[e.charCodeAt(n+1)]<<4|r[e.charCodeAt(n+2)]>>2,c[u++]=t>>8&255,c[u++]=255&t);return c},t.fromByteArray=function(e){for(var t,r=e.length,o=r%3,i=[],a=16383,l=0,s=r-o;l<s;l+=a)i.push(c(e,l,l+a>s?s:l+a));1===o?(t=e[r-1],i.push(n[t>>2]+n[t<<4&63]+"==")):2===o&&(t=(e[r-2]<<8)+e[r-1],i.push(n[t>>10]+n[t>>4&63]+n[t<<2&63]+"="));return i.join("")};for(var n=[],r=[],o="undefined"!=typeof Uint8Array?Uint8Array:Array,i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",a=0,l=i.length;a<l;++a)n[a]=i[a],r[i.charCodeAt(a)]=a;function s(e){var t=e.length;if(t%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var n=e.indexOf("=");return-1===n&&(n=t),[n,n===t?0:4-n%4]}function c(e,t,r){for(var o,i,a=[],l=t;l<r;l+=3)o=(e[l]<<16&16711680)+(e[l+1]<<8&65280)+(255&e[l+2]),a.push(n[(i=o)>>18&63]+n[i>>12&63]+n[i>>6&63]+n[63&i]);return a.join("")}r["-".charCodeAt(0)]=62,r["_".charCodeAt(0)]=63},764:(e,t,n)=>{"use strict";var r=n(742),o=n(645),i=n(826);function a(){return s.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function l(e,t){if(a()<t)throw new RangeError("Invalid typed array length");return s.TYPED_ARRAY_SUPPORT?(e=new Uint8Array(t)).__proto__=s.prototype:(null===e&&(e=new s(t)),e.length=t),e}function s(e,t,n){if(!(s.TYPED_ARRAY_SUPPORT||this instanceof s))return new s(e,t,n);if("number"==typeof e){if("string"==typeof t)throw new Error("If encoding is specified then the first argument must be a string");return f(this,e)}return c(this,e,t,n)}function c(e,t,n,r){if("number"==typeof t)throw new TypeError('"value" argument must not be a number');return"undefined"!=typeof ArrayBuffer&&t instanceof ArrayBuffer?function(e,t,n,r){if(t.byteLength,n<0||t.byteLength<n)throw new RangeError("'offset' is out of bounds");if(t.byteLength<n+(r||0))throw new RangeError("'length' is out of bounds");t=void 0===n&&void 0===r?new Uint8Array(t):void 0===r?new Uint8Array(t,n):new Uint8Array(t,n,r);s.TYPED_ARRAY_SUPPORT?(e=t).__proto__=s.prototype:e=d(e,t);return e}(e,t,n,r):"string"==typeof t?function(e,t,n){"string"==typeof n&&""!==n||(n="utf8");if(!s.isEncoding(n))throw new TypeError('"encoding" must be a valid string encoding');var r=0|h(t,n);e=l(e,r);var o=e.write(t,n);o!==r&&(e=e.slice(0,o));return e}(e,t,n):function(e,t){if(s.isBuffer(t)){var n=0|p(t.length);return 0===(e=l(e,n)).length||t.copy(e,0,0,n),e}if(t){if("undefined"!=typeof ArrayBuffer&&t.buffer instanceof ArrayBuffer||"length"in t)return"number"!=typeof t.length||(r=t.length)!=r?l(e,0):d(e,t);if("Buffer"===t.type&&i(t.data))return d(e,t.data)}var r;throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(e,t)}function u(e){if("number"!=typeof e)throw new TypeError('"size" argument must be a number');if(e<0)throw new RangeError('"size" argument must not be negative')}function f(e,t){if(u(t),e=l(e,t<0?0:0|p(t)),!s.TYPED_ARRAY_SUPPORT)for(var n=0;n<t;++n)e[n]=0;return e}function d(e,t){var n=t.length<0?0:0|p(t.length);e=l(e,n);for(var r=0;r<n;r+=1)e[r]=255&t[r];return e}function p(e){if(e>=a())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+a().toString(16)+" bytes");return 0|e}function h(e,t){if(s.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var n=e.length;if(0===n)return 0;for(var r=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return U(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return $(e).length;default:if(r)return U(e).length;t=(""+t).toLowerCase(),r=!0}}function v(e,t,n){var r=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return T(this,t,n);case"utf8":case"utf-8":return S(this,t,n);case"ascii":return N(this,t,n);case"latin1":case"binary":return P(this,t,n);case"base64":return k(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return V(this,t,n);default:if(r)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),r=!0}}function m(e,t,n){var r=e[t];e[t]=e[n],e[n]=r}function g(e,t,n,r,o){if(0===e.length)return-1;if("string"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=o?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(o)return-1;n=e.length-1}else if(n<0){if(!o)return-1;n=0}if("string"==typeof t&&(t=s.from(t,r)),s.isBuffer(t))return 0===t.length?-1:y(e,t,n,r,o);if("number"==typeof t)return t&=255,s.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):y(e,[t],n,r,o);throw new TypeError("val must be string, number or Buffer")}function y(e,t,n,r,o){var i,a=1,l=e.length,s=t.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(e.length<2||t.length<2)return-1;a=2,l/=2,s/=2,n/=2}function c(e,t){return 1===a?e[t]:e.readUInt16BE(t*a)}if(o){var u=-1;for(i=n;i<l;i++)if(c(e,i)===c(t,-1===u?0:i-u)){if(-1===u&&(u=i),i-u+1===s)return u*a}else-1!==u&&(i-=i-u),u=-1}else for(n+s>l&&(n=l-s),i=n;i>=0;i--){for(var f=!0,d=0;d<s;d++)if(c(e,i+d)!==c(t,d)){f=!1;break}if(f)return i}return-1}function b(e,t,n,r){n=Number(n)||0;var o=e.length-n;r?(r=Number(r))>o&&(r=o):r=o;var i=t.length;if(i%2!=0)throw new TypeError("Invalid hex string");r>i/2&&(r=i/2);for(var a=0;a<r;++a){var l=parseInt(t.substr(2*a,2),16);if(isNaN(l))return a;e[n+a]=l}return a}function w(e,t,n,r){return H(U(t,e.length-n),e,n,r)}function C(e,t,n,r){return H(function(e){for(var t=[],n=0;n<e.length;++n)t.push(255&e.charCodeAt(n));return t}(t),e,n,r)}function _(e,t,n,r){return C(e,t,n,r)}function E(e,t,n,r){return H($(t),e,n,r)}function x(e,t,n,r){return H(function(e,t){for(var n,r,o,i=[],a=0;a<e.length&&!((t-=2)<0);++a)r=(n=e.charCodeAt(a))>>8,o=n%256,i.push(o),i.push(r);return i}(t,e.length-n),e,n,r)}function k(e,t,n){return 0===t&&n===e.length?r.fromByteArray(e):r.fromByteArray(e.slice(t,n))}function S(e,t,n){n=Math.min(e.length,n);for(var r=[],o=t;o<n;){var i,a,l,s,c=e[o],u=null,f=c>239?4:c>223?3:c>191?2:1;if(o+f<=n)switch(f){case 1:c<128&&(u=c);break;case 2:128==(192&(i=e[o+1]))&&(s=(31&c)<<6|63&i)>127&&(u=s);break;case 3:i=e[o+1],a=e[o+2],128==(192&i)&&128==(192&a)&&(s=(15&c)<<12|(63&i)<<6|63&a)>2047&&(s<55296||s>57343)&&(u=s);break;case 4:i=e[o+1],a=e[o+2],l=e[o+3],128==(192&i)&&128==(192&a)&&128==(192&l)&&(s=(15&c)<<18|(63&i)<<12|(63&a)<<6|63&l)>65535&&s<1114112&&(u=s)}null===u?(u=65533,f=1):u>65535&&(u-=65536,r.push(u>>>10&1023|55296),u=56320|1023&u),r.push(u),o+=f}return function(e){var t=e.length;if(t<=O)return String.fromCharCode.apply(String,e);var n="",r=0;for(;r<t;)n+=String.fromCharCode.apply(String,e.slice(r,r+=O));return n}(r)}t.lW=s,t.h2=50,s.TYPED_ARRAY_SUPPORT=void 0!==n.g.TYPED_ARRAY_SUPPORT?n.g.TYPED_ARRAY_SUPPORT:function(){try{var e=new Uint8Array(1);return e.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===e.foo()&&"function"==typeof e.subarray&&0===e.subarray(1,1).byteLength}catch(e){return!1}}(),a(),s.poolSize=8192,s._augment=function(e){return e.__proto__=s.prototype,e},s.from=function(e,t,n){return c(null,e,t,n)},s.TYPED_ARRAY_SUPPORT&&(s.prototype.__proto__=Uint8Array.prototype,s.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&s[Symbol.species]===s&&Object.defineProperty(s,Symbol.species,{value:null,configurable:!0})),s.alloc=function(e,t,n){return function(e,t,n,r){return u(t),t<=0?l(e,t):void 0!==n?"string"==typeof r?l(e,t).fill(n,r):l(e,t).fill(n):l(e,t)}(null,e,t,n)},s.allocUnsafe=function(e){return f(null,e)},s.allocUnsafeSlow=function(e){return f(null,e)},s.isBuffer=function(e){return!(null==e||!e._isBuffer)},s.compare=function(e,t){if(!s.isBuffer(e)||!s.isBuffer(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var n=e.length,r=t.length,o=0,i=Math.min(n,r);o<i;++o)if(e[o]!==t[o]){n=e[o],r=t[o];break}return n<r?-1:r<n?1:0},s.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},s.concat=function(e,t){if(!i(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return s.alloc(0);var n;if(void 0===t)for(t=0,n=0;n<e.length;++n)t+=e[n].length;var r=s.allocUnsafe(t),o=0;for(n=0;n<e.length;++n){var a=e[n];if(!s.isBuffer(a))throw new TypeError('"list" argument must be an Array of Buffers');a.copy(r,o),o+=a.length}return r},s.byteLength=h,s.prototype._isBuffer=!0,s.prototype.swap16=function(){var e=this.length;if(e%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var t=0;t<e;t+=2)m(this,t,t+1);return this},s.prototype.swap32=function(){var e=this.length;if(e%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var t=0;t<e;t+=4)m(this,t,t+3),m(this,t+1,t+2);return this},s.prototype.swap64=function(){var e=this.length;if(e%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var t=0;t<e;t+=8)m(this,t,t+7),m(this,t+1,t+6),m(this,t+2,t+5),m(this,t+3,t+4);return this},s.prototype.toString=function(){var e=0|this.length;return 0===e?"":0===arguments.length?S(this,0,e):v.apply(this,arguments)},s.prototype.equals=function(e){if(!s.isBuffer(e))throw new TypeError("Argument must be a Buffer");return this===e||0===s.compare(this,e)},s.prototype.inspect=function(){var e="",n=t.h2;return this.length>0&&(e=this.toString("hex",0,n).match(/.{2}/g).join(" "),this.length>n&&(e+=" ... ")),"<Buffer "+e+">"},s.prototype.compare=function(e,t,n,r,o){if(!s.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===r&&(r=0),void 0===o&&(o=this.length),t<0||n>e.length||r<0||o>this.length)throw new RangeError("out of range index");if(r>=o&&t>=n)return 0;if(r>=o)return-1;if(t>=n)return 1;if(this===e)return 0;for(var i=(o>>>=0)-(r>>>=0),a=(n>>>=0)-(t>>>=0),l=Math.min(i,a),c=this.slice(r,o),u=e.slice(t,n),f=0;f<l;++f)if(c[f]!==u[f]){i=c[f],a=u[f];break}return i<a?-1:a<i?1:0},s.prototype.includes=function(e,t,n){return-1!==this.indexOf(e,t,n)},s.prototype.indexOf=function(e,t,n){return g(this,e,t,n,!0)},s.prototype.lastIndexOf=function(e,t,n){return g(this,e,t,n,!1)},s.prototype.write=function(e,t,n,r){if(void 0===t)r="utf8",n=this.length,t=0;else if(void 0===n&&"string"==typeof t)r=t,n=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t|=0,isFinite(n)?(n|=0,void 0===r&&(r="utf8")):(r=n,n=void 0)}var o=this.length-t;if((void 0===n||n>o)&&(n=o),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");for(var i=!1;;)switch(r){case"hex":return b(this,e,t,n);case"utf8":case"utf-8":return w(this,e,t,n);case"ascii":return C(this,e,t,n);case"latin1":case"binary":return _(this,e,t,n);case"base64":return E(this,e,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return x(this,e,t,n);default:if(i)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),i=!0}},s.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var O=4096;function N(e,t,n){var r="";n=Math.min(e.length,n);for(var o=t;o<n;++o)r+=String.fromCharCode(127&e[o]);return r}function P(e,t,n){var r="";n=Math.min(e.length,n);for(var o=t;o<n;++o)r+=String.fromCharCode(e[o]);return r}function T(e,t,n){var r=e.length;(!t||t<0)&&(t=0),(!n||n<0||n>r)&&(n=r);for(var o="",i=t;i<n;++i)o+=D(e[i]);return o}function V(e,t,n){for(var r=e.slice(t,n),o="",i=0;i<r.length;i+=2)o+=String.fromCharCode(r[i]+256*r[i+1]);return o}function R(e,t,n){if(e%1!=0||e<0)throw new RangeError("offset is not uint");if(e+t>n)throw new RangeError("Trying to access beyond buffer length")}function L(e,t,n,r,o,i){if(!s.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>o||t<i)throw new RangeError('"value" argument is out of bounds');if(n+r>e.length)throw new RangeError("Index out of range")}function A(e,t,n,r){t<0&&(t=65535+t+1);for(var o=0,i=Math.min(e.length-n,2);o<i;++o)e[n+o]=(t&255<<8*(r?o:1-o))>>>8*(r?o:1-o)}function j(e,t,n,r){t<0&&(t=4294967295+t+1);for(var o=0,i=Math.min(e.length-n,4);o<i;++o)e[n+o]=t>>>8*(r?o:3-o)&255}function B(e,t,n,r,o,i){if(n+r>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function I(e,t,n,r,i){return i||B(e,0,n,4),o.write(e,t,n,r,23,4),n+4}function M(e,t,n,r,i){return i||B(e,0,n,8),o.write(e,t,n,r,52,8),n+8}s.prototype.slice=function(e,t){var n,r=this.length;if((e=~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),(t=void 0===t?r:~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),t<e&&(t=e),s.TYPED_ARRAY_SUPPORT)(n=this.subarray(e,t)).__proto__=s.prototype;else{var o=t-e;n=new s(o,void 0);for(var i=0;i<o;++i)n[i]=this[i+e]}return n},s.prototype.readUIntLE=function(e,t,n){e|=0,t|=0,n||R(e,t,this.length);for(var r=this[e],o=1,i=0;++i<t&&(o*=256);)r+=this[e+i]*o;return r},s.prototype.readUIntBE=function(e,t,n){e|=0,t|=0,n||R(e,t,this.length);for(var r=this[e+--t],o=1;t>0&&(o*=256);)r+=this[e+--t]*o;return r},s.prototype.readUInt8=function(e,t){return t||R(e,1,this.length),this[e]},s.prototype.readUInt16LE=function(e,t){return t||R(e,2,this.length),this[e]|this[e+1]<<8},s.prototype.readUInt16BE=function(e,t){return t||R(e,2,this.length),this[e]<<8|this[e+1]},s.prototype.readUInt32LE=function(e,t){return t||R(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},s.prototype.readUInt32BE=function(e,t){return t||R(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},s.prototype.readIntLE=function(e,t,n){e|=0,t|=0,n||R(e,t,this.length);for(var r=this[e],o=1,i=0;++i<t&&(o*=256);)r+=this[e+i]*o;return r>=(o*=128)&&(r-=Math.pow(2,8*t)),r},s.prototype.readIntBE=function(e,t,n){e|=0,t|=0,n||R(e,t,this.length);for(var r=t,o=1,i=this[e+--r];r>0&&(o*=256);)i+=this[e+--r]*o;return i>=(o*=128)&&(i-=Math.pow(2,8*t)),i},s.prototype.readInt8=function(e,t){return t||R(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},s.prototype.readInt16LE=function(e,t){t||R(e,2,this.length);var n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},s.prototype.readInt16BE=function(e,t){t||R(e,2,this.length);var n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},s.prototype.readInt32LE=function(e,t){return t||R(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},s.prototype.readInt32BE=function(e,t){return t||R(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},s.prototype.readFloatLE=function(e,t){return t||R(e,4,this.length),o.read(this,e,!0,23,4)},s.prototype.readFloatBE=function(e,t){return t||R(e,4,this.length),o.read(this,e,!1,23,4)},s.prototype.readDoubleLE=function(e,t){return t||R(e,8,this.length),o.read(this,e,!0,52,8)},s.prototype.readDoubleBE=function(e,t){return t||R(e,8,this.length),o.read(this,e,!1,52,8)},s.prototype.writeUIntLE=function(e,t,n,r){(e=+e,t|=0,n|=0,r)||L(this,e,t,n,Math.pow(2,8*n)-1,0);var o=1,i=0;for(this[t]=255&e;++i<n&&(o*=256);)this[t+i]=e/o&255;return t+n},s.prototype.writeUIntBE=function(e,t,n,r){(e=+e,t|=0,n|=0,r)||L(this,e,t,n,Math.pow(2,8*n)-1,0);var o=n-1,i=1;for(this[t+o]=255&e;--o>=0&&(i*=256);)this[t+o]=e/i&255;return t+n},s.prototype.writeUInt8=function(e,t,n){return e=+e,t|=0,n||L(this,e,t,1,255,0),s.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},s.prototype.writeUInt16LE=function(e,t,n){return e=+e,t|=0,n||L(this,e,t,2,65535,0),s.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):A(this,e,t,!0),t+2},s.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||L(this,e,t,2,65535,0),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):A(this,e,t,!1),t+2},s.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||L(this,e,t,4,4294967295,0),s.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):j(this,e,t,!0),t+4},s.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||L(this,e,t,4,4294967295,0),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):j(this,e,t,!1),t+4},s.prototype.writeIntLE=function(e,t,n,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*n-1);L(this,e,t,n,o-1,-o)}var i=0,a=1,l=0;for(this[t]=255&e;++i<n&&(a*=256);)e<0&&0===l&&0!==this[t+i-1]&&(l=1),this[t+i]=(e/a>>0)-l&255;return t+n},s.prototype.writeIntBE=function(e,t,n,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*n-1);L(this,e,t,n,o-1,-o)}var i=n-1,a=1,l=0;for(this[t+i]=255&e;--i>=0&&(a*=256);)e<0&&0===l&&0!==this[t+i+1]&&(l=1),this[t+i]=(e/a>>0)-l&255;return t+n},s.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||L(this,e,t,1,127,-128),s.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},s.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||L(this,e,t,2,32767,-32768),s.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):A(this,e,t,!0),t+2},s.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||L(this,e,t,2,32767,-32768),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):A(this,e,t,!1),t+2},s.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||L(this,e,t,4,2147483647,-2147483648),s.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):j(this,e,t,!0),t+4},s.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||L(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):j(this,e,t,!1),t+4},s.prototype.writeFloatLE=function(e,t,n){return I(this,e,t,!0,n)},s.prototype.writeFloatBE=function(e,t,n){return I(this,e,t,!1,n)},s.prototype.writeDoubleLE=function(e,t,n){return M(this,e,t,!0,n)},s.prototype.writeDoubleBE=function(e,t,n){return M(this,e,t,!1,n)},s.prototype.copy=function(e,t,n,r){if(n||(n=0),r||0===r||(r=this.length),t>=e.length&&(t=e.length),t||(t=0),r>0&&r<n&&(r=n),r===n)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError("targetStart out of bounds");if(n<0||n>=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),e.length-t<r-n&&(r=e.length-t+n);var o,i=r-n;if(this===e&&n<t&&t<r)for(o=i-1;o>=0;--o)e[o+t]=this[o+n];else if(i<1e3||!s.TYPED_ARRAY_SUPPORT)for(o=0;o<i;++o)e[o+t]=this[o+n];else Uint8Array.prototype.set.call(e,this.subarray(n,n+i),t);return i},s.prototype.fill=function(e,t,n,r){if("string"==typeof e){if("string"==typeof t?(r=t,t=0,n=this.length):"string"==typeof n&&(r=n,n=this.length),1===e.length){var o=e.charCodeAt(0);o<256&&(e=o)}if(void 0!==r&&"string"!=typeof r)throw new TypeError("encoding must be a string");if("string"==typeof r&&!s.isEncoding(r))throw new TypeError("Unknown encoding: "+r)}else"number"==typeof e&&(e&=255);if(t<0||this.length<t||this.length<n)throw new RangeError("Out of range index");if(n<=t)return this;var i;if(t>>>=0,n=void 0===n?this.length:n>>>0,e||(e=0),"number"==typeof e)for(i=t;i<n;++i)this[i]=e;else{var a=s.isBuffer(e)?e:U(new s(e,r).toString()),l=a.length;for(i=0;i<n-t;++i)this[i+t]=a[i%l]}return this};var F=/[^+\/0-9A-Za-z-_]/g;function D(e){return e<16?"0"+e.toString(16):e.toString(16)}function U(e,t){var n;t=t||1/0;for(var r=e.length,o=null,i=[],a=0;a<r;++a){if((n=e.charCodeAt(a))>55295&&n<57344){if(!o){if(n>56319){(t-=3)>-1&&i.push(239,191,189);continue}if(a+1===r){(t-=3)>-1&&i.push(239,191,189);continue}o=n;continue}if(n<56320){(t-=3)>-1&&i.push(239,191,189),o=n;continue}n=65536+(o-55296<<10|n-56320)}else o&&(t-=3)>-1&&i.push(239,191,189);if(o=null,n<128){if((t-=1)<0)break;i.push(n)}else if(n<2048){if((t-=2)<0)break;i.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;i.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;i.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return i}function $(e){return r.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(F,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function H(e,t,n,r){for(var o=0;o<r&&!(o+n>=t.length||o>=e.length);++o)t[o+n]=e[o];return o}},645:(e,t)=>{t.read=function(e,t,n,r,o){var i,a,l=8*o-r-1,s=(1<<l)-1,c=s>>1,u=-7,f=n?o-1:0,d=n?-1:1,p=e[t+f];for(f+=d,i=p&(1<<-u)-1,p>>=-u,u+=l;u>0;i=256*i+e[t+f],f+=d,u-=8);for(a=i&(1<<-u)-1,i>>=-u,u+=r;u>0;a=256*a+e[t+f],f+=d,u-=8);if(0===i)i=1-c;else{if(i===s)return a?NaN:1/0*(p?-1:1);a+=Math.pow(2,r),i-=c}return(p?-1:1)*a*Math.pow(2,i-r)},t.write=function(e,t,n,r,o,i){var a,l,s,c=8*i-o-1,u=(1<<c)-1,f=u>>1,d=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,p=r?0:i-1,h=r?1:-1,v=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(l=isNaN(t)?1:0,a=u):(a=Math.floor(Math.log(t)/Math.LN2),t*(s=Math.pow(2,-a))<1&&(a--,s*=2),(t+=a+f>=1?d/s:d*Math.pow(2,1-f))*s>=2&&(a++,s/=2),a+f>=u?(l=0,a=u):a+f>=1?(l=(t*s-1)*Math.pow(2,o),a+=f):(l=t*Math.pow(2,f-1)*Math.pow(2,o),a=0));o>=8;e[n+p]=255&l,p+=h,l/=256,o-=8);for(a=a<<o|l,c+=o;c>0;e[n+p]=255&a,p+=h,a/=256,c-=8);e[n+p-h]|=128*v}},826:e=>{var t={}.toString;e.exports=Array.isArray||function(e){return"[object Array]"==t.call(e)}},486:function(e,t,n){var r;e=n.nmd(e),function(){var o,i=200,a="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",l="Expected a function",s="Invalid `variable` option passed into `_.template`",c="__lodash_hash_undefined__",u=500,f="__lodash_placeholder__",d=1,p=2,h=4,v=1,m=2,g=1,y=2,b=4,w=8,C=16,_=32,E=64,x=128,k=256,S=512,O=30,N="...",P=800,T=16,V=1,R=2,L=1/0,A=9007199254740991,j=17976931348623157e292,B=NaN,I=4294967295,M=I-1,F=I>>>1,D=[["ary",x],["bind",g],["bindKey",y],["curry",w],["curryRight",C],["flip",S],["partial",_],["partialRight",E],["rearg",k]],U="[object Arguments]",$="[object Array]",H="[object AsyncFunction]",z="[object Boolean]",q="[object Date]",W="[object DOMException]",K="[object Error]",G="[object Function]",Z="[object GeneratorFunction]",Y="[object Map]",J="[object Number]",Q="[object Null]",X="[object Object]",ee="[object Promise]",te="[object Proxy]",ne="[object RegExp]",re="[object Set]",oe="[object String]",ie="[object Symbol]",ae="[object Undefined]",le="[object WeakMap]",se="[object WeakSet]",ce="[object ArrayBuffer]",ue="[object DataView]",fe="[object Float32Array]",de="[object Float64Array]",pe="[object Int8Array]",he="[object Int16Array]",ve="[object Int32Array]",me="[object Uint8Array]",ge="[object Uint8ClampedArray]",ye="[object Uint16Array]",be="[object Uint32Array]",we=/\b__p \+= '';/g,Ce=/\b(__p \+=) '' \+/g,_e=/(__e\(.*?\)|\b__t\)) \+\n'';/g,Ee=/&(?:amp|lt|gt|quot|#39);/g,xe=/[&<>"']/g,ke=RegExp(Ee.source),Se=RegExp(xe.source),Oe=/<%-([\s\S]+?)%>/g,Ne=/<%([\s\S]+?)%>/g,Pe=/<%=([\s\S]+?)%>/g,Te=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Ve=/^\w*$/,Re=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Le=/[\\^$.*+?()[\]{}|]/g,Ae=RegExp(Le.source),je=/^\s+/,Be=/\s/,Ie=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Me=/\{\n\/\* \[wrapped with (.+)\] \*/,Fe=/,? & /,De=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Ue=/[()=,{}\[\]\/\s]/,$e=/\\(\\)?/g,He=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,ze=/\w*$/,qe=/^[-+]0x[0-9a-f]+$/i,We=/^0b[01]+$/i,Ke=/^\[object .+?Constructor\]$/,Ge=/^0o[0-7]+$/i,Ze=/^(?:0|[1-9]\d*)$/,Ye=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Je=/($^)/,Qe=/['\n\r\u2028\u2029\\]/g,Xe="\\ud800-\\udfff",et="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",tt="\\u2700-\\u27bf",nt="a-z\\xdf-\\xf6\\xf8-\\xff",rt="A-Z\\xc0-\\xd6\\xd8-\\xde",ot="\\ufe0e\\ufe0f",it="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",at="['’]",lt="["+Xe+"]",st="["+it+"]",ct="["+et+"]",ut="\\d+",ft="["+tt+"]",dt="["+nt+"]",pt="[^"+Xe+it+ut+tt+nt+rt+"]",ht="\\ud83c[\\udffb-\\udfff]",vt="[^"+Xe+"]",mt="(?:\\ud83c[\\udde6-\\uddff]){2}",gt="[\\ud800-\\udbff][\\udc00-\\udfff]",yt="["+rt+"]",bt="\\u200d",wt="(?:"+dt+"|"+pt+")",Ct="(?:"+yt+"|"+pt+")",_t="(?:['’](?:d|ll|m|re|s|t|ve))?",Et="(?:['’](?:D|LL|M|RE|S|T|VE))?",xt="(?:"+ct+"|"+ht+")"+"?",kt="["+ot+"]?",St=kt+xt+("(?:"+bt+"(?:"+[vt,mt,gt].join("|")+")"+kt+xt+")*"),Ot="(?:"+[ft,mt,gt].join("|")+")"+St,Nt="(?:"+[vt+ct+"?",ct,mt,gt,lt].join("|")+")",Pt=RegExp(at,"g"),Tt=RegExp(ct,"g"),Vt=RegExp(ht+"(?="+ht+")|"+Nt+St,"g"),Rt=RegExp([yt+"?"+dt+"+"+_t+"(?="+[st,yt,"$"].join("|")+")",Ct+"+"+Et+"(?="+[st,yt+wt,"$"].join("|")+")",yt+"?"+wt+"+"+_t,yt+"+"+Et,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",ut,Ot].join("|"),"g"),Lt=RegExp("["+bt+Xe+et+ot+"]"),At=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,jt=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Bt=-1,It={};It[fe]=It[de]=It[pe]=It[he]=It[ve]=It[me]=It[ge]=It[ye]=It[be]=!0,It[U]=It[$]=It[ce]=It[z]=It[ue]=It[q]=It[K]=It[G]=It[Y]=It[J]=It[X]=It[ne]=It[re]=It[oe]=It[le]=!1;var Mt={};Mt[U]=Mt[$]=Mt[ce]=Mt[ue]=Mt[z]=Mt[q]=Mt[fe]=Mt[de]=Mt[pe]=Mt[he]=Mt[ve]=Mt[Y]=Mt[J]=Mt[X]=Mt[ne]=Mt[re]=Mt[oe]=Mt[ie]=Mt[me]=Mt[ge]=Mt[ye]=Mt[be]=!0,Mt[K]=Mt[G]=Mt[le]=!1;var Ft={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Dt=parseFloat,Ut=parseInt,$t="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,Ht="object"==typeof self&&self&&self.Object===Object&&self,zt=$t||Ht||Function("return this")(),qt=t&&!t.nodeType&&t,Wt=qt&&e&&!e.nodeType&&e,Kt=Wt&&Wt.exports===qt,Gt=Kt&&$t.process,Zt=function(){try{var e=Wt&&Wt.require&&Wt.require("util").types;return e||Gt&&Gt.binding&&Gt.binding("util")}catch(e){}}(),Yt=Zt&&Zt.isArrayBuffer,Jt=Zt&&Zt.isDate,Qt=Zt&&Zt.isMap,Xt=Zt&&Zt.isRegExp,en=Zt&&Zt.isSet,tn=Zt&&Zt.isTypedArray;function nn(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}function rn(e,t,n,r){for(var o=-1,i=null==e?0:e.length;++o<i;){var a=e[o];t(r,a,n(a),e)}return r}function on(e,t){for(var n=-1,r=null==e?0:e.length;++n<r&&!1!==t(e[n],n,e););return e}function an(e,t){for(var n=null==e?0:e.length;n--&&!1!==t(e[n],n,e););return e}function ln(e,t){for(var n=-1,r=null==e?0:e.length;++n<r;)if(!t(e[n],n,e))return!1;return!0}function sn(e,t){for(var n=-1,r=null==e?0:e.length,o=0,i=[];++n<r;){var a=e[n];t(a,n,e)&&(i[o++]=a)}return i}function cn(e,t){return!!(null==e?0:e.length)&&bn(e,t,0)>-1}function un(e,t,n){for(var r=-1,o=null==e?0:e.length;++r<o;)if(n(t,e[r]))return!0;return!1}function fn(e,t){for(var n=-1,r=null==e?0:e.length,o=Array(r);++n<r;)o[n]=t(e[n],n,e);return o}function dn(e,t){for(var n=-1,r=t.length,o=e.length;++n<r;)e[o+n]=t[n];return e}function pn(e,t,n,r){var o=-1,i=null==e?0:e.length;for(r&&i&&(n=e[++o]);++o<i;)n=t(n,e[o],o,e);return n}function hn(e,t,n,r){var o=null==e?0:e.length;for(r&&o&&(n=e[--o]);o--;)n=t(n,e[o],o,e);return n}function vn(e,t){for(var n=-1,r=null==e?0:e.length;++n<r;)if(t(e[n],n,e))return!0;return!1}var mn=En("length");function gn(e,t,n){var r;return n(e,(function(e,n,o){if(t(e,n,o))return r=n,!1})),r}function yn(e,t,n,r){for(var o=e.length,i=n+(r?1:-1);r?i--:++i<o;)if(t(e[i],i,e))return i;return-1}function bn(e,t,n){return t==t?function(e,t,n){var r=n-1,o=e.length;for(;++r<o;)if(e[r]===t)return r;return-1}(e,t,n):yn(e,Cn,n)}function wn(e,t,n,r){for(var o=n-1,i=e.length;++o<i;)if(r(e[o],t))return o;return-1}function Cn(e){return e!=e}function _n(e,t){var n=null==e?0:e.length;return n?Sn(e,t)/n:B}function En(e){return function(t){return null==t?o:t[e]}}function xn(e){return function(t){return null==e?o:e[t]}}function kn(e,t,n,r,o){return o(e,(function(e,o,i){n=r?(r=!1,e):t(n,e,o,i)})),n}function Sn(e,t){for(var n,r=-1,i=e.length;++r<i;){var a=t(e[r]);a!==o&&(n=n===o?a:n+a)}return n}function On(e,t){for(var n=-1,r=Array(e);++n<e;)r[n]=t(n);return r}function Nn(e){return e?e.slice(0,qn(e)+1).replace(je,""):e}function Pn(e){return function(t){return e(t)}}function Tn(e,t){return fn(t,(function(t){return e[t]}))}function Vn(e,t){return e.has(t)}function Rn(e,t){for(var n=-1,r=e.length;++n<r&&bn(t,e[n],0)>-1;);return n}function Ln(e,t){for(var n=e.length;n--&&bn(t,e[n],0)>-1;);return n}var An=xn({À:"A",Á:"A",Â:"A",Ã:"A",Ä:"A",Å:"A",à:"a",á:"a",â:"a",ã:"a",ä:"a",å:"a",Ç:"C",ç:"c",Ð:"D",ð:"d",È:"E",É:"E",Ê:"E",Ë:"E",è:"e",é:"e",ê:"e",ë:"e",Ì:"I",Í:"I",Î:"I",Ï:"I",ì:"i",í:"i",î:"i",ï:"i",Ñ:"N",ñ:"n",Ò:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"O",Ø:"O",ò:"o",ó:"o",ô:"o",õ:"o",ö:"o",ø:"o",Ù:"U",Ú:"U",Û:"U",Ü:"U",ù:"u",ú:"u",û:"u",ü:"u",Ý:"Y",ý:"y",ÿ:"y",Æ:"Ae",æ:"ae",Þ:"Th",þ:"th",ß:"ss",Ā:"A",Ă:"A",Ą:"A",ā:"a",ă:"a",ą:"a",Ć:"C",Ĉ:"C",Ċ:"C",Č:"C",ć:"c",ĉ:"c",ċ:"c",č:"c",Ď:"D",Đ:"D",ď:"d",đ:"d",Ē:"E",Ĕ:"E",Ė:"E",Ę:"E",Ě:"E",ē:"e",ĕ:"e",ė:"e",ę:"e",ě:"e",Ĝ:"G",Ğ:"G",Ġ:"G",Ģ:"G",ĝ:"g",ğ:"g",ġ:"g",ģ:"g",Ĥ:"H",Ħ:"H",ĥ:"h",ħ:"h",Ĩ:"I",Ī:"I",Ĭ:"I",Į:"I",İ:"I",ĩ:"i",ī:"i",ĭ:"i",į:"i",ı:"i",Ĵ:"J",ĵ:"j",Ķ:"K",ķ:"k",ĸ:"k",Ĺ:"L",Ļ:"L",Ľ:"L",Ŀ:"L",Ł:"L",ĺ:"l",ļ:"l",ľ:"l",ŀ:"l",ł:"l",Ń:"N",Ņ:"N",Ň:"N",Ŋ:"N",ń:"n",ņ:"n",ň:"n",ŋ:"n",Ō:"O",Ŏ:"O",Ő:"O",ō:"o",ŏ:"o",ő:"o",Ŕ:"R",Ŗ:"R",Ř:"R",ŕ:"r",ŗ:"r",ř:"r",Ś:"S",Ŝ:"S",Ş:"S",Š:"S",ś:"s",ŝ:"s",ş:"s",š:"s",Ţ:"T",Ť:"T",Ŧ:"T",ţ:"t",ť:"t",ŧ:"t",Ũ:"U",Ū:"U",Ŭ:"U",Ů:"U",Ű:"U",Ų:"U",ũ:"u",ū:"u",ŭ:"u",ů:"u",ű:"u",ų:"u",Ŵ:"W",ŵ:"w",Ŷ:"Y",ŷ:"y",Ÿ:"Y",Ź:"Z",Ż:"Z",Ž:"Z",ź:"z",ż:"z",ž:"z",Ĳ:"IJ",ĳ:"ij",Œ:"Oe",œ:"oe",ŉ:"'n",ſ:"s"}),jn=xn({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"});function Bn(e){return"\\"+Ft[e]}function In(e){return Lt.test(e)}function Mn(e){var t=-1,n=Array(e.size);return e.forEach((function(e,r){n[++t]=[r,e]})),n}function Fn(e,t){return function(n){return e(t(n))}}function Dn(e,t){for(var n=-1,r=e.length,o=0,i=[];++n<r;){var a=e[n];a!==t&&a!==f||(e[n]=f,i[o++]=n)}return i}function Un(e){var t=-1,n=Array(e.size);return e.forEach((function(e){n[++t]=e})),n}function $n(e){var t=-1,n=Array(e.size);return e.forEach((function(e){n[++t]=[e,e]})),n}function Hn(e){return In(e)?function(e){var t=Vt.lastIndex=0;for(;Vt.test(e);)++t;return t}(e):mn(e)}function zn(e){return In(e)?function(e){return e.match(Vt)||[]}(e):function(e){return e.split("")}(e)}function qn(e){for(var t=e.length;t--&&Be.test(e.charAt(t)););return t}var Wn=xn({"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&#39;":"'"});var Kn=function e(t){var n,r=(t=null==t?zt:Kn.defaults(zt.Object(),t,Kn.pick(zt,jt))).Array,Be=t.Date,Xe=t.Error,et=t.Function,tt=t.Math,nt=t.Object,rt=t.RegExp,ot=t.String,it=t.TypeError,at=r.prototype,lt=et.prototype,st=nt.prototype,ct=t["__core-js_shared__"],ut=lt.toString,ft=st.hasOwnProperty,dt=0,pt=(n=/[^.]+$/.exec(ct&&ct.keys&&ct.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"",ht=st.toString,vt=ut.call(nt),mt=zt._,gt=rt("^"+ut.call(ft).replace(Le,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),yt=Kt?t.Buffer:o,bt=t.Symbol,wt=t.Uint8Array,Ct=yt?yt.allocUnsafe:o,_t=Fn(nt.getPrototypeOf,nt),Et=nt.create,xt=st.propertyIsEnumerable,kt=at.splice,St=bt?bt.isConcatSpreadable:o,Ot=bt?bt.iterator:o,Nt=bt?bt.toStringTag:o,Vt=function(){try{var e=$i(nt,"defineProperty");return e({},"",{}),e}catch(e){}}(),Lt=t.clearTimeout!==zt.clearTimeout&&t.clearTimeout,Ft=Be&&Be.now!==zt.Date.now&&Be.now,$t=t.setTimeout!==zt.setTimeout&&t.setTimeout,Ht=tt.ceil,qt=tt.floor,Wt=nt.getOwnPropertySymbols,Gt=yt?yt.isBuffer:o,Zt=t.isFinite,mn=at.join,xn=Fn(nt.keys,nt),Gn=tt.max,Zn=tt.min,Yn=Be.now,Jn=t.parseInt,Qn=tt.random,Xn=at.reverse,er=$i(t,"DataView"),tr=$i(t,"Map"),nr=$i(t,"Promise"),rr=$i(t,"Set"),or=$i(t,"WeakMap"),ir=$i(nt,"create"),ar=or&&new or,lr={},sr=ha(er),cr=ha(tr),ur=ha(nr),fr=ha(rr),dr=ha(or),pr=bt?bt.prototype:o,hr=pr?pr.valueOf:o,vr=pr?pr.toString:o;function mr(e){if(Vl(e)&&!wl(e)&&!(e instanceof wr)){if(e instanceof br)return e;if(ft.call(e,"__wrapped__"))return va(e)}return new br(e)}var gr=function(){function e(){}return function(t){if(!Tl(t))return{};if(Et)return Et(t);e.prototype=t;var n=new e;return e.prototype=o,n}}();function yr(){}function br(e,t){this.__wrapped__=e,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=o}function wr(e){this.__wrapped__=e,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=I,this.__views__=[]}function Cr(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function _r(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function Er(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function xr(e){var t=-1,n=null==e?0:e.length;for(this.__data__=new Er;++t<n;)this.add(e[t])}function kr(e){var t=this.__data__=new _r(e);this.size=t.size}function Sr(e,t){var n=wl(e),r=!n&&bl(e),o=!n&&!r&&xl(e),i=!n&&!r&&!o&&Fl(e),a=n||r||o||i,l=a?On(e.length,ot):[],s=l.length;for(var c in e)!t&&!ft.call(e,c)||a&&("length"==c||o&&("offset"==c||"parent"==c)||i&&("buffer"==c||"byteLength"==c||"byteOffset"==c)||Zi(c,s))||l.push(c);return l}function Or(e){var t=e.length;return t?e[ko(0,t-1)]:o}function Nr(e,t){return fa(ai(e),Ir(t,0,e.length))}function Pr(e){return fa(ai(e))}function Tr(e,t,n){(n!==o&&!ml(e[t],n)||n===o&&!(t in e))&&jr(e,t,n)}function Vr(e,t,n){var r=e[t];ft.call(e,t)&&ml(r,n)&&(n!==o||t in e)||jr(e,t,n)}function Rr(e,t){for(var n=e.length;n--;)if(ml(e[n][0],t))return n;return-1}function Lr(e,t,n,r){return $r(e,(function(e,o,i){t(r,e,n(e),i)})),r}function Ar(e,t){return e&&li(t,ls(t),e)}function jr(e,t,n){"__proto__"==t&&Vt?Vt(e,t,{configurable:!0,enumerable:!0,value:n,writable:!0}):e[t]=n}function Br(e,t){for(var n=-1,i=t.length,a=r(i),l=null==e;++n<i;)a[n]=l?o:ns(e,t[n]);return a}function Ir(e,t,n){return e==e&&(n!==o&&(e=e<=n?e:n),t!==o&&(e=e>=t?e:t)),e}function Mr(e,t,n,r,i,a){var l,s=t&d,c=t&p,u=t&h;if(n&&(l=i?n(e,r,i,a):n(e)),l!==o)return l;if(!Tl(e))return e;var f=wl(e);if(f){if(l=function(e){var t=e.length,n=new e.constructor(t);t&&"string"==typeof e[0]&&ft.call(e,"index")&&(n.index=e.index,n.input=e.input);return n}(e),!s)return ai(e,l)}else{var v=qi(e),m=v==G||v==Z;if(xl(e))return ei(e,s);if(v==X||v==U||m&&!i){if(l=c||m?{}:Ki(e),!s)return c?function(e,t){return li(e,zi(e),t)}(e,function(e,t){return e&&li(t,ss(t),e)}(l,e)):function(e,t){return li(e,Hi(e),t)}(e,Ar(l,e))}else{if(!Mt[v])return i?e:{};l=function(e,t,n){var r=e.constructor;switch(t){case ce:return ti(e);case z:case q:return new r(+e);case ue:return function(e,t){var n=t?ti(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.byteLength)}(e,n);case fe:case de:case pe:case he:case ve:case me:case ge:case ye:case be:return ni(e,n);case Y:return new r;case J:case oe:return new r(e);case ne:return function(e){var t=new e.constructor(e.source,ze.exec(e));return t.lastIndex=e.lastIndex,t}(e);case re:return new r;case ie:return o=e,hr?nt(hr.call(o)):{}}var o}(e,v,s)}}a||(a=new kr);var g=a.get(e);if(g)return g;a.set(e,l),Bl(e)?e.forEach((function(r){l.add(Mr(r,t,n,r,e,a))})):Rl(e)&&e.forEach((function(r,o){l.set(o,Mr(r,t,n,o,e,a))}));var y=f?o:(u?c?ji:Ai:c?ss:ls)(e);return on(y||e,(function(r,o){y&&(r=e[o=r]),Vr(l,o,Mr(r,t,n,o,e,a))})),l}function Fr(e,t,n){var r=n.length;if(null==e)return!r;for(e=nt(e);r--;){var i=n[r],a=t[i],l=e[i];if(l===o&&!(i in e)||!a(l))return!1}return!0}function Dr(e,t,n){if("function"!=typeof e)throw new it(l);return la((function(){e.apply(o,n)}),t)}function Ur(e,t,n,r){var o=-1,a=cn,l=!0,s=e.length,c=[],u=t.length;if(!s)return c;n&&(t=fn(t,Pn(n))),r?(a=un,l=!1):t.length>=i&&(a=Vn,l=!1,t=new xr(t));e:for(;++o<s;){var f=e[o],d=null==n?f:n(f);if(f=r||0!==f?f:0,l&&d==d){for(var p=u;p--;)if(t[p]===d)continue e;c.push(f)}else a(t,d,r)||c.push(f)}return c}mr.templateSettings={escape:Oe,evaluate:Ne,interpolate:Pe,variable:"",imports:{_:mr}},mr.prototype=yr.prototype,mr.prototype.constructor=mr,br.prototype=gr(yr.prototype),br.prototype.constructor=br,wr.prototype=gr(yr.prototype),wr.prototype.constructor=wr,Cr.prototype.clear=function(){this.__data__=ir?ir(null):{},this.size=0},Cr.prototype.delete=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t},Cr.prototype.get=function(e){var t=this.__data__;if(ir){var n=t[e];return n===c?o:n}return ft.call(t,e)?t[e]:o},Cr.prototype.has=function(e){var t=this.__data__;return ir?t[e]!==o:ft.call(t,e)},Cr.prototype.set=function(e,t){var n=this.__data__;return this.size+=this.has(e)?0:1,n[e]=ir&&t===o?c:t,this},_r.prototype.clear=function(){this.__data__=[],this.size=0},_r.prototype.delete=function(e){var t=this.__data__,n=Rr(t,e);return!(n<0)&&(n==t.length-1?t.pop():kt.call(t,n,1),--this.size,!0)},_r.prototype.get=function(e){var t=this.__data__,n=Rr(t,e);return n<0?o:t[n][1]},_r.prototype.has=function(e){return Rr(this.__data__,e)>-1},_r.prototype.set=function(e,t){var n=this.__data__,r=Rr(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this},Er.prototype.clear=function(){this.size=0,this.__data__={hash:new Cr,map:new(tr||_r),string:new Cr}},Er.prototype.delete=function(e){var t=Di(this,e).delete(e);return this.size-=t?1:0,t},Er.prototype.get=function(e){return Di(this,e).get(e)},Er.prototype.has=function(e){return Di(this,e).has(e)},Er.prototype.set=function(e,t){var n=Di(this,e),r=n.size;return n.set(e,t),this.size+=n.size==r?0:1,this},xr.prototype.add=xr.prototype.push=function(e){return this.__data__.set(e,c),this},xr.prototype.has=function(e){return this.__data__.has(e)},kr.prototype.clear=function(){this.__data__=new _r,this.size=0},kr.prototype.delete=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n},kr.prototype.get=function(e){return this.__data__.get(e)},kr.prototype.has=function(e){return this.__data__.has(e)},kr.prototype.set=function(e,t){var n=this.__data__;if(n instanceof _r){var r=n.__data__;if(!tr||r.length<i-1)return r.push([e,t]),this.size=++n.size,this;n=this.__data__=new Er(r)}return n.set(e,t),this.size=n.size,this};var $r=ui(Yr),Hr=ui(Jr,!0);function zr(e,t){var n=!0;return $r(e,(function(e,r,o){return n=!!t(e,r,o)})),n}function qr(e,t,n){for(var r=-1,i=e.length;++r<i;){var a=e[r],l=t(a);if(null!=l&&(s===o?l==l&&!Ml(l):n(l,s)))var s=l,c=a}return c}function Wr(e,t){var n=[];return $r(e,(function(e,r,o){t(e,r,o)&&n.push(e)})),n}function Kr(e,t,n,r,o){var i=-1,a=e.length;for(n||(n=Gi),o||(o=[]);++i<a;){var l=e[i];t>0&&n(l)?t>1?Kr(l,t-1,n,r,o):dn(o,l):r||(o[o.length]=l)}return o}var Gr=fi(),Zr=fi(!0);function Yr(e,t){return e&&Gr(e,t,ls)}function Jr(e,t){return e&&Zr(e,t,ls)}function Qr(e,t){return sn(t,(function(t){return Ol(e[t])}))}function Xr(e,t){for(var n=0,r=(t=Yo(t,e)).length;null!=e&&n<r;)e=e[pa(t[n++])];return n&&n==r?e:o}function eo(e,t,n){var r=t(e);return wl(e)?r:dn(r,n(e))}function to(e){return null==e?e===o?ae:Q:Nt&&Nt in nt(e)?function(e){var t=ft.call(e,Nt),n=e[Nt];try{e[Nt]=o;var r=!0}catch(e){}var i=ht.call(e);r&&(t?e[Nt]=n:delete e[Nt]);return i}(e):function(e){return ht.call(e)}(e)}function no(e,t){return e>t}function ro(e,t){return null!=e&&ft.call(e,t)}function oo(e,t){return null!=e&&t in nt(e)}function io(e,t,n){for(var i=n?un:cn,a=e[0].length,l=e.length,s=l,c=r(l),u=1/0,f=[];s--;){var d=e[s];s&&t&&(d=fn(d,Pn(t))),u=Zn(d.length,u),c[s]=!n&&(t||a>=120&&d.length>=120)?new xr(s&&d):o}d=e[0];var p=-1,h=c[0];e:for(;++p<a&&f.length<u;){var v=d[p],m=t?t(v):v;if(v=n||0!==v?v:0,!(h?Vn(h,m):i(f,m,n))){for(s=l;--s;){var g=c[s];if(!(g?Vn(g,m):i(e[s],m,n)))continue e}h&&h.push(m),f.push(v)}}return f}function ao(e,t,n){var r=null==(e=oa(e,t=Yo(t,e)))?e:e[pa(Sa(t))];return null==r?o:nn(r,e,n)}function lo(e){return Vl(e)&&to(e)==U}function so(e,t,n,r,i){return e===t||(null==e||null==t||!Vl(e)&&!Vl(t)?e!=e&&t!=t:function(e,t,n,r,i,a){var l=wl(e),s=wl(t),c=l?$:qi(e),u=s?$:qi(t),f=(c=c==U?X:c)==X,d=(u=u==U?X:u)==X,p=c==u;if(p&&xl(e)){if(!xl(t))return!1;l=!0,f=!1}if(p&&!f)return a||(a=new kr),l||Fl(e)?Ri(e,t,n,r,i,a):function(e,t,n,r,o,i,a){switch(n){case ue:if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case ce:return!(e.byteLength!=t.byteLength||!i(new wt(e),new wt(t)));case z:case q:case J:return ml(+e,+t);case K:return e.name==t.name&&e.message==t.message;case ne:case oe:return e==t+"";case Y:var l=Mn;case re:var s=r&v;if(l||(l=Un),e.size!=t.size&&!s)return!1;var c=a.get(e);if(c)return c==t;r|=m,a.set(e,t);var u=Ri(l(e),l(t),r,o,i,a);return a.delete(e),u;case ie:if(hr)return hr.call(e)==hr.call(t)}return!1}(e,t,c,n,r,i,a);if(!(n&v)){var h=f&&ft.call(e,"__wrapped__"),g=d&&ft.call(t,"__wrapped__");if(h||g){var y=h?e.value():e,b=g?t.value():t;return a||(a=new kr),i(y,b,n,r,a)}}if(!p)return!1;return a||(a=new kr),function(e,t,n,r,i,a){var l=n&v,s=Ai(e),c=s.length,u=Ai(t),f=u.length;if(c!=f&&!l)return!1;var d=c;for(;d--;){var p=s[d];if(!(l?p in t:ft.call(t,p)))return!1}var h=a.get(e),m=a.get(t);if(h&&m)return h==t&&m==e;var g=!0;a.set(e,t),a.set(t,e);var y=l;for(;++d<c;){var b=e[p=s[d]],w=t[p];if(r)var C=l?r(w,b,p,t,e,a):r(b,w,p,e,t,a);if(!(C===o?b===w||i(b,w,n,r,a):C)){g=!1;break}y||(y="constructor"==p)}if(g&&!y){var _=e.constructor,E=t.constructor;_==E||!("constructor"in e)||!("constructor"in t)||"function"==typeof _&&_ instanceof _&&"function"==typeof E&&E instanceof E||(g=!1)}return a.delete(e),a.delete(t),g}(e,t,n,r,i,a)}(e,t,n,r,so,i))}function co(e,t,n,r){var i=n.length,a=i,l=!r;if(null==e)return!a;for(e=nt(e);i--;){var s=n[i];if(l&&s[2]?s[1]!==e[s[0]]:!(s[0]in e))return!1}for(;++i<a;){var c=(s=n[i])[0],u=e[c],f=s[1];if(l&&s[2]){if(u===o&&!(c in e))return!1}else{var d=new kr;if(r)var p=r(u,f,c,e,t,d);if(!(p===o?so(f,u,v|m,r,d):p))return!1}}return!0}function uo(e){return!(!Tl(e)||(t=e,pt&&pt in t))&&(Ol(e)?gt:Ke).test(ha(e));var t}function fo(e){return"function"==typeof e?e:null==e?Ls:"object"==typeof e?wl(e)?yo(e[0],e[1]):go(e):$s(e)}function po(e){if(!ea(e))return xn(e);var t=[];for(var n in nt(e))ft.call(e,n)&&"constructor"!=n&&t.push(n);return t}function ho(e){if(!Tl(e))return function(e){var t=[];if(null!=e)for(var n in nt(e))t.push(n);return t}(e);var t=ea(e),n=[];for(var r in e)("constructor"!=r||!t&&ft.call(e,r))&&n.push(r);return n}function vo(e,t){return e<t}function mo(e,t){var n=-1,o=_l(e)?r(e.length):[];return $r(e,(function(e,r,i){o[++n]=t(e,r,i)})),o}function go(e){var t=Ui(e);return 1==t.length&&t[0][2]?na(t[0][0],t[0][1]):function(n){return n===e||co(n,e,t)}}function yo(e,t){return Ji(e)&&ta(t)?na(pa(e),t):function(n){var r=ns(n,e);return r===o&&r===t?rs(n,e):so(t,r,v|m)}}function bo(e,t,n,r,i){e!==t&&Gr(t,(function(a,l){if(i||(i=new kr),Tl(a))!function(e,t,n,r,i,a,l){var s=ia(e,n),c=ia(t,n),u=l.get(c);if(u)return void Tr(e,n,u);var f=a?a(s,c,n+"",e,t,l):o,d=f===o;if(d){var p=wl(c),h=!p&&xl(c),v=!p&&!h&&Fl(c);f=c,p||h||v?wl(s)?f=s:El(s)?f=ai(s):h?(d=!1,f=ei(c,!0)):v?(d=!1,f=ni(c,!0)):f=[]:Al(c)||bl(c)?(f=s,bl(s)?f=Kl(s):Tl(s)&&!Ol(s)||(f=Ki(c))):d=!1}d&&(l.set(c,f),i(f,c,r,a,l),l.delete(c));Tr(e,n,f)}(e,t,l,n,bo,r,i);else{var s=r?r(ia(e,l),a,l+"",e,t,i):o;s===o&&(s=a),Tr(e,l,s)}}),ss)}function wo(e,t){var n=e.length;if(n)return Zi(t+=t<0?n:0,n)?e[t]:o}function Co(e,t,n){t=t.length?fn(t,(function(e){return wl(e)?function(t){return Xr(t,1===e.length?e[0]:e)}:e})):[Ls];var r=-1;t=fn(t,Pn(Fi()));var o=mo(e,(function(e,n,o){var i=fn(t,(function(t){return t(e)}));return{criteria:i,index:++r,value:e}}));return function(e,t){var n=e.length;for(e.sort(t);n--;)e[n]=e[n].value;return e}(o,(function(e,t){return function(e,t,n){var r=-1,o=e.criteria,i=t.criteria,a=o.length,l=n.length;for(;++r<a;){var s=ri(o[r],i[r]);if(s)return r>=l?s:s*("desc"==n[r]?-1:1)}return e.index-t.index}(e,t,n)}))}function _o(e,t,n){for(var r=-1,o=t.length,i={};++r<o;){var a=t[r],l=Xr(e,a);n(l,a)&&To(i,Yo(a,e),l)}return i}function Eo(e,t,n,r){var o=r?wn:bn,i=-1,a=t.length,l=e;for(e===t&&(t=ai(t)),n&&(l=fn(e,Pn(n)));++i<a;)for(var s=0,c=t[i],u=n?n(c):c;(s=o(l,u,s,r))>-1;)l!==e&&kt.call(l,s,1),kt.call(e,s,1);return e}function xo(e,t){for(var n=e?t.length:0,r=n-1;n--;){var o=t[n];if(n==r||o!==i){var i=o;Zi(o)?kt.call(e,o,1):$o(e,o)}}return e}function ko(e,t){return e+qt(Qn()*(t-e+1))}function So(e,t){var n="";if(!e||t<1||t>A)return n;do{t%2&&(n+=e),(t=qt(t/2))&&(e+=e)}while(t);return n}function Oo(e,t){return sa(ra(e,t,Ls),e+"")}function No(e){return Or(ms(e))}function Po(e,t){var n=ms(e);return fa(n,Ir(t,0,n.length))}function To(e,t,n,r){if(!Tl(e))return e;for(var i=-1,a=(t=Yo(t,e)).length,l=a-1,s=e;null!=s&&++i<a;){var c=pa(t[i]),u=n;if("__proto__"===c||"constructor"===c||"prototype"===c)return e;if(i!=l){var f=s[c];(u=r?r(f,c,s):o)===o&&(u=Tl(f)?f:Zi(t[i+1])?[]:{})}Vr(s,c,u),s=s[c]}return e}var Vo=ar?function(e,t){return ar.set(e,t),e}:Ls,Ro=Vt?function(e,t){return Vt(e,"toString",{configurable:!0,enumerable:!1,value:Ts(t),writable:!0})}:Ls;function Lo(e){return fa(ms(e))}function Ao(e,t,n){var o=-1,i=e.length;t<0&&(t=-t>i?0:i+t),(n=n>i?i:n)<0&&(n+=i),i=t>n?0:n-t>>>0,t>>>=0;for(var a=r(i);++o<i;)a[o]=e[o+t];return a}function jo(e,t){var n;return $r(e,(function(e,r,o){return!(n=t(e,r,o))})),!!n}function Bo(e,t,n){var r=0,o=null==e?r:e.length;if("number"==typeof t&&t==t&&o<=F){for(;r<o;){var i=r+o>>>1,a=e[i];null!==a&&!Ml(a)&&(n?a<=t:a<t)?r=i+1:o=i}return o}return Io(e,t,Ls,n)}function Io(e,t,n,r){var i=0,a=null==e?0:e.length;if(0===a)return 0;for(var l=(t=n(t))!=t,s=null===t,c=Ml(t),u=t===o;i<a;){var f=qt((i+a)/2),d=n(e[f]),p=d!==o,h=null===d,v=d==d,m=Ml(d);if(l)var g=r||v;else g=u?v&&(r||p):s?v&&p&&(r||!h):c?v&&p&&!h&&(r||!m):!h&&!m&&(r?d<=t:d<t);g?i=f+1:a=f}return Zn(a,M)}function Mo(e,t){for(var n=-1,r=e.length,o=0,i=[];++n<r;){var a=e[n],l=t?t(a):a;if(!n||!ml(l,s)){var s=l;i[o++]=0===a?0:a}}return i}function Fo(e){return"number"==typeof e?e:Ml(e)?B:+e}function Do(e){if("string"==typeof e)return e;if(wl(e))return fn(e,Do)+"";if(Ml(e))return vr?vr.call(e):"";var t=e+"";return"0"==t&&1/e==-L?"-0":t}function Uo(e,t,n){var r=-1,o=cn,a=e.length,l=!0,s=[],c=s;if(n)l=!1,o=un;else if(a>=i){var u=t?null:Si(e);if(u)return Un(u);l=!1,o=Vn,c=new xr}else c=t?[]:s;e:for(;++r<a;){var f=e[r],d=t?t(f):f;if(f=n||0!==f?f:0,l&&d==d){for(var p=c.length;p--;)if(c[p]===d)continue e;t&&c.push(d),s.push(f)}else o(c,d,n)||(c!==s&&c.push(d),s.push(f))}return s}function $o(e,t){return null==(e=oa(e,t=Yo(t,e)))||delete e[pa(Sa(t))]}function Ho(e,t,n,r){return To(e,t,n(Xr(e,t)),r)}function zo(e,t,n,r){for(var o=e.length,i=r?o:-1;(r?i--:++i<o)&&t(e[i],i,e););return n?Ao(e,r?0:i,r?i+1:o):Ao(e,r?i+1:0,r?o:i)}function qo(e,t){var n=e;return n instanceof wr&&(n=n.value()),pn(t,(function(e,t){return t.func.apply(t.thisArg,dn([e],t.args))}),n)}function Wo(e,t,n){var o=e.length;if(o<2)return o?Uo(e[0]):[];for(var i=-1,a=r(o);++i<o;)for(var l=e[i],s=-1;++s<o;)s!=i&&(a[i]=Ur(a[i]||l,e[s],t,n));return Uo(Kr(a,1),t,n)}function Ko(e,t,n){for(var r=-1,i=e.length,a=t.length,l={};++r<i;){var s=r<a?t[r]:o;n(l,e[r],s)}return l}function Go(e){return El(e)?e:[]}function Zo(e){return"function"==typeof e?e:Ls}function Yo(e,t){return wl(e)?e:Ji(e,t)?[e]:da(Gl(e))}var Jo=Oo;function Qo(e,t,n){var r=e.length;return n=n===o?r:n,!t&&n>=r?e:Ao(e,t,n)}var Xo=Lt||function(e){return zt.clearTimeout(e)};function ei(e,t){if(t)return e.slice();var n=e.length,r=Ct?Ct(n):new e.constructor(n);return e.copy(r),r}function ti(e){var t=new e.constructor(e.byteLength);return new wt(t).set(new wt(e)),t}function ni(e,t){var n=t?ti(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.length)}function ri(e,t){if(e!==t){var n=e!==o,r=null===e,i=e==e,a=Ml(e),l=t!==o,s=null===t,c=t==t,u=Ml(t);if(!s&&!u&&!a&&e>t||a&&l&&c&&!s&&!u||r&&l&&c||!n&&c||!i)return 1;if(!r&&!a&&!u&&e<t||u&&n&&i&&!r&&!a||s&&n&&i||!l&&i||!c)return-1}return 0}function oi(e,t,n,o){for(var i=-1,a=e.length,l=n.length,s=-1,c=t.length,u=Gn(a-l,0),f=r(c+u),d=!o;++s<c;)f[s]=t[s];for(;++i<l;)(d||i<a)&&(f[n[i]]=e[i]);for(;u--;)f[s++]=e[i++];return f}function ii(e,t,n,o){for(var i=-1,a=e.length,l=-1,s=n.length,c=-1,u=t.length,f=Gn(a-s,0),d=r(f+u),p=!o;++i<f;)d[i]=e[i];for(var h=i;++c<u;)d[h+c]=t[c];for(;++l<s;)(p||i<a)&&(d[h+n[l]]=e[i++]);return d}function ai(e,t){var n=-1,o=e.length;for(t||(t=r(o));++n<o;)t[n]=e[n];return t}function li(e,t,n,r){var i=!n;n||(n={});for(var a=-1,l=t.length;++a<l;){var s=t[a],c=r?r(n[s],e[s],s,n,e):o;c===o&&(c=e[s]),i?jr(n,s,c):Vr(n,s,c)}return n}function si(e,t){return function(n,r){var o=wl(n)?rn:Lr,i=t?t():{};return o(n,e,Fi(r,2),i)}}function ci(e){return Oo((function(t,n){var r=-1,i=n.length,a=i>1?n[i-1]:o,l=i>2?n[2]:o;for(a=e.length>3&&"function"==typeof a?(i--,a):o,l&&Yi(n[0],n[1],l)&&(a=i<3?o:a,i=1),t=nt(t);++r<i;){var s=n[r];s&&e(t,s,r,a)}return t}))}function ui(e,t){return function(n,r){if(null==n)return n;if(!_l(n))return e(n,r);for(var o=n.length,i=t?o:-1,a=nt(n);(t?i--:++i<o)&&!1!==r(a[i],i,a););return n}}function fi(e){return function(t,n,r){for(var o=-1,i=nt(t),a=r(t),l=a.length;l--;){var s=a[e?l:++o];if(!1===n(i[s],s,i))break}return t}}function di(e){return function(t){var n=In(t=Gl(t))?zn(t):o,r=n?n[0]:t.charAt(0),i=n?Qo(n,1).join(""):t.slice(1);return r[e]()+i}}function pi(e){return function(t){return pn(Os(bs(t).replace(Pt,"")),e,"")}}function hi(e){return function(){var t=arguments;switch(t.length){case 0:return new e;case 1:return new e(t[0]);case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[1],t[2]);case 4:return new e(t[0],t[1],t[2],t[3]);case 5:return new e(t[0],t[1],t[2],t[3],t[4]);case 6:return new e(t[0],t[1],t[2],t[3],t[4],t[5]);case 7:return new e(t[0],t[1],t[2],t[3],t[4],t[5],t[6])}var n=gr(e.prototype),r=e.apply(n,t);return Tl(r)?r:n}}function vi(e){return function(t,n,r){var i=nt(t);if(!_l(t)){var a=Fi(n,3);t=ls(t),n=function(e){return a(i[e],e,i)}}var l=e(t,n,r);return l>-1?i[a?t[l]:l]:o}}function mi(e){return Li((function(t){var n=t.length,r=n,i=br.prototype.thru;for(e&&t.reverse();r--;){var a=t[r];if("function"!=typeof a)throw new it(l);if(i&&!s&&"wrapper"==Ii(a))var s=new br([],!0)}for(r=s?r:n;++r<n;){var c=Ii(a=t[r]),u="wrapper"==c?Bi(a):o;s=u&&Qi(u[0])&&u[1]==(x|w|_|k)&&!u[4].length&&1==u[9]?s[Ii(u[0])].apply(s,u[3]):1==a.length&&Qi(a)?s[c]():s.thru(a)}return function(){var e=arguments,r=e[0];if(s&&1==e.length&&wl(r))return s.plant(r).value();for(var o=0,i=n?t[o].apply(this,e):r;++o<n;)i=t[o].call(this,i);return i}}))}function gi(e,t,n,i,a,l,s,c,u,f){var d=t&x,p=t&g,h=t&y,v=t&(w|C),m=t&S,b=h?o:hi(e);return function g(){for(var y=arguments.length,w=r(y),C=y;C--;)w[C]=arguments[C];if(v)var _=Mi(g),E=function(e,t){for(var n=e.length,r=0;n--;)e[n]===t&&++r;return r}(w,_);if(i&&(w=oi(w,i,a,v)),l&&(w=ii(w,l,s,v)),y-=E,v&&y<f){var x=Dn(w,_);return xi(e,t,gi,g.placeholder,n,w,x,c,u,f-y)}var k=p?n:this,S=h?k[e]:e;return y=w.length,c?w=function(e,t){var n=e.length,r=Zn(t.length,n),i=ai(e);for(;r--;){var a=t[r];e[r]=Zi(a,n)?i[a]:o}return e}(w,c):m&&y>1&&w.reverse(),d&&u<y&&(w.length=u),this&&this!==zt&&this instanceof g&&(S=b||hi(S)),S.apply(k,w)}}function yi(e,t){return function(n,r){return function(e,t,n,r){return Yr(e,(function(e,o,i){t(r,n(e),o,i)})),r}(n,e,t(r),{})}}function bi(e,t){return function(n,r){var i;if(n===o&&r===o)return t;if(n!==o&&(i=n),r!==o){if(i===o)return r;"string"==typeof n||"string"==typeof r?(n=Do(n),r=Do(r)):(n=Fo(n),r=Fo(r)),i=e(n,r)}return i}}function wi(e){return Li((function(t){return t=fn(t,Pn(Fi())),Oo((function(n){var r=this;return e(t,(function(e){return nn(e,r,n)}))}))}))}function Ci(e,t){var n=(t=t===o?" ":Do(t)).length;if(n<2)return n?So(t,e):t;var r=So(t,Ht(e/Hn(t)));return In(t)?Qo(zn(r),0,e).join(""):r.slice(0,e)}function _i(e){return function(t,n,i){return i&&"number"!=typeof i&&Yi(t,n,i)&&(n=i=o),t=Hl(t),n===o?(n=t,t=0):n=Hl(n),function(e,t,n,o){for(var i=-1,a=Gn(Ht((t-e)/(n||1)),0),l=r(a);a--;)l[o?a:++i]=e,e+=n;return l}(t,n,i=i===o?t<n?1:-1:Hl(i),e)}}function Ei(e){return function(t,n){return"string"==typeof t&&"string"==typeof n||(t=Wl(t),n=Wl(n)),e(t,n)}}function xi(e,t,n,r,i,a,l,s,c,u){var f=t&w;t|=f?_:E,(t&=~(f?E:_))&b||(t&=~(g|y));var d=[e,t,i,f?a:o,f?l:o,f?o:a,f?o:l,s,c,u],p=n.apply(o,d);return Qi(e)&&aa(p,d),p.placeholder=r,ca(p,e,t)}function ki(e){var t=tt[e];return function(e,n){if(e=Wl(e),(n=null==n?0:Zn(zl(n),292))&&Zt(e)){var r=(Gl(e)+"e").split("e");return+((r=(Gl(t(r[0]+"e"+(+r[1]+n)))+"e").split("e"))[0]+"e"+(+r[1]-n))}return t(e)}}var Si=rr&&1/Un(new rr([,-0]))[1]==L?function(e){return new rr(e)}:Ms;function Oi(e){return function(t){var n=qi(t);return n==Y?Mn(t):n==re?$n(t):function(e,t){return fn(t,(function(t){return[t,e[t]]}))}(t,e(t))}}function Ni(e,t,n,i,a,s,c,u){var d=t&y;if(!d&&"function"!=typeof e)throw new it(l);var p=i?i.length:0;if(p||(t&=~(_|E),i=a=o),c=c===o?c:Gn(zl(c),0),u=u===o?u:zl(u),p-=a?a.length:0,t&E){var h=i,v=a;i=a=o}var m=d?o:Bi(e),S=[e,t,n,i,a,h,v,s,c,u];if(m&&function(e,t){var n=e[1],r=t[1],o=n|r,i=o<(g|y|x),a=r==x&&n==w||r==x&&n==k&&e[7].length<=t[8]||r==(x|k)&&t[7].length<=t[8]&&n==w;if(!i&&!a)return e;r&g&&(e[2]=t[2],o|=n&g?0:b);var l=t[3];if(l){var s=e[3];e[3]=s?oi(s,l,t[4]):l,e[4]=s?Dn(e[3],f):t[4]}(l=t[5])&&(s=e[5],e[5]=s?ii(s,l,t[6]):l,e[6]=s?Dn(e[5],f):t[6]);(l=t[7])&&(e[7]=l);r&x&&(e[8]=null==e[8]?t[8]:Zn(e[8],t[8]));null==e[9]&&(e[9]=t[9]);e[0]=t[0],e[1]=o}(S,m),e=S[0],t=S[1],n=S[2],i=S[3],a=S[4],!(u=S[9]=S[9]===o?d?0:e.length:Gn(S[9]-p,0))&&t&(w|C)&&(t&=~(w|C)),t&&t!=g)O=t==w||t==C?function(e,t,n){var i=hi(e);return function a(){for(var l=arguments.length,s=r(l),c=l,u=Mi(a);c--;)s[c]=arguments[c];var f=l<3&&s[0]!==u&&s[l-1]!==u?[]:Dn(s,u);return(l-=f.length)<n?xi(e,t,gi,a.placeholder,o,s,f,o,o,n-l):nn(this&&this!==zt&&this instanceof a?i:e,this,s)}}(e,t,u):t!=_&&t!=(g|_)||a.length?gi.apply(o,S):function(e,t,n,o){var i=t&g,a=hi(e);return function t(){for(var l=-1,s=arguments.length,c=-1,u=o.length,f=r(u+s),d=this&&this!==zt&&this instanceof t?a:e;++c<u;)f[c]=o[c];for(;s--;)f[c++]=arguments[++l];return nn(d,i?n:this,f)}}(e,t,n,i);else var O=function(e,t,n){var r=t&g,o=hi(e);return function t(){return(this&&this!==zt&&this instanceof t?o:e).apply(r?n:this,arguments)}}(e,t,n);return ca((m?Vo:aa)(O,S),e,t)}function Pi(e,t,n,r){return e===o||ml(e,st[n])&&!ft.call(r,n)?t:e}function Ti(e,t,n,r,i,a){return Tl(e)&&Tl(t)&&(a.set(t,e),bo(e,t,o,Ti,a),a.delete(t)),e}function Vi(e){return Al(e)?o:e}function Ri(e,t,n,r,i,a){var l=n&v,s=e.length,c=t.length;if(s!=c&&!(l&&c>s))return!1;var u=a.get(e),f=a.get(t);if(u&&f)return u==t&&f==e;var d=-1,p=!0,h=n&m?new xr:o;for(a.set(e,t),a.set(t,e);++d<s;){var g=e[d],y=t[d];if(r)var b=l?r(y,g,d,t,e,a):r(g,y,d,e,t,a);if(b!==o){if(b)continue;p=!1;break}if(h){if(!vn(t,(function(e,t){if(!Vn(h,t)&&(g===e||i(g,e,n,r,a)))return h.push(t)}))){p=!1;break}}else if(g!==y&&!i(g,y,n,r,a)){p=!1;break}}return a.delete(e),a.delete(t),p}function Li(e){return sa(ra(e,o,Ca),e+"")}function Ai(e){return eo(e,ls,Hi)}function ji(e){return eo(e,ss,zi)}var Bi=ar?function(e){return ar.get(e)}:Ms;function Ii(e){for(var t=e.name+"",n=lr[t],r=ft.call(lr,t)?n.length:0;r--;){var o=n[r],i=o.func;if(null==i||i==e)return o.name}return t}function Mi(e){return(ft.call(mr,"placeholder")?mr:e).placeholder}function Fi(){var e=mr.iteratee||As;return e=e===As?fo:e,arguments.length?e(arguments[0],arguments[1]):e}function Di(e,t){var n,r,o=e.__data__;return("string"==(r=typeof(n=t))||"number"==r||"symbol"==r||"boolean"==r?"__proto__"!==n:null===n)?o["string"==typeof t?"string":"hash"]:o.map}function Ui(e){for(var t=ls(e),n=t.length;n--;){var r=t[n],o=e[r];t[n]=[r,o,ta(o)]}return t}function $i(e,t){var n=function(e,t){return null==e?o:e[t]}(e,t);return uo(n)?n:o}var Hi=Wt?function(e){return null==e?[]:(e=nt(e),sn(Wt(e),(function(t){return xt.call(e,t)})))}:qs,zi=Wt?function(e){for(var t=[];e;)dn(t,Hi(e)),e=_t(e);return t}:qs,qi=to;function Wi(e,t,n){for(var r=-1,o=(t=Yo(t,e)).length,i=!1;++r<o;){var a=pa(t[r]);if(!(i=null!=e&&n(e,a)))break;e=e[a]}return i||++r!=o?i:!!(o=null==e?0:e.length)&&Pl(o)&&Zi(a,o)&&(wl(e)||bl(e))}function Ki(e){return"function"!=typeof e.constructor||ea(e)?{}:gr(_t(e))}function Gi(e){return wl(e)||bl(e)||!!(St&&e&&e[St])}function Zi(e,t){var n=typeof e;return!!(t=null==t?A:t)&&("number"==n||"symbol"!=n&&Ze.test(e))&&e>-1&&e%1==0&&e<t}function Yi(e,t,n){if(!Tl(n))return!1;var r=typeof t;return!!("number"==r?_l(n)&&Zi(t,n.length):"string"==r&&t in n)&&ml(n[t],e)}function Ji(e,t){if(wl(e))return!1;var n=typeof e;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=e&&!Ml(e))||(Ve.test(e)||!Te.test(e)||null!=t&&e in nt(t))}function Qi(e){var t=Ii(e),n=mr[t];if("function"!=typeof n||!(t in wr.prototype))return!1;if(e===n)return!0;var r=Bi(n);return!!r&&e===r[0]}(er&&qi(new er(new ArrayBuffer(1)))!=ue||tr&&qi(new tr)!=Y||nr&&qi(nr.resolve())!=ee||rr&&qi(new rr)!=re||or&&qi(new or)!=le)&&(qi=function(e){var t=to(e),n=t==X?e.constructor:o,r=n?ha(n):"";if(r)switch(r){case sr:return ue;case cr:return Y;case ur:return ee;case fr:return re;case dr:return le}return t});var Xi=ct?Ol:Ws;function ea(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||st)}function ta(e){return e==e&&!Tl(e)}function na(e,t){return function(n){return null!=n&&(n[e]===t&&(t!==o||e in nt(n)))}}function ra(e,t,n){return t=Gn(t===o?e.length-1:t,0),function(){for(var o=arguments,i=-1,a=Gn(o.length-t,0),l=r(a);++i<a;)l[i]=o[t+i];i=-1;for(var s=r(t+1);++i<t;)s[i]=o[i];return s[t]=n(l),nn(e,this,s)}}function oa(e,t){return t.length<2?e:Xr(e,Ao(t,0,-1))}function ia(e,t){if(("constructor"!==t||"function"!=typeof e[t])&&"__proto__"!=t)return e[t]}var aa=ua(Vo),la=$t||function(e,t){return zt.setTimeout(e,t)},sa=ua(Ro);function ca(e,t,n){var r=t+"";return sa(e,function(e,t){var n=t.length;if(!n)return e;var r=n-1;return t[r]=(n>1?"& ":"")+t[r],t=t.join(n>2?", ":" "),e.replace(Ie,"{\n/* [wrapped with "+t+"] */\n")}(r,function(e,t){return on(D,(function(n){var r="_."+n[0];t&n[1]&&!cn(e,r)&&e.push(r)})),e.sort()}(function(e){var t=e.match(Me);return t?t[1].split(Fe):[]}(r),n)))}function ua(e){var t=0,n=0;return function(){var r=Yn(),i=T-(r-n);if(n=r,i>0){if(++t>=P)return arguments[0]}else t=0;return e.apply(o,arguments)}}function fa(e,t){var n=-1,r=e.length,i=r-1;for(t=t===o?r:t;++n<t;){var a=ko(n,i),l=e[a];e[a]=e[n],e[n]=l}return e.length=t,e}var da=function(e){var t=ul(e,(function(e){return n.size===u&&n.clear(),e})),n=t.cache;return t}((function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(""),e.replace(Re,(function(e,n,r,o){t.push(r?o.replace($e,"$1"):n||e)})),t}));function pa(e){if("string"==typeof e||Ml(e))return e;var t=e+"";return"0"==t&&1/e==-L?"-0":t}function ha(e){if(null!=e){try{return ut.call(e)}catch(e){}try{return e+""}catch(e){}}return""}function va(e){if(e instanceof wr)return e.clone();var t=new br(e.__wrapped__,e.__chain__);return t.__actions__=ai(e.__actions__),t.__index__=e.__index__,t.__values__=e.__values__,t}var ma=Oo((function(e,t){return El(e)?Ur(e,Kr(t,1,El,!0)):[]})),ga=Oo((function(e,t){var n=Sa(t);return El(n)&&(n=o),El(e)?Ur(e,Kr(t,1,El,!0),Fi(n,2)):[]})),ya=Oo((function(e,t){var n=Sa(t);return El(n)&&(n=o),El(e)?Ur(e,Kr(t,1,El,!0),o,n):[]}));function ba(e,t,n){var r=null==e?0:e.length;if(!r)return-1;var o=null==n?0:zl(n);return o<0&&(o=Gn(r+o,0)),yn(e,Fi(t,3),o)}function wa(e,t,n){var r=null==e?0:e.length;if(!r)return-1;var i=r-1;return n!==o&&(i=zl(n),i=n<0?Gn(r+i,0):Zn(i,r-1)),yn(e,Fi(t,3),i,!0)}function Ca(e){return(null==e?0:e.length)?Kr(e,1):[]}function _a(e){return e&&e.length?e[0]:o}var Ea=Oo((function(e){var t=fn(e,Go);return t.length&&t[0]===e[0]?io(t):[]})),xa=Oo((function(e){var t=Sa(e),n=fn(e,Go);return t===Sa(n)?t=o:n.pop(),n.length&&n[0]===e[0]?io(n,Fi(t,2)):[]})),ka=Oo((function(e){var t=Sa(e),n=fn(e,Go);return(t="function"==typeof t?t:o)&&n.pop(),n.length&&n[0]===e[0]?io(n,o,t):[]}));function Sa(e){var t=null==e?0:e.length;return t?e[t-1]:o}var Oa=Oo(Na);function Na(e,t){return e&&e.length&&t&&t.length?Eo(e,t):e}var Pa=Li((function(e,t){var n=null==e?0:e.length,r=Br(e,t);return xo(e,fn(t,(function(e){return Zi(e,n)?+e:e})).sort(ri)),r}));function Ta(e){return null==e?e:Xn.call(e)}var Va=Oo((function(e){return Uo(Kr(e,1,El,!0))})),Ra=Oo((function(e){var t=Sa(e);return El(t)&&(t=o),Uo(Kr(e,1,El,!0),Fi(t,2))})),La=Oo((function(e){var t=Sa(e);return t="function"==typeof t?t:o,Uo(Kr(e,1,El,!0),o,t)}));function Aa(e){if(!e||!e.length)return[];var t=0;return e=sn(e,(function(e){if(El(e))return t=Gn(e.length,t),!0})),On(t,(function(t){return fn(e,En(t))}))}function ja(e,t){if(!e||!e.length)return[];var n=Aa(e);return null==t?n:fn(n,(function(e){return nn(t,o,e)}))}var Ba=Oo((function(e,t){return El(e)?Ur(e,t):[]})),Ia=Oo((function(e){return Wo(sn(e,El))})),Ma=Oo((function(e){var t=Sa(e);return El(t)&&(t=o),Wo(sn(e,El),Fi(t,2))})),Fa=Oo((function(e){var t=Sa(e);return t="function"==typeof t?t:o,Wo(sn(e,El),o,t)})),Da=Oo(Aa);var Ua=Oo((function(e){var t=e.length,n=t>1?e[t-1]:o;return n="function"==typeof n?(e.pop(),n):o,ja(e,n)}));function $a(e){var t=mr(e);return t.__chain__=!0,t}function Ha(e,t){return t(e)}var za=Li((function(e){var t=e.length,n=t?e[0]:0,r=this.__wrapped__,i=function(t){return Br(t,e)};return!(t>1||this.__actions__.length)&&r instanceof wr&&Zi(n)?((r=r.slice(n,+n+(t?1:0))).__actions__.push({func:Ha,args:[i],thisArg:o}),new br(r,this.__chain__).thru((function(e){return t&&!e.length&&e.push(o),e}))):this.thru(i)}));var qa=si((function(e,t,n){ft.call(e,n)?++e[n]:jr(e,n,1)}));var Wa=vi(ba),Ka=vi(wa);function Ga(e,t){return(wl(e)?on:$r)(e,Fi(t,3))}function Za(e,t){return(wl(e)?an:Hr)(e,Fi(t,3))}var Ya=si((function(e,t,n){ft.call(e,n)?e[n].push(t):jr(e,n,[t])}));var Ja=Oo((function(e,t,n){var o=-1,i="function"==typeof t,a=_l(e)?r(e.length):[];return $r(e,(function(e){a[++o]=i?nn(t,e,n):ao(e,t,n)})),a})),Qa=si((function(e,t,n){jr(e,n,t)}));function Xa(e,t){return(wl(e)?fn:mo)(e,Fi(t,3))}var el=si((function(e,t,n){e[n?0:1].push(t)}),(function(){return[[],[]]}));var tl=Oo((function(e,t){if(null==e)return[];var n=t.length;return n>1&&Yi(e,t[0],t[1])?t=[]:n>2&&Yi(t[0],t[1],t[2])&&(t=[t[0]]),Co(e,Kr(t,1),[])})),nl=Ft||function(){return zt.Date.now()};function rl(e,t,n){return t=n?o:t,t=e&&null==t?e.length:t,Ni(e,x,o,o,o,o,t)}function ol(e,t){var n;if("function"!=typeof t)throw new it(l);return e=zl(e),function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=o),n}}var il=Oo((function(e,t,n){var r=g;if(n.length){var o=Dn(n,Mi(il));r|=_}return Ni(e,r,t,n,o)})),al=Oo((function(e,t,n){var r=g|y;if(n.length){var o=Dn(n,Mi(al));r|=_}return Ni(t,r,e,n,o)}));function ll(e,t,n){var r,i,a,s,c,u,f=0,d=!1,p=!1,h=!0;if("function"!=typeof e)throw new it(l);function v(t){var n=r,a=i;return r=i=o,f=t,s=e.apply(a,n)}function m(e){var n=e-u;return u===o||n>=t||n<0||p&&e-f>=a}function g(){var e=nl();if(m(e))return y(e);c=la(g,function(e){var n=t-(e-u);return p?Zn(n,a-(e-f)):n}(e))}function y(e){return c=o,h&&r?v(e):(r=i=o,s)}function b(){var e=nl(),n=m(e);if(r=arguments,i=this,u=e,n){if(c===o)return function(e){return f=e,c=la(g,t),d?v(e):s}(u);if(p)return Xo(c),c=la(g,t),v(u)}return c===o&&(c=la(g,t)),s}return t=Wl(t)||0,Tl(n)&&(d=!!n.leading,a=(p="maxWait"in n)?Gn(Wl(n.maxWait)||0,t):a,h="trailing"in n?!!n.trailing:h),b.cancel=function(){c!==o&&Xo(c),f=0,r=u=i=c=o},b.flush=function(){return c===o?s:y(nl())},b}var sl=Oo((function(e,t){return Dr(e,1,t)})),cl=Oo((function(e,t,n){return Dr(e,Wl(t)||0,n)}));function ul(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new it(l);var n=function(){var r=arguments,o=t?t.apply(this,r):r[0],i=n.cache;if(i.has(o))return i.get(o);var a=e.apply(this,r);return n.cache=i.set(o,a)||i,a};return n.cache=new(ul.Cache||Er),n}function fl(e){if("function"!=typeof e)throw new it(l);return function(){var t=arguments;switch(t.length){case 0:return!e.call(this);case 1:return!e.call(this,t[0]);case 2:return!e.call(this,t[0],t[1]);case 3:return!e.call(this,t[0],t[1],t[2])}return!e.apply(this,t)}}ul.Cache=Er;var dl=Jo((function(e,t){var n=(t=1==t.length&&wl(t[0])?fn(t[0],Pn(Fi())):fn(Kr(t,1),Pn(Fi()))).length;return Oo((function(r){for(var o=-1,i=Zn(r.length,n);++o<i;)r[o]=t[o].call(this,r[o]);return nn(e,this,r)}))})),pl=Oo((function(e,t){var n=Dn(t,Mi(pl));return Ni(e,_,o,t,n)})),hl=Oo((function(e,t){var n=Dn(t,Mi(hl));return Ni(e,E,o,t,n)})),vl=Li((function(e,t){return Ni(e,k,o,o,o,t)}));function ml(e,t){return e===t||e!=e&&t!=t}var gl=Ei(no),yl=Ei((function(e,t){return e>=t})),bl=lo(function(){return arguments}())?lo:function(e){return Vl(e)&&ft.call(e,"callee")&&!xt.call(e,"callee")},wl=r.isArray,Cl=Yt?Pn(Yt):function(e){return Vl(e)&&to(e)==ce};function _l(e){return null!=e&&Pl(e.length)&&!Ol(e)}function El(e){return Vl(e)&&_l(e)}var xl=Gt||Ws,kl=Jt?Pn(Jt):function(e){return Vl(e)&&to(e)==q};function Sl(e){if(!Vl(e))return!1;var t=to(e);return t==K||t==W||"string"==typeof e.message&&"string"==typeof e.name&&!Al(e)}function Ol(e){if(!Tl(e))return!1;var t=to(e);return t==G||t==Z||t==H||t==te}function Nl(e){return"number"==typeof e&&e==zl(e)}function Pl(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=A}function Tl(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}function Vl(e){return null!=e&&"object"==typeof e}var Rl=Qt?Pn(Qt):function(e){return Vl(e)&&qi(e)==Y};function Ll(e){return"number"==typeof e||Vl(e)&&to(e)==J}function Al(e){if(!Vl(e)||to(e)!=X)return!1;var t=_t(e);if(null===t)return!0;var n=ft.call(t,"constructor")&&t.constructor;return"function"==typeof n&&n instanceof n&&ut.call(n)==vt}var jl=Xt?Pn(Xt):function(e){return Vl(e)&&to(e)==ne};var Bl=en?Pn(en):function(e){return Vl(e)&&qi(e)==re};function Il(e){return"string"==typeof e||!wl(e)&&Vl(e)&&to(e)==oe}function Ml(e){return"symbol"==typeof e||Vl(e)&&to(e)==ie}var Fl=tn?Pn(tn):function(e){return Vl(e)&&Pl(e.length)&&!!It[to(e)]};var Dl=Ei(vo),Ul=Ei((function(e,t){return e<=t}));function $l(e){if(!e)return[];if(_l(e))return Il(e)?zn(e):ai(e);if(Ot&&e[Ot])return function(e){for(var t,n=[];!(t=e.next()).done;)n.push(t.value);return n}(e[Ot]());var t=qi(e);return(t==Y?Mn:t==re?Un:ms)(e)}function Hl(e){return e?(e=Wl(e))===L||e===-L?(e<0?-1:1)*j:e==e?e:0:0===e?e:0}function zl(e){var t=Hl(e),n=t%1;return t==t?n?t-n:t:0}function ql(e){return e?Ir(zl(e),0,I):0}function Wl(e){if("number"==typeof e)return e;if(Ml(e))return B;if(Tl(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=Tl(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=Nn(e);var n=We.test(e);return n||Ge.test(e)?Ut(e.slice(2),n?2:8):qe.test(e)?B:+e}function Kl(e){return li(e,ss(e))}function Gl(e){return null==e?"":Do(e)}var Zl=ci((function(e,t){if(ea(t)||_l(t))li(t,ls(t),e);else for(var n in t)ft.call(t,n)&&Vr(e,n,t[n])})),Yl=ci((function(e,t){li(t,ss(t),e)})),Jl=ci((function(e,t,n,r){li(t,ss(t),e,r)})),Ql=ci((function(e,t,n,r){li(t,ls(t),e,r)})),Xl=Li(Br);var es=Oo((function(e,t){e=nt(e);var n=-1,r=t.length,i=r>2?t[2]:o;for(i&&Yi(t[0],t[1],i)&&(r=1);++n<r;)for(var a=t[n],l=ss(a),s=-1,c=l.length;++s<c;){var u=l[s],f=e[u];(f===o||ml(f,st[u])&&!ft.call(e,u))&&(e[u]=a[u])}return e})),ts=Oo((function(e){return e.push(o,Ti),nn(us,o,e)}));function ns(e,t,n){var r=null==e?o:Xr(e,t);return r===o?n:r}function rs(e,t){return null!=e&&Wi(e,t,oo)}var os=yi((function(e,t,n){null!=t&&"function"!=typeof t.toString&&(t=ht.call(t)),e[t]=n}),Ts(Ls)),is=yi((function(e,t,n){null!=t&&"function"!=typeof t.toString&&(t=ht.call(t)),ft.call(e,t)?e[t].push(n):e[t]=[n]}),Fi),as=Oo(ao);function ls(e){return _l(e)?Sr(e):po(e)}function ss(e){return _l(e)?Sr(e,!0):ho(e)}var cs=ci((function(e,t,n){bo(e,t,n)})),us=ci((function(e,t,n,r){bo(e,t,n,r)})),fs=Li((function(e,t){var n={};if(null==e)return n;var r=!1;t=fn(t,(function(t){return t=Yo(t,e),r||(r=t.length>1),t})),li(e,ji(e),n),r&&(n=Mr(n,d|p|h,Vi));for(var o=t.length;o--;)$o(n,t[o]);return n}));var ds=Li((function(e,t){return null==e?{}:function(e,t){return _o(e,t,(function(t,n){return rs(e,n)}))}(e,t)}));function ps(e,t){if(null==e)return{};var n=fn(ji(e),(function(e){return[e]}));return t=Fi(t),_o(e,n,(function(e,n){return t(e,n[0])}))}var hs=Oi(ls),vs=Oi(ss);function ms(e){return null==e?[]:Tn(e,ls(e))}var gs=pi((function(e,t,n){return t=t.toLowerCase(),e+(n?ys(t):t)}));function ys(e){return Ss(Gl(e).toLowerCase())}function bs(e){return(e=Gl(e))&&e.replace(Ye,An).replace(Tt,"")}var ws=pi((function(e,t,n){return e+(n?"-":"")+t.toLowerCase()})),Cs=pi((function(e,t,n){return e+(n?" ":"")+t.toLowerCase()})),_s=di("toLowerCase");var Es=pi((function(e,t,n){return e+(n?"_":"")+t.toLowerCase()}));var xs=pi((function(e,t,n){return e+(n?" ":"")+Ss(t)}));var ks=pi((function(e,t,n){return e+(n?" ":"")+t.toUpperCase()})),Ss=di("toUpperCase");function Os(e,t,n){return e=Gl(e),(t=n?o:t)===o?function(e){return At.test(e)}(e)?function(e){return e.match(Rt)||[]}(e):function(e){return e.match(De)||[]}(e):e.match(t)||[]}var Ns=Oo((function(e,t){try{return nn(e,o,t)}catch(e){return Sl(e)?e:new Xe(e)}})),Ps=Li((function(e,t){return on(t,(function(t){t=pa(t),jr(e,t,il(e[t],e))})),e}));function Ts(e){return function(){return e}}var Vs=mi(),Rs=mi(!0);function Ls(e){return e}function As(e){return fo("function"==typeof e?e:Mr(e,d))}var js=Oo((function(e,t){return function(n){return ao(n,e,t)}})),Bs=Oo((function(e,t){return function(n){return ao(e,n,t)}}));function Is(e,t,n){var r=ls(t),o=Qr(t,r);null!=n||Tl(t)&&(o.length||!r.length)||(n=t,t=e,e=this,o=Qr(t,ls(t)));var i=!(Tl(n)&&"chain"in n&&!n.chain),a=Ol(e);return on(o,(function(n){var r=t[n];e[n]=r,a&&(e.prototype[n]=function(){var t=this.__chain__;if(i||t){var n=e(this.__wrapped__);return(n.__actions__=ai(this.__actions__)).push({func:r,args:arguments,thisArg:e}),n.__chain__=t,n}return r.apply(e,dn([this.value()],arguments))})})),e}function Ms(){}var Fs=wi(fn),Ds=wi(ln),Us=wi(vn);function $s(e){return Ji(e)?En(pa(e)):function(e){return function(t){return Xr(t,e)}}(e)}var Hs=_i(),zs=_i(!0);function qs(){return[]}function Ws(){return!1}var Ks=bi((function(e,t){return e+t}),0),Gs=ki("ceil"),Zs=bi((function(e,t){return e/t}),1),Ys=ki("floor");var Js,Qs=bi((function(e,t){return e*t}),1),Xs=ki("round"),ec=bi((function(e,t){return e-t}),0);return mr.after=function(e,t){if("function"!=typeof t)throw new it(l);return e=zl(e),function(){if(--e<1)return t.apply(this,arguments)}},mr.ary=rl,mr.assign=Zl,mr.assignIn=Yl,mr.assignInWith=Jl,mr.assignWith=Ql,mr.at=Xl,mr.before=ol,mr.bind=il,mr.bindAll=Ps,mr.bindKey=al,mr.castArray=function(){if(!arguments.length)return[];var e=arguments[0];return wl(e)?e:[e]},mr.chain=$a,mr.chunk=function(e,t,n){t=(n?Yi(e,t,n):t===o)?1:Gn(zl(t),0);var i=null==e?0:e.length;if(!i||t<1)return[];for(var a=0,l=0,s=r(Ht(i/t));a<i;)s[l++]=Ao(e,a,a+=t);return s},mr.compact=function(e){for(var t=-1,n=null==e?0:e.length,r=0,o=[];++t<n;){var i=e[t];i&&(o[r++]=i)}return o},mr.concat=function(){var e=arguments.length;if(!e)return[];for(var t=r(e-1),n=arguments[0],o=e;o--;)t[o-1]=arguments[o];return dn(wl(n)?ai(n):[n],Kr(t,1))},mr.cond=function(e){var t=null==e?0:e.length,n=Fi();return e=t?fn(e,(function(e){if("function"!=typeof e[1])throw new it(l);return[n(e[0]),e[1]]})):[],Oo((function(n){for(var r=-1;++r<t;){var o=e[r];if(nn(o[0],this,n))return nn(o[1],this,n)}}))},mr.conforms=function(e){return function(e){var t=ls(e);return function(n){return Fr(n,e,t)}}(Mr(e,d))},mr.constant=Ts,mr.countBy=qa,mr.create=function(e,t){var n=gr(e);return null==t?n:Ar(n,t)},mr.curry=function e(t,n,r){var i=Ni(t,w,o,o,o,o,o,n=r?o:n);return i.placeholder=e.placeholder,i},mr.curryRight=function e(t,n,r){var i=Ni(t,C,o,o,o,o,o,n=r?o:n);return i.placeholder=e.placeholder,i},mr.debounce=ll,mr.defaults=es,mr.defaultsDeep=ts,mr.defer=sl,mr.delay=cl,mr.difference=ma,mr.differenceBy=ga,mr.differenceWith=ya,mr.drop=function(e,t,n){var r=null==e?0:e.length;return r?Ao(e,(t=n||t===o?1:zl(t))<0?0:t,r):[]},mr.dropRight=function(e,t,n){var r=null==e?0:e.length;return r?Ao(e,0,(t=r-(t=n||t===o?1:zl(t)))<0?0:t):[]},mr.dropRightWhile=function(e,t){return e&&e.length?zo(e,Fi(t,3),!0,!0):[]},mr.dropWhile=function(e,t){return e&&e.length?zo(e,Fi(t,3),!0):[]},mr.fill=function(e,t,n,r){var i=null==e?0:e.length;return i?(n&&"number"!=typeof n&&Yi(e,t,n)&&(n=0,r=i),function(e,t,n,r){var i=e.length;for((n=zl(n))<0&&(n=-n>i?0:i+n),(r=r===o||r>i?i:zl(r))<0&&(r+=i),r=n>r?0:ql(r);n<r;)e[n++]=t;return e}(e,t,n,r)):[]},mr.filter=function(e,t){return(wl(e)?sn:Wr)(e,Fi(t,3))},mr.flatMap=function(e,t){return Kr(Xa(e,t),1)},mr.flatMapDeep=function(e,t){return Kr(Xa(e,t),L)},mr.flatMapDepth=function(e,t,n){return n=n===o?1:zl(n),Kr(Xa(e,t),n)},mr.flatten=Ca,mr.flattenDeep=function(e){return(null==e?0:e.length)?Kr(e,L):[]},mr.flattenDepth=function(e,t){return(null==e?0:e.length)?Kr(e,t=t===o?1:zl(t)):[]},mr.flip=function(e){return Ni(e,S)},mr.flow=Vs,mr.flowRight=Rs,mr.fromPairs=function(e){for(var t=-1,n=null==e?0:e.length,r={};++t<n;){var o=e[t];r[o[0]]=o[1]}return r},mr.functions=function(e){return null==e?[]:Qr(e,ls(e))},mr.functionsIn=function(e){return null==e?[]:Qr(e,ss(e))},mr.groupBy=Ya,mr.initial=function(e){return(null==e?0:e.length)?Ao(e,0,-1):[]},mr.intersection=Ea,mr.intersectionBy=xa,mr.intersectionWith=ka,mr.invert=os,mr.invertBy=is,mr.invokeMap=Ja,mr.iteratee=As,mr.keyBy=Qa,mr.keys=ls,mr.keysIn=ss,mr.map=Xa,mr.mapKeys=function(e,t){var n={};return t=Fi(t,3),Yr(e,(function(e,r,o){jr(n,t(e,r,o),e)})),n},mr.mapValues=function(e,t){var n={};return t=Fi(t,3),Yr(e,(function(e,r,o){jr(n,r,t(e,r,o))})),n},mr.matches=function(e){return go(Mr(e,d))},mr.matchesProperty=function(e,t){return yo(e,Mr(t,d))},mr.memoize=ul,mr.merge=cs,mr.mergeWith=us,mr.method=js,mr.methodOf=Bs,mr.mixin=Is,mr.negate=fl,mr.nthArg=function(e){return e=zl(e),Oo((function(t){return wo(t,e)}))},mr.omit=fs,mr.omitBy=function(e,t){return ps(e,fl(Fi(t)))},mr.once=function(e){return ol(2,e)},mr.orderBy=function(e,t,n,r){return null==e?[]:(wl(t)||(t=null==t?[]:[t]),wl(n=r?o:n)||(n=null==n?[]:[n]),Co(e,t,n))},mr.over=Fs,mr.overArgs=dl,mr.overEvery=Ds,mr.overSome=Us,mr.partial=pl,mr.partialRight=hl,mr.partition=el,mr.pick=ds,mr.pickBy=ps,mr.property=$s,mr.propertyOf=function(e){return function(t){return null==e?o:Xr(e,t)}},mr.pull=Oa,mr.pullAll=Na,mr.pullAllBy=function(e,t,n){return e&&e.length&&t&&t.length?Eo(e,t,Fi(n,2)):e},mr.pullAllWith=function(e,t,n){return e&&e.length&&t&&t.length?Eo(e,t,o,n):e},mr.pullAt=Pa,mr.range=Hs,mr.rangeRight=zs,mr.rearg=vl,mr.reject=function(e,t){return(wl(e)?sn:Wr)(e,fl(Fi(t,3)))},mr.remove=function(e,t){var n=[];if(!e||!e.length)return n;var r=-1,o=[],i=e.length;for(t=Fi(t,3);++r<i;){var a=e[r];t(a,r,e)&&(n.push(a),o.push(r))}return xo(e,o),n},mr.rest=function(e,t){if("function"!=typeof e)throw new it(l);return Oo(e,t=t===o?t:zl(t))},mr.reverse=Ta,mr.sampleSize=function(e,t,n){return t=(n?Yi(e,t,n):t===o)?1:zl(t),(wl(e)?Nr:Po)(e,t)},mr.set=function(e,t,n){return null==e?e:To(e,t,n)},mr.setWith=function(e,t,n,r){return r="function"==typeof r?r:o,null==e?e:To(e,t,n,r)},mr.shuffle=function(e){return(wl(e)?Pr:Lo)(e)},mr.slice=function(e,t,n){var r=null==e?0:e.length;return r?(n&&"number"!=typeof n&&Yi(e,t,n)?(t=0,n=r):(t=null==t?0:zl(t),n=n===o?r:zl(n)),Ao(e,t,n)):[]},mr.sortBy=tl,mr.sortedUniq=function(e){return e&&e.length?Mo(e):[]},mr.sortedUniqBy=function(e,t){return e&&e.length?Mo(e,Fi(t,2)):[]},mr.split=function(e,t,n){return n&&"number"!=typeof n&&Yi(e,t,n)&&(t=n=o),(n=n===o?I:n>>>0)?(e=Gl(e))&&("string"==typeof t||null!=t&&!jl(t))&&!(t=Do(t))&&In(e)?Qo(zn(e),0,n):e.split(t,n):[]},mr.spread=function(e,t){if("function"!=typeof e)throw new it(l);return t=null==t?0:Gn(zl(t),0),Oo((function(n){var r=n[t],o=Qo(n,0,t);return r&&dn(o,r),nn(e,this,o)}))},mr.tail=function(e){var t=null==e?0:e.length;return t?Ao(e,1,t):[]},mr.take=function(e,t,n){return e&&e.length?Ao(e,0,(t=n||t===o?1:zl(t))<0?0:t):[]},mr.takeRight=function(e,t,n){var r=null==e?0:e.length;return r?Ao(e,(t=r-(t=n||t===o?1:zl(t)))<0?0:t,r):[]},mr.takeRightWhile=function(e,t){return e&&e.length?zo(e,Fi(t,3),!1,!0):[]},mr.takeWhile=function(e,t){return e&&e.length?zo(e,Fi(t,3)):[]},mr.tap=function(e,t){return t(e),e},mr.throttle=function(e,t,n){var r=!0,o=!0;if("function"!=typeof e)throw new it(l);return Tl(n)&&(r="leading"in n?!!n.leading:r,o="trailing"in n?!!n.trailing:o),ll(e,t,{leading:r,maxWait:t,trailing:o})},mr.thru=Ha,mr.toArray=$l,mr.toPairs=hs,mr.toPairsIn=vs,mr.toPath=function(e){return wl(e)?fn(e,pa):Ml(e)?[e]:ai(da(Gl(e)))},mr.toPlainObject=Kl,mr.transform=function(e,t,n){var r=wl(e),o=r||xl(e)||Fl(e);if(t=Fi(t,4),null==n){var i=e&&e.constructor;n=o?r?new i:[]:Tl(e)&&Ol(i)?gr(_t(e)):{}}return(o?on:Yr)(e,(function(e,r,o){return t(n,e,r,o)})),n},mr.unary=function(e){return rl(e,1)},mr.union=Va,mr.unionBy=Ra,mr.unionWith=La,mr.uniq=function(e){return e&&e.length?Uo(e):[]},mr.uniqBy=function(e,t){return e&&e.length?Uo(e,Fi(t,2)):[]},mr.uniqWith=function(e,t){return t="function"==typeof t?t:o,e&&e.length?Uo(e,o,t):[]},mr.unset=function(e,t){return null==e||$o(e,t)},mr.unzip=Aa,mr.unzipWith=ja,mr.update=function(e,t,n){return null==e?e:Ho(e,t,Zo(n))},mr.updateWith=function(e,t,n,r){return r="function"==typeof r?r:o,null==e?e:Ho(e,t,Zo(n),r)},mr.values=ms,mr.valuesIn=function(e){return null==e?[]:Tn(e,ss(e))},mr.without=Ba,mr.words=Os,mr.wrap=function(e,t){return pl(Zo(t),e)},mr.xor=Ia,mr.xorBy=Ma,mr.xorWith=Fa,mr.zip=Da,mr.zipObject=function(e,t){return Ko(e||[],t||[],Vr)},mr.zipObjectDeep=function(e,t){return Ko(e||[],t||[],To)},mr.zipWith=Ua,mr.entries=hs,mr.entriesIn=vs,mr.extend=Yl,mr.extendWith=Jl,Is(mr,mr),mr.add=Ks,mr.attempt=Ns,mr.camelCase=gs,mr.capitalize=ys,mr.ceil=Gs,mr.clamp=function(e,t,n){return n===o&&(n=t,t=o),n!==o&&(n=(n=Wl(n))==n?n:0),t!==o&&(t=(t=Wl(t))==t?t:0),Ir(Wl(e),t,n)},mr.clone=function(e){return Mr(e,h)},mr.cloneDeep=function(e){return Mr(e,d|h)},mr.cloneDeepWith=function(e,t){return Mr(e,d|h,t="function"==typeof t?t:o)},mr.cloneWith=function(e,t){return Mr(e,h,t="function"==typeof t?t:o)},mr.conformsTo=function(e,t){return null==t||Fr(e,t,ls(t))},mr.deburr=bs,mr.defaultTo=function(e,t){return null==e||e!=e?t:e},mr.divide=Zs,mr.endsWith=function(e,t,n){e=Gl(e),t=Do(t);var r=e.length,i=n=n===o?r:Ir(zl(n),0,r);return(n-=t.length)>=0&&e.slice(n,i)==t},mr.eq=ml,mr.escape=function(e){return(e=Gl(e))&&Se.test(e)?e.replace(xe,jn):e},mr.escapeRegExp=function(e){return(e=Gl(e))&&Ae.test(e)?e.replace(Le,"\\$&"):e},mr.every=function(e,t,n){var r=wl(e)?ln:zr;return n&&Yi(e,t,n)&&(t=o),r(e,Fi(t,3))},mr.find=Wa,mr.findIndex=ba,mr.findKey=function(e,t){return gn(e,Fi(t,3),Yr)},mr.findLast=Ka,mr.findLastIndex=wa,mr.findLastKey=function(e,t){return gn(e,Fi(t,3),Jr)},mr.floor=Ys,mr.forEach=Ga,mr.forEachRight=Za,mr.forIn=function(e,t){return null==e?e:Gr(e,Fi(t,3),ss)},mr.forInRight=function(e,t){return null==e?e:Zr(e,Fi(t,3),ss)},mr.forOwn=function(e,t){return e&&Yr(e,Fi(t,3))},mr.forOwnRight=function(e,t){return e&&Jr(e,Fi(t,3))},mr.get=ns,mr.gt=gl,mr.gte=yl,mr.has=function(e,t){return null!=e&&Wi(e,t,ro)},mr.hasIn=rs,mr.head=_a,mr.identity=Ls,mr.includes=function(e,t,n,r){e=_l(e)?e:ms(e),n=n&&!r?zl(n):0;var o=e.length;return n<0&&(n=Gn(o+n,0)),Il(e)?n<=o&&e.indexOf(t,n)>-1:!!o&&bn(e,t,n)>-1},mr.indexOf=function(e,t,n){var r=null==e?0:e.length;if(!r)return-1;var o=null==n?0:zl(n);return o<0&&(o=Gn(r+o,0)),bn(e,t,o)},mr.inRange=function(e,t,n){return t=Hl(t),n===o?(n=t,t=0):n=Hl(n),function(e,t,n){return e>=Zn(t,n)&&e<Gn(t,n)}(e=Wl(e),t,n)},mr.invoke=as,mr.isArguments=bl,mr.isArray=wl,mr.isArrayBuffer=Cl,mr.isArrayLike=_l,mr.isArrayLikeObject=El,mr.isBoolean=function(e){return!0===e||!1===e||Vl(e)&&to(e)==z},mr.isBuffer=xl,mr.isDate=kl,mr.isElement=function(e){return Vl(e)&&1===e.nodeType&&!Al(e)},mr.isEmpty=function(e){if(null==e)return!0;if(_l(e)&&(wl(e)||"string"==typeof e||"function"==typeof e.splice||xl(e)||Fl(e)||bl(e)))return!e.length;var t=qi(e);if(t==Y||t==re)return!e.size;if(ea(e))return!po(e).length;for(var n in e)if(ft.call(e,n))return!1;return!0},mr.isEqual=function(e,t){return so(e,t)},mr.isEqualWith=function(e,t,n){var r=(n="function"==typeof n?n:o)?n(e,t):o;return r===o?so(e,t,o,n):!!r},mr.isError=Sl,mr.isFinite=function(e){return"number"==typeof e&&Zt(e)},mr.isFunction=Ol,mr.isInteger=Nl,mr.isLength=Pl,mr.isMap=Rl,mr.isMatch=function(e,t){return e===t||co(e,t,Ui(t))},mr.isMatchWith=function(e,t,n){return n="function"==typeof n?n:o,co(e,t,Ui(t),n)},mr.isNaN=function(e){return Ll(e)&&e!=+e},mr.isNative=function(e){if(Xi(e))throw new Xe(a);return uo(e)},mr.isNil=function(e){return null==e},mr.isNull=function(e){return null===e},mr.isNumber=Ll,mr.isObject=Tl,mr.isObjectLike=Vl,mr.isPlainObject=Al,mr.isRegExp=jl,mr.isSafeInteger=function(e){return Nl(e)&&e>=-A&&e<=A},mr.isSet=Bl,mr.isString=Il,mr.isSymbol=Ml,mr.isTypedArray=Fl,mr.isUndefined=function(e){return e===o},mr.isWeakMap=function(e){return Vl(e)&&qi(e)==le},mr.isWeakSet=function(e){return Vl(e)&&to(e)==se},mr.join=function(e,t){return null==e?"":mn.call(e,t)},mr.kebabCase=ws,mr.last=Sa,mr.lastIndexOf=function(e,t,n){var r=null==e?0:e.length;if(!r)return-1;var i=r;return n!==o&&(i=(i=zl(n))<0?Gn(r+i,0):Zn(i,r-1)),t==t?function(e,t,n){for(var r=n+1;r--;)if(e[r]===t)return r;return r}(e,t,i):yn(e,Cn,i,!0)},mr.lowerCase=Cs,mr.lowerFirst=_s,mr.lt=Dl,mr.lte=Ul,mr.max=function(e){return e&&e.length?qr(e,Ls,no):o},mr.maxBy=function(e,t){return e&&e.length?qr(e,Fi(t,2),no):o},mr.mean=function(e){return _n(e,Ls)},mr.meanBy=function(e,t){return _n(e,Fi(t,2))},mr.min=function(e){return e&&e.length?qr(e,Ls,vo):o},mr.minBy=function(e,t){return e&&e.length?qr(e,Fi(t,2),vo):o},mr.stubArray=qs,mr.stubFalse=Ws,mr.stubObject=function(){return{}},mr.stubString=function(){return""},mr.stubTrue=function(){return!0},mr.multiply=Qs,mr.nth=function(e,t){return e&&e.length?wo(e,zl(t)):o},mr.noConflict=function(){return zt._===this&&(zt._=mt),this},mr.noop=Ms,mr.now=nl,mr.pad=function(e,t,n){e=Gl(e);var r=(t=zl(t))?Hn(e):0;if(!t||r>=t)return e;var o=(t-r)/2;return Ci(qt(o),n)+e+Ci(Ht(o),n)},mr.padEnd=function(e,t,n){e=Gl(e);var r=(t=zl(t))?Hn(e):0;return t&&r<t?e+Ci(t-r,n):e},mr.padStart=function(e,t,n){e=Gl(e);var r=(t=zl(t))?Hn(e):0;return t&&r<t?Ci(t-r,n)+e:e},mr.parseInt=function(e,t,n){return n||null==t?t=0:t&&(t=+t),Jn(Gl(e).replace(je,""),t||0)},mr.random=function(e,t,n){if(n&&"boolean"!=typeof n&&Yi(e,t,n)&&(t=n=o),n===o&&("boolean"==typeof t?(n=t,t=o):"boolean"==typeof e&&(n=e,e=o)),e===o&&t===o?(e=0,t=1):(e=Hl(e),t===o?(t=e,e=0):t=Hl(t)),e>t){var r=e;e=t,t=r}if(n||e%1||t%1){var i=Qn();return Zn(e+i*(t-e+Dt("1e-"+((i+"").length-1))),t)}return ko(e,t)},mr.reduce=function(e,t,n){var r=wl(e)?pn:kn,o=arguments.length<3;return r(e,Fi(t,4),n,o,$r)},mr.reduceRight=function(e,t,n){var r=wl(e)?hn:kn,o=arguments.length<3;return r(e,Fi(t,4),n,o,Hr)},mr.repeat=function(e,t,n){return t=(n?Yi(e,t,n):t===o)?1:zl(t),So(Gl(e),t)},mr.replace=function(){var e=arguments,t=Gl(e[0]);return e.length<3?t:t.replace(e[1],e[2])},mr.result=function(e,t,n){var r=-1,i=(t=Yo(t,e)).length;for(i||(i=1,e=o);++r<i;){var a=null==e?o:e[pa(t[r])];a===o&&(r=i,a=n),e=Ol(a)?a.call(e):a}return e},mr.round=Xs,mr.runInContext=e,mr.sample=function(e){return(wl(e)?Or:No)(e)},mr.size=function(e){if(null==e)return 0;if(_l(e))return Il(e)?Hn(e):e.length;var t=qi(e);return t==Y||t==re?e.size:po(e).length},mr.snakeCase=Es,mr.some=function(e,t,n){var r=wl(e)?vn:jo;return n&&Yi(e,t,n)&&(t=o),r(e,Fi(t,3))},mr.sortedIndex=function(e,t){return Bo(e,t)},mr.sortedIndexBy=function(e,t,n){return Io(e,t,Fi(n,2))},mr.sortedIndexOf=function(e,t){var n=null==e?0:e.length;if(n){var r=Bo(e,t);if(r<n&&ml(e[r],t))return r}return-1},mr.sortedLastIndex=function(e,t){return Bo(e,t,!0)},mr.sortedLastIndexBy=function(e,t,n){return Io(e,t,Fi(n,2),!0)},mr.sortedLastIndexOf=function(e,t){if(null==e?0:e.length){var n=Bo(e,t,!0)-1;if(ml(e[n],t))return n}return-1},mr.startCase=xs,mr.startsWith=function(e,t,n){return e=Gl(e),n=null==n?0:Ir(zl(n),0,e.length),t=Do(t),e.slice(n,n+t.length)==t},mr.subtract=ec,mr.sum=function(e){return e&&e.length?Sn(e,Ls):0},mr.sumBy=function(e,t){return e&&e.length?Sn(e,Fi(t,2)):0},mr.template=function(e,t,n){var r=mr.templateSettings;n&&Yi(e,t,n)&&(t=o),e=Gl(e),t=Jl({},t,r,Pi);var i,a,l=Jl({},t.imports,r.imports,Pi),c=ls(l),u=Tn(l,c),f=0,d=t.interpolate||Je,p="__p += '",h=rt((t.escape||Je).source+"|"+d.source+"|"+(d===Pe?He:Je).source+"|"+(t.evaluate||Je).source+"|$","g"),v="//# sourceURL="+(ft.call(t,"sourceURL")?(t.sourceURL+"").replace(/\s/g," "):"lodash.templateSources["+ ++Bt+"]")+"\n";e.replace(h,(function(t,n,r,o,l,s){return r||(r=o),p+=e.slice(f,s).replace(Qe,Bn),n&&(i=!0,p+="' +\n__e("+n+") +\n'"),l&&(a=!0,p+="';\n"+l+";\n__p += '"),r&&(p+="' +\n((__t = ("+r+")) == null ? '' : __t) +\n'"),f=s+t.length,t})),p+="';\n";var m=ft.call(t,"variable")&&t.variable;if(m){if(Ue.test(m))throw new Xe(s)}else p="with (obj) {\n"+p+"\n}\n";p=(a?p.replace(we,""):p).replace(Ce,"$1").replace(_e,"$1;"),p="function("+(m||"obj")+") {\n"+(m?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(i?", __e = _.escape":"")+(a?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+p+"return __p\n}";var g=Ns((function(){return et(c,v+"return "+p).apply(o,u)}));if(g.source=p,Sl(g))throw g;return g},mr.times=function(e,t){if((e=zl(e))<1||e>A)return[];var n=I,r=Zn(e,I);t=Fi(t),e-=I;for(var o=On(r,t);++n<e;)t(n);return o},mr.toFinite=Hl,mr.toInteger=zl,mr.toLength=ql,mr.toLower=function(e){return Gl(e).toLowerCase()},mr.toNumber=Wl,mr.toSafeInteger=function(e){return e?Ir(zl(e),-A,A):0===e?e:0},mr.toString=Gl,mr.toUpper=function(e){return Gl(e).toUpperCase()},mr.trim=function(e,t,n){if((e=Gl(e))&&(n||t===o))return Nn(e);if(!e||!(t=Do(t)))return e;var r=zn(e),i=zn(t);return Qo(r,Rn(r,i),Ln(r,i)+1).join("")},mr.trimEnd=function(e,t,n){if((e=Gl(e))&&(n||t===o))return e.slice(0,qn(e)+1);if(!e||!(t=Do(t)))return e;var r=zn(e);return Qo(r,0,Ln(r,zn(t))+1).join("")},mr.trimStart=function(e,t,n){if((e=Gl(e))&&(n||t===o))return e.replace(je,"");if(!e||!(t=Do(t)))return e;var r=zn(e);return Qo(r,Rn(r,zn(t))).join("")},mr.truncate=function(e,t){var n=O,r=N;if(Tl(t)){var i="separator"in t?t.separator:i;n="length"in t?zl(t.length):n,r="omission"in t?Do(t.omission):r}var a=(e=Gl(e)).length;if(In(e)){var l=zn(e);a=l.length}if(n>=a)return e;var s=n-Hn(r);if(s<1)return r;var c=l?Qo(l,0,s).join(""):e.slice(0,s);if(i===o)return c+r;if(l&&(s+=c.length-s),jl(i)){if(e.slice(s).search(i)){var u,f=c;for(i.global||(i=rt(i.source,Gl(ze.exec(i))+"g")),i.lastIndex=0;u=i.exec(f);)var d=u.index;c=c.slice(0,d===o?s:d)}}else if(e.indexOf(Do(i),s)!=s){var p=c.lastIndexOf(i);p>-1&&(c=c.slice(0,p))}return c+r},mr.unescape=function(e){return(e=Gl(e))&&ke.test(e)?e.replace(Ee,Wn):e},mr.uniqueId=function(e){var t=++dt;return Gl(e)+t},mr.upperCase=ks,mr.upperFirst=Ss,mr.each=Ga,mr.eachRight=Za,mr.first=_a,Is(mr,(Js={},Yr(mr,(function(e,t){ft.call(mr.prototype,t)||(Js[t]=e)})),Js),{chain:!1}),mr.VERSION="4.17.21",on(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(e){mr[e].placeholder=mr})),on(["drop","take"],(function(e,t){wr.prototype[e]=function(n){n=n===o?1:Gn(zl(n),0);var r=this.__filtered__&&!t?new wr(this):this.clone();return r.__filtered__?r.__takeCount__=Zn(n,r.__takeCount__):r.__views__.push({size:Zn(n,I),type:e+(r.__dir__<0?"Right":"")}),r},wr.prototype[e+"Right"]=function(t){return this.reverse()[e](t).reverse()}})),on(["filter","map","takeWhile"],(function(e,t){var n=t+1,r=n==V||3==n;wr.prototype[e]=function(e){var t=this.clone();return t.__iteratees__.push({iteratee:Fi(e,3),type:n}),t.__filtered__=t.__filtered__||r,t}})),on(["head","last"],(function(e,t){var n="take"+(t?"Right":"");wr.prototype[e]=function(){return this[n](1).value()[0]}})),on(["initial","tail"],(function(e,t){var n="drop"+(t?"":"Right");wr.prototype[e]=function(){return this.__filtered__?new wr(this):this[n](1)}})),wr.prototype.compact=function(){return this.filter(Ls)},wr.prototype.find=function(e){return this.filter(e).head()},wr.prototype.findLast=function(e){return this.reverse().find(e)},wr.prototype.invokeMap=Oo((function(e,t){return"function"==typeof e?new wr(this):this.map((function(n){return ao(n,e,t)}))})),wr.prototype.reject=function(e){return this.filter(fl(Fi(e)))},wr.prototype.slice=function(e,t){e=zl(e);var n=this;return n.__filtered__&&(e>0||t<0)?new wr(n):(e<0?n=n.takeRight(-e):e&&(n=n.drop(e)),t!==o&&(n=(t=zl(t))<0?n.dropRight(-t):n.take(t-e)),n)},wr.prototype.takeRightWhile=function(e){return this.reverse().takeWhile(e).reverse()},wr.prototype.toArray=function(){return this.take(I)},Yr(wr.prototype,(function(e,t){var n=/^(?:filter|find|map|reject)|While$/.test(t),r=/^(?:head|last)$/.test(t),i=mr[r?"take"+("last"==t?"Right":""):t],a=r||/^find/.test(t);i&&(mr.prototype[t]=function(){var t=this.__wrapped__,l=r?[1]:arguments,s=t instanceof wr,c=l[0],u=s||wl(t),f=function(e){var t=i.apply(mr,dn([e],l));return r&&d?t[0]:t};u&&n&&"function"==typeof c&&1!=c.length&&(s=u=!1);var d=this.__chain__,p=!!this.__actions__.length,h=a&&!d,v=s&&!p;if(!a&&u){t=v?t:new wr(this);var m=e.apply(t,l);return m.__actions__.push({func:Ha,args:[f],thisArg:o}),new br(m,d)}return h&&v?e.apply(this,l):(m=this.thru(f),h?r?m.value()[0]:m.value():m)})})),on(["pop","push","shift","sort","splice","unshift"],(function(e){var t=at[e],n=/^(?:push|sort|unshift)$/.test(e)?"tap":"thru",r=/^(?:pop|shift)$/.test(e);mr.prototype[e]=function(){var e=arguments;if(r&&!this.__chain__){var o=this.value();return t.apply(wl(o)?o:[],e)}return this[n]((function(n){return t.apply(wl(n)?n:[],e)}))}})),Yr(wr.prototype,(function(e,t){var n=mr[t];if(n){var r=n.name+"";ft.call(lr,r)||(lr[r]=[]),lr[r].push({name:t,func:n})}})),lr[gi(o,y).name]=[{name:"wrapper",func:o}],wr.prototype.clone=function(){var e=new wr(this.__wrapped__);return e.__actions__=ai(this.__actions__),e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=ai(this.__iteratees__),e.__takeCount__=this.__takeCount__,e.__views__=ai(this.__views__),e},wr.prototype.reverse=function(){if(this.__filtered__){var e=new wr(this);e.__dir__=-1,e.__filtered__=!0}else(e=this.clone()).__dir__*=-1;return e},wr.prototype.value=function(){var e=this.__wrapped__.value(),t=this.__dir__,n=wl(e),r=t<0,o=n?e.length:0,i=function(e,t,n){var r=-1,o=n.length;for(;++r<o;){var i=n[r],a=i.size;switch(i.type){case"drop":e+=a;break;case"dropRight":t-=a;break;case"take":t=Zn(t,e+a);break;case"takeRight":e=Gn(e,t-a)}}return{start:e,end:t}}(0,o,this.__views__),a=i.start,l=i.end,s=l-a,c=r?l:a-1,u=this.__iteratees__,f=u.length,d=0,p=Zn(s,this.__takeCount__);if(!n||!r&&o==s&&p==s)return qo(e,this.__actions__);var h=[];e:for(;s--&&d<p;){for(var v=-1,m=e[c+=t];++v<f;){var g=u[v],y=g.iteratee,b=g.type,w=y(m);if(b==R)m=w;else if(!w){if(b==V)continue e;break e}}h[d++]=m}return h},mr.prototype.at=za,mr.prototype.chain=function(){return $a(this)},mr.prototype.commit=function(){return new br(this.value(),this.__chain__)},mr.prototype.next=function(){this.__values__===o&&(this.__values__=$l(this.value()));var e=this.__index__>=this.__values__.length;return{done:e,value:e?o:this.__values__[this.__index__++]}},mr.prototype.plant=function(e){for(var t,n=this;n instanceof yr;){var r=va(n);r.__index__=0,r.__values__=o,t?i.__wrapped__=r:t=r;var i=r;n=n.__wrapped__}return i.__wrapped__=e,t},mr.prototype.reverse=function(){var e=this.__wrapped__;if(e instanceof wr){var t=e;return this.__actions__.length&&(t=new wr(this)),(t=t.reverse()).__actions__.push({func:Ha,args:[Ta],thisArg:o}),new br(t,this.__chain__)}return this.thru(Ta)},mr.prototype.toJSON=mr.prototype.valueOf=mr.prototype.value=function(){return qo(this.__wrapped__,this.__actions__)},mr.prototype.first=mr.prototype.head,Ot&&(mr.prototype[Ot]=function(){return this}),mr}();zt._=Kn,(r=function(){return Kn}.call(t,n,t,e))===o||(e.exports=r)}.call(this)},378:()=>{},744:(e,t)=>{"use strict";t.Z=(e,t)=>{const n=e.__vccOpts||e;for(const[e,r]of t)n[e]=r;return n}},821:(e,t,n)=>{"use strict";n.r(t),n.d(t,{BaseTransition:()=>vr,Comment:()=>si,EffectScope:()=>pe,Fragment:()=>ai,KeepAlive:()=>Or,ReactiveEffect:()=>Ne,Static:()=>ci,Suspense:()=>Yn,Teleport:()=>oi,Text:()=>li,Transition:()=>Ja,TransitionGroup:()=>ml,VueElement:()=>za,assertNumber:()=>ln,callWithAsyncErrorHandling:()=>cn,callWithErrorHandling:()=>sn,camelize:()=>ee,capitalize:()=>re,cloneVNode:()=>Ti,compatUtils:()=>ka,compile:()=>Uf,computed:()=>ia,createApp:()=>Gl,createBlock:()=>bi,createCommentVNode:()=>Li,createElementBlock:()=>yi,createElementVNode:()=>Si,createHydrationRenderer:()=>Zo,createPropsRestProxy:()=>ha,createRenderer:()=>Go,createSSRApp:()=>Zl,createSlots:()=>oo,createStaticVNode:()=>Ri,createTextVNode:()=>Vi,createVNode:()=>Oi,customRef:()=>Xt,defineAsyncComponent:()=>xr,defineComponent:()=>_r,defineCustomElement:()=>Ua,defineEmits:()=>la,defineExpose:()=>sa,defineProps:()=>aa,defineSSRCustomElement:()=>$a,devtools:()=>Pn,effect:()=>Te,effectScope:()=>he,getCurrentInstance:()=>Hi,getCurrentScope:()=>me,getTransitionRawChildren:()=>Cr,guardReactiveProps:()=>Pi,h:()=>ma,handleError:()=>un,hydrate:()=>Kl,initCustomFormatter:()=>ba,initDirectivesForSSR:()=>Ql,inject:()=>rr,isMemoSame:()=>Ca,isProxy:()=>Bt,isReactive:()=>Lt,isReadonly:()=>At,isRef:()=>Ht,isRuntimeOnly:()=>Xi,isShallow:()=>jt,isVNode:()=>wi,markRaw:()=>Mt,mergeDefaults:()=>pa,mergeProps:()=>Ii,nextTick:()=>wn,normalizeClass:()=>d,normalizeProps:()=>p,normalizeStyle:()=>l,onActivated:()=>Pr,onBeforeMount:()=>Ir,onBeforeUnmount:()=>Ur,onBeforeUpdate:()=>Fr,onDeactivated:()=>Tr,onErrorCaptured:()=>Wr,onMounted:()=>Mr,onRenderTracked:()=>qr,onRenderTriggered:()=>zr,onScopeDispose:()=>ge,onServerPrefetch:()=>Hr,onUnmounted:()=>$r,onUpdated:()=>Dr,openBlock:()=>di,popScopeId:()=>Dn,provide:()=>nr,proxyRefs:()=>Jt,pushScopeId:()=>Fn,queuePostFlushCb:()=>En,reactive:()=>Nt,readonly:()=>Tt,ref:()=>zt,registerRuntimeCompiler:()=>Qi,render:()=>Wl,renderList:()=>ro,renderSlot:()=>io,resolveComponent:()=>Jr,resolveDirective:()=>eo,resolveDynamicComponent:()=>Xr,resolveFilter:()=>xa,resolveTransitionHooks:()=>gr,setBlockTracking:()=>mi,setDevtoolsHook:()=>Rn,setTransitionHooks:()=>wr,shallowReactive:()=>Pt,shallowReadonly:()=>Vt,shallowRef:()=>qt,ssrContextKey:()=>ga,ssrUtils:()=>Ea,stop:()=>Ve,toDisplayString:()=>_,toHandlerKey:()=>oe,toHandlers:()=>lo,toRaw:()=>It,toRef:()=>nn,toRefs:()=>en,transformVNodeArgs:()=>_i,triggerRef:()=>Gt,unref:()=>Zt,useAttrs:()=>fa,useCssModule:()=>qa,useCssVars:()=>Wa,useSSRContext:()=>ya,useSlots:()=>ua,useTransitionState:()=>pr,vModelCheckbox:()=>xl,vModelDynamic:()=>Vl,vModelRadio:()=>Sl,vModelSelect:()=>Ol,vModelText:()=>El,vShow:()=>Fl,version:()=>_a,warn:()=>an,watch:()=>sr,watchEffect:()=>or,watchPostEffect:()=>ir,watchSyncEffect:()=>ar,withAsyncContext:()=>va,withCtx:()=>$n,withDefaults:()=>ca,withDirectives:()=>Kr,withKeys:()=>Ml,withMemo:()=>wa,withModifiers:()=>Bl,withScopeId:()=>Un});var r={};function o(e,t){const n=Object.create(null),r=e.split(",");for(let e=0;e<r.length;e++)n[r[e]]=!0;return t?e=>!!n[e.toLowerCase()]:e=>!!n[e]}n.r(r),n.d(r,{BaseTransition:()=>vr,Comment:()=>si,EffectScope:()=>pe,Fragment:()=>ai,KeepAlive:()=>Or,ReactiveEffect:()=>Ne,Static:()=>ci,Suspense:()=>Yn,Teleport:()=>oi,Text:()=>li,Transition:()=>Ja,TransitionGroup:()=>ml,VueElement:()=>za,assertNumber:()=>ln,callWithAsyncErrorHandling:()=>cn,callWithErrorHandling:()=>sn,camelize:()=>ee,capitalize:()=>re,cloneVNode:()=>Ti,compatUtils:()=>ka,computed:()=>ia,createApp:()=>Gl,createBlock:()=>bi,createCommentVNode:()=>Li,createElementBlock:()=>yi,createElementVNode:()=>Si,createHydrationRenderer:()=>Zo,createPropsRestProxy:()=>ha,createRenderer:()=>Go,createSSRApp:()=>Zl,createSlots:()=>oo,createStaticVNode:()=>Ri,createTextVNode:()=>Vi,createVNode:()=>Oi,customRef:()=>Xt,defineAsyncComponent:()=>xr,defineComponent:()=>_r,defineCustomElement:()=>Ua,defineEmits:()=>la,defineExpose:()=>sa,defineProps:()=>aa,defineSSRCustomElement:()=>$a,devtools:()=>Pn,effect:()=>Te,effectScope:()=>he,getCurrentInstance:()=>Hi,getCurrentScope:()=>me,getTransitionRawChildren:()=>Cr,guardReactiveProps:()=>Pi,h:()=>ma,handleError:()=>un,hydrate:()=>Kl,initCustomFormatter:()=>ba,initDirectivesForSSR:()=>Ql,inject:()=>rr,isMemoSame:()=>Ca,isProxy:()=>Bt,isReactive:()=>Lt,isReadonly:()=>At,isRef:()=>Ht,isRuntimeOnly:()=>Xi,isShallow:()=>jt,isVNode:()=>wi,markRaw:()=>Mt,mergeDefaults:()=>pa,mergeProps:()=>Ii,nextTick:()=>wn,normalizeClass:()=>d,normalizeProps:()=>p,normalizeStyle:()=>l,onActivated:()=>Pr,onBeforeMount:()=>Ir,onBeforeUnmount:()=>Ur,onBeforeUpdate:()=>Fr,onDeactivated:()=>Tr,onErrorCaptured:()=>Wr,onMounted:()=>Mr,onRenderTracked:()=>qr,onRenderTriggered:()=>zr,onScopeDispose:()=>ge,onServerPrefetch:()=>Hr,onUnmounted:()=>$r,onUpdated:()=>Dr,openBlock:()=>di,popScopeId:()=>Dn,provide:()=>nr,proxyRefs:()=>Jt,pushScopeId:()=>Fn,queuePostFlushCb:()=>En,reactive:()=>Nt,readonly:()=>Tt,ref:()=>zt,registerRuntimeCompiler:()=>Qi,render:()=>Wl,renderList:()=>ro,renderSlot:()=>io,resolveComponent:()=>Jr,resolveDirective:()=>eo,resolveDynamicComponent:()=>Xr,resolveFilter:()=>xa,resolveTransitionHooks:()=>gr,setBlockTracking:()=>mi,setDevtoolsHook:()=>Rn,setTransitionHooks:()=>wr,shallowReactive:()=>Pt,shallowReadonly:()=>Vt,shallowRef:()=>qt,ssrContextKey:()=>ga,ssrUtils:()=>Ea,stop:()=>Ve,toDisplayString:()=>_,toHandlerKey:()=>oe,toHandlers:()=>lo,toRaw:()=>It,toRef:()=>nn,toRefs:()=>en,transformVNodeArgs:()=>_i,triggerRef:()=>Gt,unref:()=>Zt,useAttrs:()=>fa,useCssModule:()=>qa,useCssVars:()=>Wa,useSSRContext:()=>ya,useSlots:()=>ua,useTransitionState:()=>pr,vModelCheckbox:()=>xl,vModelDynamic:()=>Vl,vModelRadio:()=>Sl,vModelSelect:()=>Ol,vModelText:()=>El,vShow:()=>Fl,version:()=>_a,warn:()=>an,watch:()=>sr,watchEffect:()=>or,watchPostEffect:()=>ir,watchSyncEffect:()=>ar,withAsyncContext:()=>va,withCtx:()=>$n,withDefaults:()=>ca,withDirectives:()=>Kr,withKeys:()=>Ml,withMemo:()=>wa,withModifiers:()=>Bl,withScopeId:()=>Un});const i={1:"TEXT",2:"CLASS",4:"STYLE",8:"PROPS",16:"FULL_PROPS",32:"HYDRATE_EVENTS",64:"STABLE_FRAGMENT",128:"KEYED_FRAGMENT",256:"UNKEYED_FRAGMENT",512:"NEED_PATCH",1024:"DYNAMIC_SLOTS",2048:"DEV_ROOT_FRAGMENT",[-1]:"HOISTED",[-2]:"BAIL"},a=o("Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt");function l(e){if(j(e)){const t={};for(let n=0;n<e.length;n++){const r=e[n],o=U(r)?f(r):l(r);if(o)for(const e in o)t[e]=o[e]}return t}return U(e)||H(e)?e:void 0}const s=/;(?![^(]*\))/g,c=/:([^]+)/,u=/\/\*.*?\*\//gs;function f(e){const t={};return e.replace(u,"").split(s).forEach((e=>{if(e){const n=e.split(c);n.length>1&&(t[n[0].trim()]=n[1].trim())}})),t}function d(e){let t="";if(U(e))t=e;else if(j(e))for(let n=0;n<e.length;n++){const r=d(e[n]);r&&(t+=r+" ")}else if(H(e))for(const n in e)e[n]&&(t+=n+" ");return t.trim()}function p(e){if(!e)return null;let{class:t,style:n}=e;return t&&!U(t)&&(e.class=d(t)),n&&(e.style=l(n)),e}const h=o("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot"),v=o("svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view"),m=o("area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr"),g="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",y=o(g);function b(e){return!!e||""===e}function w(e,t){if(e===t)return!0;let n=M(e),r=M(t);if(n||r)return!(!n||!r)&&e.getTime()===t.getTime();if(n=$(e),r=$(t),n||r)return e===t;if(n=j(e),r=j(t),n||r)return!(!n||!r)&&function(e,t){if(e.length!==t.length)return!1;let n=!0;for(let r=0;n&&r<e.length;r++)n=w(e[r],t[r]);return n}(e,t);if(n=H(e),r=H(t),n||r){if(!n||!r)return!1;if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e){const r=e.hasOwnProperty(n),o=t.hasOwnProperty(n);if(r&&!o||!r&&o||!w(e[n],t[n]))return!1}}return String(e)===String(t)}function C(e,t){return e.findIndex((e=>w(e,t)))}const _=e=>U(e)?e:null==e?"":j(e)||H(e)&&(e.toString===q||!D(e.toString))?JSON.stringify(e,E,2):String(e),E=(e,t)=>t&&t.__v_isRef?E(e,t.value):B(t)?{[`Map(${t.size})`]:[...t.entries()].reduce(((e,[t,n])=>(e[`${t} =>`]=n,e)),{})}:I(t)?{[`Set(${t.size})`]:[...t.values()]}:!H(t)||j(t)||G(t)?t:String(t),x={},k=[],S=()=>{},O=()=>!1,N=/^on[^a-z]/,P=e=>N.test(e),T=e=>e.startsWith("onUpdate:"),V=Object.assign,R=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},L=Object.prototype.hasOwnProperty,A=(e,t)=>L.call(e,t),j=Array.isArray,B=e=>"[object Map]"===W(e),I=e=>"[object Set]"===W(e),M=e=>"[object Date]"===W(e),F=e=>"[object RegExp]"===W(e),D=e=>"function"==typeof e,U=e=>"string"==typeof e,$=e=>"symbol"==typeof e,H=e=>null!==e&&"object"==typeof e,z=e=>H(e)&&D(e.then)&&D(e.catch),q=Object.prototype.toString,W=e=>q.call(e),K=e=>W(e).slice(8,-1),G=e=>"[object Object]"===W(e),Z=e=>U(e)&&"NaN"!==e&&"-"!==e[0]&&""+parseInt(e,10)===e,Y=o(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),J=o("bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"),Q=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},X=/-(\w)/g,ee=Q((e=>e.replace(X,((e,t)=>t?t.toUpperCase():"")))),te=/\B([A-Z])/g,ne=Q((e=>e.replace(te,"-$1").toLowerCase())),re=Q((e=>e.charAt(0).toUpperCase()+e.slice(1))),oe=Q((e=>e?`on${re(e)}`:"")),ie=(e,t)=>!Object.is(e,t),ae=(e,t)=>{for(let n=0;n<e.length;n++)e[n](t)},le=(e,t,n)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},se=e=>{const t=parseFloat(e);return isNaN(t)?e:t},ce=e=>{const t=U(e)?Number(e):NaN;return isNaN(t)?e:t};let ue;const fe=()=>ue||(ue="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==n.g?n.g:{});let de;class pe{constructor(e=!1){this.detached=e,this._active=!0,this.effects=[],this.cleanups=[],this.parent=de,!e&&de&&(this.index=(de.scopes||(de.scopes=[])).push(this)-1)}get active(){return this._active}run(e){if(this._active){const t=de;try{return de=this,e()}finally{de=t}}else 0}on(){de=this}off(){de=this.parent}stop(e){if(this._active){let t,n;for(t=0,n=this.effects.length;t<n;t++)this.effects[t].stop();for(t=0,n=this.cleanups.length;t<n;t++)this.cleanups[t]();if(this.scopes)for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].stop(!0);if(!this.detached&&this.parent&&!e){const e=this.parent.scopes.pop();e&&e!==this&&(this.parent.scopes[this.index]=e,e.index=this.index)}this.parent=void 0,this._active=!1}}}function he(e){return new pe(e)}function ve(e,t=de){t&&t.active&&t.effects.push(e)}function me(){return de}function ge(e){de&&de.cleanups.push(e)}const ye=e=>{const t=new Set(e);return t.w=0,t.n=0,t},be=e=>(e.w&Ee)>0,we=e=>(e.n&Ee)>0,Ce=new WeakMap;let _e=0,Ee=1;const xe=30;let ke;const Se=Symbol(""),Oe=Symbol("");class Ne{constructor(e,t=null,n){this.fn=e,this.scheduler=t,this.active=!0,this.deps=[],this.parent=void 0,ve(this,n)}run(){if(!this.active)return this.fn();let e=ke,t=Re;for(;e;){if(e===this)return;e=e.parent}try{return this.parent=ke,ke=this,Re=!0,Ee=1<<++_e,_e<=xe?(({deps:e})=>{if(e.length)for(let t=0;t<e.length;t++)e[t].w|=Ee})(this):Pe(this),this.fn()}finally{_e<=xe&&(e=>{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r<t.length;r++){const o=t[r];be(o)&&!we(o)?o.delete(e):t[n++]=o,o.w&=~Ee,o.n&=~Ee}t.length=n}})(this),Ee=1<<--_e,ke=this.parent,Re=t,this.parent=void 0,this.deferStop&&this.stop()}}stop(){ke===this?this.deferStop=!0:this.active&&(Pe(this),this.onStop&&this.onStop(),this.active=!1)}}function Pe(e){const{deps:t}=e;if(t.length){for(let n=0;n<t.length;n++)t[n].delete(e);t.length=0}}function Te(e,t){e.effect&&(e=e.effect.fn);const n=new Ne(e);t&&(V(n,t),t.scope&&ve(n,t.scope)),t&&t.lazy||n.run();const r=n.run.bind(n);return r.effect=n,r}function Ve(e){e.effect.stop()}let Re=!0;const Le=[];function Ae(){Le.push(Re),Re=!1}function je(){const e=Le.pop();Re=void 0===e||e}function Be(e,t,n){if(Re&&ke){let t=Ce.get(e);t||Ce.set(e,t=new Map);let r=t.get(n);r||t.set(n,r=ye());Ie(r,void 0)}}function Ie(e,t){let n=!1;_e<=xe?we(e)||(e.n|=Ee,n=!be(e)):n=!e.has(ke),n&&(e.add(ke),ke.deps.push(e))}function Me(e,t,n,r,o,i){const a=Ce.get(e);if(!a)return;let l=[];if("clear"===t)l=[...a.values()];else if("length"===n&&j(e)){const e=Number(r);a.forEach(((t,n)=>{("length"===n||n>=e)&&l.push(t)}))}else switch(void 0!==n&&l.push(a.get(n)),t){case"add":j(e)?Z(n)&&l.push(a.get("length")):(l.push(a.get(Se)),B(e)&&l.push(a.get(Oe)));break;case"delete":j(e)||(l.push(a.get(Se)),B(e)&&l.push(a.get(Oe)));break;case"set":B(e)&&l.push(a.get(Se))}if(1===l.length)l[0]&&Fe(l[0]);else{const e=[];for(const t of l)t&&e.push(...t);Fe(ye(e))}}function Fe(e,t){const n=j(e)?e:[...e];for(const e of n)e.computed&&De(e,t);for(const e of n)e.computed||De(e,t)}function De(e,t){(e!==ke||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}const Ue=o("__proto__,__v_isRef,__isVue"),$e=new Set(Object.getOwnPropertyNames(Symbol).filter((e=>"arguments"!==e&&"caller"!==e)).map((e=>Symbol[e])).filter($)),He=Ye(),ze=Ye(!1,!0),qe=Ye(!0),We=Ye(!0,!0),Ke=Ge();function Ge(){const e={};return["includes","indexOf","lastIndexOf"].forEach((t=>{e[t]=function(...e){const n=It(this);for(let e=0,t=this.length;e<t;e++)Be(n,0,e+"");const r=n[t](...e);return-1===r||!1===r?n[t](...e.map(It)):r}})),["push","pop","shift","unshift","splice"].forEach((t=>{e[t]=function(...e){Ae();const n=It(this)[t].apply(this,e);return je(),n}})),e}function Ze(e){const t=It(this);return Be(t,0,e),t.hasOwnProperty(e)}function Ye(e=!1,t=!1){return function(n,r,o){if("__v_isReactive"===r)return!e;if("__v_isReadonly"===r)return e;if("__v_isShallow"===r)return t;if("__v_raw"===r&&o===(e?t?Ot:St:t?kt:xt).get(n))return n;const i=j(n);if(!e){if(i&&A(Ke,r))return Reflect.get(Ke,r,o);if("hasOwnProperty"===r)return Ze}const a=Reflect.get(n,r,o);return($(r)?$e.has(r):Ue(r))?a:(e||Be(n,0,r),t?a:Ht(a)?i&&Z(r)?a:a.value:H(a)?e?Tt(a):Nt(a):a)}}function Je(e=!1){return function(t,n,r,o){let i=t[n];if(At(i)&&Ht(i)&&!Ht(r))return!1;if(!e&&(jt(r)||At(r)||(i=It(i),r=It(r)),!j(t)&&Ht(i)&&!Ht(r)))return i.value=r,!0;const a=j(t)&&Z(n)?Number(n)<t.length:A(t,n),l=Reflect.set(t,n,r,o);return t===It(o)&&(a?ie(r,i)&&Me(t,"set",n,r):Me(t,"add",n,r)),l}}const Qe={get:He,set:Je(),deleteProperty:function(e,t){const n=A(e,t),r=(e[t],Reflect.deleteProperty(e,t));return r&&n&&Me(e,"delete",t,void 0),r},has:function(e,t){const n=Reflect.has(e,t);return $(t)&&$e.has(t)||Be(e,0,t),n},ownKeys:function(e){return Be(e,0,j(e)?"length":Se),Reflect.ownKeys(e)}},Xe={get:qe,set:(e,t)=>!0,deleteProperty:(e,t)=>!0},et=V({},Qe,{get:ze,set:Je(!0)}),tt=V({},Xe,{get:We}),nt=e=>e,rt=e=>Reflect.getPrototypeOf(e);function ot(e,t,n=!1,r=!1){const o=It(e=e.__v_raw),i=It(t);n||(t!==i&&Be(o,0,t),Be(o,0,i));const{has:a}=rt(o),l=r?nt:n?Dt:Ft;return a.call(o,t)?l(e.get(t)):a.call(o,i)?l(e.get(i)):void(e!==o&&e.get(t))}function it(e,t=!1){const n=this.__v_raw,r=It(n),o=It(e);return t||(e!==o&&Be(r,0,e),Be(r,0,o)),e===o?n.has(e):n.has(e)||n.has(o)}function at(e,t=!1){return e=e.__v_raw,!t&&Be(It(e),0,Se),Reflect.get(e,"size",e)}function lt(e){e=It(e);const t=It(this);return rt(t).has.call(t,e)||(t.add(e),Me(t,"add",e,e)),this}function st(e,t){t=It(t);const n=It(this),{has:r,get:o}=rt(n);let i=r.call(n,e);i||(e=It(e),i=r.call(n,e));const a=o.call(n,e);return n.set(e,t),i?ie(t,a)&&Me(n,"set",e,t):Me(n,"add",e,t),this}function ct(e){const t=It(this),{has:n,get:r}=rt(t);let o=n.call(t,e);o||(e=It(e),o=n.call(t,e));r&&r.call(t,e);const i=t.delete(e);return o&&Me(t,"delete",e,void 0),i}function ut(){const e=It(this),t=0!==e.size,n=e.clear();return t&&Me(e,"clear",void 0,void 0),n}function ft(e,t){return function(n,r){const o=this,i=o.__v_raw,a=It(i),l=t?nt:e?Dt:Ft;return!e&&Be(a,0,Se),i.forEach(((e,t)=>n.call(r,l(e),l(t),o)))}}function dt(e,t,n){return function(...r){const o=this.__v_raw,i=It(o),a=B(i),l="entries"===e||e===Symbol.iterator&&a,s="keys"===e&&a,c=o[e](...r),u=n?nt:t?Dt:Ft;return!t&&Be(i,0,s?Oe:Se),{next(){const{value:e,done:t}=c.next();return t?{value:e,done:t}:{value:l?[u(e[0]),u(e[1])]:u(e),done:t}},[Symbol.iterator](){return this}}}}function pt(e){return function(...t){return"delete"!==e&&this}}function ht(){const e={get(e){return ot(this,e)},get size(){return at(this)},has:it,add:lt,set:st,delete:ct,clear:ut,forEach:ft(!1,!1)},t={get(e){return ot(this,e,!1,!0)},get size(){return at(this)},has:it,add:lt,set:st,delete:ct,clear:ut,forEach:ft(!1,!0)},n={get(e){return ot(this,e,!0)},get size(){return at(this,!0)},has(e){return it.call(this,e,!0)},add:pt("add"),set:pt("set"),delete:pt("delete"),clear:pt("clear"),forEach:ft(!0,!1)},r={get(e){return ot(this,e,!0,!0)},get size(){return at(this,!0)},has(e){return it.call(this,e,!0)},add:pt("add"),set:pt("set"),delete:pt("delete"),clear:pt("clear"),forEach:ft(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach((o=>{e[o]=dt(o,!1,!1),n[o]=dt(o,!0,!1),t[o]=dt(o,!1,!0),r[o]=dt(o,!0,!0)})),[e,n,t,r]}const[vt,mt,gt,yt]=ht();function bt(e,t){const n=t?e?yt:gt:e?mt:vt;return(t,r,o)=>"__v_isReactive"===r?!e:"__v_isReadonly"===r?e:"__v_raw"===r?t:Reflect.get(A(n,r)&&r in t?n:t,r,o)}const wt={get:bt(!1,!1)},Ct={get:bt(!1,!0)},_t={get:bt(!0,!1)},Et={get:bt(!0,!0)};const xt=new WeakMap,kt=new WeakMap,St=new WeakMap,Ot=new WeakMap;function Nt(e){return At(e)?e:Rt(e,!1,Qe,wt,xt)}function Pt(e){return Rt(e,!1,et,Ct,kt)}function Tt(e){return Rt(e,!0,Xe,_t,St)}function Vt(e){return Rt(e,!0,tt,Et,Ot)}function Rt(e,t,n,r,o){if(!H(e))return e;if(e.__v_raw&&(!t||!e.__v_isReactive))return e;const i=o.get(e);if(i)return i;const a=(l=e).__v_skip||!Object.isExtensible(l)?0:function(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}(K(l));var l;if(0===a)return e;const s=new Proxy(e,2===a?r:n);return o.set(e,s),s}function Lt(e){return At(e)?Lt(e.__v_raw):!(!e||!e.__v_isReactive)}function At(e){return!(!e||!e.__v_isReadonly)}function jt(e){return!(!e||!e.__v_isShallow)}function Bt(e){return Lt(e)||At(e)}function It(e){const t=e&&e.__v_raw;return t?It(t):e}function Mt(e){return le(e,"__v_skip",!0),e}const Ft=e=>H(e)?Nt(e):e,Dt=e=>H(e)?Tt(e):e;function Ut(e){Re&&ke&&Ie((e=It(e)).dep||(e.dep=ye()))}function $t(e,t){const n=(e=It(e)).dep;n&&Fe(n)}function Ht(e){return!(!e||!0!==e.__v_isRef)}function zt(e){return Wt(e,!1)}function qt(e){return Wt(e,!0)}function Wt(e,t){return Ht(e)?e:new Kt(e,t)}class Kt{constructor(e,t){this.__v_isShallow=t,this.dep=void 0,this.__v_isRef=!0,this._rawValue=t?e:It(e),this._value=t?e:Ft(e)}get value(){return Ut(this),this._value}set value(e){const t=this.__v_isShallow||jt(e)||At(e);e=t?e:It(e),ie(e,this._rawValue)&&(this._rawValue=e,this._value=t?e:Ft(e),$t(this))}}function Gt(e){$t(e)}function Zt(e){return Ht(e)?e.value:e}const Yt={get:(e,t,n)=>Zt(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return Ht(o)&&!Ht(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function Jt(e){return Lt(e)?e:new Proxy(e,Yt)}class Qt{constructor(e){this.dep=void 0,this.__v_isRef=!0;const{get:t,set:n}=e((()=>Ut(this)),(()=>$t(this)));this._get=t,this._set=n}get value(){return this._get()}set value(e){this._set(e)}}function Xt(e){return new Qt(e)}function en(e){const t=j(e)?new Array(e.length):{};for(const n in e)t[n]=nn(e,n);return t}class tn{constructor(e,t,n){this._object=e,this._key=t,this._defaultValue=n,this.__v_isRef=!0}get value(){const e=this._object[this._key];return void 0===e?this._defaultValue:e}set value(e){this._object[this._key]=e}get dep(){return function(e,t){var n;return null===(n=Ce.get(e))||void 0===n?void 0:n.get(t)}(It(this._object),this._key)}}function nn(e,t,n){const r=e[t];return Ht(r)?r:new tn(e,t,n)}var rn;class on{constructor(e,t,n,r){this._setter=t,this.dep=void 0,this.__v_isRef=!0,this[rn]=!1,this._dirty=!0,this.effect=new Ne(e,(()=>{this._dirty||(this._dirty=!0,$t(this))})),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=n}get value(){const e=It(this);return Ut(e),!e._dirty&&e._cacheable||(e._dirty=!1,e._value=e.effect.run()),e._value}set value(e){this._setter(e)}}rn="__v_isReadonly";function an(e,...t){}function ln(e,t){}function sn(e,t,n,r){let o;try{o=r?e(...r):e()}catch(e){un(e,t,n)}return o}function cn(e,t,n,r){if(D(e)){const o=sn(e,t,n,r);return o&&z(o)&&o.catch((e=>{un(e,t,n)})),o}const o=[];for(let i=0;i<e.length;i++)o.push(cn(e[i],t,n,r));return o}function un(e,t,n,r=!0){t&&t.vnode;if(t){let r=t.parent;const o=t.proxy,i=n;for(;r;){const t=r.ec;if(t)for(let n=0;n<t.length;n++)if(!1===t[n](e,o,i))return;r=r.parent}const a=t.appContext.config.errorHandler;if(a)return void sn(a,null,10,[e,o,i])}}let fn=!1,dn=!1;const pn=[];let hn=0;const vn=[];let mn=null,gn=0;const yn=Promise.resolve();let bn=null;function wn(e){const t=bn||yn;return e?t.then(this?e.bind(this):e):t}function Cn(e){pn.length&&pn.includes(e,fn&&e.allowRecurse?hn+1:hn)||(null==e.id?pn.push(e):pn.splice(function(e){let t=hn+1,n=pn.length;for(;t<n;){const r=t+n>>>1;Sn(pn[r])<e?t=r+1:n=r}return t}(e.id),0,e),_n())}function _n(){fn||dn||(dn=!0,bn=yn.then(Nn))}function En(e){j(e)?vn.push(...e):mn&&mn.includes(e,e.allowRecurse?gn+1:gn)||vn.push(e),_n()}function xn(e,t=(fn?hn+1:0)){for(0;t<pn.length;t++){const e=pn[t];e&&e.pre&&(pn.splice(t,1),t--,e())}}function kn(e){if(vn.length){const e=[...new Set(vn)];if(vn.length=0,mn)return void mn.push(...e);for(mn=e,mn.sort(((e,t)=>Sn(e)-Sn(t))),gn=0;gn<mn.length;gn++)mn[gn]();mn=null,gn=0}}const Sn=e=>null==e.id?1/0:e.id,On=(e,t)=>{const n=Sn(e)-Sn(t);if(0===n){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function Nn(e){dn=!1,fn=!0,pn.sort(On);try{for(hn=0;hn<pn.length;hn++){const e=pn[hn];e&&!1!==e.active&&sn(e,null,14)}}finally{hn=0,pn.length=0,kn(),fn=!1,bn=null,(pn.length||vn.length)&&Nn(e)}}new Set;new Map;let Pn,Tn=[],Vn=!1;function Rn(e,t){var n,r;if(Pn=e,Pn)Pn.enabled=!0,Tn.forEach((({event:e,args:t})=>Pn.emit(e,...t))),Tn=[];else if("undefined"!=typeof window&&window.HTMLElement&&!(null===(r=null===(n=window.navigator)||void 0===n?void 0:n.userAgent)||void 0===r?void 0:r.includes("jsdom"))){(t.__VUE_DEVTOOLS_HOOK_REPLAY__=t.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push((e=>{Rn(e,t)})),setTimeout((()=>{Pn||(t.__VUE_DEVTOOLS_HOOK_REPLAY__=null,Vn=!0,Tn=[])}),3e3)}else Vn=!0,Tn=[]}function Ln(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||x;let o=n;const i=t.startsWith("update:"),a=i&&t.slice(7);if(a&&a in r){const e=`${"modelValue"===a?"model":a}Modifiers`,{number:t,trim:i}=r[e]||x;i&&(o=n.map((e=>U(e)?e.trim():e))),t&&(o=n.map(se))}let l;let s=r[l=oe(t)]||r[l=oe(ee(t))];!s&&i&&(s=r[l=oe(ne(t))]),s&&cn(s,e,6,o);const c=r[l+"Once"];if(c){if(e.emitted){if(e.emitted[l])return}else e.emitted={};e.emitted[l]=!0,cn(c,e,6,o)}}function An(e,t,n=!1){const r=t.emitsCache,o=r.get(e);if(void 0!==o)return o;const i=e.emits;let a={},l=!1;if(!D(e)){const r=e=>{const n=An(e,t,!0);n&&(l=!0,V(a,n))};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}return i||l?(j(i)?i.forEach((e=>a[e]=null)):V(a,i),H(e)&&r.set(e,a),a):(H(e)&&r.set(e,null),null)}function jn(e,t){return!(!e||!P(t))&&(t=t.slice(2).replace(/Once$/,""),A(e,t[0].toLowerCase()+t.slice(1))||A(e,ne(t))||A(e,t))}let Bn=null,In=null;function Mn(e){const t=Bn;return Bn=e,In=e&&e.type.__scopeId||null,t}function Fn(e){In=e}function Dn(){In=null}const Un=e=>$n;function $n(e,t=Bn,n){if(!t)return e;if(e._n)return e;const r=(...n)=>{r._d&&mi(-1);const o=Mn(t);let i;try{i=e(...n)}finally{Mn(o),r._d&&mi(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function Hn(e){const{type:t,vnode:n,proxy:r,withProxy:o,props:i,propsOptions:[a],slots:l,attrs:s,emit:c,render:u,renderCache:f,data:d,setupState:p,ctx:h,inheritAttrs:v}=e;let m,g;const y=Mn(e);try{if(4&n.shapeFlag){const e=o||r;m=Ai(u.call(e,e,f,i,p,d,h)),g=s}else{const e=t;0,m=Ai(e.length>1?e(i,{attrs:s,slots:l,emit:c}):e(i,null)),g=t.props?s:qn(s)}}catch(t){ui.length=0,un(t,e,1),m=Oi(si)}let b=m;if(g&&!1!==v){const e=Object.keys(g),{shapeFlag:t}=b;e.length&&7&t&&(a&&e.some(T)&&(g=Wn(g,a)),b=Ti(b,g))}return n.dirs&&(b=Ti(b),b.dirs=b.dirs?b.dirs.concat(n.dirs):n.dirs),n.transition&&(b.transition=n.transition),m=b,Mn(y),m}function zn(e){let t;for(let n=0;n<e.length;n++){const r=e[n];if(!wi(r))return;if(r.type!==si||"v-if"===r.children){if(t)return;t=r}}return t}const qn=e=>{let t;for(const n in e)("class"===n||"style"===n||P(n))&&((t||(t={}))[n]=e[n]);return t},Wn=(e,t)=>{const n={};for(const r in e)T(r)&&r.slice(9)in t||(n[r]=e[r]);return n};function Kn(e,t,n){const r=Object.keys(t);if(r.length!==Object.keys(e).length)return!0;for(let o=0;o<r.length;o++){const i=r[o];if(t[i]!==e[i]&&!jn(n,i))return!0}return!1}function Gn({vnode:e,parent:t},n){for(;t&&t.subTree===e;)(e=t.vnode).el=n,t=t.parent}const Zn=e=>e.__isSuspense,Yn={name:"Suspense",__isSuspense:!0,process(e,t,n,r,o,i,a,l,s,c){null==e?function(e,t,n,r,o,i,a,l,s){const{p:c,o:{createElement:u}}=s,f=u("div"),d=e.suspense=Qn(e,o,r,t,f,n,i,a,l,s);c(null,d.pendingBranch=e.ssContent,f,null,r,d,i,a),d.deps>0?(Jn(e,"onPending"),Jn(e,"onFallback"),c(null,e.ssFallback,t,n,r,null,i,a),tr(d,e.ssFallback)):d.resolve()}(t,n,r,o,i,a,l,s,c):function(e,t,n,r,o,i,a,l,{p:s,um:c,o:{createElement:u}}){const f=t.suspense=e.suspense;f.vnode=t,t.el=e.el;const d=t.ssContent,p=t.ssFallback,{activeBranch:h,pendingBranch:v,isInFallback:m,isHydrating:g}=f;if(v)f.pendingBranch=d,Ci(d,v)?(s(v,d,f.hiddenContainer,null,o,f,i,a,l),f.deps<=0?f.resolve():m&&(s(h,p,n,r,o,null,i,a,l),tr(f,p))):(f.pendingId++,g?(f.isHydrating=!1,f.activeBranch=v):c(v,o,f),f.deps=0,f.effects.length=0,f.hiddenContainer=u("div"),m?(s(null,d,f.hiddenContainer,null,o,f,i,a,l),f.deps<=0?f.resolve():(s(h,p,n,r,o,null,i,a,l),tr(f,p))):h&&Ci(d,h)?(s(h,d,n,r,o,f,i,a,l),f.resolve(!0)):(s(null,d,f.hiddenContainer,null,o,f,i,a,l),f.deps<=0&&f.resolve()));else if(h&&Ci(d,h))s(h,d,n,r,o,f,i,a,l),tr(f,d);else if(Jn(t,"onPending"),f.pendingBranch=d,f.pendingId++,s(null,d,f.hiddenContainer,null,o,f,i,a,l),f.deps<=0)f.resolve();else{const{timeout:e,pendingId:t}=f;e>0?setTimeout((()=>{f.pendingId===t&&f.fallback(p)}),e):0===e&&f.fallback(p)}}(e,t,n,r,o,a,l,s,c)},hydrate:function(e,t,n,r,o,i,a,l,s){const c=t.suspense=Qn(t,r,n,e.parentNode,document.createElement("div"),null,o,i,a,l,!0),u=s(e,c.pendingBranch=t.ssContent,n,c,i,a);0===c.deps&&c.resolve();return u},create:Qn,normalize:function(e){const{shapeFlag:t,children:n}=e,r=32&t;e.ssContent=Xn(r?n.default:n),e.ssFallback=r?Xn(n.fallback):Oi(si)}};function Jn(e,t){const n=e.props&&e.props[t];D(n)&&n()}function Qn(e,t,n,r,o,i,a,l,s,c,u=!1){const{p:f,m:d,um:p,n:h,o:{parentNode:v,remove:m}}=c,g=e.props?ce(e.props.timeout):void 0;const y={vnode:e,parent:t,parentComponent:n,isSVG:a,container:r,hiddenContainer:o,anchor:i,deps:0,pendingId:0,timeout:"number"==typeof g?g:-1,activeBranch:null,pendingBranch:null,isInFallback:!0,isHydrating:u,isUnmounted:!1,effects:[],resolve(e=!1){const{vnode:t,activeBranch:n,pendingBranch:r,pendingId:o,effects:i,parentComponent:a,container:l}=y;if(y.isHydrating)y.isHydrating=!1;else if(!e){const e=n&&r.transition&&"out-in"===r.transition.mode;e&&(n.transition.afterLeave=()=>{o===y.pendingId&&d(r,l,t,0)});let{anchor:t}=y;n&&(t=h(n),p(n,a,y,!0)),e||d(r,l,t,0)}tr(y,r),y.pendingBranch=null,y.isInFallback=!1;let s=y.parent,c=!1;for(;s;){if(s.pendingBranch){s.effects.push(...i),c=!0;break}s=s.parent}c||En(i),y.effects=[],Jn(t,"onResolve")},fallback(e){if(!y.pendingBranch)return;const{vnode:t,activeBranch:n,parentComponent:r,container:o,isSVG:i}=y;Jn(t,"onFallback");const a=h(n),c=()=>{y.isInFallback&&(f(null,e,o,a,r,null,i,l,s),tr(y,e))},u=e.transition&&"out-in"===e.transition.mode;u&&(n.transition.afterLeave=c),y.isInFallback=!0,p(n,r,null,!0),u||c()},move(e,t,n){y.activeBranch&&d(y.activeBranch,e,t,n),y.container=e},next:()=>y.activeBranch&&h(y.activeBranch),registerDep(e,t){const n=!!y.pendingBranch;n&&y.deps++;const r=e.vnode.el;e.asyncDep.catch((t=>{un(t,e,0)})).then((o=>{if(e.isUnmounted||y.isUnmounted||y.pendingId!==e.suspenseId)return;e.asyncResolved=!0;const{vnode:i}=e;Ji(e,o,!1),r&&(i.el=r);const l=!r&&e.subTree.el;t(e,i,v(r||e.subTree.el),r?null:h(e.subTree),y,a,s),l&&m(l),Gn(e,i.el),n&&0==--y.deps&&y.resolve()}))},unmount(e,t){y.isUnmounted=!0,y.activeBranch&&p(y.activeBranch,n,e,t),y.pendingBranch&&p(y.pendingBranch,n,e,t)}};return y}function Xn(e){let t;if(D(e)){const n=vi&&e._c;n&&(e._d=!1,di()),e=e(),n&&(e._d=!0,t=fi,pi())}if(j(e)){const t=zn(e);0,e=t}return e=Ai(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter((t=>t!==e))),e}function er(e,t){t&&t.pendingBranch?j(e)?t.effects.push(...e):t.effects.push(e):En(e)}function tr(e,t){e.activeBranch=t;const{vnode:n,parentComponent:r}=e,o=n.el=t.el;r&&r.subTree===n&&(r.vnode.el=o,Gn(r,o))}function nr(e,t){if($i){let n=$i.provides;const r=$i.parent&&$i.parent.provides;r===n&&(n=$i.provides=Object.create(r)),n[e]=t}else 0}function rr(e,t,n=!1){const r=$i||Bn;if(r){const o=null==r.parent?r.vnode.appContext&&r.vnode.appContext.provides:r.parent.provides;if(o&&e in o)return o[e];if(arguments.length>1)return n&&D(t)?t.call(r.proxy):t}else 0}function or(e,t){return cr(e,null,t)}function ir(e,t){return cr(e,null,{flush:"post"})}function ar(e,t){return cr(e,null,{flush:"sync"})}const lr={};function sr(e,t,n){return cr(e,t,n)}function cr(e,t,{immediate:n,deep:r,flush:o,onTrack:i,onTrigger:a}=x){const l=me()===(null==$i?void 0:$i.scope)?$i:null;let s,c,u=!1,f=!1;if(Ht(e)?(s=()=>e.value,u=jt(e)):Lt(e)?(s=()=>e,r=!0):j(e)?(f=!0,u=e.some((e=>Lt(e)||jt(e))),s=()=>e.map((e=>Ht(e)?e.value:Lt(e)?dr(e):D(e)?sn(e,l,2):void 0))):s=D(e)?t?()=>sn(e,l,2):()=>{if(!l||!l.isUnmounted)return c&&c(),cn(e,l,3,[p])}:S,t&&r){const e=s;s=()=>dr(e())}let d,p=e=>{c=g.onStop=()=>{sn(e,l,4)}};if(Zi){if(p=S,t?n&&cn(t,l,3,[s(),f?[]:void 0,p]):s(),"sync"!==o)return S;{const e=ya();d=e.__watcherHandles||(e.__watcherHandles=[])}}let h=f?new Array(e.length).fill(lr):lr;const v=()=>{if(g.active)if(t){const e=g.run();(r||u||(f?e.some(((e,t)=>ie(e,h[t]))):ie(e,h)))&&(c&&c(),cn(t,l,3,[e,h===lr?void 0:f&&h[0]===lr?[]:h,p]),h=e)}else g.run()};let m;v.allowRecurse=!!t,"sync"===o?m=v:"post"===o?m=()=>Ko(v,l&&l.suspense):(v.pre=!0,l&&(v.id=l.uid),m=()=>Cn(v));const g=new Ne(s,m);t?n?v():h=g.run():"post"===o?Ko(g.run.bind(g),l&&l.suspense):g.run();const y=()=>{g.stop(),l&&l.scope&&R(l.scope.effects,g)};return d&&d.push(y),y}function ur(e,t,n){const r=this.proxy,o=U(e)?e.includes(".")?fr(r,e):()=>r[e]:e.bind(r,r);let i;D(t)?i=t:(i=t.handler,n=t);const a=$i;zi(this);const l=cr(o,i.bind(r),n);return a?zi(a):qi(),l}function fr(e,t){const n=t.split(".");return()=>{let t=e;for(let e=0;e<n.length&&t;e++)t=t[n[e]];return t}}function dr(e,t){if(!H(e)||e.__v_skip)return e;if((t=t||new Set).has(e))return e;if(t.add(e),Ht(e))dr(e.value,t);else if(j(e))for(let n=0;n<e.length;n++)dr(e[n],t);else if(I(e)||B(e))e.forEach((e=>{dr(e,t)}));else if(G(e))for(const n in e)dr(e[n],t);return e}function pr(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Mr((()=>{e.isMounted=!0})),Ur((()=>{e.isUnmounting=!0})),e}const hr=[Function,Array],vr={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:hr,onEnter:hr,onAfterEnter:hr,onEnterCancelled:hr,onBeforeLeave:hr,onLeave:hr,onAfterLeave:hr,onLeaveCancelled:hr,onBeforeAppear:hr,onAppear:hr,onAfterAppear:hr,onAppearCancelled:hr},setup(e,{slots:t}){const n=Hi(),r=pr();let o;return()=>{const i=t.default&&Cr(t.default(),!0);if(!i||!i.length)return;let a=i[0];if(i.length>1){let e=!1;for(const t of i)if(t.type!==si){0,a=t,e=!0;break}}const l=It(e),{mode:s}=l;if(r.isLeaving)return yr(a);const c=br(a);if(!c)return yr(a);const u=gr(c,l,r,n);wr(c,u);const f=n.subTree,d=f&&br(f);let p=!1;const{getTransitionKey:h}=c.type;if(h){const e=h();void 0===o?o=e:e!==o&&(o=e,p=!0)}if(d&&d.type!==si&&(!Ci(c,d)||p)){const e=gr(d,l,r,n);if(wr(d,e),"out-in"===s)return r.isLeaving=!0,e.afterLeave=()=>{r.isLeaving=!1,!1!==n.update.active&&n.update()},yr(a);"in-out"===s&&c.type!==si&&(e.delayLeave=(e,t,n)=>{mr(r,d)[String(d.key)]=d,e._leaveCb=()=>{t(),e._leaveCb=void 0,delete u.delayedLeave},u.delayedLeave=n})}return a}}};function mr(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function gr(e,t,n,r){const{appear:o,mode:i,persisted:a=!1,onBeforeEnter:l,onEnter:s,onAfterEnter:c,onEnterCancelled:u,onBeforeLeave:f,onLeave:d,onAfterLeave:p,onLeaveCancelled:h,onBeforeAppear:v,onAppear:m,onAfterAppear:g,onAppearCancelled:y}=t,b=String(e.key),w=mr(n,e),C=(e,t)=>{e&&cn(e,r,9,t)},_=(e,t)=>{const n=t[1];C(e,t),j(e)?e.every((e=>e.length<=1))&&n():e.length<=1&&n()},E={mode:i,persisted:a,beforeEnter(t){let r=l;if(!n.isMounted){if(!o)return;r=v||l}t._leaveCb&&t._leaveCb(!0);const i=w[b];i&&Ci(e,i)&&i.el._leaveCb&&i.el._leaveCb(),C(r,[t])},enter(e){let t=s,r=c,i=u;if(!n.isMounted){if(!o)return;t=m||s,r=g||c,i=y||u}let a=!1;const l=e._enterCb=t=>{a||(a=!0,C(t?i:r,[e]),E.delayedLeave&&E.delayedLeave(),e._enterCb=void 0)};t?_(t,[e,l]):l()},leave(t,r){const o=String(e.key);if(t._enterCb&&t._enterCb(!0),n.isUnmounting)return r();C(f,[t]);let i=!1;const a=t._leaveCb=n=>{i||(i=!0,r(),C(n?h:p,[t]),t._leaveCb=void 0,w[o]===e&&delete w[o])};w[o]=e,d?_(d,[t,a]):a()},clone:e=>gr(e,t,n,r)};return E}function yr(e){if(Sr(e))return(e=Ti(e)).children=null,e}function br(e){return Sr(e)?e.children?e.children[0]:void 0:e}function wr(e,t){6&e.shapeFlag&&e.component?wr(e.component.subTree,t):128&e.shapeFlag?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Cr(e,t=!1,n){let r=[],o=0;for(let i=0;i<e.length;i++){let a=e[i];const l=null==n?a.key:String(n)+String(null!=a.key?a.key:i);a.type===ai?(128&a.patchFlag&&o++,r=r.concat(Cr(a.children,t,l))):(t||a.type!==si)&&r.push(null!=l?Ti(a,{key:l}):a)}if(o>1)for(let e=0;e<r.length;e++)r[e].patchFlag=-2;return r}function _r(e){return D(e)?{setup:e,name:e.name}:e}const Er=e=>!!e.type.__asyncLoader;function xr(e){D(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:o=200,timeout:i,suspensible:a=!0,onError:l}=e;let s,c=null,u=0;const f=()=>{let e;return c||(e=c=t().catch((e=>{if(e=e instanceof Error?e:new Error(String(e)),l)return new Promise(((t,n)=>{l(e,(()=>t((u++,c=null,f()))),(()=>n(e)),u+1)}));throw e})).then((t=>e!==c&&c?c:(t&&(t.__esModule||"Module"===t[Symbol.toStringTag])&&(t=t.default),s=t,t))))};return _r({name:"AsyncComponentWrapper",__asyncLoader:f,get __asyncResolved(){return s},setup(){const e=$i;if(s)return()=>kr(s,e);const t=t=>{c=null,un(t,e,13,!r)};if(a&&e.suspense||Zi)return f().then((t=>()=>kr(t,e))).catch((e=>(t(e),()=>r?Oi(r,{error:e}):null)));const l=zt(!1),u=zt(),d=zt(!!o);return o&&setTimeout((()=>{d.value=!1}),o),null!=i&&setTimeout((()=>{if(!l.value&&!u.value){const e=new Error(`Async component timed out after ${i}ms.`);t(e),u.value=e}}),i),f().then((()=>{l.value=!0,e.parent&&Sr(e.parent.vnode)&&Cn(e.parent.update)})).catch((e=>{t(e),u.value=e})),()=>l.value&&s?kr(s,e):u.value&&r?Oi(r,{error:u.value}):n&&!d.value?Oi(n):void 0}})}function kr(e,t){const{ref:n,props:r,children:o,ce:i}=t.vnode,a=Oi(e,r,o);return a.ref=n,a.ce=i,delete t.vnode.ce,a}const Sr=e=>e.type.__isKeepAlive,Or={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=Hi(),r=n.ctx;if(!r.renderer)return()=>{const e=t.default&&t.default();return e&&1===e.length?e[0]:e};const o=new Map,i=new Set;let a=null;const l=n.suspense,{renderer:{p:s,m:c,um:u,o:{createElement:f}}}=r,d=f("div");function p(e){Lr(e),u(e,n,l,!0)}function h(e){o.forEach(((t,n)=>{const r=ra(t.type);!r||e&&e(r)||v(n)}))}function v(e){const t=o.get(e);a&&Ci(t,a)?a&&Lr(a):p(t),o.delete(e),i.delete(e)}r.activate=(e,t,n,r,o)=>{const i=e.component;c(e,t,n,0,l),s(i.vnode,e,t,n,i,l,r,e.slotScopeIds,o),Ko((()=>{i.isDeactivated=!1,i.a&&ae(i.a);const t=e.props&&e.props.onVnodeMounted;t&&Mi(t,i.parent,e)}),l)},r.deactivate=e=>{const t=e.component;c(e,d,null,1,l),Ko((()=>{t.da&&ae(t.da);const n=e.props&&e.props.onVnodeUnmounted;n&&Mi(n,t.parent,e),t.isDeactivated=!0}),l)},sr((()=>[e.include,e.exclude]),(([e,t])=>{e&&h((t=>Nr(e,t))),t&&h((e=>!Nr(t,e)))}),{flush:"post",deep:!0});let m=null;const g=()=>{null!=m&&o.set(m,Ar(n.subTree))};return Mr(g),Dr(g),Ur((()=>{o.forEach((e=>{const{subTree:t,suspense:r}=n,o=Ar(t);if(e.type!==o.type||e.key!==o.key)p(e);else{Lr(o);const e=o.component.da;e&&Ko(e,r)}}))})),()=>{if(m=null,!t.default)return null;const n=t.default(),r=n[0];if(n.length>1)return a=null,n;if(!(wi(r)&&(4&r.shapeFlag||128&r.shapeFlag)))return a=null,r;let l=Ar(r);const s=l.type,c=ra(Er(l)?l.type.__asyncResolved||{}:s),{include:u,exclude:f,max:d}=e;if(u&&(!c||!Nr(u,c))||f&&c&&Nr(f,c))return a=l,r;const p=null==l.key?s:l.key,h=o.get(p);return l.el&&(l=Ti(l),128&r.shapeFlag&&(r.ssContent=l)),m=p,h?(l.el=h.el,l.component=h.component,l.transition&&wr(l,l.transition),l.shapeFlag|=512,i.delete(p),i.add(p)):(i.add(p),d&&i.size>parseInt(d,10)&&v(i.values().next().value)),l.shapeFlag|=256,a=l,Zn(r.type)?r:l}}};function Nr(e,t){return j(e)?e.some((e=>Nr(e,t))):U(e)?e.split(",").includes(t):!!F(e)&&e.test(t)}function Pr(e,t){Vr(e,"a",t)}function Tr(e,t){Vr(e,"da",t)}function Vr(e,t,n=$i){const r=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()});if(jr(t,r,n),n){let e=n.parent;for(;e&&e.parent;)Sr(e.parent.vnode)&&Rr(r,t,n,e),e=e.parent}}function Rr(e,t,n,r){const o=jr(t,e,r,!0);$r((()=>{R(r[t],o)}),n)}function Lr(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function Ar(e){return 128&e.shapeFlag?e.ssContent:e}function jr(e,t,n=$i,r=!1){if(n){const o=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...r)=>{if(n.isUnmounted)return;Ae(),zi(n);const o=cn(t,n,e,r);return qi(),je(),o});return r?o.unshift(i):o.push(i),i}}const Br=e=>(t,n=$i)=>(!Zi||"sp"===e)&&jr(e,((...e)=>t(...e)),n),Ir=Br("bm"),Mr=Br("m"),Fr=Br("bu"),Dr=Br("u"),Ur=Br("bum"),$r=Br("um"),Hr=Br("sp"),zr=Br("rtg"),qr=Br("rtc");function Wr(e,t=$i){jr("ec",e,t)}function Kr(e,t){const n=Bn;if(null===n)return e;const r=na(n)||n.proxy,o=e.dirs||(e.dirs=[]);for(let e=0;e<t.length;e++){let[n,i,a,l=x]=t[e];n&&(D(n)&&(n={mounted:n,updated:n}),n.deep&&dr(i),o.push({dir:n,instance:r,value:i,oldValue:void 0,arg:a,modifiers:l}))}return e}function Gr(e,t,n,r){const o=e.dirs,i=t&&t.dirs;for(let a=0;a<o.length;a++){const l=o[a];i&&(l.oldValue=i[a].value);let s=l.dir[r];s&&(Ae(),cn(s,n,8,[e.el,l,e,t]),je())}}const Zr="components",Yr="directives";function Jr(e,t){return to(Zr,e,!0,t)||e}const Qr=Symbol();function Xr(e){return U(e)?to(Zr,e,!1)||e:e||Qr}function eo(e){return to(Yr,e)}function to(e,t,n=!0,r=!1){const o=Bn||$i;if(o){const n=o.type;if(e===Zr){const e=ra(n,!1);if(e&&(e===t||e===ee(t)||e===re(ee(t))))return n}const i=no(o[e]||n[e],t)||no(o.appContext[e],t);return!i&&r?n:i}}function no(e,t){return e&&(e[t]||e[ee(t)]||e[re(ee(t))])}function ro(e,t,n,r){let o;const i=n&&n[r];if(j(e)||U(e)){o=new Array(e.length);for(let n=0,r=e.length;n<r;n++)o[n]=t(e[n],n,void 0,i&&i[n])}else if("number"==typeof e){0,o=new Array(e);for(let n=0;n<e;n++)o[n]=t(n+1,n,void 0,i&&i[n])}else if(H(e))if(e[Symbol.iterator])o=Array.from(e,((e,n)=>t(e,n,void 0,i&&i[n])));else{const n=Object.keys(e);o=new Array(n.length);for(let r=0,a=n.length;r<a;r++){const a=n[r];o[r]=t(e[a],a,r,i&&i[r])}}else o=[];return n&&(n[r]=o),o}function oo(e,t){for(let n=0;n<t.length;n++){const r=t[n];if(j(r))for(let t=0;t<r.length;t++)e[r[t].name]=r[t].fn;else r&&(e[r.name]=r.key?(...e)=>{const t=r.fn(...e);return t&&(t.key=r.key),t}:r.fn)}return e}function io(e,t,n={},r,o){if(Bn.isCE||Bn.parent&&Er(Bn.parent)&&Bn.parent.isCE)return"default"!==t&&(n.name=t),Oi("slot",n,r&&r());let i=e[t];i&&i._c&&(i._d=!1),di();const a=i&&ao(i(n)),l=bi(ai,{key:n.key||a&&a.key||`_${t}`},a||(r?r():[]),a&&1===e._?64:-2);return!o&&l.scopeId&&(l.slotScopeIds=[l.scopeId+"-s"]),i&&i._c&&(i._d=!0),l}function ao(e){return e.some((e=>!wi(e)||e.type!==si&&!(e.type===ai&&!ao(e.children))))?e:null}function lo(e,t){const n={};for(const r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:oe(r)]=e[r];return n}const so=e=>e?Wi(e)?na(e)||e.proxy:so(e.parent):null,co=V(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>so(e.parent),$root:e=>so(e.root),$emit:e=>e.emit,$options:e=>yo(e),$forceUpdate:e=>e.f||(e.f=()=>Cn(e.update)),$nextTick:e=>e.n||(e.n=wn.bind(e.proxy)),$watch:e=>ur.bind(e)}),uo=(e,t)=>e!==x&&!e.__isScriptSetup&&A(e,t),fo={get({_:e},t){const{ctx:n,setupState:r,data:o,props:i,accessCache:a,type:l,appContext:s}=e;let c;if("$"!==t[0]){const l=a[t];if(void 0!==l)switch(l){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return i[t]}else{if(uo(r,t))return a[t]=1,r[t];if(o!==x&&A(o,t))return a[t]=2,o[t];if((c=e.propsOptions[0])&&A(c,t))return a[t]=3,i[t];if(n!==x&&A(n,t))return a[t]=4,n[t];ho&&(a[t]=0)}}const u=co[t];let f,d;return u?("$attrs"===t&&Be(e,0,t),u(e)):(f=l.__cssModules)&&(f=f[t])?f:n!==x&&A(n,t)?(a[t]=4,n[t]):(d=s.config.globalProperties,A(d,t)?d[t]:void 0)},set({_:e},t,n){const{data:r,setupState:o,ctx:i}=e;return uo(o,t)?(o[t]=n,!0):r!==x&&A(r,t)?(r[t]=n,!0):!A(e.props,t)&&(("$"!==t[0]||!(t.slice(1)in e))&&(i[t]=n,!0))},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:o,propsOptions:i}},a){let l;return!!n[a]||e!==x&&A(e,a)||uo(t,a)||(l=i[0])&&A(l,a)||A(r,a)||A(co,a)||A(o.config.globalProperties,a)},defineProperty(e,t,n){return null!=n.get?e._.accessCache[t]=0:A(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};const po=V({},fo,{get(e,t){if(t!==Symbol.unscopables)return fo.get(e,t,e)},has:(e,t)=>"_"!==t[0]&&!a(t)});let ho=!0;function vo(e){const t=yo(e),n=e.proxy,r=e.ctx;ho=!1,t.beforeCreate&&mo(t.beforeCreate,e,"bc");const{data:o,computed:i,methods:a,watch:l,provide:s,inject:c,created:u,beforeMount:f,mounted:d,beforeUpdate:p,updated:h,activated:v,deactivated:m,beforeDestroy:g,beforeUnmount:y,destroyed:b,unmounted:w,render:C,renderTracked:_,renderTriggered:E,errorCaptured:x,serverPrefetch:k,expose:O,inheritAttrs:N,components:P,directives:T,filters:V}=t;if(c&&function(e,t,n=S,r=!1){j(e)&&(e=_o(e));for(const n in e){const o=e[n];let i;i=H(o)?"default"in o?rr(o.from||n,o.default,!0):rr(o.from||n):rr(o),Ht(i)&&r?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>i.value,set:e=>i.value=e}):t[n]=i}}(c,r,null,e.appContext.config.unwrapInjectedRef),a)for(const e in a){const t=a[e];D(t)&&(r[e]=t.bind(n))}if(o){0;const t=o.call(n,n);0,H(t)&&(e.data=Nt(t))}if(ho=!0,i)for(const e in i){const t=i[e],o=D(t)?t.bind(n,n):D(t.get)?t.get.bind(n,n):S;0;const a=!D(t)&&D(t.set)?t.set.bind(n):S,l=ia({get:o,set:a});Object.defineProperty(r,e,{enumerable:!0,configurable:!0,get:()=>l.value,set:e=>l.value=e})}if(l)for(const e in l)go(l[e],r,n,e);if(s){const e=D(s)?s.call(n):s;Reflect.ownKeys(e).forEach((t=>{nr(t,e[t])}))}function R(e,t){j(t)?t.forEach((t=>e(t.bind(n)))):t&&e(t.bind(n))}if(u&&mo(u,e,"c"),R(Ir,f),R(Mr,d),R(Fr,p),R(Dr,h),R(Pr,v),R(Tr,m),R(Wr,x),R(qr,_),R(zr,E),R(Ur,y),R($r,w),R(Hr,k),j(O))if(O.length){const t=e.exposed||(e.exposed={});O.forEach((e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t})}))}else e.exposed||(e.exposed={});C&&e.render===S&&(e.render=C),null!=N&&(e.inheritAttrs=N),P&&(e.components=P),T&&(e.directives=T)}function mo(e,t,n){cn(j(e)?e.map((e=>e.bind(t.proxy))):e.bind(t.proxy),t,n)}function go(e,t,n,r){const o=r.includes(".")?fr(n,r):()=>n[r];if(U(e)){const n=t[e];D(n)&&sr(o,n)}else if(D(e))sr(o,e.bind(n));else if(H(e))if(j(e))e.forEach((e=>go(e,t,n,r)));else{const r=D(e.handler)?e.handler.bind(n):t[e.handler];D(r)&&sr(o,r,e)}else 0}function yo(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:i,config:{optionMergeStrategies:a}}=e.appContext,l=i.get(t);let s;return l?s=l:o.length||n||r?(s={},o.length&&o.forEach((e=>bo(s,e,a,!0))),bo(s,t,a)):s=t,H(t)&&i.set(t,s),s}function bo(e,t,n,r=!1){const{mixins:o,extends:i}=t;i&&bo(e,i,n,!0),o&&o.forEach((t=>bo(e,t,n,!0)));for(const o in t)if(r&&"expose"===o);else{const r=wo[o]||n&&n[o];e[o]=r?r(e[o],t[o]):t[o]}return e}const wo={data:Co,props:xo,emits:xo,methods:xo,computed:xo,beforeCreate:Eo,created:Eo,beforeMount:Eo,mounted:Eo,beforeUpdate:Eo,updated:Eo,beforeDestroy:Eo,beforeUnmount:Eo,destroyed:Eo,unmounted:Eo,activated:Eo,deactivated:Eo,errorCaptured:Eo,serverPrefetch:Eo,components:xo,directives:xo,watch:function(e,t){if(!e)return t;if(!t)return e;const n=V(Object.create(null),e);for(const r in t)n[r]=Eo(e[r],t[r]);return n},provide:Co,inject:function(e,t){return xo(_o(e),_o(t))}};function Co(e,t){return t?e?function(){return V(D(e)?e.call(this,this):e,D(t)?t.call(this,this):t)}:t:e}function _o(e){if(j(e)){const t={};for(let n=0;n<e.length;n++)t[e[n]]=e[n];return t}return e}function Eo(e,t){return e?[...new Set([].concat(e,t))]:t}function xo(e,t){return e?V(V(Object.create(null),e),t):t}function ko(e,t,n,r){const[o,i]=e.propsOptions;let a,l=!1;if(t)for(let s in t){if(Y(s))continue;const c=t[s];let u;o&&A(o,u=ee(s))?i&&i.includes(u)?(a||(a={}))[u]=c:n[u]=c:jn(e.emitsOptions,s)||s in r&&c===r[s]||(r[s]=c,l=!0)}if(i){const t=It(n),r=a||x;for(let a=0;a<i.length;a++){const l=i[a];n[l]=So(o,t,l,r[l],e,!A(r,l))}}return l}function So(e,t,n,r,o,i){const a=e[n];if(null!=a){const e=A(a,"default");if(e&&void 0===r){const e=a.default;if(a.type!==Function&&D(e)){const{propsDefaults:i}=o;n in i?r=i[n]:(zi(o),r=i[n]=e.call(null,t),qi())}else r=e}a[0]&&(i&&!e?r=!1:!a[1]||""!==r&&r!==ne(n)||(r=!0))}return r}function Oo(e,t,n=!1){const r=t.propsCache,o=r.get(e);if(o)return o;const i=e.props,a={},l=[];let s=!1;if(!D(e)){const r=e=>{s=!0;const[n,r]=Oo(e,t,!0);V(a,n),r&&l.push(...r)};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}if(!i&&!s)return H(e)&&r.set(e,k),k;if(j(i))for(let e=0;e<i.length;e++){0;const t=ee(i[e]);No(t)&&(a[t]=x)}else if(i){0;for(const e in i){const t=ee(e);if(No(t)){const n=i[e],r=a[t]=j(n)||D(n)?{type:n}:Object.assign({},n);if(r){const e=Vo(Boolean,r.type),n=Vo(String,r.type);r[0]=e>-1,r[1]=n<0||e<n,(e>-1||A(r,"default"))&&l.push(t)}}}}const c=[a,l];return H(e)&&r.set(e,c),c}function No(e){return"$"!==e[0]}function Po(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:null===e?"null":""}function To(e,t){return Po(e)===Po(t)}function Vo(e,t){return j(t)?t.findIndex((t=>To(t,e))):D(t)&&To(t,e)?0:-1}const Ro=e=>"_"===e[0]||"$stable"===e,Lo=e=>j(e)?e.map(Ai):[Ai(e)],Ao=(e,t,n)=>{if(t._n)return t;const r=$n(((...e)=>Lo(t(...e))),n);return r._c=!1,r},jo=(e,t,n)=>{const r=e._ctx;for(const n in e){if(Ro(n))continue;const o=e[n];if(D(o))t[n]=Ao(0,o,r);else if(null!=o){0;const e=Lo(o);t[n]=()=>e}}},Bo=(e,t)=>{const n=Lo(t);e.slots.default=()=>n},Io=(e,t)=>{if(32&e.vnode.shapeFlag){const n=t._;n?(e.slots=It(t),le(t,"_",n)):jo(t,e.slots={})}else e.slots={},t&&Bo(e,t);le(e.slots,Ei,1)},Mo=(e,t,n)=>{const{vnode:r,slots:o}=e;let i=!0,a=x;if(32&r.shapeFlag){const e=t._;e?n&&1===e?i=!1:(V(o,t),n||1!==e||delete o._):(i=!t.$stable,jo(t,o)),a=t}else t&&(Bo(e,t),a={default:1});if(i)for(const e in o)Ro(e)||e in a||delete o[e]};function Fo(){return{app:null,config:{isNativeTag:O,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let Do=0;function Uo(e,t){return function(n,r=null){D(n)||(n=Object.assign({},n)),null==r||H(r)||(r=null);const o=Fo(),i=new Set;let a=!1;const l=o.app={_uid:Do++,_component:n,_props:r,_container:null,_context:o,_instance:null,version:_a,get config(){return o.config},set config(e){0},use:(e,...t)=>(i.has(e)||(e&&D(e.install)?(i.add(e),e.install(l,...t)):D(e)&&(i.add(e),e(l,...t))),l),mixin:e=>(o.mixins.includes(e)||o.mixins.push(e),l),component:(e,t)=>t?(o.components[e]=t,l):o.components[e],directive:(e,t)=>t?(o.directives[e]=t,l):o.directives[e],mount(i,s,c){if(!a){0;const u=Oi(n,r);return u.appContext=o,s&&t?t(u,i):e(u,i,c),a=!0,l._container=i,i.__vue_app__=l,na(u.component)||u.component.proxy}},unmount(){a&&(e(null,l._container),delete l._container.__vue_app__)},provide:(e,t)=>(o.provides[e]=t,l)};return l}}function $o(e,t,n,r,o=!1){if(j(e))return void e.forEach(((e,i)=>$o(e,t&&(j(t)?t[i]:t),n,r,o)));if(Er(r)&&!o)return;const i=4&r.shapeFlag?na(r.component)||r.component.proxy:r.el,a=o?null:i,{i:l,r:s}=e;const c=t&&t.r,u=l.refs===x?l.refs={}:l.refs,f=l.setupState;if(null!=c&&c!==s&&(U(c)?(u[c]=null,A(f,c)&&(f[c]=null)):Ht(c)&&(c.value=null)),D(s))sn(s,l,12,[a,u]);else{const t=U(s),r=Ht(s);if(t||r){const l=()=>{if(e.f){const n=t?A(f,s)?f[s]:u[s]:s.value;o?j(n)&&R(n,i):j(n)?n.includes(i)||n.push(i):t?(u[s]=[i],A(f,s)&&(f[s]=u[s])):(s.value=[i],e.k&&(u[e.k]=s.value))}else t?(u[s]=a,A(f,s)&&(f[s]=a)):r&&(s.value=a,e.k&&(u[e.k]=a))};a?(l.id=-1,Ko(l,n)):l()}else 0}}let Ho=!1;const zo=e=>/svg/.test(e.namespaceURI)&&"foreignObject"!==e.tagName,qo=e=>8===e.nodeType;function Wo(e){const{mt:t,p:n,o:{patchProp:r,createText:o,nextSibling:i,parentNode:a,remove:l,insert:s,createComment:c}}=e,u=(n,r,l,c,m,g=!1)=>{const y=qo(n)&&"["===n.data,b=()=>h(n,r,l,c,m,y),{type:w,ref:C,shapeFlag:_,patchFlag:E}=r;let x=n.nodeType;r.el=n,-2===E&&(g=!1,r.dynamicChildren=null);let k=null;switch(w){case li:3!==x?""===r.children?(s(r.el=o(""),a(n),n),k=n):k=b():(n.data!==r.children&&(Ho=!0,n.data=r.children),k=i(n));break;case si:k=8!==x||y?b():i(n);break;case ci:if(y&&(x=(n=i(n)).nodeType),1===x||3===x){k=n;const e=!r.children.length;for(let t=0;t<r.staticCount;t++)e&&(r.children+=1===k.nodeType?k.outerHTML:k.data),t===r.staticCount-1&&(r.anchor=k),k=i(k);return y?i(k):k}b();break;case ai:k=y?p(n,r,l,c,m,g):b();break;default:if(1&_)k=1!==x||r.type.toLowerCase()!==n.tagName.toLowerCase()?b():f(n,r,l,c,m,g);else if(6&_){r.slotScopeIds=m;const e=a(n);if(t(r,e,null,l,c,zo(e),g),k=y?v(n):i(n),k&&qo(k)&&"teleport end"===k.data&&(k=i(k)),Er(r)){let t;y?(t=Oi(ai),t.anchor=k?k.previousSibling:e.lastChild):t=3===n.nodeType?Vi(""):Oi("div"),t.el=n,r.component.subTree=t}}else 64&_?k=8!==x?b():r.type.hydrate(n,r,l,c,m,g,e,d):128&_&&(k=r.type.hydrate(n,r,l,c,zo(a(n)),m,g,e,u))}return null!=C&&$o(C,null,c,r),k},f=(e,t,n,o,i,a)=>{a=a||!!t.dynamicChildren;const{type:s,props:c,patchFlag:u,shapeFlag:f,dirs:p}=t,h="input"===s&&p||"option"===s;if(h||-1!==u){if(p&&Gr(t,null,n,"created"),c)if(h||!a||48&u)for(const t in c)(h&&t.endsWith("value")||P(t)&&!Y(t))&&r(e,t,null,c[t],!1,void 0,n);else c.onClick&&r(e,"onClick",null,c.onClick,!1,void 0,n);let s;if((s=c&&c.onVnodeBeforeMount)&&Mi(s,n,t),p&&Gr(t,null,n,"beforeMount"),((s=c&&c.onVnodeMounted)||p)&&er((()=>{s&&Mi(s,n,t),p&&Gr(t,null,n,"mounted")}),o),16&f&&(!c||!c.innerHTML&&!c.textContent)){let r=d(e.firstChild,t,e,n,o,i,a);for(;r;){Ho=!0;const e=r;r=r.nextSibling,l(e)}}else 8&f&&e.textContent!==t.children&&(Ho=!0,e.textContent=t.children)}return e.nextSibling},d=(e,t,r,o,i,a,l)=>{l=l||!!t.dynamicChildren;const s=t.children,c=s.length;for(let t=0;t<c;t++){const c=l?s[t]:s[t]=Ai(s[t]);if(e)e=u(e,c,o,i,a,l);else{if(c.type===li&&!c.children)continue;Ho=!0,n(null,c,r,null,o,i,zo(r),a)}}return e},p=(e,t,n,r,o,l)=>{const{slotScopeIds:u}=t;u&&(o=o?o.concat(u):u);const f=a(e),p=d(i(e),t,f,n,r,o,l);return p&&qo(p)&&"]"===p.data?i(t.anchor=p):(Ho=!0,s(t.anchor=c("]"),f,p),p)},h=(e,t,r,o,s,c)=>{if(Ho=!0,t.el=null,c){const t=v(e);for(;;){const n=i(e);if(!n||n===t)break;l(n)}}const u=i(e),f=a(e);return l(e),n(null,t,f,u,r,o,zo(f),s),u},v=e=>{let t=0;for(;e;)if((e=i(e))&&qo(e)&&("["===e.data&&t++,"]"===e.data)){if(0===t)return i(e);t--}return e};return[(e,t)=>{if(!t.hasChildNodes())return n(null,e,t),kn(),void(t._vnode=e);Ho=!1,u(t.firstChild,e,null,null,null),kn(),t._vnode=e},u]}const Ko=er;function Go(e){return Yo(e)}function Zo(e){return Yo(e,Wo)}function Yo(e,t){fe().__VUE__=!0;const{insert:n,remove:r,patchProp:o,createElement:i,createText:a,createComment:l,setText:s,setElementText:c,parentNode:u,nextSibling:f,setScopeId:d=S,insertStaticContent:p}=e,h=(e,t,n,r=null,o=null,i=null,a=!1,l=null,s=!!t.dynamicChildren)=>{if(e===t)return;e&&!Ci(e,t)&&(r=q(e),D(e,o,i,!0),e=null),-2===t.patchFlag&&(s=!1,t.dynamicChildren=null);const{type:c,ref:u,shapeFlag:f}=t;switch(c){case li:v(e,t,n,r);break;case si:m(e,t,n,r);break;case ci:null==e&&g(t,n,r,a);break;case ai:P(e,t,n,r,o,i,a,l,s);break;default:1&f?b(e,t,n,r,o,i,a,l,s):6&f?T(e,t,n,r,o,i,a,l,s):(64&f||128&f)&&c.process(e,t,n,r,o,i,a,l,s,K)}null!=u&&o&&$o(u,e&&e.ref,i,t||e,!t)},v=(e,t,r,o)=>{if(null==e)n(t.el=a(t.children),r,o);else{const n=t.el=e.el;t.children!==e.children&&s(n,t.children)}},m=(e,t,r,o)=>{null==e?n(t.el=l(t.children||""),r,o):t.el=e.el},g=(e,t,n,r)=>{[e.el,e.anchor]=p(e.children,t,n,r,e.el,e.anchor)},y=({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=f(e),r(e),e=n;r(t)},b=(e,t,n,r,o,i,a,l,s)=>{a=a||"svg"===t.type,null==e?w(t,n,r,o,i,a,l,s):E(e,t,o,i,a,l,s)},w=(e,t,r,a,l,s,u,f)=>{let d,p;const{type:h,props:v,shapeFlag:m,transition:g,dirs:y}=e;if(d=e.el=i(e.type,s,v&&v.is,v),8&m?c(d,e.children):16&m&&_(e.children,d,null,a,l,s&&"foreignObject"!==h,u,f),y&&Gr(e,null,a,"created"),C(d,e,e.scopeId,u,a),v){for(const t in v)"value"===t||Y(t)||o(d,t,null,v[t],s,e.children,a,l,z);"value"in v&&o(d,"value",null,v.value),(p=v.onVnodeBeforeMount)&&Mi(p,a,e)}y&&Gr(e,null,a,"beforeMount");const b=(!l||l&&!l.pendingBranch)&&g&&!g.persisted;b&&g.beforeEnter(d),n(d,t,r),((p=v&&v.onVnodeMounted)||b||y)&&Ko((()=>{p&&Mi(p,a,e),b&&g.enter(d),y&&Gr(e,null,a,"mounted")}),l)},C=(e,t,n,r,o)=>{if(n&&d(e,n),r)for(let t=0;t<r.length;t++)d(e,r[t]);if(o){if(t===o.subTree){const t=o.vnode;C(e,t,t.scopeId,t.slotScopeIds,o.parent)}}},_=(e,t,n,r,o,i,a,l,s=0)=>{for(let c=s;c<e.length;c++){const s=e[c]=l?ji(e[c]):Ai(e[c]);h(null,s,t,n,r,o,i,a,l)}},E=(e,t,n,r,i,a,l)=>{const s=t.el=e.el;let{patchFlag:u,dynamicChildren:f,dirs:d}=t;u|=16&e.patchFlag;const p=e.props||x,h=t.props||x;let v;n&&Jo(n,!1),(v=h.onVnodeBeforeUpdate)&&Mi(v,n,t,e),d&&Gr(t,e,n,"beforeUpdate"),n&&Jo(n,!0);const m=i&&"foreignObject"!==t.type;if(f?O(e.dynamicChildren,f,s,n,r,m,a):l||B(e,t,s,null,n,r,m,a,!1),u>0){if(16&u)N(s,t,p,h,n,r,i);else if(2&u&&p.class!==h.class&&o(s,"class",null,h.class,i),4&u&&o(s,"style",p.style,h.style,i),8&u){const a=t.dynamicProps;for(let t=0;t<a.length;t++){const l=a[t],c=p[l],u=h[l];u===c&&"value"!==l||o(s,l,c,u,i,e.children,n,r,z)}}1&u&&e.children!==t.children&&c(s,t.children)}else l||null!=f||N(s,t,p,h,n,r,i);((v=h.onVnodeUpdated)||d)&&Ko((()=>{v&&Mi(v,n,t,e),d&&Gr(t,e,n,"updated")}),r)},O=(e,t,n,r,o,i,a)=>{for(let l=0;l<t.length;l++){const s=e[l],c=t[l],f=s.el&&(s.type===ai||!Ci(s,c)||70&s.shapeFlag)?u(s.el):n;h(s,c,f,null,r,o,i,a,!0)}},N=(e,t,n,r,i,a,l)=>{if(n!==r){if(n!==x)for(const s in n)Y(s)||s in r||o(e,s,n[s],null,l,t.children,i,a,z);for(const s in r){if(Y(s))continue;const c=r[s],u=n[s];c!==u&&"value"!==s&&o(e,s,u,c,l,t.children,i,a,z)}"value"in r&&o(e,"value",n.value,r.value)}},P=(e,t,r,o,i,l,s,c,u)=>{const f=t.el=e?e.el:a(""),d=t.anchor=e?e.anchor:a("");let{patchFlag:p,dynamicChildren:h,slotScopeIds:v}=t;v&&(c=c?c.concat(v):v),null==e?(n(f,r,o),n(d,r,o),_(t.children,r,d,i,l,s,c,u)):p>0&&64&p&&h&&e.dynamicChildren?(O(e.dynamicChildren,h,r,i,l,s,c),(null!=t.key||i&&t===i.subTree)&&Qo(e,t,!0)):B(e,t,r,d,i,l,s,c,u)},T=(e,t,n,r,o,i,a,l,s)=>{t.slotScopeIds=l,null==e?512&t.shapeFlag?o.ctx.activate(t,n,r,a,s):V(t,n,r,o,i,a,s):R(e,t,s)},V=(e,t,n,r,o,i,a)=>{const l=e.component=Ui(e,r,o);if(Sr(e)&&(l.ctx.renderer=K),Yi(l),l.asyncDep){if(o&&o.registerDep(l,L),!e.el){const e=l.subTree=Oi(si);m(null,e,t,n)}}else L(l,e,t,n,o,i,a)},R=(e,t,n)=>{const r=t.component=e.component;if(function(e,t,n){const{props:r,children:o,component:i}=e,{props:a,children:l,patchFlag:s}=t,c=i.emitsOptions;if(t.dirs||t.transition)return!0;if(!(n&&s>=0))return!(!o&&!l||l&&l.$stable)||r!==a&&(r?!a||Kn(r,a,c):!!a);if(1024&s)return!0;if(16&s)return r?Kn(r,a,c):!!a;if(8&s){const e=t.dynamicProps;for(let t=0;t<e.length;t++){const n=e[t];if(a[n]!==r[n]&&!jn(c,n))return!0}}return!1}(e,t,n)){if(r.asyncDep&&!r.asyncResolved)return void j(r,t,n);r.next=t,function(e){const t=pn.indexOf(e);t>hn&&pn.splice(t,1)}(r.update),r.update()}else t.el=e.el,r.vnode=t},L=(e,t,n,r,o,i,a)=>{const l=e.effect=new Ne((()=>{if(e.isMounted){let t,{next:n,bu:r,u:l,parent:s,vnode:c}=e,f=n;0,Jo(e,!1),n?(n.el=c.el,j(e,n,a)):n=c,r&&ae(r),(t=n.props&&n.props.onVnodeBeforeUpdate)&&Mi(t,s,n,c),Jo(e,!0);const d=Hn(e);0;const p=e.subTree;e.subTree=d,h(p,d,u(p.el),q(p),e,o,i),n.el=d.el,null===f&&Gn(e,d.el),l&&Ko(l,o),(t=n.props&&n.props.onVnodeUpdated)&&Ko((()=>Mi(t,s,n,c)),o)}else{let a;const{el:l,props:s}=t,{bm:c,m:u,parent:f}=e,d=Er(t);if(Jo(e,!1),c&&ae(c),!d&&(a=s&&s.onVnodeBeforeMount)&&Mi(a,f,t),Jo(e,!0),l&&Z){const n=()=>{e.subTree=Hn(e),Z(l,e.subTree,e,o,null)};d?t.type.__asyncLoader().then((()=>!e.isUnmounted&&n())):n()}else{0;const a=e.subTree=Hn(e);0,h(null,a,n,r,e,o,i),t.el=a.el}if(u&&Ko(u,o),!d&&(a=s&&s.onVnodeMounted)){const e=t;Ko((()=>Mi(a,f,e)),o)}(256&t.shapeFlag||f&&Er(f.vnode)&&256&f.vnode.shapeFlag)&&e.a&&Ko(e.a,o),e.isMounted=!0,t=n=r=null}}),(()=>Cn(s)),e.scope),s=e.update=()=>l.run();s.id=e.uid,Jo(e,!0),s()},j=(e,t,n)=>{t.component=e;const r=e.vnode.props;e.vnode=t,e.next=null,function(e,t,n,r){const{props:o,attrs:i,vnode:{patchFlag:a}}=e,l=It(o),[s]=e.propsOptions;let c=!1;if(!(r||a>0)||16&a){let r;ko(e,t,o,i)&&(c=!0);for(const i in l)t&&(A(t,i)||(r=ne(i))!==i&&A(t,r))||(s?!n||void 0===n[i]&&void 0===n[r]||(o[i]=So(s,l,i,void 0,e,!0)):delete o[i]);if(i!==l)for(const e in i)t&&A(t,e)||(delete i[e],c=!0)}else if(8&a){const n=e.vnode.dynamicProps;for(let r=0;r<n.length;r++){let a=n[r];if(jn(e.emitsOptions,a))continue;const u=t[a];if(s)if(A(i,a))u!==i[a]&&(i[a]=u,c=!0);else{const t=ee(a);o[t]=So(s,l,t,u,e,!1)}else u!==i[a]&&(i[a]=u,c=!0)}}c&&Me(e,"set","$attrs")}(e,t.props,r,n),Mo(e,t.children,n),Ae(),xn(),je()},B=(e,t,n,r,o,i,a,l,s=!1)=>{const u=e&&e.children,f=e?e.shapeFlag:0,d=t.children,{patchFlag:p,shapeFlag:h}=t;if(p>0){if(128&p)return void M(u,d,n,r,o,i,a,l,s);if(256&p)return void I(u,d,n,r,o,i,a,l,s)}8&h?(16&f&&z(u,o,i),d!==u&&c(n,d)):16&f?16&h?M(u,d,n,r,o,i,a,l,s):z(u,o,i,!0):(8&f&&c(n,""),16&h&&_(d,n,r,o,i,a,l,s))},I=(e,t,n,r,o,i,a,l,s)=>{t=t||k;const c=(e=e||k).length,u=t.length,f=Math.min(c,u);let d;for(d=0;d<f;d++){const r=t[d]=s?ji(t[d]):Ai(t[d]);h(e[d],r,n,null,o,i,a,l,s)}c>u?z(e,o,i,!0,!1,f):_(t,n,r,o,i,a,l,s,f)},M=(e,t,n,r,o,i,a,l,s)=>{let c=0;const u=t.length;let f=e.length-1,d=u-1;for(;c<=f&&c<=d;){const r=e[c],u=t[c]=s?ji(t[c]):Ai(t[c]);if(!Ci(r,u))break;h(r,u,n,null,o,i,a,l,s),c++}for(;c<=f&&c<=d;){const r=e[f],c=t[d]=s?ji(t[d]):Ai(t[d]);if(!Ci(r,c))break;h(r,c,n,null,o,i,a,l,s),f--,d--}if(c>f){if(c<=d){const e=d+1,f=e<u?t[e].el:r;for(;c<=d;)h(null,t[c]=s?ji(t[c]):Ai(t[c]),n,f,o,i,a,l,s),c++}}else if(c>d)for(;c<=f;)D(e[c],o,i,!0),c++;else{const p=c,v=c,m=new Map;for(c=v;c<=d;c++){const e=t[c]=s?ji(t[c]):Ai(t[c]);null!=e.key&&m.set(e.key,c)}let g,y=0;const b=d-v+1;let w=!1,C=0;const _=new Array(b);for(c=0;c<b;c++)_[c]=0;for(c=p;c<=f;c++){const r=e[c];if(y>=b){D(r,o,i,!0);continue}let u;if(null!=r.key)u=m.get(r.key);else for(g=v;g<=d;g++)if(0===_[g-v]&&Ci(r,t[g])){u=g;break}void 0===u?D(r,o,i,!0):(_[u-v]=c+1,u>=C?C=u:w=!0,h(r,t[u],n,null,o,i,a,l,s),y++)}const E=w?function(e){const t=e.slice(),n=[0];let r,o,i,a,l;const s=e.length;for(r=0;r<s;r++){const s=e[r];if(0!==s){if(o=n[n.length-1],e[o]<s){t[r]=o,n.push(r);continue}for(i=0,a=n.length-1;i<a;)l=i+a>>1,e[n[l]]<s?i=l+1:a=l;s<e[n[i]]&&(i>0&&(t[r]=n[i-1]),n[i]=r)}}i=n.length,a=n[i-1];for(;i-- >0;)n[i]=a,a=t[a];return n}(_):k;for(g=E.length-1,c=b-1;c>=0;c--){const e=v+c,f=t[e],d=e+1<u?t[e+1].el:r;0===_[c]?h(null,f,n,d,o,i,a,l,s):w&&(g<0||c!==E[g]?F(f,n,d,2):g--)}}},F=(e,t,r,o,i=null)=>{const{el:a,type:l,transition:s,children:c,shapeFlag:u}=e;if(6&u)return void F(e.component.subTree,t,r,o);if(128&u)return void e.suspense.move(t,r,o);if(64&u)return void l.move(e,t,r,K);if(l===ai){n(a,t,r);for(let e=0;e<c.length;e++)F(c[e],t,r,o);return void n(e.anchor,t,r)}if(l===ci)return void(({el:e,anchor:t},r,o)=>{let i;for(;e&&e!==t;)i=f(e),n(e,r,o),e=i;n(t,r,o)})(e,t,r);if(2!==o&&1&u&&s)if(0===o)s.beforeEnter(a),n(a,t,r),Ko((()=>s.enter(a)),i);else{const{leave:e,delayLeave:o,afterLeave:i}=s,l=()=>n(a,t,r),c=()=>{e(a,(()=>{l(),i&&i()}))};o?o(a,l,c):c()}else n(a,t,r)},D=(e,t,n,r=!1,o=!1)=>{const{type:i,props:a,ref:l,children:s,dynamicChildren:c,shapeFlag:u,patchFlag:f,dirs:d}=e;if(null!=l&&$o(l,null,n,e,!0),256&u)return void t.ctx.deactivate(e);const p=1&u&&d,h=!Er(e);let v;if(h&&(v=a&&a.onVnodeBeforeUnmount)&&Mi(v,t,e),6&u)H(e.component,n,r);else{if(128&u)return void e.suspense.unmount(n,r);p&&Gr(e,null,t,"beforeUnmount"),64&u?e.type.remove(e,t,n,o,K,r):c&&(i!==ai||f>0&&64&f)?z(c,t,n,!1,!0):(i===ai&&384&f||!o&&16&u)&&z(s,t,n),r&&U(e)}(h&&(v=a&&a.onVnodeUnmounted)||p)&&Ko((()=>{v&&Mi(v,t,e),p&&Gr(e,null,t,"unmounted")}),n)},U=e=>{const{type:t,el:n,anchor:o,transition:i}=e;if(t===ai)return void $(n,o);if(t===ci)return void y(e);const a=()=>{r(n),i&&!i.persisted&&i.afterLeave&&i.afterLeave()};if(1&e.shapeFlag&&i&&!i.persisted){const{leave:t,delayLeave:r}=i,o=()=>t(n,a);r?r(e.el,a,o):o()}else a()},$=(e,t)=>{let n;for(;e!==t;)n=f(e),r(e),e=n;r(t)},H=(e,t,n)=>{const{bum:r,scope:o,update:i,subTree:a,um:l}=e;r&&ae(r),o.stop(),i&&(i.active=!1,D(a,e,t,n)),l&&Ko(l,t),Ko((()=>{e.isUnmounted=!0}),t),t&&t.pendingBranch&&!t.isUnmounted&&e.asyncDep&&!e.asyncResolved&&e.suspenseId===t.pendingId&&(t.deps--,0===t.deps&&t.resolve())},z=(e,t,n,r=!1,o=!1,i=0)=>{for(let a=i;a<e.length;a++)D(e[a],t,n,r,o)},q=e=>6&e.shapeFlag?q(e.component.subTree):128&e.shapeFlag?e.suspense.next():f(e.anchor||e.el),W=(e,t,n)=>{null==e?t._vnode&&D(t._vnode,null,null,!0):h(t._vnode||null,e,t,null,null,null,n),xn(),kn(),t._vnode=e},K={p:h,um:D,m:F,r:U,mt:V,mc:_,pc:B,pbc:O,n:q,o:e};let G,Z;return t&&([G,Z]=t(K)),{render:W,hydrate:G,createApp:Uo(W,G)}}function Jo({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Qo(e,t,n=!1){const r=e.children,o=t.children;if(j(r)&&j(o))for(let e=0;e<r.length;e++){const t=r[e];let i=o[e];1&i.shapeFlag&&!i.dynamicChildren&&((i.patchFlag<=0||32===i.patchFlag)&&(i=o[e]=ji(o[e]),i.el=t.el),n||Qo(t,i)),i.type===li&&(i.el=t.el)}}const Xo=e=>e.__isTeleport,ei=e=>e&&(e.disabled||""===e.disabled),ti=e=>"undefined"!=typeof SVGElement&&e instanceof SVGElement,ni=(e,t)=>{const n=e&&e.to;if(U(n)){if(t){const e=t(n);return e}return null}return n};function ri(e,t,n,{o:{insert:r},m:o},i=2){0===i&&r(e.targetAnchor,t,n);const{el:a,anchor:l,shapeFlag:s,children:c,props:u}=e,f=2===i;if(f&&r(a,t,n),(!f||ei(u))&&16&s)for(let e=0;e<c.length;e++)o(c[e],t,n,2);f&&r(l,t,n)}const oi={__isTeleport:!0,process(e,t,n,r,o,i,a,l,s,c){const{mc:u,pc:f,pbc:d,o:{insert:p,querySelector:h,createText:v,createComment:m}}=c,g=ei(t.props);let{shapeFlag:y,children:b,dynamicChildren:w}=t;if(null==e){const e=t.el=v(""),c=t.anchor=v("");p(e,n,r),p(c,n,r);const f=t.target=ni(t.props,h),d=t.targetAnchor=v("");f&&(p(d,f),a=a||ti(f));const m=(e,t)=>{16&y&&u(b,e,t,o,i,a,l,s)};g?m(n,c):f&&m(f,d)}else{t.el=e.el;const r=t.anchor=e.anchor,u=t.target=e.target,p=t.targetAnchor=e.targetAnchor,v=ei(e.props),m=v?n:u,y=v?r:p;if(a=a||ti(u),w?(d(e.dynamicChildren,w,m,o,i,a,l),Qo(e,t,!0)):s||f(e,t,m,y,o,i,a,l,!1),g)v||ri(t,n,r,c,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const e=t.target=ni(t.props,h);e&&ri(t,e,null,c,0)}else v&&ri(t,u,p,c,1)}ii(t)},remove(e,t,n,r,{um:o,o:{remove:i}},a){const{shapeFlag:l,children:s,anchor:c,targetAnchor:u,target:f,props:d}=e;if(f&&i(u),(a||!ei(d))&&(i(c),16&l))for(let e=0;e<s.length;e++){const r=s[e];o(r,t,n,!0,!!r.dynamicChildren)}},move:ri,hydrate:function(e,t,n,r,o,i,{o:{nextSibling:a,parentNode:l,querySelector:s}},c){const u=t.target=ni(t.props,s);if(u){const s=u._lpa||u.firstChild;if(16&t.shapeFlag)if(ei(t.props))t.anchor=c(a(e),t,l(e),n,r,o,i),t.targetAnchor=s;else{t.anchor=a(e);let l=s;for(;l;)if(l=a(l),l&&8===l.nodeType&&"teleport anchor"===l.data){t.targetAnchor=l,u._lpa=t.targetAnchor&&a(t.targetAnchor);break}c(s,t,u,n,r,o,i)}ii(t)}return t.anchor&&a(t.anchor)}};function ii(e){const t=e.ctx;if(t&&t.ut){let n=e.children[0].el;for(;n!==e.targetAnchor;)1===n.nodeType&&n.setAttribute("data-v-owner",t.uid),n=n.nextSibling;t.ut()}}const ai=Symbol(void 0),li=Symbol(void 0),si=Symbol(void 0),ci=Symbol(void 0),ui=[];let fi=null;function di(e=!1){ui.push(fi=e?null:[])}function pi(){ui.pop(),fi=ui[ui.length-1]||null}let hi,vi=1;function mi(e){vi+=e}function gi(e){return e.dynamicChildren=vi>0?fi||k:null,pi(),vi>0&&fi&&fi.push(e),e}function yi(e,t,n,r,o,i){return gi(Si(e,t,n,r,o,i,!0))}function bi(e,t,n,r,o){return gi(Oi(e,t,n,r,o,!0))}function wi(e){return!!e&&!0===e.__v_isVNode}function Ci(e,t){return e.type===t.type&&e.key===t.key}function _i(e){hi=e}const Ei="__vInternal",xi=({key:e})=>null!=e?e:null,ki=({ref:e,ref_key:t,ref_for:n})=>null!=e?U(e)||Ht(e)||D(e)?{i:Bn,r:e,k:t,f:!!n}:e:null;function Si(e,t=null,n=null,r=0,o=null,i=(e===ai?0:1),a=!1,l=!1){const s={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&xi(t),ref:t&&ki(t),scopeId:In,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:Bn};return l?(Bi(s,n),128&i&&e.normalize(s)):n&&(s.shapeFlag|=U(n)?8:16),vi>0&&!a&&fi&&(s.patchFlag>0||6&i)&&32!==s.patchFlag&&fi.push(s),s}const Oi=Ni;function Ni(e,t=null,n=null,r=0,o=null,i=!1){if(e&&e!==Qr||(e=si),wi(e)){const r=Ti(e,t,!0);return n&&Bi(r,n),vi>0&&!i&&fi&&(6&r.shapeFlag?fi[fi.indexOf(e)]=r:fi.push(r)),r.patchFlag|=-2,r}if(oa(e)&&(e=e.__vccOpts),t){t=Pi(t);let{class:e,style:n}=t;e&&!U(e)&&(t.class=d(e)),H(n)&&(Bt(n)&&!j(n)&&(n=V({},n)),t.style=l(n))}return Si(e,t,n,r,o,U(e)?1:Zn(e)?128:Xo(e)?64:H(e)?4:D(e)?2:0,i,!0)}function Pi(e){return e?Bt(e)||Ei in e?V({},e):e:null}function Ti(e,t,n=!1){const{props:r,ref:o,patchFlag:i,children:a}=e,l=t?Ii(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&xi(l),ref:t&&t.ref?n&&o?j(o)?o.concat(ki(t)):[o,ki(t)]:ki(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ai?-1===i?16:16|i:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Ti(e.ssContent),ssFallback:e.ssFallback&&Ti(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Vi(e=" ",t=0){return Oi(li,null,e,t)}function Ri(e,t){const n=Oi(ci,null,e);return n.staticCount=t,n}function Li(e="",t=!1){return t?(di(),bi(si,null,e)):Oi(si,null,e)}function Ai(e){return null==e||"boolean"==typeof e?Oi(si):j(e)?Oi(ai,null,e.slice()):"object"==typeof e?ji(e):Oi(li,null,String(e))}function ji(e){return null===e.el&&-1!==e.patchFlag||e.memo?e:Ti(e)}function Bi(e,t){let n=0;const{shapeFlag:r}=e;if(null==t)t=null;else if(j(t))n=16;else if("object"==typeof t){if(65&r){const n=t.default;return void(n&&(n._c&&(n._d=!1),Bi(e,n()),n._c&&(n._d=!0)))}{n=32;const r=t._;r||Ei in t?3===r&&Bn&&(1===Bn.slots._?t._=1:(t._=2,e.patchFlag|=1024)):t._ctx=Bn}}else D(t)?(t={default:t,_ctx:Bn},n=32):(t=String(t),64&r?(n=16,t=[Vi(t)]):n=8);e.children=t,e.shapeFlag|=n}function Ii(...e){const t={};for(let n=0;n<e.length;n++){const r=e[n];for(const e in r)if("class"===e)t.class!==r.class&&(t.class=d([t.class,r.class]));else if("style"===e)t.style=l([t.style,r.style]);else if(P(e)){const n=t[e],o=r[e];!o||n===o||j(n)&&n.includes(o)||(t[e]=n?[].concat(n,o):o)}else""!==e&&(t[e]=r[e])}return t}function Mi(e,t,n,r=null){cn(e,t,7,[n,r])}const Fi=Fo();let Di=0;function Ui(e,t,n){const r=e.type,o=(t?t.appContext:e.appContext)||Fi,i={uid:Di++,vnode:e,type:r,parent:t,appContext:o,root:null,next:null,subTree:null,effect:null,update:null,scope:new pe(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(o.provides),accessCache:null,renderCache:[],components:null,directives:null,propsOptions:Oo(r,o),emitsOptions:An(r,o),emit:null,emitted:null,propsDefaults:x,inheritAttrs:r.inheritAttrs,ctx:x,data:x,props:x,attrs:x,slots:x,refs:x,setupState:x,setupContext:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return i.ctx={_:i},i.root=t?t.root:i,i.emit=Ln.bind(null,i),e.ce&&e.ce(i),i}let $i=null;const Hi=()=>$i||Bn,zi=e=>{$i=e,e.scope.on()},qi=()=>{$i&&$i.scope.off(),$i=null};function Wi(e){return 4&e.vnode.shapeFlag}let Ki,Gi,Zi=!1;function Yi(e,t=!1){Zi=t;const{props:n,children:r}=e.vnode,o=Wi(e);!function(e,t,n,r=!1){const o={},i={};le(i,Ei,1),e.propsDefaults=Object.create(null),ko(e,t,o,i);for(const t in e.propsOptions[0])t in o||(o[t]=void 0);n?e.props=r?o:Pt(o):e.type.props?e.props=o:e.props=i,e.attrs=i}(e,n,o,t),Io(e,r);const i=o?function(e,t){const n=e.type;0;e.accessCache=Object.create(null),e.proxy=Mt(new Proxy(e.ctx,fo)),!1;const{setup:r}=n;if(r){const n=e.setupContext=r.length>1?ta(e):null;zi(e),Ae();const o=sn(r,e,0,[e.props,n]);if(je(),qi(),z(o)){if(o.then(qi,qi),t)return o.then((n=>{Ji(e,n,t)})).catch((t=>{un(t,e,0)}));e.asyncDep=o}else Ji(e,o,t)}else ea(e,t)}(e,t):void 0;return Zi=!1,i}function Ji(e,t,n){D(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:H(t)&&(e.setupState=Jt(t)),ea(e,n)}function Qi(e){Ki=e,Gi=e=>{e.render._rc&&(e.withProxy=new Proxy(e.ctx,po))}}const Xi=()=>!Ki;function ea(e,t,n){const r=e.type;if(!e.render){if(!t&&Ki&&!r.render){const t=r.template||yo(e).template;if(t){0;const{isCustomElement:n,compilerOptions:o}=e.appContext.config,{delimiters:i,compilerOptions:a}=r,l=V(V({isCustomElement:n,delimiters:i},o),a);r.render=Ki(t,l)}}e.render=r.render||S,Gi&&Gi(e)}zi(e),Ae(),vo(e),je(),qi()}function ta(e){const t=t=>{e.exposed=t||{}};let n;return{get attrs(){return n||(n=function(e){return new Proxy(e.attrs,{get:(t,n)=>(Be(e,0,"$attrs"),t[n])})}(e))},slots:e.slots,emit:e.emit,expose:t}}function na(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Jt(Mt(e.exposed)),{get:(t,n)=>n in t?t[n]:n in co?co[n](e):void 0,has:(e,t)=>t in e||t in co}))}function ra(e,t=!0){return D(e)?e.displayName||e.name:e.name||t&&e.__name}function oa(e){return D(e)&&"__vccOpts"in e}const ia=(e,t)=>function(e,t,n=!1){let r,o;const i=D(e);return i?(r=e,o=S):(r=e.get,o=e.set),new on(r,o,i||!o,n)}(e,0,Zi);function aa(){return null}function la(){return null}function sa(e){0}function ca(e,t){return null}function ua(){return da().slots}function fa(){return da().attrs}function da(){const e=Hi();return e.setupContext||(e.setupContext=ta(e))}function pa(e,t){const n=j(e)?e.reduce(((e,t)=>(e[t]={},e)),{}):e;for(const e in t){const r=n[e];r?j(r)||D(r)?n[e]={type:r,default:t[e]}:r.default=t[e]:null===r&&(n[e]={default:t[e]})}return n}function ha(e,t){const n={};for(const r in e)t.includes(r)||Object.defineProperty(n,r,{enumerable:!0,get:()=>e[r]});return n}function va(e){const t=Hi();let n=e();return qi(),z(n)&&(n=n.catch((e=>{throw zi(t),e}))),[n,()=>zi(t)]}function ma(e,t,n){const r=arguments.length;return 2===r?H(t)&&!j(t)?wi(t)?Oi(e,null,[t]):Oi(e,t):Oi(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):3===r&&wi(n)&&(n=[n]),Oi(e,t,n))}const ga=Symbol(""),ya=()=>{{const e=rr(ga);return e}};function ba(){return void 0}function wa(e,t,n,r){const o=n[r];if(o&&Ca(o,e))return o;const i=t();return i.memo=e.slice(),n[r]=i}function Ca(e,t){const n=e.memo;if(n.length!=t.length)return!1;for(let e=0;e<n.length;e++)if(ie(n[e],t[e]))return!1;return vi>0&&fi&&fi.push(e),!0}const _a="3.2.47",Ea={createComponentInstance:Ui,setupComponent:Yi,renderComponentRoot:Hn,setCurrentRenderingInstance:Mn,isVNode:wi,normalizeVNode:Ai},xa=null,ka=null,Sa="undefined"!=typeof document?document:null,Oa=Sa&&Sa.createElement("template"),Na={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t?Sa.createElementNS("http://www.w3.org/2000/svg",e):Sa.createElement(e,n?{is:n}:void 0);return"select"===e&&r&&null!=r.multiple&&o.setAttribute("multiple",r.multiple),o},createText:e=>Sa.createTextNode(e),createComment:e=>Sa.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Sa.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,i){const a=n?n.previousSibling:t.lastChild;if(o&&(o===i||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),o!==i&&(o=o.nextSibling););else{Oa.innerHTML=r?`<svg>${e}</svg>`:e;const o=Oa.content;if(r){const e=o.firstChild;for(;e.firstChild;)o.appendChild(e.firstChild);o.removeChild(e)}t.insertBefore(o,n)}return[a?a.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};const Pa=/\s*!important$/;function Ta(e,t,n){if(j(n))n.forEach((n=>Ta(e,t,n)));else if(null==n&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=function(e,t){const n=Ra[t];if(n)return n;let r=ee(t);if("filter"!==r&&r in e)return Ra[t]=r;r=re(r);for(let n=0;n<Va.length;n++){const o=Va[n]+r;if(o in e)return Ra[t]=o}return t}(e,t);Pa.test(n)?e.setProperty(ne(r),n.replace(Pa,""),"important"):e[r]=n}}const Va=["Webkit","Moz","ms"],Ra={};const La="http://www.w3.org/1999/xlink";function Aa(e,t,n,r){e.addEventListener(t,n,r)}function ja(e,t,n,r,o=null){const i=e._vei||(e._vei={}),a=i[t];if(r&&a)a.value=r;else{const[n,l]=function(e){let t;if(Ba.test(e)){let n;for(t={};n=e.match(Ba);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}const n=":"===e[2]?e.slice(3):ne(e.slice(2));return[n,t]}(t);if(r){const a=i[t]=function(e,t){const n=e=>{if(e._vts){if(e._vts<=n.attached)return}else e._vts=Date.now();cn(function(e,t){if(j(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map((e=>t=>!t._stopped&&e&&e(t)))}return t}(e,n.value),t,5,[e])};return n.value=e,n.attached=Fa(),n}(r,o);Aa(e,n,a,l)}else a&&(!function(e,t,n,r){e.removeEventListener(t,n,r)}(e,n,a,l),i[t]=void 0)}}const Ba=/(?:Once|Passive|Capture)$/;let Ia=0;const Ma=Promise.resolve(),Fa=()=>Ia||(Ma.then((()=>Ia=0)),Ia=Date.now());const Da=/^on[a-z]/;function Ua(e,t){const n=_r(e);class r extends za{constructor(e){super(n,e,t)}}return r.def=n,r}const $a=e=>Ua(e,Kl),Ha="undefined"!=typeof HTMLElement?HTMLElement:class{};class za extends Ha{constructor(e,t={},n){super(),this._def=e,this._props=t,this._instance=null,this._connected=!1,this._resolved=!1,this._numberProps=null,this.shadowRoot&&n?n(this._createVNode(),this.shadowRoot):(this.attachShadow({mode:"open"}),this._def.__asyncLoader||this._resolveProps(this._def))}connectedCallback(){this._connected=!0,this._instance||(this._resolved?this._update():this._resolveDef())}disconnectedCallback(){this._connected=!1,wn((()=>{this._connected||(Wl(null,this.shadowRoot),this._instance=null)}))}_resolveDef(){this._resolved=!0;for(let e=0;e<this.attributes.length;e++)this._setAttr(this.attributes[e].name);new MutationObserver((e=>{for(const t of e)this._setAttr(t.attributeName)})).observe(this,{attributes:!0});const e=(e,t=!1)=>{const{props:n,styles:r}=e;let o;if(n&&!j(n))for(const e in n){const t=n[e];(t===Number||t&&t.type===Number)&&(e in this._props&&(this._props[e]=ce(this._props[e])),(o||(o=Object.create(null)))[ee(e)]=!0)}this._numberProps=o,t&&this._resolveProps(e),this._applyStyles(r),this._update()},t=this._def.__asyncLoader;t?t().then((t=>e(t,!0))):e(this._def)}_resolveProps(e){const{props:t}=e,n=j(t)?t:Object.keys(t||{});for(const e of Object.keys(this))"_"!==e[0]&&n.includes(e)&&this._setProp(e,this[e],!0,!1);for(const e of n.map(ee))Object.defineProperty(this,e,{get(){return this._getProp(e)},set(t){this._setProp(e,t)}})}_setAttr(e){let t=this.getAttribute(e);const n=ee(e);this._numberProps&&this._numberProps[n]&&(t=ce(t)),this._setProp(n,t,!1)}_getProp(e){return this._props[e]}_setProp(e,t,n=!0,r=!0){t!==this._props[e]&&(this._props[e]=t,r&&this._instance&&this._update(),n&&(!0===t?this.setAttribute(ne(e),""):"string"==typeof t||"number"==typeof t?this.setAttribute(ne(e),t+""):t||this.removeAttribute(ne(e))))}_update(){Wl(this._createVNode(),this.shadowRoot)}_createVNode(){const e=Oi(this._def,V({},this._props));return this._instance||(e.ce=e=>{this._instance=e,e.isCE=!0;const t=(e,t)=>{this.dispatchEvent(new CustomEvent(e,{detail:t}))};e.emit=(e,...n)=>{t(e,n),ne(e)!==e&&t(ne(e),n)};let n=this;for(;n=n&&(n.parentNode||n.host);)if(n instanceof za){e.parent=n._instance,e.provides=n._instance.provides;break}}),e}_applyStyles(e){e&&e.forEach((e=>{const t=document.createElement("style");t.textContent=e,this.shadowRoot.appendChild(t)}))}}function qa(e="$style"){{const t=Hi();if(!t)return x;const n=t.type.__cssModules;if(!n)return x;const r=n[e];return r||x}}function Wa(e){const t=Hi();if(!t)return;const n=t.ut=(n=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach((e=>Ga(e,n)))},r=()=>{const r=e(t.proxy);Ka(t.subTree,r),n(r)};ir(r),Mr((()=>{const e=new MutationObserver(r);e.observe(t.subTree.el.parentNode,{childList:!0}),$r((()=>e.disconnect()))}))}function Ka(e,t){if(128&e.shapeFlag){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push((()=>{Ka(n.activeBranch,t)}))}for(;e.component;)e=e.component.subTree;if(1&e.shapeFlag&&e.el)Ga(e.el,t);else if(e.type===ai)e.children.forEach((e=>Ka(e,t)));else if(e.type===ci){let{el:n,anchor:r}=e;for(;n&&(Ga(n,t),n!==r);)n=n.nextSibling}}function Ga(e,t){if(1===e.nodeType){const n=e.style;for(const e in t)n.setProperty(`--${e}`,t[e])}}const Za="transition",Ya="animation",Ja=(e,{slots:t})=>ma(vr,nl(e),t);Ja.displayName="Transition";const Qa={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Xa=Ja.props=V({},vr.props,Qa),el=(e,t=[])=>{j(e)?e.forEach((e=>e(...t))):e&&e(...t)},tl=e=>!!e&&(j(e)?e.some((e=>e.length>1)):e.length>1);function nl(e){const t={};for(const n in e)n in Qa||(t[n]=e[n]);if(!1===e.css)return t;const{name:n="v",type:r,duration:o,enterFromClass:i=`${n}-enter-from`,enterActiveClass:a=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:s=i,appearActiveClass:c=a,appearToClass:u=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:d=`${n}-leave-active`,leaveToClass:p=`${n}-leave-to`}=e,h=function(e){if(null==e)return null;if(H(e))return[rl(e.enter),rl(e.leave)];{const t=rl(e);return[t,t]}}(o),v=h&&h[0],m=h&&h[1],{onBeforeEnter:g,onEnter:y,onEnterCancelled:b,onLeave:w,onLeaveCancelled:C,onBeforeAppear:_=g,onAppear:E=y,onAppearCancelled:x=b}=t,k=(e,t,n)=>{il(e,t?u:l),il(e,t?c:a),n&&n()},S=(e,t)=>{e._isLeaving=!1,il(e,f),il(e,p),il(e,d),t&&t()},O=e=>(t,n)=>{const o=e?E:y,a=()=>k(t,e,n);el(o,[t,a]),al((()=>{il(t,e?s:i),ol(t,e?u:l),tl(o)||sl(t,r,v,a)}))};return V(t,{onBeforeEnter(e){el(g,[e]),ol(e,i),ol(e,a)},onBeforeAppear(e){el(_,[e]),ol(e,s),ol(e,c)},onEnter:O(!1),onAppear:O(!0),onLeave(e,t){e._isLeaving=!0;const n=()=>S(e,t);ol(e,f),dl(),ol(e,d),al((()=>{e._isLeaving&&(il(e,f),ol(e,p),tl(w)||sl(e,r,m,n))})),el(w,[e,n])},onEnterCancelled(e){k(e,!1),el(b,[e])},onAppearCancelled(e){k(e,!0),el(x,[e])},onLeaveCancelled(e){S(e),el(C,[e])}})}function rl(e){return ce(e)}function ol(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.add(t))),(e._vtc||(e._vtc=new Set)).add(t)}function il(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.remove(t)));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function al(e){requestAnimationFrame((()=>{requestAnimationFrame(e)}))}let ll=0;function sl(e,t,n,r){const o=e._endId=++ll,i=()=>{o===e._endId&&r()};if(n)return setTimeout(i,n);const{type:a,timeout:l,propCount:s}=cl(e,t);if(!a)return r();const c=a+"end";let u=0;const f=()=>{e.removeEventListener(c,d),i()},d=t=>{t.target===e&&++u>=s&&f()};setTimeout((()=>{u<s&&f()}),l+1),e.addEventListener(c,d)}function cl(e,t){const n=window.getComputedStyle(e),r=e=>(n[e]||"").split(", "),o=r(`${Za}Delay`),i=r(`${Za}Duration`),a=ul(o,i),l=r(`${Ya}Delay`),s=r(`${Ya}Duration`),c=ul(l,s);let u=null,f=0,d=0;t===Za?a>0&&(u=Za,f=a,d=i.length):t===Ya?c>0&&(u=Ya,f=c,d=s.length):(f=Math.max(a,c),u=f>0?a>c?Za:Ya:null,d=u?u===Za?i.length:s.length:0);return{type:u,timeout:f,propCount:d,hasTransform:u===Za&&/\b(transform|all)(,|$)/.test(r(`${Za}Property`).toString())}}function ul(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map(((t,n)=>fl(t)+fl(e[n]))))}function fl(e){return 1e3*Number(e.slice(0,-1).replace(",","."))}function dl(){return document.body.offsetHeight}const pl=new WeakMap,hl=new WeakMap,vl={name:"TransitionGroup",props:V({},Xa,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=Hi(),r=pr();let o,i;return Dr((()=>{if(!o.length)return;const t=e.moveClass||`${e.name||"v"}-move`;if(!function(e,t,n){const r=e.cloneNode();e._vtc&&e._vtc.forEach((e=>{e.split(/\s+/).forEach((e=>e&&r.classList.remove(e)))}));n.split(/\s+/).forEach((e=>e&&r.classList.add(e))),r.style.display="none";const o=1===t.nodeType?t:t.parentNode;o.appendChild(r);const{hasTransform:i}=cl(r);return o.removeChild(r),i}(o[0].el,n.vnode.el,t))return;o.forEach(gl),o.forEach(yl);const r=o.filter(bl);dl(),r.forEach((e=>{const n=e.el,r=n.style;ol(n,t),r.transform=r.webkitTransform=r.transitionDuration="";const o=n._moveCb=e=>{e&&e.target!==n||e&&!/transform$/.test(e.propertyName)||(n.removeEventListener("transitionend",o),n._moveCb=null,il(n,t))};n.addEventListener("transitionend",o)}))})),()=>{const a=It(e),l=nl(a);let s=a.tag||ai;o=i,i=t.default?Cr(t.default()):[];for(let e=0;e<i.length;e++){const t=i[e];null!=t.key&&wr(t,gr(t,l,r,n))}if(o)for(let e=0;e<o.length;e++){const t=o[e];wr(t,gr(t,l,r,n)),pl.set(t,t.el.getBoundingClientRect())}return Oi(s,null,i)}}},ml=vl;function gl(e){const t=e.el;t._moveCb&&t._moveCb(),t._enterCb&&t._enterCb()}function yl(e){hl.set(e,e.el.getBoundingClientRect())}function bl(e){const t=pl.get(e),n=hl.get(e),r=t.left-n.left,o=t.top-n.top;if(r||o){const t=e.el.style;return t.transform=t.webkitTransform=`translate(${r}px,${o}px)`,t.transitionDuration="0s",e}}const wl=e=>{const t=e.props["onUpdate:modelValue"]||!1;return j(t)?e=>ae(t,e):t};function Cl(e){e.target.composing=!0}function _l(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const El={created(e,{modifiers:{lazy:t,trim:n,number:r}},o){e._assign=wl(o);const i=r||o.props&&"number"===o.props.type;Aa(e,t?"change":"input",(t=>{if(t.target.composing)return;let r=e.value;n&&(r=r.trim()),i&&(r=se(r)),e._assign(r)})),n&&Aa(e,"change",(()=>{e.value=e.value.trim()})),t||(Aa(e,"compositionstart",Cl),Aa(e,"compositionend",_l),Aa(e,"change",_l))},mounted(e,{value:t}){e.value=null==t?"":t},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:r,number:o}},i){if(e._assign=wl(i),e.composing)return;if(document.activeElement===e&&"range"!==e.type){if(n)return;if(r&&e.value.trim()===t)return;if((o||"number"===e.type)&&se(e.value)===t)return}const a=null==t?"":t;e.value!==a&&(e.value=a)}},xl={deep:!0,created(e,t,n){e._assign=wl(n),Aa(e,"change",(()=>{const t=e._modelValue,n=Pl(e),r=e.checked,o=e._assign;if(j(t)){const e=C(t,n),i=-1!==e;if(r&&!i)o(t.concat(n));else if(!r&&i){const n=[...t];n.splice(e,1),o(n)}}else if(I(t)){const e=new Set(t);r?e.add(n):e.delete(n),o(e)}else o(Tl(e,r))}))},mounted:kl,beforeUpdate(e,t,n){e._assign=wl(n),kl(e,t,n)}};function kl(e,{value:t,oldValue:n},r){e._modelValue=t,j(t)?e.checked=C(t,r.props.value)>-1:I(t)?e.checked=t.has(r.props.value):t!==n&&(e.checked=w(t,Tl(e,!0)))}const Sl={created(e,{value:t},n){e.checked=w(t,n.props.value),e._assign=wl(n),Aa(e,"change",(()=>{e._assign(Pl(e))}))},beforeUpdate(e,{value:t,oldValue:n},r){e._assign=wl(r),t!==n&&(e.checked=w(t,r.props.value))}},Ol={deep:!0,created(e,{value:t,modifiers:{number:n}},r){const o=I(t);Aa(e,"change",(()=>{const t=Array.prototype.filter.call(e.options,(e=>e.selected)).map((e=>n?se(Pl(e)):Pl(e)));e._assign(e.multiple?o?new Set(t):t:t[0])})),e._assign=wl(r)},mounted(e,{value:t}){Nl(e,t)},beforeUpdate(e,t,n){e._assign=wl(n)},updated(e,{value:t}){Nl(e,t)}};function Nl(e,t){const n=e.multiple;if(!n||j(t)||I(t)){for(let r=0,o=e.options.length;r<o;r++){const o=e.options[r],i=Pl(o);if(n)j(t)?o.selected=C(t,i)>-1:o.selected=t.has(i);else if(w(Pl(o),t))return void(e.selectedIndex!==r&&(e.selectedIndex=r))}n||-1===e.selectedIndex||(e.selectedIndex=-1)}}function Pl(e){return"_value"in e?e._value:e.value}function Tl(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const Vl={created(e,t,n){Ll(e,t,n,null,"created")},mounted(e,t,n){Ll(e,t,n,null,"mounted")},beforeUpdate(e,t,n,r){Ll(e,t,n,r,"beforeUpdate")},updated(e,t,n,r){Ll(e,t,n,r,"updated")}};function Rl(e,t){switch(e){case"SELECT":return Ol;case"TEXTAREA":return El;default:switch(t){case"checkbox":return xl;case"radio":return Sl;default:return El}}}function Ll(e,t,n,r,o){const i=Rl(e.tagName,n.props&&n.props.type)[o];i&&i(e,t,n,r)}const Al=["ctrl","shift","alt","meta"],jl={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&0!==e.button,middle:e=>"button"in e&&1!==e.button,right:e=>"button"in e&&2!==e.button,exact:(e,t)=>Al.some((n=>e[`${n}Key`]&&!t.includes(n)))},Bl=(e,t)=>(n,...r)=>{for(let e=0;e<t.length;e++){const r=jl[t[e]];if(r&&r(n,t))return}return e(n,...r)},Il={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},Ml=(e,t)=>n=>{if(!("key"in n))return;const r=ne(n.key);return t.some((e=>e===r||Il[e]===r))?e(n):void 0},Fl={beforeMount(e,{value:t},{transition:n}){e._vod="none"===e.style.display?"":e.style.display,n&&t?n.beforeEnter(e):Dl(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Dl(e,!0),r.enter(e)):r.leave(e,(()=>{Dl(e,!1)})):Dl(e,t))},beforeUnmount(e,{value:t}){Dl(e,t)}};function Dl(e,t){e.style.display=t?e._vod:"none"}const Ul=V({patchProp:(e,t,n,r,o=!1,i,a,l,s)=>{"class"===t?function(e,t,n){const r=e._vtc;r&&(t=(t?[t,...r]:[...r]).join(" ")),null==t?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}(e,r,o):"style"===t?function(e,t,n){const r=e.style,o=U(n);if(n&&!o){if(t&&!U(t))for(const e in t)null==n[e]&&Ta(r,e,"");for(const e in n)Ta(r,e,n[e])}else{const i=r.display;o?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(r.display=i)}}(e,n,r):P(t)?T(t)||ja(e,t,0,r,a):("."===t[0]?(t=t.slice(1),1):"^"===t[0]?(t=t.slice(1),0):function(e,t,n,r){if(r)return"innerHTML"===t||"textContent"===t||!!(t in e&&Da.test(t)&&D(n));if("spellcheck"===t||"draggable"===t||"translate"===t)return!1;if("form"===t)return!1;if("list"===t&&"INPUT"===e.tagName)return!1;if("type"===t&&"TEXTAREA"===e.tagName)return!1;if(Da.test(t)&&U(n))return!1;return t in e}(e,t,r,o))?function(e,t,n,r,o,i,a){if("innerHTML"===t||"textContent"===t)return r&&a(r,o,i),void(e[t]=null==n?"":n);if("value"===t&&"PROGRESS"!==e.tagName&&!e.tagName.includes("-")){e._value=n;const r=null==n?"":n;return e.value===r&&"OPTION"!==e.tagName||(e.value=r),void(null==n&&e.removeAttribute(t))}let l=!1;if(""===n||null==n){const r=typeof e[t];"boolean"===r?n=b(n):null==n&&"string"===r?(n="",l=!0):"number"===r&&(n=0,l=!0)}try{e[t]=n}catch(e){}l&&e.removeAttribute(t)}(e,t,r,i,a,l,s):("true-value"===t?e._trueValue=r:"false-value"===t&&(e._falseValue=r),function(e,t,n,r,o){if(r&&t.startsWith("xlink:"))null==n?e.removeAttributeNS(La,t.slice(6,t.length)):e.setAttributeNS(La,t,n);else{const r=y(t);null==n||r&&!b(n)?e.removeAttribute(t):e.setAttribute(t,r?"":n)}}(e,t,r,o))}},Na);let $l,Hl=!1;function zl(){return $l||($l=Go(Ul))}function ql(){return $l=Hl?$l:Zo(Ul),Hl=!0,$l}const Wl=(...e)=>{zl().render(...e)},Kl=(...e)=>{ql().hydrate(...e)},Gl=(...e)=>{const t=zl().createApp(...e);const{mount:n}=t;return t.mount=e=>{const r=Yl(e);if(!r)return;const o=t._component;D(o)||o.render||o.template||(o.template=r.innerHTML),r.innerHTML="";const i=n(r,!1,r instanceof SVGElement);return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),i},t},Zl=(...e)=>{const t=ql().createApp(...e);const{mount:n}=t;return t.mount=e=>{const t=Yl(e);if(t)return n(t,!0,t instanceof SVGElement)},t};function Yl(e){if(U(e)){return document.querySelector(e)}return e}let Jl=!1;const Ql=()=>{Jl||(Jl=!0,El.getSSRProps=({value:e})=>({value:e}),Sl.getSSRProps=({value:e},t)=>{if(t.props&&w(t.props.value,e))return{checked:!0}},xl.getSSRProps=({value:e},t)=>{if(j(e)){if(t.props&&C(e,t.props.value)>-1)return{checked:!0}}else if(I(e)){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}},Vl.getSSRProps=(e,t)=>{if("string"!=typeof t.type)return;const n=Rl(t.type.toUpperCase(),t.props&&t.props.type);return n.getSSRProps?n.getSSRProps(e,t):void 0},Fl.getSSRProps=({value:e})=>{if(!e)return{style:{display:"none"}}})};function Xl(e){throw e}function es(e){}function ts(e,t,n,r){const o=new SyntaxError(String(e));return o.code=e,o.loc=t,o}const ns=Symbol(""),rs=Symbol(""),os=Symbol(""),is=Symbol(""),as=Symbol(""),ls=Symbol(""),ss=Symbol(""),cs=Symbol(""),us=Symbol(""),fs=Symbol(""),ds=Symbol(""),ps=Symbol(""),hs=Symbol(""),vs=Symbol(""),ms=Symbol(""),gs=Symbol(""),ys=Symbol(""),bs=Symbol(""),ws=Symbol(""),Cs=Symbol(""),_s=Symbol(""),Es=Symbol(""),xs=Symbol(""),ks=Symbol(""),Ss=Symbol(""),Os=Symbol(""),Ns=Symbol(""),Ps=Symbol(""),Ts=Symbol(""),Vs=Symbol(""),Rs=Symbol(""),Ls=Symbol(""),As=Symbol(""),js=Symbol(""),Bs=Symbol(""),Is=Symbol(""),Ms=Symbol(""),Fs=Symbol(""),Ds=Symbol(""),Us={[ns]:"Fragment",[rs]:"Teleport",[os]:"Suspense",[is]:"KeepAlive",[as]:"BaseTransition",[ls]:"openBlock",[ss]:"createBlock",[cs]:"createElementBlock",[us]:"createVNode",[fs]:"createElementVNode",[ds]:"createCommentVNode",[ps]:"createTextVNode",[hs]:"createStaticVNode",[vs]:"resolveComponent",[ms]:"resolveDynamicComponent",[gs]:"resolveDirective",[ys]:"resolveFilter",[bs]:"withDirectives",[ws]:"renderList",[Cs]:"renderSlot",[_s]:"createSlots",[Es]:"toDisplayString",[xs]:"mergeProps",[ks]:"normalizeClass",[Ss]:"normalizeStyle",[Os]:"normalizeProps",[Ns]:"guardReactiveProps",[Ps]:"toHandlers",[Ts]:"camelize",[Vs]:"capitalize",[Rs]:"toHandlerKey",[Ls]:"setBlockTracking",[As]:"pushScopeId",[js]:"popScopeId",[Bs]:"withCtx",[Is]:"unref",[Ms]:"isRef",[Fs]:"withMemo",[Ds]:"isMemoSame"};const $s={source:"",start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0}};function Hs(e,t,n,r,o,i,a,l=!1,s=!1,c=!1,u=$s){return e&&(l?(e.helper(ls),e.helper(yc(e.inSSR,c))):e.helper(gc(e.inSSR,c)),a&&e.helper(bs)),{type:13,tag:t,props:n,children:r,patchFlag:o,dynamicProps:i,directives:a,isBlock:l,disableTracking:s,isComponent:c,loc:u}}function zs(e,t=$s){return{type:17,loc:t,elements:e}}function qs(e,t=$s){return{type:15,loc:t,properties:e}}function Ws(e,t){return{type:16,loc:$s,key:U(e)?Ks(e,!0):e,value:t}}function Ks(e,t=!1,n=$s,r=0){return{type:4,loc:n,content:e,isStatic:t,constType:t?3:r}}function Gs(e,t=$s){return{type:8,loc:t,children:e}}function Zs(e,t=[],n=$s){return{type:14,loc:n,callee:e,arguments:t}}function Ys(e,t,n=!1,r=!1,o=$s){return{type:18,params:e,returns:t,newline:n,isSlot:r,loc:o}}function Js(e,t,n,r=!0){return{type:19,test:e,consequent:t,alternate:n,newline:r,loc:$s}}const Qs=e=>4===e.type&&e.isStatic,Xs=(e,t)=>e===t||e===ne(t);function ec(e){return Xs(e,"Teleport")?rs:Xs(e,"Suspense")?os:Xs(e,"KeepAlive")?is:Xs(e,"BaseTransition")?as:void 0}const tc=/^\d|[^\$\w]/,nc=e=>!tc.test(e),rc=/[A-Za-z_$\xA0-\uFFFF]/,oc=/[\.\?\w$\xA0-\uFFFF]/,ic=/\s+[.[]\s*|\s*[.[]\s+/g,ac=e=>{e=e.trim().replace(ic,(e=>e.trim()));let t=0,n=[],r=0,o=0,i=null;for(let a=0;a<e.length;a++){const l=e.charAt(a);switch(t){case 0:if("["===l)n.push(t),t=1,r++;else if("("===l)n.push(t),t=2,o++;else if(!(0===a?rc:oc).test(l))return!1;break;case 1:"'"===l||'"'===l||"`"===l?(n.push(t),t=3,i=l):"["===l?r++:"]"===l&&(--r||(t=n.pop()));break;case 2:if("'"===l||'"'===l||"`"===l)n.push(t),t=3,i=l;else if("("===l)o++;else if(")"===l){if(a===e.length-1)return!1;--o||(t=n.pop())}break;case 3:l===i&&(t=n.pop(),i=null)}}return!r&&!o};function lc(e,t,n){const r={source:e.source.slice(t,t+n),start:sc(e.start,e.source,t),end:e.end};return null!=n&&(r.end=sc(e.start,e.source,t+n)),r}function sc(e,t,n=t.length){return cc(V({},e),t,n)}function cc(e,t,n=t.length){let r=0,o=-1;for(let e=0;e<n;e++)10===t.charCodeAt(e)&&(r++,o=e);return e.offset+=n,e.line+=r,e.column=-1===o?e.column+n:n-o,e}function uc(e,t,n=!1){for(let r=0;r<e.props.length;r++){const o=e.props[r];if(7===o.type&&(n||o.exp)&&(U(t)?o.name===t:t.test(o.name)))return o}}function fc(e,t,n=!1,r=!1){for(let o=0;o<e.props.length;o++){const i=e.props[o];if(6===i.type){if(n)continue;if(i.name===t&&(i.value||r))return i}else if("bind"===i.name&&(i.exp||r)&&dc(i.arg,t))return i}}function dc(e,t){return!(!e||!Qs(e)||e.content!==t)}function pc(e){return 5===e.type||2===e.type}function hc(e){return 7===e.type&&"slot"===e.name}function vc(e){return 1===e.type&&3===e.tagType}function mc(e){return 1===e.type&&2===e.tagType}function gc(e,t){return e||t?us:fs}function yc(e,t){return e||t?ss:cs}const bc=new Set([Os,Ns]);function wc(e,t=[]){if(e&&!U(e)&&14===e.type){const n=e.callee;if(!U(n)&&bc.has(n))return wc(e.arguments[0],t.concat(e))}return[e,t]}function Cc(e,t,n){let r,o,i=13===e.type?e.props:e.arguments[2],a=[];if(i&&!U(i)&&14===i.type){const e=wc(i);i=e[0],a=e[1],o=a[a.length-1]}if(null==i||U(i))r=qs([t]);else if(14===i.type){const e=i.arguments[0];U(e)||15!==e.type?i.callee===Ps?r=Zs(n.helper(xs),[qs([t]),i]):i.arguments.unshift(qs([t])):_c(t,e)||e.properties.unshift(t),!r&&(r=i)}else 15===i.type?(_c(t,i)||i.properties.unshift(t),r=i):(r=Zs(n.helper(xs),[qs([t]),i]),o&&o.callee===Ns&&(o=a[a.length-2]));13===e.type?o?o.arguments[0]=r:e.props=r:o?o.arguments[0]=r:e.arguments[2]=r}function _c(e,t){let n=!1;if(4===e.key.type){const r=e.key.content;n=t.properties.some((e=>4===e.key.type&&e.key.content===r))}return n}function Ec(e,t){return`_${t}_${e.replace(/[^\w]/g,((t,n)=>"-"===t?"_":e.charCodeAt(n).toString()))}`}function xc(e,{helper:t,removeHelper:n,inSSR:r}){e.isBlock||(e.isBlock=!0,n(gc(r,e.isComponent)),t(ls),t(yc(r,e.isComponent)))}function kc(e,t){const n=t.options?t.options.compatConfig:t.compatConfig,r=n&&n[e];return"MODE"===e?r||3:r}function Sc(e,t){const n=kc("MODE",t),r=kc(e,t);return 3===n?!0===r:!1!==r}function Oc(e,t,n,...r){return Sc(e,t)}const Nc=/&(gt|lt|amp|apos|quot);/g,Pc={gt:">",lt:"<",amp:"&",apos:"'",quot:'"'},Tc={delimiters:["{{","}}"],getNamespace:()=>0,getTextMode:()=>0,isVoidTag:O,isPreTag:O,isCustomElement:O,decodeEntities:e=>e.replace(Nc,((e,t)=>Pc[t])),onError:Xl,onWarn:es,comments:!1};function Vc(e,t={}){const n=function(e,t){const n=V({},Tc);let r;for(r in t)n[r]=void 0===t[r]?Tc[r]:t[r];return{options:n,column:1,line:1,offset:0,originalSource:e,source:e,inPre:!1,inVPre:!1,onWarn:n.onWarn}}(e,t),r=qc(n);return function(e,t=$s){return{type:0,children:e,helpers:new Set,components:[],directives:[],hoists:[],imports:[],cached:0,temps:0,codegenNode:void 0,loc:t}}(Rc(n,0,[]),Wc(n,r))}function Rc(e,t,n){const r=Kc(n),o=r?r.ns:0,i=[];for(;!Xc(e,t,n);){const a=e.source;let l;if(0===t||1===t)if(!e.inVPre&&Gc(a,e.options.delimiters[0]))l=$c(e,t);else if(0===t&&"<"===a[0])if(1===a.length)Qc(e,5,1);else if("!"===a[1])Gc(a,"\x3c!--")?l=jc(e):Gc(a,"<!DOCTYPE")?l=Bc(e):Gc(a,"<![CDATA[")?0!==o?l=Ac(e,n):(Qc(e,1),l=Bc(e)):(Qc(e,11),l=Bc(e));else if("/"===a[1])if(2===a.length)Qc(e,5,2);else{if(">"===a[2]){Qc(e,14,2),Zc(e,3);continue}if(/[a-z]/i.test(a[2])){Qc(e,23),Fc(e,1,r);continue}Qc(e,12,2),l=Bc(e)}else/[a-z]/i.test(a[1])?(l=Ic(e,n),Sc("COMPILER_NATIVE_TEMPLATE",e)&&l&&"template"===l.tag&&!l.props.some((e=>7===e.type&&Mc(e.name)))&&(l=l.children)):"?"===a[1]?(Qc(e,21,1),l=Bc(e)):Qc(e,12,1);if(l||(l=Hc(e,t)),j(l))for(let e=0;e<l.length;e++)Lc(i,l[e]);else Lc(i,l)}let a=!1;if(2!==t&&1!==t){const t="preserve"!==e.options.whitespace;for(let n=0;n<i.length;n++){const r=i[n];if(2===r.type)if(e.inPre)r.content=r.content.replace(/\r\n/g,"\n");else if(/[^\t\r\n\f ]/.test(r.content))t&&(r.content=r.content.replace(/[\t\r\n\f ]+/g," "));else{const e=i[n-1],o=i[n+1];!e||!o||t&&(3===e.type&&3===o.type||3===e.type&&1===o.type||1===e.type&&3===o.type||1===e.type&&1===o.type&&/[\r\n]/.test(r.content))?(a=!0,i[n]=null):r.content=" "}else 3!==r.type||e.options.comments||(a=!0,i[n]=null)}if(e.inPre&&r&&e.options.isPreTag(r.tag)){const e=i[0];e&&2===e.type&&(e.content=e.content.replace(/^\r?\n/,""))}}return a?i.filter(Boolean):i}function Lc(e,t){if(2===t.type){const n=Kc(e);if(n&&2===n.type&&n.loc.end.offset===t.loc.start.offset)return n.content+=t.content,n.loc.end=t.loc.end,void(n.loc.source+=t.loc.source)}e.push(t)}function Ac(e,t){Zc(e,9);const n=Rc(e,3,t);return 0===e.source.length?Qc(e,6):Zc(e,3),n}function jc(e){const t=qc(e);let n;const r=/--(\!)?>/.exec(e.source);if(r){r.index<=3&&Qc(e,0),r[1]&&Qc(e,10),n=e.source.slice(4,r.index);const t=e.source.slice(0,r.index);let o=1,i=0;for(;-1!==(i=t.indexOf("\x3c!--",o));)Zc(e,i-o+1),i+4<t.length&&Qc(e,16),o=i+1;Zc(e,r.index+r[0].length-o+1)}else n=e.source.slice(4),Zc(e,e.source.length),Qc(e,7);return{type:3,content:n,loc:Wc(e,t)}}function Bc(e){const t=qc(e),n="?"===e.source[1]?1:2;let r;const o=e.source.indexOf(">");return-1===o?(r=e.source.slice(n),Zc(e,e.source.length)):(r=e.source.slice(n,o),Zc(e,o+1)),{type:3,content:r,loc:Wc(e,t)}}function Ic(e,t){const n=e.inPre,r=e.inVPre,o=Kc(t),i=Fc(e,0,o),a=e.inPre&&!n,l=e.inVPre&&!r;if(i.isSelfClosing||e.options.isVoidTag(i.tag))return a&&(e.inPre=!1),l&&(e.inVPre=!1),i;t.push(i);const s=e.options.getTextMode(i,o),c=Rc(e,s,t);t.pop();{const t=i.props.find((e=>6===e.type&&"inline-template"===e.name));if(t&&Oc("COMPILER_INLINE_TEMPLATE",e,t.loc)){const n=Wc(e,i.loc.end);t.value={type:2,content:n.source,loc:n}}}if(i.children=c,eu(e.source,i.tag))Fc(e,1,o);else if(Qc(e,24,0,i.loc.start),0===e.source.length&&"script"===i.tag.toLowerCase()){const t=c[0];t&&Gc(t.loc.source,"\x3c!--")&&Qc(e,8)}return i.loc=Wc(e,i.loc.start),a&&(e.inPre=!1),l&&(e.inVPre=!1),i}const Mc=o("if,else,else-if,for,slot");function Fc(e,t,n){const r=qc(e),o=/^<\/?([a-z][^\t\r\n\f />]*)/i.exec(e.source),i=o[1],a=e.options.getNamespace(i,n);Zc(e,o[0].length),Yc(e);const l=qc(e),s=e.source;e.options.isPreTag(i)&&(e.inPre=!0);let c=Dc(e,t);0===t&&!e.inVPre&&c.some((e=>7===e.type&&"pre"===e.name))&&(e.inVPre=!0,V(e,l),e.source=s,c=Dc(e,t).filter((e=>"v-pre"!==e.name)));let u=!1;if(0===e.source.length?Qc(e,9):(u=Gc(e.source,"/>"),1===t&&u&&Qc(e,4),Zc(e,u?2:1)),1===t)return;let f=0;return e.inVPre||("slot"===i?f=2:"template"===i?c.some((e=>7===e.type&&Mc(e.name)))&&(f=3):function(e,t,n){const r=n.options;if(r.isCustomElement(e))return!1;if("component"===e||/^[A-Z]/.test(e)||ec(e)||r.isBuiltInComponent&&r.isBuiltInComponent(e)||r.isNativeTag&&!r.isNativeTag(e))return!0;for(let e=0;e<t.length;e++){const r=t[e];if(6===r.type){if("is"===r.name&&r.value){if(r.value.content.startsWith("vue:"))return!0;if(Oc("COMPILER_IS_ON_ELEMENT",n,r.loc))return!0}}else{if("is"===r.name)return!0;if("bind"===r.name&&dc(r.arg,"is")&&Oc("COMPILER_IS_ON_ELEMENT",n,r.loc))return!0}}}(i,c,e)&&(f=1)),{type:1,ns:a,tag:i,tagType:f,props:c,isSelfClosing:u,children:[],loc:Wc(e,r),codegenNode:void 0}}function Dc(e,t){const n=[],r=new Set;for(;e.source.length>0&&!Gc(e.source,">")&&!Gc(e.source,"/>");){if(Gc(e.source,"/")){Qc(e,22),Zc(e,1),Yc(e);continue}1===t&&Qc(e,3);const o=Uc(e,r);6===o.type&&o.value&&"class"===o.name&&(o.value.content=o.value.content.replace(/\s+/g," ").trim()),0===t&&n.push(o),/^[^\t\r\n\f />]/.test(e.source)&&Qc(e,15),Yc(e)}return n}function Uc(e,t){const n=qc(e),r=/^[^\t\r\n\f />][^\t\r\n\f />=]*/.exec(e.source)[0];t.has(r)&&Qc(e,2),t.add(r),"="===r[0]&&Qc(e,19);{const t=/["'<]/g;let n;for(;n=t.exec(r);)Qc(e,17,n.index)}let o;Zc(e,r.length),/^[\t\r\n\f ]*=/.test(e.source)&&(Yc(e),Zc(e,1),Yc(e),o=function(e){const t=qc(e);let n;const r=e.source[0],o='"'===r||"'"===r;if(o){Zc(e,1);const t=e.source.indexOf(r);-1===t?n=zc(e,e.source.length,4):(n=zc(e,t,4),Zc(e,1))}else{const t=/^[^\t\r\n\f >]+/.exec(e.source);if(!t)return;const r=/["'<=`]/g;let o;for(;o=r.exec(t[0]);)Qc(e,18,o.index);n=zc(e,t[0].length,4)}return{content:n,isQuoted:o,loc:Wc(e,t)}}(e),o||Qc(e,13));const i=Wc(e,n);if(!e.inVPre&&/^(v-[A-Za-z0-9-]|:|\.|@|#)/.test(r)){const t=/(?:^v-([a-z0-9-]+))?(?:(?::|^\.|^@|^#)(\[[^\]]+\]|[^\.]+))?(.+)?$/i.exec(r);let a,l=Gc(r,"."),s=t[1]||(l||Gc(r,":")?"bind":Gc(r,"@")?"on":"slot");if(t[2]){const o="slot"===s,i=r.lastIndexOf(t[2]),l=Wc(e,Jc(e,n,i),Jc(e,n,i+t[2].length+(o&&t[3]||"").length));let c=t[2],u=!0;c.startsWith("[")?(u=!1,c.endsWith("]")?c=c.slice(1,c.length-1):(Qc(e,27),c=c.slice(1))):o&&(c+=t[3]||""),a={type:4,content:c,isStatic:u,constType:u?3:0,loc:l}}if(o&&o.isQuoted){const e=o.loc;e.start.offset++,e.start.column++,e.end=sc(e.start,o.content),e.source=e.source.slice(1,-1)}const c=t[3]?t[3].slice(1).split("."):[];return l&&c.push("prop"),"bind"===s&&a&&c.includes("sync")&&Oc("COMPILER_V_BIND_SYNC",e,0,a.loc.source)&&(s="model",c.splice(c.indexOf("sync"),1)),{type:7,name:s,exp:o&&{type:4,content:o.content,isStatic:!1,constType:0,loc:o.loc},arg:a,modifiers:c,loc:i}}return!e.inVPre&&Gc(r,"v-")&&Qc(e,26),{type:6,name:r,value:o&&{type:2,content:o.content,loc:o.loc},loc:i}}function $c(e,t){const[n,r]=e.options.delimiters,o=e.source.indexOf(r,n.length);if(-1===o)return void Qc(e,25);const i=qc(e);Zc(e,n.length);const a=qc(e),l=qc(e),s=o-n.length,c=e.source.slice(0,s),u=zc(e,s,t),f=u.trim(),d=u.indexOf(f);d>0&&cc(a,c,d);return cc(l,c,s-(u.length-f.length-d)),Zc(e,r.length),{type:5,content:{type:4,isStatic:!1,constType:0,content:f,loc:Wc(e,a,l)},loc:Wc(e,i)}}function Hc(e,t){const n=3===t?["]]>"]:["<",e.options.delimiters[0]];let r=e.source.length;for(let t=0;t<n.length;t++){const o=e.source.indexOf(n[t],1);-1!==o&&r>o&&(r=o)}const o=qc(e);return{type:2,content:zc(e,r,t),loc:Wc(e,o)}}function zc(e,t,n){const r=e.source.slice(0,t);return Zc(e,t),2!==n&&3!==n&&r.includes("&")?e.options.decodeEntities(r,4===n):r}function qc(e){const{column:t,line:n,offset:r}=e;return{column:t,line:n,offset:r}}function Wc(e,t,n){return{start:t,end:n=n||qc(e),source:e.originalSource.slice(t.offset,n.offset)}}function Kc(e){return e[e.length-1]}function Gc(e,t){return e.startsWith(t)}function Zc(e,t){const{source:n}=e;cc(e,n,t),e.source=n.slice(t)}function Yc(e){const t=/^[\t\r\n\f ]+/.exec(e.source);t&&Zc(e,t[0].length)}function Jc(e,t,n){return sc(t,e.originalSource.slice(t.offset,n),n)}function Qc(e,t,n,r=qc(e)){n&&(r.offset+=n,r.column+=n),e.options.onError(ts(t,{start:r,end:r,source:""}))}function Xc(e,t,n){const r=e.source;switch(t){case 0:if(Gc(r,"</"))for(let e=n.length-1;e>=0;--e)if(eu(r,n[e].tag))return!0;break;case 1:case 2:{const e=Kc(n);if(e&&eu(r,e.tag))return!0;break}case 3:if(Gc(r,"]]>"))return!0}return!r}function eu(e,t){return Gc(e,"</")&&e.slice(2,2+t.length).toLowerCase()===t.toLowerCase()&&/[\t\r\n\f />]/.test(e[2+t.length]||">")}function tu(e,t){ru(e,t,nu(e,e.children[0]))}function nu(e,t){const{children:n}=e;return 1===n.length&&1===t.type&&!mc(t)}function ru(e,t,n=!1){const{children:r}=e,o=r.length;let i=0;for(let e=0;e<r.length;e++){const o=r[e];if(1===o.type&&0===o.tagType){const e=n?0:ou(o,t);if(e>0){if(e>=2){o.codegenNode.patchFlag="-1",o.codegenNode=t.hoist(o.codegenNode),i++;continue}}else{const e=o.codegenNode;if(13===e.type){const n=cu(e);if((!n||512===n||1===n)&&lu(o,t)>=2){const n=su(o);n&&(e.props=t.hoist(n))}e.dynamicProps&&(e.dynamicProps=t.hoist(e.dynamicProps))}}}if(1===o.type){const e=1===o.tagType;e&&t.scopes.vSlot++,ru(o,t),e&&t.scopes.vSlot--}else if(11===o.type)ru(o,t,1===o.children.length);else if(9===o.type)for(let e=0;e<o.branches.length;e++)ru(o.branches[e],t,1===o.branches[e].children.length)}i&&t.transformHoist&&t.transformHoist(r,t,e),i&&i===o&&1===e.type&&0===e.tagType&&e.codegenNode&&13===e.codegenNode.type&&j(e.codegenNode.children)&&(e.codegenNode.children=t.hoist(zs(e.codegenNode.children)))}function ou(e,t){const{constantCache:n}=t;switch(e.type){case 1:if(0!==e.tagType)return 0;const r=n.get(e);if(void 0!==r)return r;const o=e.codegenNode;if(13!==o.type)return 0;if(o.isBlock&&"svg"!==e.tag&&"foreignObject"!==e.tag)return 0;if(cu(o))return n.set(e,0),0;{let r=3;const i=lu(e,t);if(0===i)return n.set(e,0),0;i<r&&(r=i);for(let o=0;o<e.children.length;o++){const i=ou(e.children[o],t);if(0===i)return n.set(e,0),0;i<r&&(r=i)}if(r>1)for(let o=0;o<e.props.length;o++){const i=e.props[o];if(7===i.type&&"bind"===i.name&&i.exp){const o=ou(i.exp,t);if(0===o)return n.set(e,0),0;o<r&&(r=o)}}if(o.isBlock){for(let t=0;t<e.props.length;t++){if(7===e.props[t].type)return n.set(e,0),0}t.removeHelper(ls),t.removeHelper(yc(t.inSSR,o.isComponent)),o.isBlock=!1,t.helper(gc(t.inSSR,o.isComponent))}return n.set(e,r),r}case 2:case 3:return 3;case 9:case 11:case 10:default:return 0;case 5:case 12:return ou(e.content,t);case 4:return e.constType;case 8:let i=3;for(let n=0;n<e.children.length;n++){const r=e.children[n];if(U(r)||$(r))continue;const o=ou(r,t);if(0===o)return 0;o<i&&(i=o)}return i}}const iu=new Set([ks,Ss,Os,Ns]);function au(e,t){if(14===e.type&&!U(e.callee)&&iu.has(e.callee)){const n=e.arguments[0];if(4===n.type)return ou(n,t);if(14===n.type)return au(n,t)}return 0}function lu(e,t){let n=3;const r=su(e);if(r&&15===r.type){const{properties:e}=r;for(let r=0;r<e.length;r++){const{key:o,value:i}=e[r],a=ou(o,t);if(0===a)return a;let l;if(a<n&&(n=a),l=4===i.type?ou(i,t):14===i.type?au(i,t):0,0===l)return l;l<n&&(n=l)}}return n}function su(e){const t=e.codegenNode;if(13===t.type)return t.props}function cu(e){const t=e.patchFlag;return t?parseInt(t,10):void 0}function uu(e,{filename:t="",prefixIdentifiers:n=!1,hoistStatic:r=!1,cacheHandlers:o=!1,nodeTransforms:i=[],directiveTransforms:a={},transformHoist:l=null,isBuiltInComponent:s=S,isCustomElement:c=S,expressionPlugins:u=[],scopeId:f=null,slotted:d=!0,ssr:p=!1,inSSR:h=!1,ssrCssVars:v="",bindingMetadata:m=x,inline:g=!1,isTS:y=!1,onError:b=Xl,onWarn:w=es,compatConfig:C}){const _=t.replace(/\?.*$/,"").match(/([^/\\]+)\.\w+$/),E={selfName:_&&re(ee(_[1])),prefixIdentifiers:n,hoistStatic:r,cacheHandlers:o,nodeTransforms:i,directiveTransforms:a,transformHoist:l,isBuiltInComponent:s,isCustomElement:c,expressionPlugins:u,scopeId:f,slotted:d,ssr:p,inSSR:h,ssrCssVars:v,bindingMetadata:m,inline:g,isTS:y,onError:b,onWarn:w,compatConfig:C,root:e,helpers:new Map,components:new Set,directives:new Set,hoists:[],imports:[],constantCache:new Map,temps:0,cached:0,identifiers:Object.create(null),scopes:{vFor:0,vSlot:0,vPre:0,vOnce:0},parent:null,currentNode:e,childIndex:0,inVOnce:!1,helper(e){const t=E.helpers.get(e)||0;return E.helpers.set(e,t+1),e},removeHelper(e){const t=E.helpers.get(e);if(t){const n=t-1;n?E.helpers.set(e,n):E.helpers.delete(e)}},helperString:e=>`_${Us[E.helper(e)]}`,replaceNode(e){E.parent.children[E.childIndex]=E.currentNode=e},removeNode(e){const t=E.parent.children,n=e?t.indexOf(e):E.currentNode?E.childIndex:-1;e&&e!==E.currentNode?E.childIndex>n&&(E.childIndex--,E.onNodeRemoved()):(E.currentNode=null,E.onNodeRemoved()),E.parent.children.splice(n,1)},onNodeRemoved:()=>{},addIdentifiers(e){},removeIdentifiers(e){},hoist(e){U(e)&&(e=Ks(e)),E.hoists.push(e);const t=Ks(`_hoisted_${E.hoists.length}`,!1,e.loc,2);return t.hoisted=e,t},cache:(e,t=!1)=>function(e,t,n=!1){return{type:20,index:e,value:t,isVNode:n,loc:$s}}(E.cached++,e,t)};return E.filters=new Set,E}function fu(e,t){const n=uu(e,t);du(e,n),t.hoistStatic&&tu(e,n),t.ssr||function(e,t){const{helper:n}=t,{children:r}=e;if(1===r.length){const n=r[0];if(nu(e,n)&&n.codegenNode){const r=n.codegenNode;13===r.type&&xc(r,t),e.codegenNode=r}else e.codegenNode=n}else if(r.length>1){let r=64;i[64];0,e.codegenNode=Hs(t,n(ns),void 0,e.children,r+"",void 0,void 0,!0,void 0,!1)}}(e,n),e.helpers=new Set([...n.helpers.keys()]),e.components=[...n.components],e.directives=[...n.directives],e.imports=n.imports,e.hoists=n.hoists,e.temps=n.temps,e.cached=n.cached,e.filters=[...n.filters]}function du(e,t){t.currentNode=e;const{nodeTransforms:n}=t,r=[];for(let o=0;o<n.length;o++){const i=n[o](e,t);if(i&&(j(i)?r.push(...i):r.push(i)),!t.currentNode)return;e=t.currentNode}switch(e.type){case 3:t.ssr||t.helper(ds);break;case 5:t.ssr||t.helper(Es);break;case 9:for(let n=0;n<e.branches.length;n++)du(e.branches[n],t);break;case 10:case 11:case 1:case 0:!function(e,t){let n=0;const r=()=>{n--};for(;n<e.children.length;n++){const o=e.children[n];U(o)||(t.parent=e,t.childIndex=n,t.onNodeRemoved=r,du(o,t))}}(e,t)}t.currentNode=e;let o=r.length;for(;o--;)r[o]()}function pu(e,t){const n=U(e)?t=>t===e:t=>e.test(t);return(e,r)=>{if(1===e.type){const{props:o}=e;if(3===e.tagType&&o.some(hc))return;const i=[];for(let a=0;a<o.length;a++){const l=o[a];if(7===l.type&&n(l.name)){o.splice(a,1),a--;const n=t(e,l,r);n&&i.push(n)}}return i}}}const hu="/*#__PURE__*/",vu=e=>`${Us[e]}: _${Us[e]}`;function mu(e,{mode:t="function",prefixIdentifiers:n="module"===t,sourceMap:r=!1,filename:o="template.vue.html",scopeId:i=null,optimizeImports:a=!1,runtimeGlobalName:l="Vue",runtimeModuleName:s="vue",ssrRuntimeModuleName:c="vue/server-renderer",ssr:u=!1,isTS:f=!1,inSSR:d=!1}){const p={mode:t,prefixIdentifiers:n,sourceMap:r,filename:o,scopeId:i,optimizeImports:a,runtimeGlobalName:l,runtimeModuleName:s,ssrRuntimeModuleName:c,ssr:u,isTS:f,inSSR:d,source:e.loc.source,code:"",column:1,line:1,offset:0,indentLevel:0,pure:!1,map:void 0,helper:e=>`_${Us[e]}`,push(e,t){p.code+=e},indent(){h(++p.indentLevel)},deindent(e=!1){e?--p.indentLevel:h(--p.indentLevel)},newline(){h(p.indentLevel)}};function h(e){p.push("\n"+"  ".repeat(e))}return p}function gu(e,t={}){const n=mu(e,t);t.onContextCreated&&t.onContextCreated(n);const{mode:r,push:o,prefixIdentifiers:i,indent:a,deindent:l,newline:s,scopeId:c,ssr:u}=n,f=Array.from(e.helpers),d=f.length>0,p=!i&&"module"!==r,h=n;!function(e,t){const{ssr:n,prefixIdentifiers:r,push:o,newline:i,runtimeModuleName:a,runtimeGlobalName:l,ssrRuntimeModuleName:s}=t,c=l,u=Array.from(e.helpers);if(u.length>0&&(o(`const _Vue = ${c}\n`),e.hoists.length)){o(`const { ${[us,fs,ds,ps,hs].filter((e=>u.includes(e))).map(vu).join(", ")} } = _Vue\n`)}(function(e,t){if(!e.length)return;t.pure=!0;const{push:n,newline:r,helper:o,scopeId:i,mode:a}=t;r();for(let o=0;o<e.length;o++){const i=e[o];i&&(n(`const _hoisted_${o+1} = `),Cu(i,t),r())}t.pure=!1})(e.hoists,t),i(),o("return ")}(e,h);if(o(`function ${u?"ssrRender":"render"}(${(u?["_ctx","_push","_parent","_attrs"]:["_ctx","_cache"]).join(", ")}) {`),a(),p&&(o("with (_ctx) {"),a(),d&&(o(`const { ${f.map(vu).join(", ")} } = _Vue`),o("\n"),s())),e.components.length&&(yu(e.components,"component",n),(e.directives.length||e.temps>0)&&s()),e.directives.length&&(yu(e.directives,"directive",n),e.temps>0&&s()),e.filters&&e.filters.length&&(s(),yu(e.filters,"filter",n),s()),e.temps>0){o("let ");for(let t=0;t<e.temps;t++)o(`${t>0?", ":""}_temp${t}`)}return(e.components.length||e.directives.length||e.temps)&&(o("\n"),s()),u||o("return "),e.codegenNode?Cu(e.codegenNode,n):o("null"),p&&(l(),o("}")),l(),o("}"),{ast:e,code:n.code,preamble:"",map:n.map?n.map.toJSON():void 0}}function yu(e,t,{helper:n,push:r,newline:o,isTS:i}){const a=n("filter"===t?ys:"component"===t?vs:gs);for(let n=0;n<e.length;n++){let l=e[n];const s=l.endsWith("__self");s&&(l=l.slice(0,-6)),r(`const ${Ec(l,t)} = ${a}(${JSON.stringify(l)}${s?", true":""})${i?"!":""}`),n<e.length-1&&o()}}function bu(e,t){const n=e.length>3||!1;t.push("["),n&&t.indent(),wu(e,t,n),n&&t.deindent(),t.push("]")}function wu(e,t,n=!1,r=!0){const{push:o,newline:i}=t;for(let a=0;a<e.length;a++){const l=e[a];U(l)?o(l):j(l)?bu(l,t):Cu(l,t),a<e.length-1&&(n?(r&&o(","),i()):r&&o(", "))}}function Cu(e,t){if(U(e))t.push(e);else if($(e))t.push(t.helper(e));else switch(e.type){case 1:case 9:case 11:case 12:Cu(e.codegenNode,t);break;case 2:!function(e,t){t.push(JSON.stringify(e.content),e)}(e,t);break;case 4:_u(e,t);break;case 5:!function(e,t){const{push:n,helper:r,pure:o}=t;o&&n(hu);n(`${r(Es)}(`),Cu(e.content,t),n(")")}(e,t);break;case 8:Eu(e,t);break;case 3:!function(e,t){const{push:n,helper:r,pure:o}=t;o&&n(hu);n(`${r(ds)}(${JSON.stringify(e.content)})`,e)}(e,t);break;case 13:!function(e,t){const{push:n,helper:r,pure:o}=t,{tag:i,props:a,children:l,patchFlag:s,dynamicProps:c,directives:u,isBlock:f,disableTracking:d,isComponent:p}=e;u&&n(r(bs)+"(");f&&n(`(${r(ls)}(${d?"true":""}), `);o&&n(hu);const h=f?yc(t.inSSR,p):gc(t.inSSR,p);n(r(h)+"(",e),wu(function(e){let t=e.length;for(;t--&&null==e[t];);return e.slice(0,t+1).map((e=>e||"null"))}([i,a,l,s,c]),t),n(")"),f&&n(")");u&&(n(", "),Cu(u,t),n(")"))}(e,t);break;case 14:!function(e,t){const{push:n,helper:r,pure:o}=t,i=U(e.callee)?e.callee:r(e.callee);o&&n(hu);n(i+"(",e),wu(e.arguments,t),n(")")}(e,t);break;case 15:!function(e,t){const{push:n,indent:r,deindent:o,newline:i}=t,{properties:a}=e;if(!a.length)return void n("{}",e);const l=a.length>1||!1;n(l?"{":"{ "),l&&r();for(let e=0;e<a.length;e++){const{key:r,value:o}=a[e];xu(r,t),n(": "),Cu(o,t),e<a.length-1&&(n(","),i())}l&&o(),n(l?"}":" }")}(e,t);break;case 17:!function(e,t){bu(e.elements,t)}(e,t);break;case 18:!function(e,t){const{push:n,indent:r,deindent:o}=t,{params:i,returns:a,body:l,newline:s,isSlot:c}=e;c&&n(`_${Us[Bs]}(`);n("(",e),j(i)?wu(i,t):i&&Cu(i,t);n(") => "),(s||l)&&(n("{"),r());a?(s&&n("return "),j(a)?bu(a,t):Cu(a,t)):l&&Cu(l,t);(s||l)&&(o(),n("}"));c&&(e.isNonScopedSlot&&n(", undefined, true"),n(")"))}(e,t);break;case 19:!function(e,t){const{test:n,consequent:r,alternate:o,newline:i}=e,{push:a,indent:l,deindent:s,newline:c}=t;if(4===n.type){const e=!nc(n.content);e&&a("("),_u(n,t),e&&a(")")}else a("("),Cu(n,t),a(")");i&&l(),t.indentLevel++,i||a(" "),a("? "),Cu(r,t),t.indentLevel--,i&&c(),i||a(" "),a(": ");const u=19===o.type;u||t.indentLevel++;Cu(o,t),u||t.indentLevel--;i&&s(!0)}(e,t);break;case 20:!function(e,t){const{push:n,helper:r,indent:o,deindent:i,newline:a}=t;n(`_cache[${e.index}] || (`),e.isVNode&&(o(),n(`${r(Ls)}(-1),`),a());n(`_cache[${e.index}] = `),Cu(e.value,t),e.isVNode&&(n(","),a(),n(`${r(Ls)}(1),`),a(),n(`_cache[${e.index}]`),i());n(")")}(e,t);break;case 21:wu(e.body,t,!0,!1)}}function _u(e,t){const{content:n,isStatic:r}=e;t.push(r?JSON.stringify(n):n,e)}function Eu(e,t){for(let n=0;n<e.children.length;n++){const r=e.children[n];U(r)?t.push(r):Cu(r,t)}}function xu(e,t){const{push:n}=t;if(8===e.type)n("["),Eu(e,t),n("]");else if(e.isStatic){n(nc(e.content)?e.content:JSON.stringify(e.content),e)}else n(`[${e.content}]`,e)}new RegExp("\\b"+"arguments,await,break,case,catch,class,const,continue,debugger,default,delete,do,else,export,extends,finally,for,function,if,import,let,new,return,super,switch,throw,try,var,void,while,with,yield".split(",").join("\\b|\\b")+"\\b");const ku=pu(/^(if|else|else-if)$/,((e,t,n)=>function(e,t,n,r){if(!("else"===t.name||t.exp&&t.exp.content.trim())){const r=t.exp?t.exp.loc:e.loc;n.onError(ts(28,t.loc)),t.exp=Ks("true",!1,r)}0;if("if"===t.name){const o=Su(e,t),i={type:9,loc:e.loc,branches:[o]};if(n.replaceNode(i),r)return r(i,o,!0)}else{const o=n.parent.children;let i=o.indexOf(e);for(;i-- >=-1;){const a=o[i];if(a&&3===a.type)n.removeNode(a);else{if(!a||2!==a.type||a.content.trim().length){if(a&&9===a.type){"else-if"===t.name&&void 0===a.branches[a.branches.length-1].condition&&n.onError(ts(30,e.loc)),n.removeNode();const o=Su(e,t);0,a.branches.push(o);const i=r&&r(a,o,!1);du(o,n),i&&i(),n.currentNode=null}else n.onError(ts(30,e.loc));break}n.removeNode(a)}}}}(e,t,n,((e,t,r)=>{const o=n.parent.children;let i=o.indexOf(e),a=0;for(;i-- >=0;){const e=o[i];e&&9===e.type&&(a+=e.branches.length)}return()=>{if(r)e.codegenNode=Ou(t,a,n);else{const r=function(e){for(;;)if(19===e.type){if(19!==e.alternate.type)return e;e=e.alternate}else 20===e.type&&(e=e.value)}(e.codegenNode);r.alternate=Ou(t,a+e.branches.length-1,n)}}}))));function Su(e,t){const n=3===e.tagType;return{type:10,loc:e.loc,condition:"else"===t.name?void 0:t.exp,children:n&&!uc(e,"for")?e.children:[e],userKey:fc(e,"key"),isTemplateIf:n}}function Ou(e,t,n){return e.condition?Js(e.condition,Nu(e,t,n),Zs(n.helper(ds),['""',"true"])):Nu(e,t,n)}function Nu(e,t,n){const{helper:r}=n,o=Ws("key",Ks(`${t}`,!1,$s,2)),{children:a}=e,l=a[0];if(1!==a.length||1!==l.type){if(1===a.length&&11===l.type){const e=l.codegenNode;return Cc(e,o,n),e}{let t=64;i[64];return Hs(n,r(ns),qs([o]),a,t+"",void 0,void 0,!0,!1,!1,e.loc)}}{const e=l.codegenNode,t=14===(s=e).type&&s.callee===Fs?s.arguments[1].returns:s;return 13===t.type&&xc(t,n),Cc(t,o,n),e}var s}const Pu=pu("for",((e,t,n)=>{const{helper:r,removeHelper:o}=n;return function(e,t,n,r){if(!t.exp)return void n.onError(ts(31,t.loc));const o=Lu(t.exp,n);if(!o)return void n.onError(ts(32,t.loc));const{addIdentifiers:i,removeIdentifiers:a,scopes:l}=n,{source:s,value:c,key:u,index:f}=o,d={type:11,loc:t.loc,source:s,valueAlias:c,keyAlias:u,objectIndexAlias:f,parseResult:o,children:vc(e)?e.children:[e]};n.replaceNode(d),l.vFor++;const p=r&&r(d);return()=>{l.vFor--,p&&p()}}(e,t,n,(t=>{const i=Zs(r(ws),[t.source]),a=vc(e),l=uc(e,"memo"),s=fc(e,"key"),c=s&&(6===s.type?Ks(s.value.content,!0):s.exp),u=s?Ws("key",c):null,f=4===t.source.type&&t.source.constType>0,d=f?64:s?128:256;return t.codegenNode=Hs(n,r(ns),void 0,i,d+"",void 0,void 0,!0,!f,!1,e.loc),()=>{let s;const{children:d}=t;const p=1!==d.length||1!==d[0].type,h=mc(e)?e:a&&1===e.children.length&&mc(e.children[0])?e.children[0]:null;if(h?(s=h.codegenNode,a&&u&&Cc(s,u,n)):p?s=Hs(n,r(ns),u?qs([u]):void 0,e.children,"64",void 0,void 0,!0,void 0,!1):(s=d[0].codegenNode,a&&u&&Cc(s,u,n),s.isBlock!==!f&&(s.isBlock?(o(ls),o(yc(n.inSSR,s.isComponent))):o(gc(n.inSSR,s.isComponent))),s.isBlock=!f,s.isBlock?(r(ls),r(yc(n.inSSR,s.isComponent))):r(gc(n.inSSR,s.isComponent))),l){const e=Ys(ju(t.parseResult,[Ks("_cached")]));e.body={type:21,body:[Gs(["const _memo = (",l.exp,")"]),Gs(["if (_cached",...c?[" && _cached.key === ",c]:[],` && ${n.helperString(Ds)}(_cached, _memo)) return _cached`]),Gs(["const _item = ",s]),Ks("_item.memo = _memo"),Ks("return _item")],loc:$s},i.arguments.push(e,Ks("_cache"),Ks(String(n.cached++)))}else i.arguments.push(Ys(ju(t.parseResult),s,!0))}}))}));const Tu=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,Vu=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,Ru=/^\(|\)$/g;function Lu(e,t){const n=e.loc,r=e.content,o=r.match(Tu);if(!o)return;const[,i,a]=o,l={source:Au(n,a.trim(),r.indexOf(a,i.length)),value:void 0,key:void 0,index:void 0};let s=i.trim().replace(Ru,"").trim();const c=i.indexOf(s),u=s.match(Vu);if(u){s=s.replace(Vu,"").trim();const e=u[1].trim();let t;if(e&&(t=r.indexOf(e,c+s.length),l.key=Au(n,e,t)),u[2]){const o=u[2].trim();o&&(l.index=Au(n,o,r.indexOf(o,l.key?t+e.length:c+s.length)))}}return s&&(l.value=Au(n,s,c)),l}function Au(e,t,n){return Ks(t,!1,lc(e,n,t.length))}function ju({value:e,key:t,index:n},r=[]){return function(e){let t=e.length;for(;t--&&!e[t];);return e.slice(0,t+1).map(((e,t)=>e||Ks("_".repeat(t+1),!1)))}([e,t,n,...r])}const Bu=Ks("undefined",!1),Iu=(e,t)=>{if(1===e.type&&(1===e.tagType||3===e.tagType)){const n=uc(e,"slot");if(n)return n.exp,t.scopes.vSlot++,()=>{t.scopes.vSlot--}}},Mu=(e,t,n)=>Ys(e,t,!1,!0,t.length?t[0].loc:n);function Fu(e,t,n=Mu){t.helper(Bs);const{children:r,loc:o}=e,i=[],a=[];let l=t.scopes.vSlot>0||t.scopes.vFor>0;const s=uc(e,"slot",!0);if(s){const{arg:e,exp:t}=s;e&&!Qs(e)&&(l=!0),i.push(Ws(e||Ks("default",!0),n(t,r,o)))}let c=!1,u=!1;const f=[],d=new Set;let p=0;for(let e=0;e<r.length;e++){const o=r[e];let h;if(!vc(o)||!(h=uc(o,"slot",!0))){3!==o.type&&f.push(o);continue}if(s){t.onError(ts(37,h.loc));break}c=!0;const{children:v,loc:m}=o,{arg:g=Ks("default",!0),exp:y,loc:b}=h;let w;Qs(g)?w=g?g.content:"default":l=!0;const C=n(y,v,m);let _,E,x;if(_=uc(o,"if"))l=!0,a.push(Js(_.exp,Du(g,C,p++),Bu));else if(E=uc(o,/^else(-if)?$/,!0)){let n,o=e;for(;o--&&(n=r[o],3===n.type););if(n&&vc(n)&&uc(n,"if")){r.splice(e,1),e--;let t=a[a.length-1];for(;19===t.alternate.type;)t=t.alternate;t.alternate=E.exp?Js(E.exp,Du(g,C,p++),Bu):Du(g,C,p++)}else t.onError(ts(30,E.loc))}else if(x=uc(o,"for")){l=!0;const e=x.parseResult||Lu(x.exp);e?a.push(Zs(t.helper(ws),[e.source,Ys(ju(e),Du(g,C),!0)])):t.onError(ts(32,x.loc))}else{if(w){if(d.has(w)){t.onError(ts(38,b));continue}d.add(w),"default"===w&&(u=!0)}i.push(Ws(g,C))}}if(!s){const e=(e,r)=>{const i=n(e,r,o);return t.compatConfig&&(i.isNonScopedSlot=!0),Ws("default",i)};c?f.length&&f.some((e=>$u(e)))&&(u?t.onError(ts(39,f[0].loc)):i.push(e(void 0,f))):i.push(e(void 0,r))}const h=l?2:Uu(e.children)?3:1;let v=qs(i.concat(Ws("_",Ks(h+"",!1))),o);return a.length&&(v=Zs(t.helper(_s),[v,zs(a)])),{slots:v,hasDynamicSlots:l}}function Du(e,t,n){const r=[Ws("name",e),Ws("fn",t)];return null!=n&&r.push(Ws("key",Ks(String(n),!0))),qs(r)}function Uu(e){for(let t=0;t<e.length;t++){const n=e[t];switch(n.type){case 1:if(2===n.tagType||Uu(n.children))return!0;break;case 9:if(Uu(n.branches))return!0;break;case 10:case 11:if(Uu(n.children))return!0}}return!1}function $u(e){return 2!==e.type&&12!==e.type||(2===e.type?!!e.content.trim():$u(e.content))}const Hu=new WeakMap,zu=(e,t)=>function(){if(1!==(e=t.currentNode).type||0!==e.tagType&&1!==e.tagType)return;const{tag:n,props:r}=e,o=1===e.tagType;let i=o?function(e,t,n=!1){let{tag:r}=e;const o=Gu(r),i=fc(e,"is");if(i)if(o||Sc("COMPILER_IS_ON_ELEMENT",t)){const e=6===i.type?i.value&&Ks(i.value.content,!0):i.exp;if(e)return Zs(t.helper(ms),[e])}else 6===i.type&&i.value.content.startsWith("vue:")&&(r=i.value.content.slice(4));const a=!o&&uc(e,"is");if(a&&a.exp)return Zs(t.helper(ms),[a.exp]);const l=ec(r)||t.isBuiltInComponent(r);if(l)return n||t.helper(l),l;return t.helper(vs),t.components.add(r),Ec(r,"component")}(e,t):`"${n}"`;const a=H(i)&&i.callee===ms;let l,s,c,u,f,d,p=0,h=a||i===rs||i===os||!o&&("svg"===n||"foreignObject"===n);if(r.length>0){const n=qu(e,t,void 0,o,a);l=n.props,p=n.patchFlag,f=n.dynamicPropNames;const r=n.directives;d=r&&r.length?zs(r.map((e=>function(e,t){const n=[],r=Hu.get(e);r?n.push(t.helperString(r)):(t.helper(gs),t.directives.add(e.name),n.push(Ec(e.name,"directive")));const{loc:o}=e;e.exp&&n.push(e.exp);e.arg&&(e.exp||n.push("void 0"),n.push(e.arg));if(Object.keys(e.modifiers).length){e.arg||(e.exp||n.push("void 0"),n.push("void 0"));const t=Ks("true",!1,o);n.push(qs(e.modifiers.map((e=>Ws(e,t))),o))}return zs(n,e.loc)}(e,t)))):void 0,n.shouldUseBlock&&(h=!0)}if(e.children.length>0){i===is&&(h=!0,p|=1024);if(o&&i!==rs&&i!==is){const{slots:n,hasDynamicSlots:r}=Fu(e,t);s=n,r&&(p|=1024)}else if(1===e.children.length&&i!==rs){const n=e.children[0],r=n.type,o=5===r||8===r;o&&0===ou(n,t)&&(p|=1),s=o||2===r?n:e.children}else s=e.children}0!==p&&(c=String(p),f&&f.length&&(u=function(e){let t="[";for(let n=0,r=e.length;n<r;n++)t+=JSON.stringify(e[n]),n<r-1&&(t+=", ");return t+"]"}(f))),e.codegenNode=Hs(t,i,l,s,c,u,d,!!h,!1,o,e.loc)};function qu(e,t,n=e.props,r,o,i=!1){const{tag:a,loc:l,children:s}=e;let c=[];const u=[],f=[],d=s.length>0;let p=!1,h=0,v=!1,m=!1,g=!1,y=!1,b=!1,w=!1;const C=[],_=e=>{c.length&&(u.push(qs(Wu(c),l)),c=[]),e&&u.push(e)},E=({key:e,value:n})=>{if(Qs(e)){const i=e.content,a=P(i);if(!a||r&&!o||"onclick"===i.toLowerCase()||"onUpdate:modelValue"===i||Y(i)||(y=!0),a&&Y(i)&&(w=!0),20===n.type||(4===n.type||8===n.type)&&ou(n,t)>0)return;"ref"===i?v=!0:"class"===i?m=!0:"style"===i?g=!0:"key"===i||C.includes(i)||C.push(i),!r||"class"!==i&&"style"!==i||C.includes(i)||C.push(i)}else b=!0};for(let o=0;o<n.length;o++){const s=n[o];if(6===s.type){const{loc:e,name:n,value:r}=s;let o=!0;if("ref"===n&&(v=!0,t.scopes.vFor>0&&c.push(Ws(Ks("ref_for",!0),Ks("true")))),"is"===n&&(Gu(a)||r&&r.content.startsWith("vue:")||Sc("COMPILER_IS_ON_ELEMENT",t)))continue;c.push(Ws(Ks(n,!0,lc(e,0,n.length)),Ks(r?r.content:"",o,r?r.loc:e)))}else{const{name:n,arg:o,exp:h,loc:v}=s,m="bind"===n,g="on"===n;if("slot"===n){r||t.onError(ts(40,v));continue}if("once"===n||"memo"===n)continue;if("is"===n||m&&dc(o,"is")&&(Gu(a)||Sc("COMPILER_IS_ON_ELEMENT",t)))continue;if(g&&i)continue;if((m&&dc(o,"key")||g&&d&&dc(o,"vue:before-update"))&&(p=!0),m&&dc(o,"ref")&&t.scopes.vFor>0&&c.push(Ws(Ks("ref_for",!0),Ks("true"))),!o&&(m||g)){if(b=!0,h)if(m){if(_(),Sc("COMPILER_V_BIND_OBJECT_ORDER",t)){u.unshift(h);continue}u.push(h)}else _({type:14,loc:v,callee:t.helper(Ps),arguments:r?[h]:[h,"true"]});else t.onError(ts(m?34:35,v));continue}const y=t.directiveTransforms[n];if(y){const{props:n,needRuntime:r}=y(s,e,t);!i&&n.forEach(E),g&&o&&!Qs(o)?_(qs(n,l)):c.push(...n),r&&(f.push(s),$(r)&&Hu.set(s,r))}else J(n)||(f.push(s),d&&(p=!0))}}let x;if(u.length?(_(),x=u.length>1?Zs(t.helper(xs),u,l):u[0]):c.length&&(x=qs(Wu(c),l)),b?h|=16:(m&&!r&&(h|=2),g&&!r&&(h|=4),C.length&&(h|=8),y&&(h|=32)),p||0!==h&&32!==h||!(v||w||f.length>0)||(h|=512),!t.inSSR&&x)switch(x.type){case 15:let e=-1,n=-1,r=!1;for(let t=0;t<x.properties.length;t++){const o=x.properties[t].key;Qs(o)?"class"===o.content?e=t:"style"===o.content&&(n=t):o.isHandlerKey||(r=!0)}const o=x.properties[e],i=x.properties[n];r?x=Zs(t.helper(Os),[x]):(o&&!Qs(o.value)&&(o.value=Zs(t.helper(ks),[o.value])),i&&(g||4===i.value.type&&"["===i.value.content.trim()[0]||17===i.value.type)&&(i.value=Zs(t.helper(Ss),[i.value])));break;case 14:break;default:x=Zs(t.helper(Os),[Zs(t.helper(Ns),[x])])}return{props:x,directives:f,patchFlag:h,dynamicPropNames:C,shouldUseBlock:p}}function Wu(e){const t=new Map,n=[];for(let r=0;r<e.length;r++){const o=e[r];if(8===o.key.type||!o.key.isStatic){n.push(o);continue}const i=o.key.content,a=t.get(i);a?("style"===i||"class"===i||P(i))&&Ku(a,o):(t.set(i,o),n.push(o))}return n}function Ku(e,t){17===e.value.type?e.value.elements.push(t.value):e.value=zs([e.value,t.value],e.loc)}function Gu(e){return"component"===e||"Component"===e}const Zu=/-(\w)/g,Yu=(e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))})((e=>e.replace(Zu,((e,t)=>t?t.toUpperCase():"")))),Ju=(e,t)=>{if(mc(e)){const{children:n,loc:r}=e,{slotName:o,slotProps:i}=function(e,t){let n,r='"default"';const o=[];for(let t=0;t<e.props.length;t++){const n=e.props[t];6===n.type?n.value&&("name"===n.name?r=JSON.stringify(n.value.content):(n.name=Yu(n.name),o.push(n))):"bind"===n.name&&dc(n.arg,"name")?n.exp&&(r=n.exp):("bind"===n.name&&n.arg&&Qs(n.arg)&&(n.arg.content=Yu(n.arg.content)),o.push(n))}if(o.length>0){const{props:r,directives:i}=qu(e,t,o,!1,!1);n=r,i.length&&t.onError(ts(36,i[0].loc))}return{slotName:r,slotProps:n}}(e,t),a=[t.prefixIdentifiers?"_ctx.$slots":"$slots",o,"{}","undefined","true"];let l=2;i&&(a[2]=i,l=3),n.length&&(a[3]=Ys([],n,!1,!1,r),l=4),t.scopeId&&!t.slotted&&(l=5),a.splice(l),e.codegenNode=Zs(t.helper(Cs),a,r)}};const Qu=/^\s*([\w$_]+|(async\s*)?\([^)]*?\))\s*(:[^=]+)?=>|^\s*(async\s+)?function(?:\s+[\w$]+)?\s*\(/,Xu=(e,t,n,r)=>{const{loc:o,modifiers:i,arg:a}=e;let l;if(e.exp||i.length||n.onError(ts(35,o)),4===a.type)if(a.isStatic){let e=a.content;e.startsWith("vue:")&&(e=`vnode-${e.slice(4)}`);l=Ks(0!==t.tagType||e.startsWith("vnode")||!/[A-Z]/.test(e)?oe(ee(e)):`on:${e}`,!0,a.loc)}else l=Gs([`${n.helperString(Rs)}(`,a,")"]);else l=a,l.children.unshift(`${n.helperString(Rs)}(`),l.children.push(")");let s=e.exp;s&&!s.content.trim()&&(s=void 0);let c=n.cacheHandlers&&!s&&!n.inVOnce;if(s){const e=ac(s.content),t=!(e||Qu.test(s.content)),n=s.content.includes(";");0,(t||c&&e)&&(s=Gs([`${t?"$event":"(...args)"} => ${n?"{":"("}`,s,n?"}":")"]))}let u={props:[Ws(l,s||Ks("() => {}",!1,o))]};return r&&(u=r(u)),c&&(u.props[0].value=n.cache(u.props[0].value)),u.props.forEach((e=>e.key.isHandlerKey=!0)),u},ef=(e,t,n)=>{const{exp:r,modifiers:o,loc:i}=e,a=e.arg;return 4!==a.type?(a.children.unshift("("),a.children.push(') || ""')):a.isStatic||(a.content=`${a.content} || ""`),o.includes("camel")&&(4===a.type?a.isStatic?a.content=ee(a.content):a.content=`${n.helperString(Ts)}(${a.content})`:(a.children.unshift(`${n.helperString(Ts)}(`),a.children.push(")"))),n.inSSR||(o.includes("prop")&&tf(a,"."),o.includes("attr")&&tf(a,"^")),!r||4===r.type&&!r.content.trim()?(n.onError(ts(34,i)),{props:[Ws(a,Ks("",!0,i))]}):{props:[Ws(a,r)]}},tf=(e,t)=>{4===e.type?e.isStatic?e.content=t+e.content:e.content=`\`${t}\${${e.content}}\``:(e.children.unshift(`'${t}' + (`),e.children.push(")"))},nf=(e,t)=>{if(0===e.type||1===e.type||11===e.type||10===e.type)return()=>{const n=e.children;let r,o=!1;for(let e=0;e<n.length;e++){const t=n[e];if(pc(t)){o=!0;for(let o=e+1;o<n.length;o++){const i=n[o];if(!pc(i)){r=void 0;break}r||(r=n[e]=Gs([t],t.loc)),r.children.push(" + ",i),n.splice(o,1),o--}}}if(o&&(1!==n.length||0!==e.type&&(1!==e.type||0!==e.tagType||e.props.find((e=>7===e.type&&!t.directiveTransforms[e.name]))||"template"===e.tag)))for(let e=0;e<n.length;e++){const r=n[e];if(pc(r)||8===r.type){const o=[];2===r.type&&" "===r.content||o.push(r),t.ssr||0!==ou(r,t)||o.push("1"),n[e]={type:12,content:r,loc:r.loc,codegenNode:Zs(t.helper(ps),o)}}}}},rf=new WeakSet,of=(e,t)=>{if(1===e.type&&uc(e,"once",!0)){if(rf.has(e)||t.inVOnce)return;return rf.add(e),t.inVOnce=!0,t.helper(Ls),()=>{t.inVOnce=!1;const e=t.currentNode;e.codegenNode&&(e.codegenNode=t.cache(e.codegenNode,!0))}}},af=(e,t,n)=>{const{exp:r,arg:o}=e;if(!r)return n.onError(ts(41,e.loc)),lf();const i=r.loc.source,a=4===r.type?r.content:i,l=n.bindingMetadata[i];if("props"===l||"props-aliased"===l)return n.onError(ts(44,r.loc)),lf();if(!a.trim()||!ac(a))return n.onError(ts(42,r.loc)),lf();const s=o||Ks("modelValue",!0),c=o?Qs(o)?`onUpdate:${ee(o.content)}`:Gs(['"onUpdate:" + ',o]):"onUpdate:modelValue";let u;u=Gs([`${n.isTS?"($event: any)":"$event"} => ((`,r,") = $event)"]);const f=[Ws(s,e.exp),Ws(c,u)];if(e.modifiers.length&&1===t.tagType){const t=e.modifiers.map((e=>(nc(e)?e:JSON.stringify(e))+": true")).join(", "),n=o?Qs(o)?`${o.content}Modifiers`:Gs([o,' + "Modifiers"']):"modelModifiers";f.push(Ws(n,Ks(`{ ${t} }`,!1,e.loc,2)))}return lf(f)};function lf(e=[]){return{props:e}}const sf=/[\w).+\-_$\]]/,cf=(e,t)=>{Sc("COMPILER_FILTER",t)&&(5===e.type&&uf(e.content,t),1===e.type&&e.props.forEach((e=>{7===e.type&&"for"!==e.name&&e.exp&&uf(e.exp,t)})))};function uf(e,t){if(4===e.type)ff(e,t);else for(let n=0;n<e.children.length;n++){const r=e.children[n];"object"==typeof r&&(4===r.type?ff(r,t):8===r.type?uf(e,t):5===r.type&&uf(r.content,t))}}function ff(e,t){const n=e.content;let r,o,i,a,l=!1,s=!1,c=!1,u=!1,f=0,d=0,p=0,h=0,v=[];for(i=0;i<n.length;i++)if(o=r,r=n.charCodeAt(i),l)39===r&&92!==o&&(l=!1);else if(s)34===r&&92!==o&&(s=!1);else if(c)96===r&&92!==o&&(c=!1);else if(u)47===r&&92!==o&&(u=!1);else if(124!==r||124===n.charCodeAt(i+1)||124===n.charCodeAt(i-1)||f||d||p){switch(r){case 34:s=!0;break;case 39:l=!0;break;case 96:c=!0;break;case 40:p++;break;case 41:p--;break;case 91:d++;break;case 93:d--;break;case 123:f++;break;case 125:f--}if(47===r){let e,t=i-1;for(;t>=0&&(e=n.charAt(t)," "===e);t--);e&&sf.test(e)||(u=!0)}}else void 0===a?(h=i+1,a=n.slice(0,i).trim()):m();function m(){v.push(n.slice(h,i).trim()),h=i+1}if(void 0===a?a=n.slice(0,i).trim():0!==h&&m(),v.length){for(i=0;i<v.length;i++)a=df(a,v[i],t);e.content=a}}function df(e,t,n){n.helper(ys);const r=t.indexOf("(");if(r<0)return n.filters.add(t),`${Ec(t,"filter")}(${e})`;{const o=t.slice(0,r),i=t.slice(r+1);return n.filters.add(o),`${Ec(o,"filter")}(${e}${")"!==i?","+i:i}`}}const pf=new WeakSet,hf=(e,t)=>{if(1===e.type){const n=uc(e,"memo");if(!n||pf.has(e))return;return pf.add(e),()=>{const r=e.codegenNode||t.currentNode.codegenNode;r&&13===r.type&&(1!==e.tagType&&xc(r,t),e.codegenNode=Zs(t.helper(Fs),[n.exp,Ys(void 0,r),"_cache",String(t.cached++)]))}}};function vf(e,t={}){const n=t.onError||Xl,r="module"===t.mode;!0===t.prefixIdentifiers?n(ts(47)):r&&n(ts(48));t.cacheHandlers&&n(ts(49)),t.scopeId&&!r&&n(ts(50));const o=U(e)?Vc(e,t):e,[i,a]=[[of,ku,hf,Pu,cf,Ju,zu,Iu,nf],{on:Xu,bind:ef,model:af}];return fu(o,V({},t,{prefixIdentifiers:false,nodeTransforms:[...i,...t.nodeTransforms||[]],directiveTransforms:V({},a,t.directiveTransforms||{})})),gu(o,V({},t,{prefixIdentifiers:false}))}const mf=Symbol(""),gf=Symbol(""),yf=Symbol(""),bf=Symbol(""),wf=Symbol(""),Cf=Symbol(""),_f=Symbol(""),Ef=Symbol(""),xf=Symbol(""),kf=Symbol("");var Sf;let Of;Sf={[mf]:"vModelRadio",[gf]:"vModelCheckbox",[yf]:"vModelText",[bf]:"vModelSelect",[wf]:"vModelDynamic",[Cf]:"withModifiers",[_f]:"withKeys",[Ef]:"vShow",[xf]:"Transition",[kf]:"TransitionGroup"},Object.getOwnPropertySymbols(Sf).forEach((e=>{Us[e]=Sf[e]}));const Nf=o("style,iframe,script,noscript",!0),Pf={isVoidTag:m,isNativeTag:e=>h(e)||v(e),isPreTag:e=>"pre"===e,decodeEntities:function(e,t=!1){return Of||(Of=document.createElement("div")),t?(Of.innerHTML=`<div foo="${e.replace(/"/g,"&quot;")}">`,Of.children[0].getAttribute("foo")):(Of.innerHTML=e,Of.textContent)},isBuiltInComponent:e=>Xs(e,"Transition")?xf:Xs(e,"TransitionGroup")?kf:void 0,getNamespace(e,t){let n=t?t.ns:0;if(t&&2===n)if("annotation-xml"===t.tag){if("svg"===e)return 1;t.props.some((e=>6===e.type&&"encoding"===e.name&&null!=e.value&&("text/html"===e.value.content||"application/xhtml+xml"===e.value.content)))&&(n=0)}else/^m(?:[ions]|text)$/.test(t.tag)&&"mglyph"!==e&&"malignmark"!==e&&(n=0);else t&&1===n&&("foreignObject"!==t.tag&&"desc"!==t.tag&&"title"!==t.tag||(n=0));if(0===n){if("svg"===e)return 1;if("math"===e)return 2}return n},getTextMode({tag:e,ns:t}){if(0===t){if("textarea"===e||"title"===e)return 1;if(Nf(e))return 2}return 0}},Tf=(e,t)=>{const n=f(e);return Ks(JSON.stringify(n),!1,t,3)};function Vf(e,t){return ts(e,t)}const Rf=o("passive,once,capture"),Lf=o("stop,prevent,self,ctrl,shift,alt,meta,exact,middle"),Af=o("left,right"),jf=o("onkeyup,onkeydown,onkeypress",!0),Bf=(e,t)=>Qs(e)&&"onclick"===e.content.toLowerCase()?Ks(t,!0):4!==e.type?Gs(["(",e,`) === "onClick" ? "${t}" : (`,e,")"]):e;const If=(e,t)=>{1!==e.type||0!==e.tagType||"script"!==e.tag&&"style"!==e.tag||(t.onError(Vf(61,e.loc)),t.removeNode())},Mf=[e=>{1===e.type&&e.props.forEach(((t,n)=>{6===t.type&&"style"===t.name&&t.value&&(e.props[n]={type:7,name:"bind",arg:Ks("style",!0,t.loc),exp:Tf(t.value.content,t.loc),modifiers:[],loc:t.loc})}))}],Ff={cloak:()=>({props:[]}),html:(e,t,n)=>{const{exp:r,loc:o}=e;return r||n.onError(Vf(51,o)),t.children.length&&(n.onError(Vf(52,o)),t.children.length=0),{props:[Ws(Ks("innerHTML",!0,o),r||Ks("",!0))]}},text:(e,t,n)=>{const{exp:r,loc:o}=e;return r||n.onError(Vf(53,o)),t.children.length&&(n.onError(Vf(54,o)),t.children.length=0),{props:[Ws(Ks("textContent",!0),r?ou(r,n)>0?r:Zs(n.helperString(Es),[r],o):Ks("",!0))]}},model:(e,t,n)=>{const r=af(e,t,n);if(!r.props.length||1===t.tagType)return r;e.arg&&n.onError(Vf(56,e.arg.loc));const{tag:o}=t,i=n.isCustomElement(o);if("input"===o||"textarea"===o||"select"===o||i){let a=yf,l=!1;if("input"===o||i){const r=fc(t,"type");if(r){if(7===r.type)a=wf;else if(r.value)switch(r.value.content){case"radio":a=mf;break;case"checkbox":a=gf;break;case"file":l=!0,n.onError(Vf(57,e.loc))}}else(function(e){return e.props.some((e=>!(7!==e.type||"bind"!==e.name||e.arg&&4===e.arg.type&&e.arg.isStatic)))})(t)&&(a=wf)}else"select"===o&&(a=bf);l||(r.needRuntime=n.helper(a))}else n.onError(Vf(55,e.loc));return r.props=r.props.filter((e=>!(4===e.key.type&&"modelValue"===e.key.content))),r},on:(e,t,n)=>Xu(e,t,n,(t=>{const{modifiers:r}=e;if(!r.length)return t;let{key:o,value:i}=t.props[0];const{keyModifiers:a,nonKeyModifiers:l,eventOptionModifiers:s}=((e,t,n,r)=>{const o=[],i=[],a=[];for(let r=0;r<t.length;r++){const l=t[r];"native"===l&&Oc("COMPILER_V_ON_NATIVE",n)||Rf(l)?a.push(l):Af(l)?Qs(e)?jf(e.content)?o.push(l):i.push(l):(o.push(l),i.push(l)):Lf(l)?i.push(l):o.push(l)}return{keyModifiers:o,nonKeyModifiers:i,eventOptionModifiers:a}})(o,r,n,e.loc);if(l.includes("right")&&(o=Bf(o,"onContextmenu")),l.includes("middle")&&(o=Bf(o,"onMouseup")),l.length&&(i=Zs(n.helper(Cf),[i,JSON.stringify(l)])),!a.length||Qs(o)&&!jf(o.content)||(i=Zs(n.helper(_f),[i,JSON.stringify(a)])),s.length){const e=s.map(re).join("");o=Qs(o)?Ks(`${o.content}${e}`,!0):Gs(["(",o,`) + "${e}"`])}return{props:[Ws(o,i)]}})),show:(e,t,n)=>{const{exp:r,loc:o}=e;return r||n.onError(Vf(59,o)),{props:[],needRuntime:n.helper(Ef)}}};const Df=Object.create(null);function Uf(e,t){if(!U(e)){if(!e.nodeType)return S;e=e.innerHTML}const n=e,o=Df[n];if(o)return o;if("#"===e[0]){const t=document.querySelector(e);0,e=t?t.innerHTML:""}const i=V({hoistStatic:!0,onError:void 0,onWarn:S},t);i.isCustomElement||"undefined"==typeof customElements||(i.isCustomElement=e=>!!customElements.get(e));const{code:a}=function(e,t={}){return vf(e,V({},Pf,t,{nodeTransforms:[If,...Mf,...t.nodeTransforms||[]],directiveTransforms:V({},Ff,t.directiveTransforms||{}),transformHoist:null}))}(e,i);const l=new Function("Vue",a)(r);return l._rc=!0,Df[n]=l}Qi(Uf)}},n={};function r(e){var o=n[e];if(void 0!==o)return o.exports;var i=n[e]={id:e,loaded:!1,exports:{}};return t[e].call(i.exports,i,i.exports,r),i.loaded=!0,i.exports}r.m=t,e=[],r.O=(t,n,o,i)=>{if(!n){var a=1/0;for(u=0;u<e.length;u++){for(var[n,o,i]=e[u],l=!0,s=0;s<n.length;s++)(!1&i||a>=i)&&Object.keys(r.O).every((e=>r.O[e](n[s])))?n.splice(s--,1):(l=!1,i<a&&(a=i));if(l){e.splice(u--,1);var c=o();void 0!==c&&(t=c)}}return t}i=i||0;for(var u=e.length;u>0&&e[u-1][2]>i;u--)e[u]=e[u-1];e[u]=[n,o,i]},r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e={260:0,143:0};r.O.j=t=>0===e[t];var t=(t,n)=>{var o,i,[a,l,s]=n,c=0;if(a.some((t=>0!==e[t]))){for(o in l)r.o(l,o)&&(r.m[o]=l[o]);if(s)var u=s(r)}for(t&&t(n);c<a.length;c++)i=a[c],r.o(e,i)&&e[i]&&e[i][0](),e[i]=0;return r.O(u)},n=self.webpackChunkopcodesio_log_viewer=self.webpackChunkopcodesio_log_viewer||[];n.forEach(t.bind(null,0)),n.push=t.bind(null,n.push.bind(n))})(),r.O(void 0,[143],(()=>r(500)));var o=r.O(void 0,[143],(()=>r(378)));o=r.O(o)})();
\ No newline at end of file
+(()=>{var e,t={514:(e,t,n)=>{"use strict";var r={};n.r(r),n.d(r,{BaseTransition:()=>Er,BaseTransitionPropsValidators:()=>Or,Comment:()=>Ri,EffectScope:()=>de,Fragment:()=>Ai,KeepAlive:()=>Br,ReactiveEffect:()=>Pe,Static:()=>Li,Suspense:()=>rr,Teleport:()=>Pi,Text:()=>ji,Transition:()=>Ys,TransitionGroup:()=>Ul,VueElement:()=>Al,assertNumber:()=>sn,callWithAsyncErrorHandling:()=>an,callWithErrorHandling:()=>ln,camelize:()=>F,capitalize:()=>D,cloneVNode:()=>es,compatUtils:()=>Vs,computed:()=>Rs,createApp:()=>ma,createBlock:()=>Hi,createCommentVNode:()=>rs,createElementBlock:()=>Vi,createElementVNode:()=>Ji,createHydrationRenderer:()=>yi,createPropsRestProxy:()=>Ao,createRenderer:()=>mi,createSSRApp:()=>ya,createSlots:()=>so,createStaticVNode:()=>ns,createTextVNode:()=>ts,createVNode:()=>Qi,customRef:()=>Qt,defineAsyncComponent:()=>Fr,defineComponent:()=>Lr,defineCustomElement:()=>Cl,defineEmits:()=>mo,defineExpose:()=>yo,defineModel:()=>_o,defineOptions:()=>bo,defineProps:()=>go,defineSSRCustomElement:()=>Pl,defineSlots:()=>wo,devtools:()=>Pn,effect:()=>Ae,effectScope:()=>he,getCurrentInstance:()=>ds,getCurrentScope:()=>ge,getTransitionRawChildren:()=>Rr,guardReactiveProps:()=>Xi,h:()=>Ls,handleError:()=>un,hasInjectionContext:()=>Jo,hydrate:()=>ga,initCustomFormatter:()=>Ns,initDirectivesForSSR:()=>_a,inject:()=>Yo,isMemoSame:()=>Ds,isProxy:()=>Lt,isReactive:()=>At,isReadonly:()=>jt,isRef:()=>Ut,isRuntimeOnly:()=>Es,isShallow:()=>Rt,isVNode:()=>zi,markRaw:()=>Ft,mergeDefaults:()=>Po,mergeModels:()=>To,mergeProps:()=>ls,nextTick:()=>bn,normalizeClass:()=>ee,normalizeProps:()=>te,normalizeStyle:()=>Y,onActivated:()=>$r,onBeforeMount:()=>Yr,onBeforeUnmount:()=>Xr,onBeforeUpdate:()=>Qr,onDeactivated:()=>Vr,onErrorCaptured:()=>oo,onMounted:()=>Jr,onRenderTracked:()=>ro,onRenderTriggered:()=>no,onScopeDispose:()=>me,onServerPrefetch:()=>to,onUnmounted:()=>eo,onUpdated:()=>Zr,openBlock:()=>Ni,popScopeId:()=>Bn,provide:()=>Go,proxyRefs:()=>Yt,pushScopeId:()=>Dn,queuePostFlushCb:()=>xn,reactive:()=>kt,readonly:()=>Ct,ref:()=>$t,registerRuntimeCompiler:()=>ks,render:()=>va,renderList:()=>io,renderSlot:()=>lo,resolveComponent:()=>Jn,resolveDirective:()=>Xn,resolveDynamicComponent:()=>Zn,resolveFilter:()=>$s,resolveTransitionHooks:()=>Pr,setBlockTracking:()=>Ui,setDevtoolsHook:()=>jn,setTransitionHooks:()=>jr,shallowReactive:()=>Et,shallowReadonly:()=>Pt,shallowRef:()=>Vt,ssrContextKey:()=>Is,ssrUtils:()=>Us,stop:()=>je,toDisplayString:()=>ce,toHandlerKey:()=>B,toHandlers:()=>uo,toRaw:()=>It,toRef:()=>tn,toRefs:()=>Zt,toValue:()=>Kt,transformVNodeArgs:()=>Wi,triggerRef:()=>qt,unref:()=>Wt,useAttrs:()=>Oo,useCssModule:()=>jl,useCssVars:()=>Rl,useModel:()=>ko,useSSRContext:()=>Fs,useSlots:()=>So,useTransitionState:()=>xr,vModelCheckbox:()=>Yl,vModelDynamic:()=>na,vModelRadio:()=>Ql,vModelSelect:()=>Zl,vModelText:()=>Gl,vShow:()=>pl,version:()=>Bs,warn:()=>on,watch:()=>dr,watchEffect:()=>ur,watchPostEffect:()=>cr,watchSyncEffect:()=>fr,withAsyncContext:()=>jo,withCtx:()=>$n,withDefaults:()=>xo,withDirectives:()=>yr,withKeys:()=>ua,withMemo:()=>Ms,withModifiers:()=>la,withScopeId:()=>Un});var o={};function i(e,t){const n=Object.create(null),r=e.split(",");for(let e=0;e<r.length;e++)n[r[e]]=!0;return t?e=>!!n[e.toLowerCase()]:e=>!!n[e]}n.r(o),n.d(o,{hasBrowserEnv:()=>dh,hasStandardBrowserEnv:()=>hh,hasStandardBrowserWebWorkerEnv:()=>gh});const s={},l=[],a=()=>{},u=()=>!1,c=/^on[^a-z]/,f=e=>c.test(e),p=e=>e.startsWith("onUpdate:"),d=Object.assign,h=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},v=Object.prototype.hasOwnProperty,g=(e,t)=>v.call(e,t),m=Array.isArray,y=e=>"[object Map]"===C(e),b=e=>"[object Set]"===C(e),w=e=>"[object Date]"===C(e),_=e=>"function"==typeof e,x=e=>"string"==typeof e,S=e=>"symbol"==typeof e,O=e=>null!==e&&"object"==typeof e,k=e=>(O(e)||_(e))&&_(e.then)&&_(e.catch),E=Object.prototype.toString,C=e=>E.call(e),P=e=>C(e).slice(8,-1),T=e=>"[object Object]"===C(e),A=e=>x(e)&&"NaN"!==e&&"-"!==e[0]&&""+parseInt(e,10)===e,j=i(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),R=i("bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"),L=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},I=/-(\w)/g,F=L((e=>e.replace(I,((e,t)=>t?t.toUpperCase():"")))),N=/\B([A-Z])/g,M=L((e=>e.replace(N,"-$1").toLowerCase())),D=L((e=>e.charAt(0).toUpperCase()+e.slice(1))),B=L((e=>e?`on${D(e)}`:"")),U=(e,t)=>!Object.is(e,t),$=(e,t)=>{for(let n=0;n<e.length;n++)e[n](t)},V=(e,t,n)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},H=e=>{const t=parseFloat(e);return isNaN(t)?e:t},z=e=>{const t=x(e)?Number(e):NaN;return isNaN(t)?e:t};let q;const W=()=>q||(q="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==n.g?n.g:{});const K={1:"TEXT",2:"CLASS",4:"STYLE",8:"PROPS",16:"FULL_PROPS",32:"HYDRATE_EVENTS",64:"STABLE_FRAGMENT",128:"KEYED_FRAGMENT",256:"UNKEYED_FRAGMENT",512:"NEED_PATCH",1024:"DYNAMIC_SLOTS",2048:"DEV_ROOT_FRAGMENT",[-1]:"HOISTED",[-2]:"BAIL"},G=i("Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console");function Y(e){if(m(e)){const t={};for(let n=0;n<e.length;n++){const r=e[n],o=x(r)?X(r):Y(r);if(o)for(const e in o)t[e]=o[e]}return t}if(x(e)||O(e))return e}const J=/;(?![^(]*\))/g,Q=/:([^]+)/,Z=/\/\*[^]*?\*\//g;function X(e){const t={};return e.replace(Z,"").split(J).forEach((e=>{if(e){const n=e.split(Q);n.length>1&&(t[n[0].trim()]=n[1].trim())}})),t}function ee(e){let t="";if(x(e))t=e;else if(m(e))for(let n=0;n<e.length;n++){const r=ee(e[n]);r&&(t+=r+" ")}else if(O(e))for(const n in e)e[n]&&(t+=n+" ");return t.trim()}function te(e){if(!e)return null;let{class:t,style:n}=e;return t&&!x(t)&&(e.class=ee(t)),n&&(e.style=Y(n)),e}const ne=i("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot"),re=i("svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view"),oe=i("area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr"),ie="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",se=i(ie);function le(e){return!!e||""===e}function ae(e,t){if(e===t)return!0;let n=w(e),r=w(t);if(n||r)return!(!n||!r)&&e.getTime()===t.getTime();if(n=S(e),r=S(t),n||r)return e===t;if(n=m(e),r=m(t),n||r)return!(!n||!r)&&function(e,t){if(e.length!==t.length)return!1;let n=!0;for(let r=0;n&&r<e.length;r++)n=ae(e[r],t[r]);return n}(e,t);if(n=O(e),r=O(t),n||r){if(!n||!r)return!1;if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e){const r=e.hasOwnProperty(n),o=t.hasOwnProperty(n);if(r&&!o||!r&&o||!ae(e[n],t[n]))return!1}}return String(e)===String(t)}function ue(e,t){return e.findIndex((e=>ae(e,t)))}const ce=e=>x(e)?e:null==e?"":m(e)||O(e)&&(e.toString===E||!_(e.toString))?JSON.stringify(e,fe,2):String(e),fe=(e,t)=>t&&t.__v_isRef?fe(e,t.value):y(t)?{[`Map(${t.size})`]:[...t.entries()].reduce(((e,[t,n])=>(e[`${t} =>`]=n,e)),{})}:b(t)?{[`Set(${t.size})`]:[...t.values()]}:!O(t)||m(t)||T(t)?t:String(t);let pe;class de{constructor(e=!1){this.detached=e,this._active=!0,this.effects=[],this.cleanups=[],this.parent=pe,!e&&pe&&(this.index=(pe.scopes||(pe.scopes=[])).push(this)-1)}get active(){return this._active}run(e){if(this._active){const t=pe;try{return pe=this,e()}finally{pe=t}}else 0}on(){pe=this}off(){pe=this.parent}stop(e){if(this._active){let t,n;for(t=0,n=this.effects.length;t<n;t++)this.effects[t].stop();for(t=0,n=this.cleanups.length;t<n;t++)this.cleanups[t]();if(this.scopes)for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].stop(!0);if(!this.detached&&this.parent&&!e){const e=this.parent.scopes.pop();e&&e!==this&&(this.parent.scopes[this.index]=e,e.index=this.index)}this.parent=void 0,this._active=!1}}}function he(e){return new de(e)}function ve(e,t=pe){t&&t.active&&t.effects.push(e)}function ge(){return pe}function me(e){pe&&pe.cleanups.push(e)}const ye=e=>{const t=new Set(e);return t.w=0,t.n=0,t},be=e=>(e.w&Se)>0,we=e=>(e.n&Se)>0,_e=new WeakMap;let xe=0,Se=1;const Oe=30;let ke;const Ee=Symbol(""),Ce=Symbol("");class Pe{constructor(e,t=null,n){this.fn=e,this.scheduler=t,this.active=!0,this.deps=[],this.parent=void 0,ve(this,n)}run(){if(!this.active)return this.fn();let e=ke,t=Re;for(;e;){if(e===this)return;e=e.parent}try{return this.parent=ke,ke=this,Re=!0,Se=1<<++xe,xe<=Oe?(({deps:e})=>{if(e.length)for(let t=0;t<e.length;t++)e[t].w|=Se})(this):Te(this),this.fn()}finally{xe<=Oe&&(e=>{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r<t.length;r++){const o=t[r];be(o)&&!we(o)?o.delete(e):t[n++]=o,o.w&=~Se,o.n&=~Se}t.length=n}})(this),Se=1<<--xe,ke=this.parent,Re=t,this.parent=void 0,this.deferStop&&this.stop()}}stop(){ke===this?this.deferStop=!0:this.active&&(Te(this),this.onStop&&this.onStop(),this.active=!1)}}function Te(e){const{deps:t}=e;if(t.length){for(let n=0;n<t.length;n++)t[n].delete(e);t.length=0}}function Ae(e,t){e.effect instanceof Pe&&(e=e.effect.fn);const n=new Pe(e);t&&(d(n,t),t.scope&&ve(n,t.scope)),t&&t.lazy||n.run();const r=n.run.bind(n);return r.effect=n,r}function je(e){e.effect.stop()}let Re=!0;const Le=[];function Ie(){Le.push(Re),Re=!1}function Fe(){const e=Le.pop();Re=void 0===e||e}function Ne(e,t,n){if(Re&&ke){let t=_e.get(e);t||_e.set(e,t=new Map);let r=t.get(n);r||t.set(n,r=ye());Me(r,void 0)}}function Me(e,t){let n=!1;xe<=Oe?we(e)||(e.n|=Se,n=!be(e)):n=!e.has(ke),n&&(e.add(ke),ke.deps.push(e))}function De(e,t,n,r,o,i){const s=_e.get(e);if(!s)return;let l=[];if("clear"===t)l=[...s.values()];else if("length"===n&&m(e)){const e=Number(r);s.forEach(((t,n)=>{("length"===n||!S(n)&&n>=e)&&l.push(t)}))}else switch(void 0!==n&&l.push(s.get(n)),t){case"add":m(e)?A(n)&&l.push(s.get("length")):(l.push(s.get(Ee)),y(e)&&l.push(s.get(Ce)));break;case"delete":m(e)||(l.push(s.get(Ee)),y(e)&&l.push(s.get(Ce)));break;case"set":y(e)&&l.push(s.get(Ee))}if(1===l.length)l[0]&&Be(l[0]);else{const e=[];for(const t of l)t&&e.push(...t);Be(ye(e))}}function Be(e,t){const n=m(e)?e:[...e];for(const e of n)e.computed&&Ue(e,t);for(const e of n)e.computed||Ue(e,t)}function Ue(e,t){(e!==ke||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}const $e=i("__proto__,__v_isRef,__isVue"),Ve=new Set(Object.getOwnPropertyNames(Symbol).filter((e=>"arguments"!==e&&"caller"!==e)).map((e=>Symbol[e])).filter(S)),He=ze();function ze(){const e={};return["includes","indexOf","lastIndexOf"].forEach((t=>{e[t]=function(...e){const n=It(this);for(let e=0,t=this.length;e<t;e++)Ne(n,0,e+"");const r=n[t](...e);return-1===r||!1===r?n[t](...e.map(It)):r}})),["push","pop","shift","unshift","splice"].forEach((t=>{e[t]=function(...e){Ie();const n=It(this)[t].apply(this,e);return Fe(),n}})),e}function qe(e){const t=It(this);return Ne(t,0,e),t.hasOwnProperty(e)}class We{constructor(e=!1,t=!1){this._isReadonly=e,this._shallow=t}get(e,t,n){const r=this._isReadonly,o=this._shallow;if("__v_isReactive"===t)return!r;if("__v_isReadonly"===t)return r;if("__v_isShallow"===t)return o;if("__v_raw"===t&&n===(r?o?Ot:St:o?xt:_t).get(e))return e;const i=m(e);if(!r){if(i&&g(He,t))return Reflect.get(He,t,n);if("hasOwnProperty"===t)return qe}const s=Reflect.get(e,t,n);return(S(t)?Ve.has(t):$e(t))?s:(r||Ne(e,0,t),o?s:Ut(s)?i&&A(t)?s:s.value:O(s)?r?Ct(s):kt(s):s)}}class Ke extends We{constructor(e=!1){super(!1,e)}set(e,t,n,r){let o=e[t];if(jt(o)&&Ut(o)&&!Ut(n))return!1;if(!this._shallow&&(Rt(n)||jt(n)||(o=It(o),n=It(n)),!m(e)&&Ut(o)&&!Ut(n)))return o.value=n,!0;const i=m(e)&&A(t)?Number(t)<e.length:g(e,t),s=Reflect.set(e,t,n,r);return e===It(r)&&(i?U(n,o)&&De(e,"set",t,n):De(e,"add",t,n)),s}deleteProperty(e,t){const n=g(e,t),r=(e[t],Reflect.deleteProperty(e,t));return r&&n&&De(e,"delete",t,void 0),r}has(e,t){const n=Reflect.has(e,t);return S(t)&&Ve.has(t)||Ne(e,0,t),n}ownKeys(e){return Ne(e,0,m(e)?"length":Ee),Reflect.ownKeys(e)}}class Ge extends We{constructor(e=!1){super(!0,e)}set(e,t){return!0}deleteProperty(e,t){return!0}}const Ye=new Ke,Je=new Ge,Qe=new Ke(!0),Ze=new Ge(!0),Xe=e=>e,et=e=>Reflect.getPrototypeOf(e);function tt(e,t,n=!1,r=!1){const o=It(e=e.__v_raw),i=It(t);n||(U(t,i)&&Ne(o,0,t),Ne(o,0,i));const{has:s}=et(o),l=r?Xe:n?Mt:Nt;return s.call(o,t)?l(e.get(t)):s.call(o,i)?l(e.get(i)):void(e!==o&&e.get(t))}function nt(e,t=!1){const n=this.__v_raw,r=It(n),o=It(e);return t||(U(e,o)&&Ne(r,0,e),Ne(r,0,o)),e===o?n.has(e):n.has(e)||n.has(o)}function rt(e,t=!1){return e=e.__v_raw,!t&&Ne(It(e),0,Ee),Reflect.get(e,"size",e)}function ot(e){e=It(e);const t=It(this);return et(t).has.call(t,e)||(t.add(e),De(t,"add",e,e)),this}function it(e,t){t=It(t);const n=It(this),{has:r,get:o}=et(n);let i=r.call(n,e);i||(e=It(e),i=r.call(n,e));const s=o.call(n,e);return n.set(e,t),i?U(t,s)&&De(n,"set",e,t):De(n,"add",e,t),this}function st(e){const t=It(this),{has:n,get:r}=et(t);let o=n.call(t,e);o||(e=It(e),o=n.call(t,e));r&&r.call(t,e);const i=t.delete(e);return o&&De(t,"delete",e,void 0),i}function lt(){const e=It(this),t=0!==e.size,n=e.clear();return t&&De(e,"clear",void 0,void 0),n}function at(e,t){return function(n,r){const o=this,i=o.__v_raw,s=It(i),l=t?Xe:e?Mt:Nt;return!e&&Ne(s,0,Ee),i.forEach(((e,t)=>n.call(r,l(e),l(t),o)))}}function ut(e,t,n){return function(...r){const o=this.__v_raw,i=It(o),s=y(i),l="entries"===e||e===Symbol.iterator&&s,a="keys"===e&&s,u=o[e](...r),c=n?Xe:t?Mt:Nt;return!t&&Ne(i,0,a?Ce:Ee),{next(){const{value:e,done:t}=u.next();return t?{value:e,done:t}:{value:l?[c(e[0]),c(e[1])]:c(e),done:t}},[Symbol.iterator](){return this}}}}function ct(e){return function(...t){return"delete"!==e&&this}}function ft(){const e={get(e){return tt(this,e)},get size(){return rt(this)},has:nt,add:ot,set:it,delete:st,clear:lt,forEach:at(!1,!1)},t={get(e){return tt(this,e,!1,!0)},get size(){return rt(this)},has:nt,add:ot,set:it,delete:st,clear:lt,forEach:at(!1,!0)},n={get(e){return tt(this,e,!0)},get size(){return rt(this,!0)},has(e){return nt.call(this,e,!0)},add:ct("add"),set:ct("set"),delete:ct("delete"),clear:ct("clear"),forEach:at(!0,!1)},r={get(e){return tt(this,e,!0,!0)},get size(){return rt(this,!0)},has(e){return nt.call(this,e,!0)},add:ct("add"),set:ct("set"),delete:ct("delete"),clear:ct("clear"),forEach:at(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach((o=>{e[o]=ut(o,!1,!1),n[o]=ut(o,!0,!1),t[o]=ut(o,!1,!0),r[o]=ut(o,!0,!0)})),[e,n,t,r]}const[pt,dt,ht,vt]=ft();function gt(e,t){const n=t?e?vt:ht:e?dt:pt;return(t,r,o)=>"__v_isReactive"===r?!e:"__v_isReadonly"===r?e:"__v_raw"===r?t:Reflect.get(g(n,r)&&r in t?n:t,r,o)}const mt={get:gt(!1,!1)},yt={get:gt(!1,!0)},bt={get:gt(!0,!1)},wt={get:gt(!0,!0)};const _t=new WeakMap,xt=new WeakMap,St=new WeakMap,Ot=new WeakMap;function kt(e){return jt(e)?e:Tt(e,!1,Ye,mt,_t)}function Et(e){return Tt(e,!1,Qe,yt,xt)}function Ct(e){return Tt(e,!0,Je,bt,St)}function Pt(e){return Tt(e,!0,Ze,wt,Ot)}function Tt(e,t,n,r,o){if(!O(e))return e;if(e.__v_raw&&(!t||!e.__v_isReactive))return e;const i=o.get(e);if(i)return i;const s=function(e){return e.__v_skip||!Object.isExtensible(e)?0:function(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}(P(e))}(e);if(0===s)return e;const l=new Proxy(e,2===s?r:n);return o.set(e,l),l}function At(e){return jt(e)?At(e.__v_raw):!(!e||!e.__v_isReactive)}function jt(e){return!(!e||!e.__v_isReadonly)}function Rt(e){return!(!e||!e.__v_isShallow)}function Lt(e){return At(e)||jt(e)}function It(e){const t=e&&e.__v_raw;return t?It(t):e}function Ft(e){return V(e,"__v_skip",!0),e}const Nt=e=>O(e)?kt(e):e,Mt=e=>O(e)?Ct(e):e;function Dt(e){Re&&ke&&Me((e=It(e)).dep||(e.dep=ye()))}function Bt(e,t){const n=(e=It(e)).dep;n&&Be(n)}function Ut(e){return!(!e||!0!==e.__v_isRef)}function $t(e){return Ht(e,!1)}function Vt(e){return Ht(e,!0)}function Ht(e,t){return Ut(e)?e:new zt(e,t)}class zt{constructor(e,t){this.__v_isShallow=t,this.dep=void 0,this.__v_isRef=!0,this._rawValue=t?e:It(e),this._value=t?e:Nt(e)}get value(){return Dt(this),this._value}set value(e){const t=this.__v_isShallow||Rt(e)||jt(e);e=t?e:It(e),U(e,this._rawValue)&&(this._rawValue=e,this._value=t?e:Nt(e),Bt(this))}}function qt(e){Bt(e)}function Wt(e){return Ut(e)?e.value:e}function Kt(e){return _(e)?e():Wt(e)}const Gt={get:(e,t,n)=>Wt(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return Ut(o)&&!Ut(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function Yt(e){return At(e)?e:new Proxy(e,Gt)}class Jt{constructor(e){this.dep=void 0,this.__v_isRef=!0;const{get:t,set:n}=e((()=>Dt(this)),(()=>Bt(this)));this._get=t,this._set=n}get value(){return this._get()}set value(e){this._set(e)}}function Qt(e){return new Jt(e)}function Zt(e){const t=m(e)?new Array(e.length):{};for(const n in e)t[n]=nn(e,n);return t}class Xt{constructor(e,t,n){this._object=e,this._key=t,this._defaultValue=n,this.__v_isRef=!0}get value(){const e=this._object[this._key];return void 0===e?this._defaultValue:e}set value(e){this._object[this._key]=e}get dep(){return function(e,t){var n;return null==(n=_e.get(e))?void 0:n.get(t)}(It(this._object),this._key)}}class en{constructor(e){this._getter=e,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function tn(e,t,n){return Ut(e)?e:_(e)?new en(e):O(e)&&arguments.length>1?nn(e,t,n):$t(e)}function nn(e,t,n){const r=e[t];return Ut(r)?r:new Xt(e,t,n)}class rn{constructor(e,t,n,r){this._setter=t,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this._dirty=!0,this.effect=new Pe(e,(()=>{this._dirty||(this._dirty=!0,Bt(this))})),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=n}get value(){const e=It(this);return Dt(e),!e._dirty&&e._cacheable||(e._dirty=!1,e._value=e.effect.run()),e._value}set value(e){this._setter(e)}}function on(e,...t){}function sn(e,t){}function ln(e,t,n,r){let o;try{o=r?e(...r):e()}catch(e){un(e,t,n)}return o}function an(e,t,n,r){if(_(e)){const o=ln(e,t,n,r);return o&&k(o)&&o.catch((e=>{un(e,t,n)})),o}const o=[];for(let i=0;i<e.length;i++)o.push(an(e[i],t,n,r));return o}function un(e,t,n,r=!0){t&&t.vnode;if(t){let r=t.parent;const o=t.proxy,i=n;for(;r;){const t=r.ec;if(t)for(let n=0;n<t.length;n++)if(!1===t[n](e,o,i))return;r=r.parent}const s=t.appContext.config.errorHandler;if(s)return void ln(s,null,10,[e,o,i])}}let cn=!1,fn=!1;const pn=[];let dn=0;const hn=[];let vn=null,gn=0;const mn=Promise.resolve();let yn=null;function bn(e){const t=yn||mn;return e?t.then(this?e.bind(this):e):t}function wn(e){pn.length&&pn.includes(e,cn&&e.allowRecurse?dn+1:dn)||(null==e.id?pn.push(e):pn.splice(function(e){let t=dn+1,n=pn.length;for(;t<n;){const r=t+n>>>1,o=pn[r],i=kn(o);i<e||i===e&&o.pre?t=r+1:n=r}return t}(e.id),0,e),_n())}function _n(){cn||fn||(fn=!0,yn=mn.then(Cn))}function xn(e){m(e)?hn.push(...e):vn&&vn.includes(e,e.allowRecurse?gn+1:gn)||hn.push(e),_n()}function Sn(e,t=(cn?dn+1:0)){for(0;t<pn.length;t++){const e=pn[t];e&&e.pre&&(pn.splice(t,1),t--,e())}}function On(e){if(hn.length){const e=[...new Set(hn)];if(hn.length=0,vn)return void vn.push(...e);for(vn=e,vn.sort(((e,t)=>kn(e)-kn(t))),gn=0;gn<vn.length;gn++)vn[gn]();vn=null,gn=0}}const kn=e=>null==e.id?1/0:e.id,En=(e,t)=>{const n=kn(e)-kn(t);if(0===n){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function Cn(e){fn=!1,cn=!0,pn.sort(En);try{for(dn=0;dn<pn.length;dn++){const e=pn[dn];e&&!1!==e.active&&ln(e,null,14)}}finally{dn=0,pn.length=0,On(),cn=!1,yn=null,(pn.length||hn.length)&&Cn(e)}}let Pn,Tn=[],An=!1;function jn(e,t){var n,r;if(Pn=e,Pn)Pn.enabled=!0,Tn.forEach((({event:e,args:t})=>Pn.emit(e,...t))),Tn=[];else if("undefined"!=typeof window&&window.HTMLElement&&!(null==(r=null==(n=window.navigator)?void 0:n.userAgent)?void 0:r.includes("jsdom"))){(t.__VUE_DEVTOOLS_HOOK_REPLAY__=t.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push((e=>{jn(e,t)})),setTimeout((()=>{Pn||(t.__VUE_DEVTOOLS_HOOK_REPLAY__=null,An=!0,Tn=[])}),3e3)}else An=!0,Tn=[]}function Rn(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||s;let o=n;const i=t.startsWith("update:"),l=i&&t.slice(7);if(l&&l in r){const e=`${"modelValue"===l?"model":l}Modifiers`,{number:t,trim:i}=r[e]||s;i&&(o=n.map((e=>x(e)?e.trim():e))),t&&(o=n.map(H))}let a;let u=r[a=B(t)]||r[a=B(F(t))];!u&&i&&(u=r[a=B(M(t))]),u&&an(u,e,6,o);const c=r[a+"Once"];if(c){if(e.emitted){if(e.emitted[a])return}else e.emitted={};e.emitted[a]=!0,an(c,e,6,o)}}function Ln(e,t,n=!1){const r=t.emitsCache,o=r.get(e);if(void 0!==o)return o;const i=e.emits;let s={},l=!1;if(!_(e)){const r=e=>{const n=Ln(e,t,!0);n&&(l=!0,d(s,n))};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}return i||l?(m(i)?i.forEach((e=>s[e]=null)):d(s,i),O(e)&&r.set(e,s),s):(O(e)&&r.set(e,null),null)}function In(e,t){return!(!e||!f(t))&&(t=t.slice(2).replace(/Once$/,""),g(e,t[0].toLowerCase()+t.slice(1))||g(e,M(t))||g(e,t))}let Fn=null,Nn=null;function Mn(e){const t=Fn;return Fn=e,Nn=e&&e.type.__scopeId||null,t}function Dn(e){Nn=e}function Bn(){Nn=null}const Un=e=>$n;function $n(e,t=Fn,n){if(!t)return e;if(e._n)return e;const r=(...n)=>{r._d&&Ui(-1);const o=Mn(t);let i;try{i=e(...n)}finally{Mn(o),r._d&&Ui(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function Vn(e){const{type:t,vnode:n,proxy:r,withProxy:o,props:i,propsOptions:[s],slots:l,attrs:a,emit:u,render:c,renderCache:f,data:d,setupState:h,ctx:v,inheritAttrs:g}=e;let m,y;const b=Mn(e);try{if(4&n.shapeFlag){const e=o||r;m=os(c.call(e,e,f,i,h,d,v)),y=a}else{const e=t;0,m=os(e.length>1?e(i,{attrs:a,slots:l,emit:u}):e(i,null)),y=t.props?a:zn(a)}}catch(t){Ii.length=0,un(t,e,1),m=Qi(Ri)}let w=m;if(y&&!1!==g){const e=Object.keys(y),{shapeFlag:t}=w;e.length&&7&t&&(s&&e.some(p)&&(y=qn(y,s)),w=es(w,y))}return n.dirs&&(w=es(w),w.dirs=w.dirs?w.dirs.concat(n.dirs):n.dirs),n.transition&&(w.transition=n.transition),m=w,Mn(b),m}function Hn(e){let t;for(let n=0;n<e.length;n++){const r=e[n];if(!zi(r))return;if(r.type!==Ri||"v-if"===r.children){if(t)return;t=r}}return t}const zn=e=>{let t;for(const n in e)("class"===n||"style"===n||f(n))&&((t||(t={}))[n]=e[n]);return t},qn=(e,t)=>{const n={};for(const r in e)p(r)&&r.slice(9)in t||(n[r]=e[r]);return n};function Wn(e,t,n){const r=Object.keys(t);if(r.length!==Object.keys(e).length)return!0;for(let o=0;o<r.length;o++){const i=r[o];if(t[i]!==e[i]&&!In(n,i))return!0}return!1}function Kn({vnode:e,parent:t},n){for(;t&&t.subTree===e;)(e=t.vnode).el=n,t=t.parent}const Gn="components",Yn="directives";function Jn(e,t){return er(Gn,e,!0,t)||e}const Qn=Symbol.for("v-ndc");function Zn(e){return x(e)?er(Gn,e,!1)||e:e||Qn}function Xn(e){return er(Yn,e)}function er(e,t,n=!0,r=!1){const o=Fn||ps;if(o){const n=o.type;if(e===Gn){const e=As(n,!1);if(e&&(e===t||e===F(t)||e===D(F(t))))return n}const i=tr(o[e]||n[e],t)||tr(o.appContext[e],t);return!i&&r?n:i}}function tr(e,t){return e&&(e[t]||e[F(t)]||e[D(F(t))])}const nr=e=>e.__isSuspense,rr={name:"Suspense",__isSuspense:!0,process(e,t,n,r,o,i,s,l,a,u){null==e?function(e,t,n,r,o,i,s,l,a){const{p:u,o:{createElement:c}}=a,f=c("div"),p=e.suspense=ir(e,o,r,t,f,n,i,s,l,a);u(null,p.pendingBranch=e.ssContent,f,null,r,p,i,s),p.deps>0?(or(e,"onPending"),or(e,"onFallback"),u(null,e.ssFallback,t,n,r,null,i,s),ar(p,e.ssFallback)):p.resolve(!1,!0)}(t,n,r,o,i,s,l,a,u):function(e,t,n,r,o,i,s,l,{p:a,um:u,o:{createElement:c}}){const f=t.suspense=e.suspense;f.vnode=t,t.el=e.el;const p=t.ssContent,d=t.ssFallback,{activeBranch:h,pendingBranch:v,isInFallback:g,isHydrating:m}=f;if(v)f.pendingBranch=p,qi(p,v)?(a(v,p,f.hiddenContainer,null,o,f,i,s,l),f.deps<=0?f.resolve():g&&(a(h,d,n,r,o,null,i,s,l),ar(f,d))):(f.pendingId++,m?(f.isHydrating=!1,f.activeBranch=v):u(v,o,f),f.deps=0,f.effects.length=0,f.hiddenContainer=c("div"),g?(a(null,p,f.hiddenContainer,null,o,f,i,s,l),f.deps<=0?f.resolve():(a(h,d,n,r,o,null,i,s,l),ar(f,d))):h&&qi(p,h)?(a(h,p,n,r,o,f,i,s,l),f.resolve(!0)):(a(null,p,f.hiddenContainer,null,o,f,i,s,l),f.deps<=0&&f.resolve()));else if(h&&qi(p,h))a(h,p,n,r,o,f,i,s,l),ar(f,p);else if(or(t,"onPending"),f.pendingBranch=p,f.pendingId++,a(null,p,f.hiddenContainer,null,o,f,i,s,l),f.deps<=0)f.resolve();else{const{timeout:e,pendingId:t}=f;e>0?setTimeout((()=>{f.pendingId===t&&f.fallback(d)}),e):0===e&&f.fallback(d)}}(e,t,n,r,o,s,l,a,u)},hydrate:function(e,t,n,r,o,i,s,l,a){const u=t.suspense=ir(t,r,n,e.parentNode,document.createElement("div"),null,o,i,s,l,!0),c=a(e,u.pendingBranch=t.ssContent,n,u,i,s);0===u.deps&&u.resolve(!1,!0);return c},create:ir,normalize:function(e){const{shapeFlag:t,children:n}=e,r=32&t;e.ssContent=sr(r?n.default:n),e.ssFallback=r?sr(n.fallback):Qi(Ri)}};function or(e,t){const n=e.props&&e.props[t];_(n)&&n()}function ir(e,t,n,r,o,i,s,l,a,u,c=!1){const{p:f,m:p,um:d,n:h,o:{parentNode:v,remove:g}}=u;let m;const y=function(e){var t;return null!=(null==(t=e.props)?void 0:t.suspensible)&&!1!==e.props.suspensible}(e);y&&(null==t?void 0:t.pendingBranch)&&(m=t.pendingId,t.deps++);const b=e.props?z(e.props.timeout):void 0;const w={vnode:e,parent:t,parentComponent:n,isSVG:s,container:r,hiddenContainer:o,anchor:i,deps:0,pendingId:0,timeout:"number"==typeof b?b:-1,activeBranch:null,pendingBranch:null,isInFallback:!0,isHydrating:c,isUnmounted:!1,effects:[],resolve(e=!1,n=!1){const{vnode:r,activeBranch:o,pendingBranch:i,pendingId:s,effects:l,parentComponent:a,container:u}=w;let c=!1;if(w.isHydrating)w.isHydrating=!1;else if(!e){c=o&&i.transition&&"out-in"===i.transition.mode,c&&(o.transition.afterLeave=()=>{s===w.pendingId&&(p(i,u,e,0),xn(l))});let{anchor:e}=w;o&&(e=h(o),d(o,a,w,!0)),c||p(i,u,e,0)}ar(w,i),w.pendingBranch=null,w.isInFallback=!1;let f=w.parent,v=!1;for(;f;){if(f.pendingBranch){f.effects.push(...l),v=!0;break}f=f.parent}v||c||xn(l),w.effects=[],y&&t&&t.pendingBranch&&m===t.pendingId&&(t.deps--,0!==t.deps||n||t.resolve()),or(r,"onResolve")},fallback(e){if(!w.pendingBranch)return;const{vnode:t,activeBranch:n,parentComponent:r,container:o,isSVG:i}=w;or(t,"onFallback");const s=h(n),u=()=>{w.isInFallback&&(f(null,e,o,s,r,null,i,l,a),ar(w,e))},c=e.transition&&"out-in"===e.transition.mode;c&&(n.transition.afterLeave=u),w.isInFallback=!0,d(n,r,null,!0),c||u()},move(e,t,n){w.activeBranch&&p(w.activeBranch,e,t,n),w.container=e},next:()=>w.activeBranch&&h(w.activeBranch),registerDep(e,t){const n=!!w.pendingBranch;n&&w.deps++;const r=e.vnode.el;e.asyncDep.catch((t=>{un(t,e,0)})).then((o=>{if(e.isUnmounted||w.isUnmounted||w.pendingId!==e.suspenseId)return;e.asyncResolved=!0;const{vnode:i}=e;Os(e,o,!1),r&&(i.el=r);const l=!r&&e.subTree.el;t(e,i,v(r||e.subTree.el),r?null:h(e.subTree),w,s,a),l&&g(l),Kn(e,i.el),n&&0==--w.deps&&w.resolve()}))},unmount(e,t){w.isUnmounted=!0,w.activeBranch&&d(w.activeBranch,n,e,t),w.pendingBranch&&d(w.pendingBranch,n,e,t)}};return w}function sr(e){let t;if(_(e)){const n=Bi&&e._c;n&&(e._d=!1,Ni()),e=e(),n&&(e._d=!0,t=Fi,Mi())}if(m(e)){const t=Hn(e);0,e=t}return e=os(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter((t=>t!==e))),e}function lr(e,t){t&&t.pendingBranch?m(e)?t.effects.push(...e):t.effects.push(e):xn(e)}function ar(e,t){e.activeBranch=t;const{vnode:n,parentComponent:r}=e,o=n.el=t.el;r&&r.subTree===n&&(r.vnode.el=o,Kn(r,o))}function ur(e,t){return hr(e,null,t)}function cr(e,t){return hr(e,null,{flush:"post"})}function fr(e,t){return hr(e,null,{flush:"sync"})}const pr={};function dr(e,t,n){return hr(e,t,n)}function hr(e,t,{immediate:n,deep:r,flush:o,onTrack:i,onTrigger:l}=s){var u;const c=ge()===(null==(u=ps)?void 0:u.scope)?ps:null;let f,p,d=!1,v=!1;if(Ut(e)?(f=()=>e.value,d=Rt(e)):At(e)?(f=()=>e,r=!0):m(e)?(v=!0,d=e.some((e=>At(e)||Rt(e))),f=()=>e.map((e=>Ut(e)?e.value:At(e)?mr(e):_(e)?ln(e,c,2):void 0))):f=_(e)?t?()=>ln(e,c,2):()=>{if(!c||!c.isUnmounted)return p&&p(),an(e,c,3,[y])}:a,t&&r){const e=f;f=()=>mr(e())}let g,y=e=>{p=S.onStop=()=>{ln(e,c,4)}};if(xs){if(y=a,t?n&&an(t,c,3,[f(),v?[]:void 0,y]):f(),"sync"!==o)return a;{const e=Fs();g=e.__watcherHandles||(e.__watcherHandles=[])}}let b=v?new Array(e.length).fill(pr):pr;const w=()=>{if(S.active)if(t){const e=S.run();(r||d||(v?e.some(((e,t)=>U(e,b[t]))):U(e,b)))&&(p&&p(),an(t,c,3,[e,b===pr?void 0:v&&b[0]===pr?[]:b,y]),b=e)}else S.run()};let x;w.allowRecurse=!!t,"sync"===o?x=w:"post"===o?x=()=>gi(w,c&&c.suspense):(w.pre=!0,c&&(w.id=c.uid),x=()=>wn(w));const S=new Pe(f,x);t?n?w():b=S.run():"post"===o?gi(S.run.bind(S),c&&c.suspense):S.run();const O=()=>{S.stop(),c&&c.scope&&h(c.scope.effects,S)};return g&&g.push(O),O}function vr(e,t,n){const r=this.proxy,o=x(e)?e.includes(".")?gr(r,e):()=>r[e]:e.bind(r,r);let i;_(t)?i=t:(i=t.handler,n=t);const s=ps;ms(this);const l=hr(o,i.bind(r),n);return s?ms(s):ys(),l}function gr(e,t){const n=t.split(".");return()=>{let t=e;for(let e=0;e<n.length&&t;e++)t=t[n[e]];return t}}function mr(e,t){if(!O(e)||e.__v_skip)return e;if((t=t||new Set).has(e))return e;if(t.add(e),Ut(e))mr(e.value,t);else if(m(e))for(let n=0;n<e.length;n++)mr(e[n],t);else if(b(e)||y(e))e.forEach((e=>{mr(e,t)}));else if(T(e))for(const n in e)mr(e[n],t);return e}function yr(e,t){const n=Fn;if(null===n)return e;const r=Ts(n)||n.proxy,o=e.dirs||(e.dirs=[]);for(let e=0;e<t.length;e++){let[n,i,l,a=s]=t[e];n&&(_(n)&&(n={mounted:n,updated:n}),n.deep&&mr(i),o.push({dir:n,instance:r,value:i,oldValue:void 0,arg:l,modifiers:a}))}return e}function br(e,t,n,r){const o=e.dirs,i=t&&t.dirs;for(let s=0;s<o.length;s++){const l=o[s];i&&(l.oldValue=i[s].value);let a=l.dir[r];a&&(Ie(),an(a,n,8,[e.el,l,e,t]),Fe())}}const wr=Symbol("_leaveCb"),_r=Symbol("_enterCb");function xr(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Jr((()=>{e.isMounted=!0})),Xr((()=>{e.isUnmounting=!0})),e}const Sr=[Function,Array],Or={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Sr,onEnter:Sr,onAfterEnter:Sr,onEnterCancelled:Sr,onBeforeLeave:Sr,onLeave:Sr,onAfterLeave:Sr,onLeaveCancelled:Sr,onBeforeAppear:Sr,onAppear:Sr,onAfterAppear:Sr,onAppearCancelled:Sr},kr={name:"BaseTransition",props:Or,setup(e,{slots:t}){const n=ds(),r=xr();let o;return()=>{const i=t.default&&Rr(t.default(),!0);if(!i||!i.length)return;let s=i[0];if(i.length>1){let e=!1;for(const t of i)if(t.type!==Ri){0,s=t,e=!0;break}}const l=It(e),{mode:a}=l;if(r.isLeaving)return Tr(s);const u=Ar(s);if(!u)return Tr(s);const c=Pr(u,l,r,n);jr(u,c);const f=n.subTree,p=f&&Ar(f);let d=!1;const{getTransitionKey:h}=u.type;if(h){const e=h();void 0===o?o=e:e!==o&&(o=e,d=!0)}if(p&&p.type!==Ri&&(!qi(u,p)||d)){const e=Pr(p,l,r,n);if(jr(p,e),"out-in"===a)return r.isLeaving=!0,e.afterLeave=()=>{r.isLeaving=!1,!1!==n.update.active&&n.update()},Tr(s);"in-out"===a&&u.type!==Ri&&(e.delayLeave=(e,t,n)=>{Cr(r,p)[String(p.key)]=p,e[wr]=()=>{t(),e[wr]=void 0,delete c.delayedLeave},c.delayedLeave=n})}return s}}},Er=kr;function Cr(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function Pr(e,t,n,r){const{appear:o,mode:i,persisted:s=!1,onBeforeEnter:l,onEnter:a,onAfterEnter:u,onEnterCancelled:c,onBeforeLeave:f,onLeave:p,onAfterLeave:d,onLeaveCancelled:h,onBeforeAppear:v,onAppear:g,onAfterAppear:y,onAppearCancelled:b}=t,w=String(e.key),_=Cr(n,e),x=(e,t)=>{e&&an(e,r,9,t)},S=(e,t)=>{const n=t[1];x(e,t),m(e)?e.every((e=>e.length<=1))&&n():e.length<=1&&n()},O={mode:i,persisted:s,beforeEnter(t){let r=l;if(!n.isMounted){if(!o)return;r=v||l}t[wr]&&t[wr](!0);const i=_[w];i&&qi(e,i)&&i.el[wr]&&i.el[wr](),x(r,[t])},enter(e){let t=a,r=u,i=c;if(!n.isMounted){if(!o)return;t=g||a,r=y||u,i=b||c}let s=!1;const l=e[_r]=t=>{s||(s=!0,x(t?i:r,[e]),O.delayedLeave&&O.delayedLeave(),e[_r]=void 0)};t?S(t,[e,l]):l()},leave(t,r){const o=String(e.key);if(t[_r]&&t[_r](!0),n.isUnmounting)return r();x(f,[t]);let i=!1;const s=t[wr]=n=>{i||(i=!0,r(),x(n?h:d,[t]),t[wr]=void 0,_[o]===e&&delete _[o])};_[o]=e,p?S(p,[t,s]):s()},clone:e=>Pr(e,t,n,r)};return O}function Tr(e){if(Mr(e))return(e=es(e)).children=null,e}function Ar(e){return Mr(e)?e.children?e.children[0]:void 0:e}function jr(e,t){6&e.shapeFlag&&e.component?jr(e.component.subTree,t):128&e.shapeFlag?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Rr(e,t=!1,n){let r=[],o=0;for(let i=0;i<e.length;i++){let s=e[i];const l=null==n?s.key:String(n)+String(null!=s.key?s.key:i);s.type===Ai?(128&s.patchFlag&&o++,r=r.concat(Rr(s.children,t,l))):(t||s.type!==Ri)&&r.push(null!=l?es(s,{key:l}):s)}if(o>1)for(let e=0;e<r.length;e++)r[e].patchFlag=-2;return r}function Lr(e,t){return _(e)?(()=>d({name:e.name},t,{setup:e}))():e}const Ir=e=>!!e.type.__asyncLoader;function Fr(e){_(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:o=200,timeout:i,suspensible:s=!0,onError:l}=e;let a,u=null,c=0;const f=()=>{let e;return u||(e=u=t().catch((e=>{if(e=e instanceof Error?e:new Error(String(e)),l)return new Promise(((t,n)=>{l(e,(()=>t((c++,u=null,f()))),(()=>n(e)),c+1)}));throw e})).then((t=>e!==u&&u?u:(t&&(t.__esModule||"Module"===t[Symbol.toStringTag])&&(t=t.default),a=t,t))))};return Lr({name:"AsyncComponentWrapper",__asyncLoader:f,get __asyncResolved(){return a},setup(){const e=ps;if(a)return()=>Nr(a,e);const t=t=>{u=null,un(t,e,13,!r)};if(s&&e.suspense||xs)return f().then((t=>()=>Nr(t,e))).catch((e=>(t(e),()=>r?Qi(r,{error:e}):null)));const l=$t(!1),c=$t(),p=$t(!!o);return o&&setTimeout((()=>{p.value=!1}),o),null!=i&&setTimeout((()=>{if(!l.value&&!c.value){const e=new Error(`Async component timed out after ${i}ms.`);t(e),c.value=e}}),i),f().then((()=>{l.value=!0,e.parent&&Mr(e.parent.vnode)&&wn(e.parent.update)})).catch((e=>{t(e),c.value=e})),()=>l.value&&a?Nr(a,e):c.value&&r?Qi(r,{error:c.value}):n&&!p.value?Qi(n):void 0}})}function Nr(e,t){const{ref:n,props:r,children:o,ce:i}=t.vnode,s=Qi(e,r,o);return s.ref=n,s.ce=i,delete t.vnode.ce,s}const Mr=e=>e.type.__isKeepAlive,Dr={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=ds(),r=n.ctx;if(!r.renderer)return()=>{const e=t.default&&t.default();return e&&1===e.length?e[0]:e};const o=new Map,i=new Set;let s=null;const l=n.suspense,{renderer:{p:a,m:u,um:c,o:{createElement:f}}}=r,p=f("div");function d(e){qr(e),c(e,n,l,!0)}function h(e){o.forEach(((t,n)=>{const r=As(t.type);!r||e&&e(r)||v(n)}))}function v(e){const t=o.get(e);s&&qi(t,s)?s&&qr(s):d(t),o.delete(e),i.delete(e)}r.activate=(e,t,n,r,o)=>{const i=e.component;u(e,t,n,0,l),a(i.vnode,e,t,n,i,l,r,e.slotScopeIds,o),gi((()=>{i.isDeactivated=!1,i.a&&$(i.a);const t=e.props&&e.props.onVnodeMounted;t&&as(t,i.parent,e)}),l)},r.deactivate=e=>{const t=e.component;u(e,p,null,1,l),gi((()=>{t.da&&$(t.da);const n=e.props&&e.props.onVnodeUnmounted;n&&as(n,t.parent,e),t.isDeactivated=!0}),l)},dr((()=>[e.include,e.exclude]),(([e,t])=>{e&&h((t=>Ur(e,t))),t&&h((e=>!Ur(t,e)))}),{flush:"post",deep:!0});let g=null;const m=()=>{null!=g&&o.set(g,Wr(n.subTree))};return Jr(m),Zr(m),Xr((()=>{o.forEach((e=>{const{subTree:t,suspense:r}=n,o=Wr(t);if(e.type!==o.type||e.key!==o.key)d(e);else{qr(o);const e=o.component.da;e&&gi(e,r)}}))})),()=>{if(g=null,!t.default)return null;const n=t.default(),r=n[0];if(n.length>1)return s=null,n;if(!(zi(r)&&(4&r.shapeFlag||128&r.shapeFlag)))return s=null,r;let l=Wr(r);const a=l.type,u=As(Ir(l)?l.type.__asyncResolved||{}:a),{include:c,exclude:f,max:p}=e;if(c&&(!u||!Ur(c,u))||f&&u&&Ur(f,u))return s=l,r;const d=null==l.key?a:l.key,h=o.get(d);return l.el&&(l=es(l),128&r.shapeFlag&&(r.ssContent=l)),g=d,h?(l.el=h.el,l.component=h.component,l.transition&&jr(l,l.transition),l.shapeFlag|=512,i.delete(d),i.add(d)):(i.add(d),p&&i.size>parseInt(p,10)&&v(i.values().next().value)),l.shapeFlag|=256,s=l,nr(r.type)?r:l}}},Br=Dr;function Ur(e,t){return m(e)?e.some((e=>Ur(e,t))):x(e)?e.split(",").includes(t):"[object RegExp]"===C(e)&&e.test(t)}function $r(e,t){Hr(e,"a",t)}function Vr(e,t){Hr(e,"da",t)}function Hr(e,t,n=ps){const r=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()});if(Kr(t,r,n),n){let e=n.parent;for(;e&&e.parent;)Mr(e.parent.vnode)&&zr(r,t,n,e),e=e.parent}}function zr(e,t,n,r){const o=Kr(t,e,r,!0);eo((()=>{h(r[t],o)}),n)}function qr(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function Wr(e){return 128&e.shapeFlag?e.ssContent:e}function Kr(e,t,n=ps,r=!1){if(n){const o=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...r)=>{if(n.isUnmounted)return;Ie(),ms(n);const o=an(t,n,e,r);return ys(),Fe(),o});return r?o.unshift(i):o.push(i),i}}const Gr=e=>(t,n=ps)=>(!xs||"sp"===e)&&Kr(e,((...e)=>t(...e)),n),Yr=Gr("bm"),Jr=Gr("m"),Qr=Gr("bu"),Zr=Gr("u"),Xr=Gr("bum"),eo=Gr("um"),to=Gr("sp"),no=Gr("rtg"),ro=Gr("rtc");function oo(e,t=ps){Kr("ec",e,t)}function io(e,t,n,r){let o;const i=n&&n[r];if(m(e)||x(e)){o=new Array(e.length);for(let n=0,r=e.length;n<r;n++)o[n]=t(e[n],n,void 0,i&&i[n])}else if("number"==typeof e){0,o=new Array(e);for(let n=0;n<e;n++)o[n]=t(n+1,n,void 0,i&&i[n])}else if(O(e))if(e[Symbol.iterator])o=Array.from(e,((e,n)=>t(e,n,void 0,i&&i[n])));else{const n=Object.keys(e);o=new Array(n.length);for(let r=0,s=n.length;r<s;r++){const s=n[r];o[r]=t(e[s],s,r,i&&i[r])}}else o=[];return n&&(n[r]=o),o}function so(e,t){for(let n=0;n<t.length;n++){const r=t[n];if(m(r))for(let t=0;t<r.length;t++)e[r[t].name]=r[t].fn;else r&&(e[r.name]=r.key?(...e)=>{const t=r.fn(...e);return t&&(t.key=r.key),t}:r.fn)}return e}function lo(e,t,n={},r,o){if(Fn.isCE||Fn.parent&&Ir(Fn.parent)&&Fn.parent.isCE)return"default"!==t&&(n.name=t),Qi("slot",n,r&&r());let i=e[t];i&&i._c&&(i._d=!1),Ni();const s=i&&ao(i(n)),l=Hi(Ai,{key:n.key||s&&s.key||`_${t}`},s||(r?r():[]),s&&1===e._?64:-2);return!o&&l.scopeId&&(l.slotScopeIds=[l.scopeId+"-s"]),i&&i._c&&(i._d=!0),l}function ao(e){return e.some((e=>!zi(e)||e.type!==Ri&&!(e.type===Ai&&!ao(e.children))))?e:null}function uo(e,t){const n={};for(const r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:B(r)]=e[r];return n}const co=e=>e?bs(e)?Ts(e)||e.proxy:co(e.parent):null,fo=d(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>co(e.parent),$root:e=>co(e.root),$emit:e=>e.emit,$options:e=>No(e),$forceUpdate:e=>e.f||(e.f=()=>wn(e.update)),$nextTick:e=>e.n||(e.n=bn.bind(e.proxy)),$watch:e=>vr.bind(e)}),po=(e,t)=>e!==s&&!e.__isScriptSetup&&g(e,t),ho={get({_:e},t){const{ctx:n,setupState:r,data:o,props:i,accessCache:l,type:a,appContext:u}=e;let c;if("$"!==t[0]){const a=l[t];if(void 0!==a)switch(a){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return i[t]}else{if(po(r,t))return l[t]=1,r[t];if(o!==s&&g(o,t))return l[t]=2,o[t];if((c=e.propsOptions[0])&&g(c,t))return l[t]=3,i[t];if(n!==s&&g(n,t))return l[t]=4,n[t];Ro&&(l[t]=0)}}const f=fo[t];let p,d;return f?("$attrs"===t&&Ne(e,0,t),f(e)):(p=a.__cssModules)&&(p=p[t])?p:n!==s&&g(n,t)?(l[t]=4,n[t]):(d=u.config.globalProperties,g(d,t)?d[t]:void 0)},set({_:e},t,n){const{data:r,setupState:o,ctx:i}=e;return po(o,t)?(o[t]=n,!0):r!==s&&g(r,t)?(r[t]=n,!0):!g(e.props,t)&&(("$"!==t[0]||!(t.slice(1)in e))&&(i[t]=n,!0))},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:o,propsOptions:i}},l){let a;return!!n[l]||e!==s&&g(e,l)||po(t,l)||(a=i[0])&&g(a,l)||g(r,l)||g(fo,l)||g(o.config.globalProperties,l)},defineProperty(e,t,n){return null!=n.get?e._.accessCache[t]=0:g(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};const vo=d({},ho,{get(e,t){if(t!==Symbol.unscopables)return ho.get(e,t,e)},has:(e,t)=>"_"!==t[0]&&!G(t)});function go(){return null}function mo(){return null}function yo(e){0}function bo(e){0}function wo(){return null}function _o(){0}function xo(e,t){return null}function So(){return Eo().slots}function Oo(){return Eo().attrs}function ko(e,t,n){const r=ds();if(n&&n.local){const n=$t(e[t]);return dr((()=>e[t]),(e=>n.value=e)),dr(n,(n=>{n!==e[t]&&r.emit(`update:${t}`,n)})),n}return{__v_isRef:!0,get value(){return e[t]},set value(e){r.emit(`update:${t}`,e)}}}function Eo(){const e=ds();return e.setupContext||(e.setupContext=Ps(e))}function Co(e){return m(e)?e.reduce(((e,t)=>(e[t]=null,e)),{}):e}function Po(e,t){const n=Co(e);for(const e in t){if(e.startsWith("__skip"))continue;let r=n[e];r?m(r)||_(r)?r=n[e]={type:r,default:t[e]}:r.default=t[e]:null===r&&(r=n[e]={default:t[e]}),r&&t[`__skip_${e}`]&&(r.skipFactory=!0)}return n}function To(e,t){return e&&t?m(e)&&m(t)?e.concat(t):d({},Co(e),Co(t)):e||t}function Ao(e,t){const n={};for(const r in e)t.includes(r)||Object.defineProperty(n,r,{enumerable:!0,get:()=>e[r]});return n}function jo(e){const t=ds();let n=e();return ys(),k(n)&&(n=n.catch((e=>{throw ms(t),e}))),[n,()=>ms(t)]}let Ro=!0;function Lo(e){const t=No(e),n=e.proxy,r=e.ctx;Ro=!1,t.beforeCreate&&Io(t.beforeCreate,e,"bc");const{data:o,computed:i,methods:s,watch:l,provide:u,inject:c,created:f,beforeMount:p,mounted:d,beforeUpdate:h,updated:v,activated:g,deactivated:y,beforeDestroy:b,beforeUnmount:w,destroyed:x,unmounted:S,render:k,renderTracked:E,renderTriggered:C,errorCaptured:P,serverPrefetch:T,expose:A,inheritAttrs:j,components:R,directives:L,filters:I}=t;if(c&&function(e,t,n=a){m(e)&&(e=Uo(e));for(const n in e){const r=e[n];let o;o=O(r)?"default"in r?Yo(r.from||n,r.default,!0):Yo(r.from||n):Yo(r),Ut(o)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>o.value,set:e=>o.value=e}):t[n]=o}}(c,r,null),s)for(const e in s){const t=s[e];_(t)&&(r[e]=t.bind(n))}if(o){0;const t=o.call(n,n);0,O(t)&&(e.data=kt(t))}if(Ro=!0,i)for(const e in i){const t=i[e],o=_(t)?t.bind(n,n):_(t.get)?t.get.bind(n,n):a;0;const s=!_(t)&&_(t.set)?t.set.bind(n):a,l=Rs({get:o,set:s});Object.defineProperty(r,e,{enumerable:!0,configurable:!0,get:()=>l.value,set:e=>l.value=e})}if(l)for(const e in l)Fo(l[e],r,n,e);if(u){const e=_(u)?u.call(n):u;Reflect.ownKeys(e).forEach((t=>{Go(t,e[t])}))}function F(e,t){m(t)?t.forEach((t=>e(t.bind(n)))):t&&e(t.bind(n))}if(f&&Io(f,e,"c"),F(Yr,p),F(Jr,d),F(Qr,h),F(Zr,v),F($r,g),F(Vr,y),F(oo,P),F(ro,E),F(no,C),F(Xr,w),F(eo,S),F(to,T),m(A))if(A.length){const t=e.exposed||(e.exposed={});A.forEach((e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t})}))}else e.exposed||(e.exposed={});k&&e.render===a&&(e.render=k),null!=j&&(e.inheritAttrs=j),R&&(e.components=R),L&&(e.directives=L)}function Io(e,t,n){an(m(e)?e.map((e=>e.bind(t.proxy))):e.bind(t.proxy),t,n)}function Fo(e,t,n,r){const o=r.includes(".")?gr(n,r):()=>n[r];if(x(e)){const n=t[e];_(n)&&dr(o,n)}else if(_(e))dr(o,e.bind(n));else if(O(e))if(m(e))e.forEach((e=>Fo(e,t,n,r)));else{const r=_(e.handler)?e.handler.bind(n):t[e.handler];_(r)&&dr(o,r,e)}else 0}function No(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:i,config:{optionMergeStrategies:s}}=e.appContext,l=i.get(t);let a;return l?a=l:o.length||n||r?(a={},o.length&&o.forEach((e=>Mo(a,e,s,!0))),Mo(a,t,s)):a=t,O(t)&&i.set(t,a),a}function Mo(e,t,n,r=!1){const{mixins:o,extends:i}=t;i&&Mo(e,i,n,!0),o&&o.forEach((t=>Mo(e,t,n,!0)));for(const o in t)if(r&&"expose"===o);else{const r=Do[o]||n&&n[o];e[o]=r?r(e[o],t[o]):t[o]}return e}const Do={data:Bo,props:Ho,emits:Ho,methods:Vo,computed:Vo,beforeCreate:$o,created:$o,beforeMount:$o,mounted:$o,beforeUpdate:$o,updated:$o,beforeDestroy:$o,beforeUnmount:$o,destroyed:$o,unmounted:$o,activated:$o,deactivated:$o,errorCaptured:$o,serverPrefetch:$o,components:Vo,directives:Vo,watch:function(e,t){if(!e)return t;if(!t)return e;const n=d(Object.create(null),e);for(const r in t)n[r]=$o(e[r],t[r]);return n},provide:Bo,inject:function(e,t){return Vo(Uo(e),Uo(t))}};function Bo(e,t){return t?e?function(){return d(_(e)?e.call(this,this):e,_(t)?t.call(this,this):t)}:t:e}function Uo(e){if(m(e)){const t={};for(let n=0;n<e.length;n++)t[e[n]]=e[n];return t}return e}function $o(e,t){return e?[...new Set([].concat(e,t))]:t}function Vo(e,t){return e?d(Object.create(null),e,t):t}function Ho(e,t){return e?m(e)&&m(t)?[...new Set([...e,...t])]:d(Object.create(null),Co(e),Co(null!=t?t:{})):t}function zo(){return{app:null,config:{isNativeTag:u,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let qo=0;function Wo(e,t){return function(n,r=null){_(n)||(n=d({},n)),null==r||O(r)||(r=null);const o=zo();const i=new WeakSet;let s=!1;const l=o.app={_uid:qo++,_component:n,_props:r,_container:null,_context:o,_instance:null,version:Bs,get config(){return o.config},set config(e){0},use:(e,...t)=>(i.has(e)||(e&&_(e.install)?(i.add(e),e.install(l,...t)):_(e)&&(i.add(e),e(l,...t))),l),mixin:e=>(o.mixins.includes(e)||o.mixins.push(e),l),component:(e,t)=>t?(o.components[e]=t,l):o.components[e],directive:(e,t)=>t?(o.directives[e]=t,l):o.directives[e],mount(i,a,u){if(!s){0;const c=Qi(n,r);return c.appContext=o,a&&t?t(c,i):e(c,i,u),s=!0,l._container=i,i.__vue_app__=l,Ts(c.component)||c.component.proxy}},unmount(){s&&(e(null,l._container),delete l._container.__vue_app__)},provide:(e,t)=>(o.provides[e]=t,l),runWithContext(e){Ko=l;try{return e()}finally{Ko=null}}};return l}}let Ko=null;function Go(e,t){if(ps){let n=ps.provides;const r=ps.parent&&ps.parent.provides;r===n&&(n=ps.provides=Object.create(r)),n[e]=t}else 0}function Yo(e,t,n=!1){const r=ps||Fn;if(r||Ko){const o=r?null==r.parent?r.vnode.appContext&&r.vnode.appContext.provides:r.parent.provides:Ko._context.provides;if(o&&e in o)return o[e];if(arguments.length>1)return n&&_(t)?t.call(r&&r.proxy):t}else 0}function Jo(){return!!(ps||Fn||Ko)}function Qo(e,t,n,r){const[o,i]=e.propsOptions;let l,a=!1;if(t)for(let s in t){if(j(s))continue;const u=t[s];let c;o&&g(o,c=F(s))?i&&i.includes(c)?(l||(l={}))[c]=u:n[c]=u:In(e.emitsOptions,s)||s in r&&u===r[s]||(r[s]=u,a=!0)}if(i){const t=It(n),r=l||s;for(let s=0;s<i.length;s++){const l=i[s];n[l]=Zo(o,t,l,r[l],e,!g(r,l))}}return a}function Zo(e,t,n,r,o,i){const s=e[n];if(null!=s){const e=g(s,"default");if(e&&void 0===r){const e=s.default;if(s.type!==Function&&!s.skipFactory&&_(e)){const{propsDefaults:i}=o;n in i?r=i[n]:(ms(o),r=i[n]=e.call(null,t),ys())}else r=e}s[0]&&(i&&!e?r=!1:!s[1]||""!==r&&r!==M(n)||(r=!0))}return r}function Xo(e,t,n=!1){const r=t.propsCache,o=r.get(e);if(o)return o;const i=e.props,a={},u=[];let c=!1;if(!_(e)){const r=e=>{c=!0;const[n,r]=Xo(e,t,!0);d(a,n),r&&u.push(...r)};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}if(!i&&!c)return O(e)&&r.set(e,l),l;if(m(i))for(let e=0;e<i.length;e++){0;const t=F(i[e]);ei(t)&&(a[t]=s)}else if(i){0;for(const e in i){const t=F(e);if(ei(t)){const n=i[e],r=a[t]=m(n)||_(n)?{type:n}:d({},n);if(r){const e=ri(Boolean,r.type),n=ri(String,r.type);r[0]=e>-1,r[1]=n<0||e<n,(e>-1||g(r,"default"))&&u.push(t)}}}}const f=[a,u];return O(e)&&r.set(e,f),f}function ei(e){return"$"!==e[0]}function ti(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:null===e?"null":""}function ni(e,t){return ti(e)===ti(t)}function ri(e,t){return m(t)?t.findIndex((t=>ni(t,e))):_(t)&&ni(t,e)?0:-1}const oi=e=>"_"===e[0]||"$stable"===e,ii=e=>m(e)?e.map(os):[os(e)],si=(e,t,n)=>{if(t._n)return t;const r=$n(((...e)=>ii(t(...e))),n);return r._c=!1,r},li=(e,t,n)=>{const r=e._ctx;for(const n in e){if(oi(n))continue;const o=e[n];if(_(o))t[n]=si(0,o,r);else if(null!=o){0;const e=ii(o);t[n]=()=>e}}},ai=(e,t)=>{const n=ii(t);e.slots.default=()=>n},ui=(e,t)=>{if(32&e.vnode.shapeFlag){const n=t._;n?(e.slots=It(t),V(t,"_",n)):li(t,e.slots={})}else e.slots={},t&&ai(e,t);V(e.slots,Ki,1)},ci=(e,t,n)=>{const{vnode:r,slots:o}=e;let i=!0,l=s;if(32&r.shapeFlag){const e=t._;e?n&&1===e?i=!1:(d(o,t),n||1!==e||delete o._):(i=!t.$stable,li(t,o)),l=t}else t&&(ai(e,t),l={default:1});if(i)for(const e in o)oi(e)||null!=l[e]||delete o[e]};function fi(e,t,n,r,o=!1){if(m(e))return void e.forEach(((e,i)=>fi(e,t&&(m(t)?t[i]:t),n,r,o)));if(Ir(r)&&!o)return;const i=4&r.shapeFlag?Ts(r.component)||r.component.proxy:r.el,l=o?null:i,{i:a,r:u}=e;const c=t&&t.r,f=a.refs===s?a.refs={}:a.refs,p=a.setupState;if(null!=c&&c!==u&&(x(c)?(f[c]=null,g(p,c)&&(p[c]=null)):Ut(c)&&(c.value=null)),_(u))ln(u,a,12,[l,f]);else{const t=x(u),r=Ut(u);if(t||r){const s=()=>{if(e.f){const n=t?g(p,u)?p[u]:f[u]:u.value;o?m(n)&&h(n,i):m(n)?n.includes(i)||n.push(i):t?(f[u]=[i],g(p,u)&&(p[u]=f[u])):(u.value=[i],e.k&&(f[e.k]=u.value))}else t?(f[u]=l,g(p,u)&&(p[u]=l)):r&&(u.value=l,e.k&&(f[e.k]=l))};l?(s.id=-1,gi(s,n)):s()}else 0}}let pi=!1;const di=e=>/svg/.test(e.namespaceURI)&&"foreignObject"!==e.tagName,hi=e=>8===e.nodeType;function vi(e){const{mt:t,p:n,o:{patchProp:r,createText:o,nextSibling:i,parentNode:s,remove:l,insert:a,createComment:u}}=e,c=(n,r,l,u,f,b=!1)=>{const w=hi(n)&&"["===n.data,_=()=>v(n,r,l,u,f,w),{type:x,ref:S,shapeFlag:O,patchFlag:k}=r;let E=n.nodeType;r.el=n,-2===k&&(b=!1,r.dynamicChildren=null);let C=null;switch(x){case ji:3!==E?""===r.children?(a(r.el=o(""),s(n),n),C=n):C=_():(n.data!==r.children&&(pi=!0,n.data=r.children),C=i(n));break;case Ri:y(n)?(C=i(n),m(r.el=n.content.firstChild,n,l)):C=8!==E||w?_():i(n);break;case Li:if(w&&(E=(n=i(n)).nodeType),1===E||3===E){C=n;const e=!r.children.length;for(let t=0;t<r.staticCount;t++)e&&(r.children+=1===C.nodeType?C.outerHTML:C.data),t===r.staticCount-1&&(r.anchor=C),C=i(C);return w?i(C):C}_();break;case Ai:C=w?h(n,r,l,u,f,b):_();break;default:if(1&O)C=1===E&&r.type.toLowerCase()===n.tagName.toLowerCase()||y(n)?p(n,r,l,u,f,b):_();else if(6&O){r.slotScopeIds=f;const e=s(n);if(C=w?g(n):hi(n)&&"teleport start"===n.data?g(n,n.data,"teleport end"):i(n),t(r,e,null,l,u,di(e),b),Ir(r)){let t;w?(t=Qi(Ai),t.anchor=C?C.previousSibling:e.lastChild):t=3===n.nodeType?ts(""):Qi("div"),t.el=n,r.component.subTree=t}}else 64&O?C=8!==E?_():r.type.hydrate(n,r,l,u,f,b,e,d):128&O&&(C=r.type.hydrate(n,r,l,u,di(s(n)),f,b,e,c))}return null!=S&&fi(S,null,u,r),C},p=(e,t,n,o,i,s)=>{s=s||!!t.dynamicChildren;const{type:a,props:u,patchFlag:c,shapeFlag:p,dirs:h,transition:v}=t,g="input"===a&&h||"option"===a;if(g||-1!==c){if(h&&br(t,null,n,"created"),u)if(g||!s||48&c)for(const t in u)(g&&t.endsWith("value")||f(t)&&!j(t))&&r(e,t,null,u[t],!1,void 0,n);else u.onClick&&r(e,"onClick",null,u.onClick,!1,void 0,n);let a;(a=u&&u.onVnodeBeforeMount)&&as(a,n,t);let b=!1;if(y(e)){b=_i(o,v)&&n&&n.vnode.props&&n.vnode.props.appear;const r=e.content.firstChild;b&&v.beforeEnter(r),m(r,e,n),t.el=e=r}if(h&&br(t,null,n,"beforeMount"),((a=u&&u.onVnodeMounted)||h||b)&&lr((()=>{a&&as(a,n,t),b&&v.enter(e),h&&br(t,null,n,"mounted")}),o),16&p&&(!u||!u.innerHTML&&!u.textContent)){let r=d(e.firstChild,t,e,n,o,i,s);for(;r;){pi=!0;const e=r;r=r.nextSibling,l(e)}}else 8&p&&e.textContent!==t.children&&(pi=!0,e.textContent=t.children)}return e.nextSibling},d=(e,t,r,o,i,s,l)=>{l=l||!!t.dynamicChildren;const a=t.children,u=a.length;for(let t=0;t<u;t++){const u=l?a[t]:a[t]=os(a[t]);if(e)e=c(e,u,o,i,s,l);else{if(u.type===ji&&!u.children)continue;pi=!0,n(null,u,r,null,o,i,di(r),s)}}return e},h=(e,t,n,r,o,l)=>{const{slotScopeIds:c}=t;c&&(o=o?o.concat(c):c);const f=s(e),p=d(i(e),t,f,n,r,o,l);return p&&hi(p)&&"]"===p.data?i(t.anchor=p):(pi=!0,a(t.anchor=u("]"),f,p),p)},v=(e,t,r,o,a,u)=>{if(pi=!0,t.el=null,u){const t=g(e);for(;;){const n=i(e);if(!n||n===t)break;l(n)}}const c=i(e),f=s(e);return l(e),n(null,t,f,c,r,o,di(f),a),c},g=(e,t="[",n="]")=>{let r=0;for(;e;)if((e=i(e))&&hi(e)&&(e.data===t&&r++,e.data===n)){if(0===r)return i(e);r--}return e},m=(e,t,n)=>{const r=t.parentNode;r&&r.replaceChild(e,t);let o=n;for(;o;)o.vnode.el===t&&(o.vnode.el=o.subTree.el=e),o=o.parent},y=e=>1===e.nodeType&&"template"===e.tagName.toLowerCase();return[(e,t)=>{if(!t.hasChildNodes())return n(null,e,t),On(),void(t._vnode=e);pi=!1,c(t.firstChild,e,null,null,null),On(),t._vnode=e},c]}const gi=lr;function mi(e){return bi(e)}function yi(e){return bi(e,vi)}function bi(e,t){W().__VUE__=!0;const{insert:n,remove:r,patchProp:o,createElement:i,createText:u,createComment:c,setText:f,setElementText:p,parentNode:d,nextSibling:h,setScopeId:v=a,insertStaticContent:m}=e,y=(e,t,n,r=null,o=null,i=null,s=!1,l=null,a=!!t.dynamicChildren)=>{if(e===t)return;e&&!qi(e,t)&&(r=J(e),z(e,o,i,!0),e=null),-2===t.patchFlag&&(a=!1,t.dynamicChildren=null);const{type:u,ref:c,shapeFlag:f}=t;switch(u){case ji:b(e,t,n,r);break;case Ri:w(e,t,n,r);break;case Li:null==e&&_(t,n,r,s);break;case Ai:A(e,t,n,r,o,i,s,l,a);break;default:1&f?S(e,t,n,r,o,i,s,l,a):6&f?R(e,t,n,r,o,i,s,l,a):(64&f||128&f)&&u.process(e,t,n,r,o,i,s,l,a,Z)}null!=c&&o&&fi(c,e&&e.ref,i,t||e,!t)},b=(e,t,r,o)=>{if(null==e)n(t.el=u(t.children),r,o);else{const n=t.el=e.el;t.children!==e.children&&f(n,t.children)}},w=(e,t,r,o)=>{null==e?n(t.el=c(t.children||""),r,o):t.el=e.el},_=(e,t,n,r)=>{[e.el,e.anchor]=m(e.children,t,n,r,e.el,e.anchor)},x=({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=h(e),r(e),e=n;r(t)},S=(e,t,n,r,o,i,s,l,a)=>{s=s||"svg"===t.type,null==e?O(t,n,r,o,i,s,l,a):C(e,t,o,i,s,l,a)},O=(e,t,r,s,l,a,u,c)=>{let f,d;const{type:h,props:v,shapeFlag:g,transition:m,dirs:y}=e;if(f=e.el=i(e.type,a,v&&v.is,v),8&g?p(f,e.children):16&g&&E(e.children,f,null,s,l,a&&"foreignObject"!==h,u,c),y&&br(e,null,s,"created"),k(f,e,e.scopeId,u,s),v){for(const t in v)"value"===t||j(t)||o(f,t,null,v[t],a,e.children,s,l,Y);"value"in v&&o(f,"value",null,v.value),(d=v.onVnodeBeforeMount)&&as(d,s,e)}y&&br(e,null,s,"beforeMount");const b=_i(l,m);b&&m.beforeEnter(f),n(f,t,r),((d=v&&v.onVnodeMounted)||b||y)&&gi((()=>{d&&as(d,s,e),b&&m.enter(f),y&&br(e,null,s,"mounted")}),l)},k=(e,t,n,r,o)=>{if(n&&v(e,n),r)for(let t=0;t<r.length;t++)v(e,r[t]);if(o){if(t===o.subTree){const t=o.vnode;k(e,t,t.scopeId,t.slotScopeIds,o.parent)}}},E=(e,t,n,r,o,i,s,l,a=0)=>{for(let u=a;u<e.length;u++){const a=e[u]=l?is(e[u]):os(e[u]);y(null,a,t,n,r,o,i,s,l)}},C=(e,t,n,r,i,l,a)=>{const u=t.el=e.el;let{patchFlag:c,dynamicChildren:f,dirs:d}=t;c|=16&e.patchFlag;const h=e.props||s,v=t.props||s;let g;n&&wi(n,!1),(g=v.onVnodeBeforeUpdate)&&as(g,n,t,e),d&&br(t,e,n,"beforeUpdate"),n&&wi(n,!0);const m=i&&"foreignObject"!==t.type;if(f?P(e.dynamicChildren,f,u,n,r,m,l):a||B(e,t,u,null,n,r,m,l,!1),c>0){if(16&c)T(u,t,h,v,n,r,i);else if(2&c&&h.class!==v.class&&o(u,"class",null,v.class,i),4&c&&o(u,"style",h.style,v.style,i),8&c){const s=t.dynamicProps;for(let t=0;t<s.length;t++){const l=s[t],a=h[l],c=v[l];c===a&&"value"!==l||o(u,l,a,c,i,e.children,n,r,Y)}}1&c&&e.children!==t.children&&p(u,t.children)}else a||null!=f||T(u,t,h,v,n,r,i);((g=v.onVnodeUpdated)||d)&&gi((()=>{g&&as(g,n,t,e),d&&br(t,e,n,"updated")}),r)},P=(e,t,n,r,o,i,s)=>{for(let l=0;l<t.length;l++){const a=e[l],u=t[l],c=a.el&&(a.type===Ai||!qi(a,u)||70&a.shapeFlag)?d(a.el):n;y(a,u,c,null,r,o,i,s,!0)}},T=(e,t,n,r,i,l,a)=>{if(n!==r){if(n!==s)for(const s in n)j(s)||s in r||o(e,s,n[s],null,a,t.children,i,l,Y);for(const s in r){if(j(s))continue;const u=r[s],c=n[s];u!==c&&"value"!==s&&o(e,s,c,u,a,t.children,i,l,Y)}"value"in r&&o(e,"value",n.value,r.value)}},A=(e,t,r,o,i,s,l,a,c)=>{const f=t.el=e?e.el:u(""),p=t.anchor=e?e.anchor:u("");let{patchFlag:d,dynamicChildren:h,slotScopeIds:v}=t;v&&(a=a?a.concat(v):v),null==e?(n(f,r,o),n(p,r,o),E(t.children,r,p,i,s,l,a,c)):d>0&&64&d&&h&&e.dynamicChildren?(P(e.dynamicChildren,h,r,i,s,l,a),(null!=t.key||i&&t===i.subTree)&&xi(e,t,!0)):B(e,t,r,p,i,s,l,a,c)},R=(e,t,n,r,o,i,s,l,a)=>{t.slotScopeIds=l,null==e?512&t.shapeFlag?o.ctx.activate(t,n,r,s,a):L(t,n,r,o,i,s,a):I(e,t,a)},L=(e,t,n,r,o,i,s)=>{const l=e.component=fs(e,r,o);if(Mr(e)&&(l.ctx.renderer=Z),Ss(l),l.asyncDep){if(o&&o.registerDep(l,N),!e.el){const e=l.subTree=Qi(Ri);w(null,e,t,n)}}else N(l,e,t,n,o,i,s)},I=(e,t,n)=>{const r=t.component=e.component;if(function(e,t,n){const{props:r,children:o,component:i}=e,{props:s,children:l,patchFlag:a}=t,u=i.emitsOptions;if(t.dirs||t.transition)return!0;if(!(n&&a>=0))return!(!o&&!l||l&&l.$stable)||r!==s&&(r?!s||Wn(r,s,u):!!s);if(1024&a)return!0;if(16&a)return r?Wn(r,s,u):!!s;if(8&a){const e=t.dynamicProps;for(let t=0;t<e.length;t++){const n=e[t];if(s[n]!==r[n]&&!In(u,n))return!0}}return!1}(e,t,n)){if(r.asyncDep&&!r.asyncResolved)return void D(r,t,n);r.next=t,function(e){const t=pn.indexOf(e);t>dn&&pn.splice(t,1)}(r.update),r.update()}else t.el=e.el,r.vnode=t},N=(e,t,n,r,o,i,s)=>{const l=e.effect=new Pe((()=>{if(e.isMounted){let t,{next:n,bu:r,u:l,parent:a,vnode:u}=e,c=n;0,wi(e,!1),n?(n.el=u.el,D(e,n,s)):n=u,r&&$(r),(t=n.props&&n.props.onVnodeBeforeUpdate)&&as(t,a,n,u),wi(e,!0);const f=Vn(e);0;const p=e.subTree;e.subTree=f,y(p,f,d(p.el),J(p),e,o,i),n.el=f.el,null===c&&Kn(e,f.el),l&&gi(l,o),(t=n.props&&n.props.onVnodeUpdated)&&gi((()=>as(t,a,n,u)),o)}else{let s;const{el:l,props:a}=t,{bm:u,m:c,parent:f}=e,p=Ir(t);if(wi(e,!1),u&&$(u),!p&&(s=a&&a.onVnodeBeforeMount)&&as(s,f,t),wi(e,!0),l&&ee){const n=()=>{e.subTree=Vn(e),ee(l,e.subTree,e,o,null)};p?t.type.__asyncLoader().then((()=>!e.isUnmounted&&n())):n()}else{0;const s=e.subTree=Vn(e);0,y(null,s,n,r,e,o,i),t.el=s.el}if(c&&gi(c,o),!p&&(s=a&&a.onVnodeMounted)){const e=t;gi((()=>as(s,f,e)),o)}(256&t.shapeFlag||f&&Ir(f.vnode)&&256&f.vnode.shapeFlag)&&e.a&&gi(e.a,o),e.isMounted=!0,t=n=r=null}}),(()=>wn(a)),e.scope),a=e.update=()=>l.run();a.id=e.uid,wi(e,!0),a()},D=(e,t,n)=>{t.component=e;const r=e.vnode.props;e.vnode=t,e.next=null,function(e,t,n,r){const{props:o,attrs:i,vnode:{patchFlag:s}}=e,l=It(o),[a]=e.propsOptions;let u=!1;if(!(r||s>0)||16&s){let r;Qo(e,t,o,i)&&(u=!0);for(const i in l)t&&(g(t,i)||(r=M(i))!==i&&g(t,r))||(a?!n||void 0===n[i]&&void 0===n[r]||(o[i]=Zo(a,l,i,void 0,e,!0)):delete o[i]);if(i!==l)for(const e in i)t&&g(t,e)||(delete i[e],u=!0)}else if(8&s){const n=e.vnode.dynamicProps;for(let r=0;r<n.length;r++){let s=n[r];if(In(e.emitsOptions,s))continue;const c=t[s];if(a)if(g(i,s))c!==i[s]&&(i[s]=c,u=!0);else{const t=F(s);o[t]=Zo(a,l,t,c,e,!1)}else c!==i[s]&&(i[s]=c,u=!0)}}u&&De(e,"set","$attrs")}(e,t.props,r,n),ci(e,t.children,n),Ie(),Sn(),Fe()},B=(e,t,n,r,o,i,s,l,a=!1)=>{const u=e&&e.children,c=e?e.shapeFlag:0,f=t.children,{patchFlag:d,shapeFlag:h}=t;if(d>0){if(128&d)return void V(u,f,n,r,o,i,s,l,a);if(256&d)return void U(u,f,n,r,o,i,s,l,a)}8&h?(16&c&&Y(u,o,i),f!==u&&p(n,f)):16&c?16&h?V(u,f,n,r,o,i,s,l,a):Y(u,o,i,!0):(8&c&&p(n,""),16&h&&E(f,n,r,o,i,s,l,a))},U=(e,t,n,r,o,i,s,a,u)=>{t=t||l;const c=(e=e||l).length,f=t.length,p=Math.min(c,f);let d;for(d=0;d<p;d++){const r=t[d]=u?is(t[d]):os(t[d]);y(e[d],r,n,null,o,i,s,a,u)}c>f?Y(e,o,i,!0,!1,p):E(t,n,r,o,i,s,a,u,p)},V=(e,t,n,r,o,i,s,a,u)=>{let c=0;const f=t.length;let p=e.length-1,d=f-1;for(;c<=p&&c<=d;){const r=e[c],l=t[c]=u?is(t[c]):os(t[c]);if(!qi(r,l))break;y(r,l,n,null,o,i,s,a,u),c++}for(;c<=p&&c<=d;){const r=e[p],l=t[d]=u?is(t[d]):os(t[d]);if(!qi(r,l))break;y(r,l,n,null,o,i,s,a,u),p--,d--}if(c>p){if(c<=d){const e=d+1,l=e<f?t[e].el:r;for(;c<=d;)y(null,t[c]=u?is(t[c]):os(t[c]),n,l,o,i,s,a,u),c++}}else if(c>d)for(;c<=p;)z(e[c],o,i,!0),c++;else{const h=c,v=c,g=new Map;for(c=v;c<=d;c++){const e=t[c]=u?is(t[c]):os(t[c]);null!=e.key&&g.set(e.key,c)}let m,b=0;const w=d-v+1;let _=!1,x=0;const S=new Array(w);for(c=0;c<w;c++)S[c]=0;for(c=h;c<=p;c++){const r=e[c];if(b>=w){z(r,o,i,!0);continue}let l;if(null!=r.key)l=g.get(r.key);else for(m=v;m<=d;m++)if(0===S[m-v]&&qi(r,t[m])){l=m;break}void 0===l?z(r,o,i,!0):(S[l-v]=c+1,l>=x?x=l:_=!0,y(r,t[l],n,null,o,i,s,a,u),b++)}const O=_?function(e){const t=e.slice(),n=[0];let r,o,i,s,l;const a=e.length;for(r=0;r<a;r++){const a=e[r];if(0!==a){if(o=n[n.length-1],e[o]<a){t[r]=o,n.push(r);continue}for(i=0,s=n.length-1;i<s;)l=i+s>>1,e[n[l]]<a?i=l+1:s=l;a<e[n[i]]&&(i>0&&(t[r]=n[i-1]),n[i]=r)}}i=n.length,s=n[i-1];for(;i-- >0;)n[i]=s,s=t[s];return n}(S):l;for(m=O.length-1,c=w-1;c>=0;c--){const e=v+c,l=t[e],p=e+1<f?t[e+1].el:r;0===S[c]?y(null,l,n,p,o,i,s,a,u):_&&(m<0||c!==O[m]?H(l,n,p,2):m--)}}},H=(e,t,r,o,i=null)=>{const{el:s,type:l,transition:a,children:u,shapeFlag:c}=e;if(6&c)return void H(e.component.subTree,t,r,o);if(128&c)return void e.suspense.move(t,r,o);if(64&c)return void l.move(e,t,r,Z);if(l===Ai){n(s,t,r);for(let e=0;e<u.length;e++)H(u[e],t,r,o);return void n(e.anchor,t,r)}if(l===Li)return void(({el:e,anchor:t},r,o)=>{let i;for(;e&&e!==t;)i=h(e),n(e,r,o),e=i;n(t,r,o)})(e,t,r);if(2!==o&&1&c&&a)if(0===o)a.beforeEnter(s),n(s,t,r),gi((()=>a.enter(s)),i);else{const{leave:e,delayLeave:o,afterLeave:i}=a,l=()=>n(s,t,r),u=()=>{e(s,(()=>{l(),i&&i()}))};o?o(s,l,u):u()}else n(s,t,r)},z=(e,t,n,r=!1,o=!1)=>{const{type:i,props:s,ref:l,children:a,dynamicChildren:u,shapeFlag:c,patchFlag:f,dirs:p}=e;if(null!=l&&fi(l,null,n,e,!0),256&c)return void t.ctx.deactivate(e);const d=1&c&&p,h=!Ir(e);let v;if(h&&(v=s&&s.onVnodeBeforeUnmount)&&as(v,t,e),6&c)G(e.component,n,r);else{if(128&c)return void e.suspense.unmount(n,r);d&&br(e,null,t,"beforeUnmount"),64&c?e.type.remove(e,t,n,o,Z,r):u&&(i!==Ai||f>0&&64&f)?Y(u,t,n,!1,!0):(i===Ai&&384&f||!o&&16&c)&&Y(a,t,n),r&&q(e)}(h&&(v=s&&s.onVnodeUnmounted)||d)&&gi((()=>{v&&as(v,t,e),d&&br(e,null,t,"unmounted")}),n)},q=e=>{const{type:t,el:n,anchor:o,transition:i}=e;if(t===Ai)return void K(n,o);if(t===Li)return void x(e);const s=()=>{r(n),i&&!i.persisted&&i.afterLeave&&i.afterLeave()};if(1&e.shapeFlag&&i&&!i.persisted){const{leave:t,delayLeave:r}=i,o=()=>t(n,s);r?r(e.el,s,o):o()}else s()},K=(e,t)=>{let n;for(;e!==t;)n=h(e),r(e),e=n;r(t)},G=(e,t,n)=>{const{bum:r,scope:o,update:i,subTree:s,um:l}=e;r&&$(r),o.stop(),i&&(i.active=!1,z(s,e,t,n)),l&&gi(l,t),gi((()=>{e.isUnmounted=!0}),t),t&&t.pendingBranch&&!t.isUnmounted&&e.asyncDep&&!e.asyncResolved&&e.suspenseId===t.pendingId&&(t.deps--,0===t.deps&&t.resolve())},Y=(e,t,n,r=!1,o=!1,i=0)=>{for(let s=i;s<e.length;s++)z(e[s],t,n,r,o)},J=e=>6&e.shapeFlag?J(e.component.subTree):128&e.shapeFlag?e.suspense.next():h(e.anchor||e.el),Q=(e,t,n)=>{null==e?t._vnode&&z(t._vnode,null,null,!0):y(t._vnode||null,e,t,null,null,null,n),Sn(),On(),t._vnode=e},Z={p:y,um:z,m:H,r:q,mt:L,mc:E,pc:B,pbc:P,n:J,o:e};let X,ee;return t&&([X,ee]=t(Z)),{render:Q,hydrate:X,createApp:Wo(Q,X)}}function wi({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function _i(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function xi(e,t,n=!1){const r=e.children,o=t.children;if(m(r)&&m(o))for(let e=0;e<r.length;e++){const t=r[e];let i=o[e];1&i.shapeFlag&&!i.dynamicChildren&&((i.patchFlag<=0||32===i.patchFlag)&&(i=o[e]=is(o[e]),i.el=t.el),n||xi(t,i)),i.type===ji&&(i.el=t.el)}}const Si=e=>e&&(e.disabled||""===e.disabled),Oi=e=>"undefined"!=typeof SVGElement&&e instanceof SVGElement,ki=(e,t)=>{const n=e&&e.to;if(x(n)){if(t){const e=t(n);return e}return null}return n},Ei={__isTeleport:!0,process(e,t,n,r,o,i,s,l,a,u){const{mc:c,pc:f,pbc:p,o:{insert:d,querySelector:h,createText:v,createComment:g}}=u,m=Si(t.props);let{shapeFlag:y,children:b,dynamicChildren:w}=t;if(null==e){const e=t.el=v(""),u=t.anchor=v("");d(e,n,r),d(u,n,r);const f=t.target=ki(t.props,h),p=t.targetAnchor=v("");f&&(d(p,f),s=s||Oi(f));const g=(e,t)=>{16&y&&c(b,e,t,o,i,s,l,a)};m?g(n,u):f&&g(f,p)}else{t.el=e.el;const r=t.anchor=e.anchor,c=t.target=e.target,d=t.targetAnchor=e.targetAnchor,v=Si(e.props),g=v?n:c,y=v?r:d;if(s=s||Oi(c),w?(p(e.dynamicChildren,w,g,o,i,s,l),xi(e,t,!0)):a||f(e,t,g,y,o,i,s,l,!1),m)v?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):Ci(t,n,r,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const e=t.target=ki(t.props,h);e&&Ci(t,e,null,u,0)}else v&&Ci(t,c,d,u,1)}Ti(t)},remove(e,t,n,r,{um:o,o:{remove:i}},s){const{shapeFlag:l,children:a,anchor:u,targetAnchor:c,target:f,props:p}=e;if(f&&i(c),s&&i(u),16&l){const e=s||!Si(p);for(let r=0;r<a.length;r++){const i=a[r];o(i,t,n,e,!!i.dynamicChildren)}}},move:Ci,hydrate:function(e,t,n,r,o,i,{o:{nextSibling:s,parentNode:l,querySelector:a}},u){const c=t.target=ki(t.props,a);if(c){const a=c._lpa||c.firstChild;if(16&t.shapeFlag)if(Si(t.props))t.anchor=u(s(e),t,l(e),n,r,o,i),t.targetAnchor=a;else{t.anchor=s(e);let l=a;for(;l;)if(l=s(l),l&&8===l.nodeType&&"teleport anchor"===l.data){t.targetAnchor=l,c._lpa=t.targetAnchor&&s(t.targetAnchor);break}u(a,t,c,n,r,o,i)}Ti(t)}return t.anchor&&s(t.anchor)}};function Ci(e,t,n,{o:{insert:r},m:o},i=2){0===i&&r(e.targetAnchor,t,n);const{el:s,anchor:l,shapeFlag:a,children:u,props:c}=e,f=2===i;if(f&&r(s,t,n),(!f||Si(c))&&16&a)for(let e=0;e<u.length;e++)o(u[e],t,n,2);f&&r(l,t,n)}const Pi=Ei;function Ti(e){const t=e.ctx;if(t&&t.ut){let n=e.children[0].el;for(;n&&n!==e.targetAnchor;)1===n.nodeType&&n.setAttribute("data-v-owner",t.uid),n=n.nextSibling;t.ut()}}const Ai=Symbol.for("v-fgt"),ji=Symbol.for("v-txt"),Ri=Symbol.for("v-cmt"),Li=Symbol.for("v-stc"),Ii=[];let Fi=null;function Ni(e=!1){Ii.push(Fi=e?null:[])}function Mi(){Ii.pop(),Fi=Ii[Ii.length-1]||null}let Di,Bi=1;function Ui(e){Bi+=e}function $i(e){return e.dynamicChildren=Bi>0?Fi||l:null,Mi(),Bi>0&&Fi&&Fi.push(e),e}function Vi(e,t,n,r,o,i){return $i(Ji(e,t,n,r,o,i,!0))}function Hi(e,t,n,r,o){return $i(Qi(e,t,n,r,o,!0))}function zi(e){return!!e&&!0===e.__v_isVNode}function qi(e,t){return e.type===t.type&&e.key===t.key}function Wi(e){Di=e}const Ki="__vInternal",Gi=({key:e})=>null!=e?e:null,Yi=({ref:e,ref_key:t,ref_for:n})=>("number"==typeof e&&(e=""+e),null!=e?x(e)||Ut(e)||_(e)?{i:Fn,r:e,k:t,f:!!n}:e:null);function Ji(e,t=null,n=null,r=0,o=null,i=(e===Ai?0:1),s=!1,l=!1){const a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Gi(t),ref:t&&Yi(t),scopeId:Nn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:Fn};return l?(ss(a,n),128&i&&e.normalize(a)):n&&(a.shapeFlag|=x(n)?8:16),Bi>0&&!s&&Fi&&(a.patchFlag>0||6&i)&&32!==a.patchFlag&&Fi.push(a),a}const Qi=Zi;function Zi(e,t=null,n=null,r=0,o=null,i=!1){if(e&&e!==Qn||(e=Ri),zi(e)){const r=es(e,t,!0);return n&&ss(r,n),Bi>0&&!i&&Fi&&(6&r.shapeFlag?Fi[Fi.indexOf(e)]=r:Fi.push(r)),r.patchFlag|=-2,r}if(js(e)&&(e=e.__vccOpts),t){t=Xi(t);let{class:e,style:n}=t;e&&!x(e)&&(t.class=ee(e)),O(n)&&(Lt(n)&&!m(n)&&(n=d({},n)),t.style=Y(n))}return Ji(e,t,n,r,o,x(e)?1:nr(e)?128:(e=>e.__isTeleport)(e)?64:O(e)?4:_(e)?2:0,i,!0)}function Xi(e){return e?Lt(e)||Ki in e?d({},e):e:null}function es(e,t,n=!1){const{props:r,ref:o,patchFlag:i,children:s}=e,l=t?ls(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&Gi(l),ref:t&&t.ref?n&&o?m(o)?o.concat(Yi(t)):[o,Yi(t)]:Yi(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:s,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ai?-1===i?16:16|i:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&es(e.ssContent),ssFallback:e.ssFallback&&es(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function ts(e=" ",t=0){return Qi(ji,null,e,t)}function ns(e,t){const n=Qi(Li,null,e);return n.staticCount=t,n}function rs(e="",t=!1){return t?(Ni(),Hi(Ri,null,e)):Qi(Ri,null,e)}function os(e){return null==e||"boolean"==typeof e?Qi(Ri):m(e)?Qi(Ai,null,e.slice()):"object"==typeof e?is(e):Qi(ji,null,String(e))}function is(e){return null===e.el&&-1!==e.patchFlag||e.memo?e:es(e)}function ss(e,t){let n=0;const{shapeFlag:r}=e;if(null==t)t=null;else if(m(t))n=16;else if("object"==typeof t){if(65&r){const n=t.default;return void(n&&(n._c&&(n._d=!1),ss(e,n()),n._c&&(n._d=!0)))}{n=32;const r=t._;r||Ki in t?3===r&&Fn&&(1===Fn.slots._?t._=1:(t._=2,e.patchFlag|=1024)):t._ctx=Fn}}else _(t)?(t={default:t,_ctx:Fn},n=32):(t=String(t),64&r?(n=16,t=[ts(t)]):n=8);e.children=t,e.shapeFlag|=n}function ls(...e){const t={};for(let n=0;n<e.length;n++){const r=e[n];for(const e in r)if("class"===e)t.class!==r.class&&(t.class=ee([t.class,r.class]));else if("style"===e)t.style=Y([t.style,r.style]);else if(f(e)){const n=t[e],o=r[e];!o||n===o||m(n)&&n.includes(o)||(t[e]=n?[].concat(n,o):o)}else""!==e&&(t[e]=r[e])}return t}function as(e,t,n,r=null){an(e,t,7,[n,r])}const us=zo();let cs=0;function fs(e,t,n){const r=e.type,o=(t?t.appContext:e.appContext)||us,i={uid:cs++,vnode:e,type:r,parent:t,appContext:o,root:null,next:null,subTree:null,effect:null,update:null,scope:new de(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(o.provides),accessCache:null,renderCache:[],components:null,directives:null,propsOptions:Xo(r,o),emitsOptions:Ln(r,o),emit:null,emitted:null,propsDefaults:s,inheritAttrs:r.inheritAttrs,ctx:s,data:s,props:s,attrs:s,slots:s,refs:s,setupState:s,setupContext:null,attrsProxy:null,slotsProxy:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return i.ctx={_:i},i.root=t?t.root:i,i.emit=Rn.bind(null,i),e.ce&&e.ce(i),i}let ps=null;const ds=()=>ps||Fn;let hs,vs,gs="__VUE_INSTANCE_SETTERS__";(vs=W()[gs])||(vs=W()[gs]=[]),vs.push((e=>ps=e)),hs=e=>{vs.length>1?vs.forEach((t=>t(e))):vs[0](e)};const ms=e=>{hs(e),e.scope.on()},ys=()=>{ps&&ps.scope.off(),hs(null)};function bs(e){return 4&e.vnode.shapeFlag}let ws,_s,xs=!1;function Ss(e,t=!1){xs=t;const{props:n,children:r}=e.vnode,o=bs(e);!function(e,t,n,r=!1){const o={},i={};V(i,Ki,1),e.propsDefaults=Object.create(null),Qo(e,t,o,i);for(const t in e.propsOptions[0])t in o||(o[t]=void 0);n?e.props=r?o:Et(o):e.type.props?e.props=o:e.props=i,e.attrs=i}(e,n,o,t),ui(e,r);const i=o?function(e,t){const n=e.type;0;e.accessCache=Object.create(null),e.proxy=Ft(new Proxy(e.ctx,ho)),!1;const{setup:r}=n;if(r){const n=e.setupContext=r.length>1?Ps(e):null;ms(e),Ie();const o=ln(r,e,0,[e.props,n]);if(Fe(),ys(),k(o)){if(o.then(ys,ys),t)return o.then((n=>{Os(e,n,t)})).catch((t=>{un(t,e,0)}));e.asyncDep=o}else Os(e,o,t)}else Cs(e,t)}(e,t):void 0;return xs=!1,i}function Os(e,t,n){_(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:O(t)&&(e.setupState=Yt(t)),Cs(e,n)}function ks(e){ws=e,_s=e=>{e.render._rc&&(e.withProxy=new Proxy(e.ctx,vo))}}const Es=()=>!ws;function Cs(e,t,n){const r=e.type;if(!e.render){if(!t&&ws&&!r.render){const t=r.template||No(e).template;if(t){0;const{isCustomElement:n,compilerOptions:o}=e.appContext.config,{delimiters:i,compilerOptions:s}=r,l=d(d({isCustomElement:n,delimiters:i},o),s);r.render=ws(t,l)}}e.render=r.render||a,_s&&_s(e)}ms(e),Ie();try{Lo(e)}finally{Fe(),ys()}}function Ps(e){const t=t=>{e.exposed=t||{}};return{get attrs(){return function(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get:(t,n)=>(Ne(e,0,"$attrs"),t[n])}))}(e)},slots:e.slots,emit:e.emit,expose:t}}function Ts(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Yt(Ft(e.exposed)),{get:(t,n)=>n in t?t[n]:n in fo?fo[n](e):void 0,has:(e,t)=>t in e||t in fo}))}function As(e,t=!0){return _(e)?e.displayName||e.name:e.name||t&&e.__name}function js(e){return _(e)&&"__vccOpts"in e}const Rs=(e,t)=>function(e,t,n=!1){let r,o;const i=_(e);return i?(r=e,o=a):(r=e.get,o=e.set),new rn(r,o,i||!o,n)}(e,0,xs);function Ls(e,t,n){const r=arguments.length;return 2===r?O(t)&&!m(t)?zi(t)?Qi(e,null,[t]):Qi(e,t):Qi(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):3===r&&zi(n)&&(n=[n]),Qi(e,t,n))}const Is=Symbol.for("v-scx"),Fs=()=>{{const e=Yo(Is);return e}};function Ns(){return void 0}function Ms(e,t,n,r){const o=n[r];if(o&&Ds(o,e))return o;const i=t();return i.memo=e.slice(),n[r]=i}function Ds(e,t){const n=e.memo;if(n.length!=t.length)return!1;for(let e=0;e<n.length;e++)if(U(n[e],t[e]))return!1;return Bi>0&&Fi&&Fi.push(e),!0}const Bs="3.3.8",Us={createComponentInstance:fs,setupComponent:Ss,renderComponentRoot:Vn,setCurrentRenderingInstance:Mn,isVNode:zi,normalizeVNode:os},$s=null,Vs=null,Hs="undefined"!=typeof document?document:null,zs=Hs&&Hs.createElement("template"),qs={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t?Hs.createElementNS("http://www.w3.org/2000/svg",e):Hs.createElement(e,n?{is:n}:void 0);return"select"===e&&r&&null!=r.multiple&&o.setAttribute("multiple",r.multiple),o},createText:e=>Hs.createTextNode(e),createComment:e=>Hs.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Hs.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,i){const s=n?n.previousSibling:t.lastChild;if(o&&(o===i||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),o!==i&&(o=o.nextSibling););else{zs.innerHTML=r?`<svg>${e}</svg>`:e;const o=zs.content;if(r){const e=o.firstChild;for(;e.firstChild;)o.appendChild(e.firstChild);o.removeChild(e)}t.insertBefore(o,n)}return[s?s.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Ws="transition",Ks="animation",Gs=Symbol("_vtc"),Ys=(e,{slots:t})=>Ls(Er,el(e),t);Ys.displayName="Transition";const Js={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Qs=Ys.props=d({},Or,Js),Zs=(e,t=[])=>{m(e)?e.forEach((e=>e(...t))):e&&e(...t)},Xs=e=>!!e&&(m(e)?e.some((e=>e.length>1)):e.length>1);function el(e){const t={};for(const n in e)n in Js||(t[n]=e[n]);if(!1===e.css)return t;const{name:n="v",type:r,duration:o,enterFromClass:i=`${n}-enter-from`,enterActiveClass:s=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=i,appearActiveClass:u=s,appearToClass:c=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:h=`${n}-leave-to`}=e,v=function(e){if(null==e)return null;if(O(e))return[tl(e.enter),tl(e.leave)];{const t=tl(e);return[t,t]}}(o),g=v&&v[0],m=v&&v[1],{onBeforeEnter:y,onEnter:b,onEnterCancelled:w,onLeave:_,onLeaveCancelled:x,onBeforeAppear:S=y,onAppear:k=b,onAppearCancelled:E=w}=t,C=(e,t,n)=>{rl(e,t?c:l),rl(e,t?u:s),n&&n()},P=(e,t)=>{e._isLeaving=!1,rl(e,f),rl(e,h),rl(e,p),t&&t()},T=e=>(t,n)=>{const o=e?k:b,s=()=>C(t,e,n);Zs(o,[t,s]),ol((()=>{rl(t,e?a:i),nl(t,e?c:l),Xs(o)||sl(t,r,g,s)}))};return d(t,{onBeforeEnter(e){Zs(y,[e]),nl(e,i),nl(e,s)},onBeforeAppear(e){Zs(S,[e]),nl(e,a),nl(e,u)},onEnter:T(!1),onAppear:T(!0),onLeave(e,t){e._isLeaving=!0;const n=()=>P(e,t);nl(e,f),cl(),nl(e,p),ol((()=>{e._isLeaving&&(rl(e,f),nl(e,h),Xs(_)||sl(e,r,m,n))})),Zs(_,[e,n])},onEnterCancelled(e){C(e,!1),Zs(w,[e])},onAppearCancelled(e){C(e,!0),Zs(E,[e])},onLeaveCancelled(e){P(e),Zs(x,[e])}})}function tl(e){return z(e)}function nl(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.add(t))),(e[Gs]||(e[Gs]=new Set)).add(t)}function rl(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.remove(t)));const n=e[Gs];n&&(n.delete(t),n.size||(e[Gs]=void 0))}function ol(e){requestAnimationFrame((()=>{requestAnimationFrame(e)}))}let il=0;function sl(e,t,n,r){const o=e._endId=++il,i=()=>{o===e._endId&&r()};if(n)return setTimeout(i,n);const{type:s,timeout:l,propCount:a}=ll(e,t);if(!s)return r();const u=s+"end";let c=0;const f=()=>{e.removeEventListener(u,p),i()},p=t=>{t.target===e&&++c>=a&&f()};setTimeout((()=>{c<a&&f()}),l+1),e.addEventListener(u,p)}function ll(e,t){const n=window.getComputedStyle(e),r=e=>(n[e]||"").split(", "),o=r(`${Ws}Delay`),i=r(`${Ws}Duration`),s=al(o,i),l=r(`${Ks}Delay`),a=r(`${Ks}Duration`),u=al(l,a);let c=null,f=0,p=0;t===Ws?s>0&&(c=Ws,f=s,p=i.length):t===Ks?u>0&&(c=Ks,f=u,p=a.length):(f=Math.max(s,u),c=f>0?s>u?Ws:Ks:null,p=c?c===Ws?i.length:a.length:0);return{type:c,timeout:f,propCount:p,hasTransform:c===Ws&&/\b(transform|all)(,|$)/.test(r(`${Ws}Property`).toString())}}function al(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map(((t,n)=>ul(t)+ul(e[n]))))}function ul(e){return"auto"===e?0:1e3*Number(e.slice(0,-1).replace(",","."))}function cl(){return document.body.offsetHeight}const fl=Symbol("_vod"),pl={beforeMount(e,{value:t},{transition:n}){e[fl]="none"===e.style.display?"":e.style.display,n&&t?n.beforeEnter(e):dl(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),dl(e,!0),r.enter(e)):r.leave(e,(()=>{dl(e,!1)})):dl(e,t))},beforeUnmount(e,{value:t}){dl(e,t)}};function dl(e,t){e.style.display=t?e[fl]:"none"}const hl=/\s*!important$/;function vl(e,t,n){if(m(n))n.forEach((n=>vl(e,t,n)));else if(null==n&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=function(e,t){const n=ml[t];if(n)return n;let r=F(t);if("filter"!==r&&r in e)return ml[t]=r;r=D(r);for(let n=0;n<gl.length;n++){const o=gl[n]+r;if(o in e)return ml[t]=o}return t}(e,t);hl.test(n)?e.setProperty(M(r),n.replace(hl,""),"important"):e[r]=n}}const gl=["Webkit","Moz","ms"],ml={};const yl="http://www.w3.org/1999/xlink";function bl(e,t,n,r){e.addEventListener(t,n,r)}const wl=Symbol("_vei");function _l(e,t,n,r,o=null){const i=e[wl]||(e[wl]={}),s=i[t];if(r&&s)s.value=r;else{const[n,l]=function(e){let t;if(xl.test(e)){let n;for(t={};n=e.match(xl);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}const n=":"===e[2]?e.slice(3):M(e.slice(2));return[n,t]}(t);if(r){const s=i[t]=function(e,t){const n=e=>{if(e._vts){if(e._vts<=n.attached)return}else e._vts=Date.now();an(function(e,t){if(m(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map((e=>t=>!t._stopped&&e&&e(t)))}return t}(e,n.value),t,5,[e])};return n.value=e,n.attached=kl(),n}(r,o);bl(e,n,s,l)}else s&&(!function(e,t,n,r){e.removeEventListener(t,n,r)}(e,n,s,l),i[t]=void 0)}}const xl=/(?:Once|Passive|Capture)$/;let Sl=0;const Ol=Promise.resolve(),kl=()=>Sl||(Ol.then((()=>Sl=0)),Sl=Date.now());const El=/^on[a-z]/;function Cl(e,t){const n=Lr(e);class r extends Al{constructor(e){super(n,e,t)}}return r.def=n,r}const Pl=e=>Cl(e,ga),Tl="undefined"!=typeof HTMLElement?HTMLElement:class{};class Al extends Tl{constructor(e,t={},n){super(),this._def=e,this._props=t,this._instance=null,this._connected=!1,this._resolved=!1,this._numberProps=null,this._ob=null,this.shadowRoot&&n?n(this._createVNode(),this.shadowRoot):(this.attachShadow({mode:"open"}),this._def.__asyncLoader||this._resolveProps(this._def))}connectedCallback(){this._connected=!0,this._instance||(this._resolved?this._update():this._resolveDef())}disconnectedCallback(){this._connected=!1,this._ob&&(this._ob.disconnect(),this._ob=null),bn((()=>{this._connected||(va(null,this.shadowRoot),this._instance=null)}))}_resolveDef(){this._resolved=!0;for(let e=0;e<this.attributes.length;e++)this._setAttr(this.attributes[e].name);this._ob=new MutationObserver((e=>{for(const t of e)this._setAttr(t.attributeName)})),this._ob.observe(this,{attributes:!0});const e=(e,t=!1)=>{const{props:n,styles:r}=e;let o;if(n&&!m(n))for(const e in n){const t=n[e];(t===Number||t&&t.type===Number)&&(e in this._props&&(this._props[e]=z(this._props[e])),(o||(o=Object.create(null)))[F(e)]=!0)}this._numberProps=o,t&&this._resolveProps(e),this._applyStyles(r),this._update()},t=this._def.__asyncLoader;t?t().then((t=>e(t,!0))):e(this._def)}_resolveProps(e){const{props:t}=e,n=m(t)?t:Object.keys(t||{});for(const e of Object.keys(this))"_"!==e[0]&&n.includes(e)&&this._setProp(e,this[e],!0,!1);for(const e of n.map(F))Object.defineProperty(this,e,{get(){return this._getProp(e)},set(t){this._setProp(e,t)}})}_setAttr(e){let t=this.getAttribute(e);const n=F(e);this._numberProps&&this._numberProps[n]&&(t=z(t)),this._setProp(n,t,!1)}_getProp(e){return this._props[e]}_setProp(e,t,n=!0,r=!0){t!==this._props[e]&&(this._props[e]=t,r&&this._instance&&this._update(),n&&(!0===t?this.setAttribute(M(e),""):"string"==typeof t||"number"==typeof t?this.setAttribute(M(e),t+""):t||this.removeAttribute(M(e))))}_update(){va(this._createVNode(),this.shadowRoot)}_createVNode(){const e=Qi(this._def,d({},this._props));return this._instance||(e.ce=e=>{this._instance=e,e.isCE=!0;const t=(e,t)=>{this.dispatchEvent(new CustomEvent(e,{detail:t}))};e.emit=(e,...n)=>{t(e,n),M(e)!==e&&t(M(e),n)};let n=this;for(;n=n&&(n.parentNode||n.host);)if(n instanceof Al){e.parent=n._instance,e.provides=n._instance.provides;break}}),e}_applyStyles(e){e&&e.forEach((e=>{const t=document.createElement("style");t.textContent=e,this.shadowRoot.appendChild(t)}))}}function jl(e="$style"){{const t=ds();if(!t)return s;const n=t.type.__cssModules;if(!n)return s;const r=n[e];return r||s}}function Rl(e){const t=ds();if(!t)return;const n=t.ut=(n=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach((e=>Il(e,n)))},r=()=>{const r=e(t.proxy);Ll(t.subTree,r),n(r)};cr(r),Jr((()=>{const e=new MutationObserver(r);e.observe(t.subTree.el.parentNode,{childList:!0}),eo((()=>e.disconnect()))}))}function Ll(e,t){if(128&e.shapeFlag){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push((()=>{Ll(n.activeBranch,t)}))}for(;e.component;)e=e.component.subTree;if(1&e.shapeFlag&&e.el)Il(e.el,t);else if(e.type===Ai)e.children.forEach((e=>Ll(e,t)));else if(e.type===Li){let{el:n,anchor:r}=e;for(;n&&(Il(n,t),n!==r);)n=n.nextSibling}}function Il(e,t){if(1===e.nodeType){const n=e.style;for(const e in t)n.setProperty(`--${e}`,t[e])}}const Fl=new WeakMap,Nl=new WeakMap,Ml=Symbol("_moveCb"),Dl=Symbol("_enterCb"),Bl={name:"TransitionGroup",props:d({},Qs,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=ds(),r=xr();let o,i;return Zr((()=>{if(!o.length)return;const t=e.moveClass||`${e.name||"v"}-move`;if(!function(e,t,n){const r=e.cloneNode(),o=e[Gs];o&&o.forEach((e=>{e.split(/\s+/).forEach((e=>e&&r.classList.remove(e)))}));n.split(/\s+/).forEach((e=>e&&r.classList.add(e))),r.style.display="none";const i=1===t.nodeType?t:t.parentNode;i.appendChild(r);const{hasTransform:s}=ll(r);return i.removeChild(r),s}(o[0].el,n.vnode.el,t))return;o.forEach($l),o.forEach(Vl);const r=o.filter(Hl);cl(),r.forEach((e=>{const n=e.el,r=n.style;nl(n,t),r.transform=r.webkitTransform=r.transitionDuration="";const o=n[Ml]=e=>{e&&e.target!==n||e&&!/transform$/.test(e.propertyName)||(n.removeEventListener("transitionend",o),n[Ml]=null,rl(n,t))};n.addEventListener("transitionend",o)}))})),()=>{const s=It(e),l=el(s);let a=s.tag||Ai;o=i,i=t.default?Rr(t.default()):[];for(let e=0;e<i.length;e++){const t=i[e];null!=t.key&&jr(t,Pr(t,l,r,n))}if(o)for(let e=0;e<o.length;e++){const t=o[e];jr(t,Pr(t,l,r,n)),Fl.set(t,t.el.getBoundingClientRect())}return Qi(a,null,i)}}},Ul=Bl;function $l(e){const t=e.el;t[Ml]&&t[Ml](),t[Dl]&&t[Dl]()}function Vl(e){Nl.set(e,e.el.getBoundingClientRect())}function Hl(e){const t=Fl.get(e),n=Nl.get(e),r=t.left-n.left,o=t.top-n.top;if(r||o){const t=e.el.style;return t.transform=t.webkitTransform=`translate(${r}px,${o}px)`,t.transitionDuration="0s",e}}const zl=e=>{const t=e.props["onUpdate:modelValue"]||!1;return m(t)?e=>$(t,e):t};function ql(e){e.target.composing=!0}function Wl(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Kl=Symbol("_assign"),Gl={created(e,{modifiers:{lazy:t,trim:n,number:r}},o){e[Kl]=zl(o);const i=r||o.props&&"number"===o.props.type;bl(e,t?"change":"input",(t=>{if(t.target.composing)return;let r=e.value;n&&(r=r.trim()),i&&(r=H(r)),e[Kl](r)})),n&&bl(e,"change",(()=>{e.value=e.value.trim()})),t||(bl(e,"compositionstart",ql),bl(e,"compositionend",Wl),bl(e,"change",Wl))},mounted(e,{value:t}){e.value=null==t?"":t},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:r,number:o}},i){if(e[Kl]=zl(i),e.composing)return;if(document.activeElement===e&&"range"!==e.type){if(n)return;if(r&&e.value.trim()===t)return;if((o||"number"===e.type)&&H(e.value)===t)return}const s=null==t?"":t;e.value!==s&&(e.value=s)}},Yl={deep:!0,created(e,t,n){e[Kl]=zl(n),bl(e,"change",(()=>{const t=e._modelValue,n=ea(e),r=e.checked,o=e[Kl];if(m(t)){const e=ue(t,n),i=-1!==e;if(r&&!i)o(t.concat(n));else if(!r&&i){const n=[...t];n.splice(e,1),o(n)}}else if(b(t)){const e=new Set(t);r?e.add(n):e.delete(n),o(e)}else o(ta(e,r))}))},mounted:Jl,beforeUpdate(e,t,n){e[Kl]=zl(n),Jl(e,t,n)}};function Jl(e,{value:t,oldValue:n},r){e._modelValue=t,m(t)?e.checked=ue(t,r.props.value)>-1:b(t)?e.checked=t.has(r.props.value):t!==n&&(e.checked=ae(t,ta(e,!0)))}const Ql={created(e,{value:t},n){e.checked=ae(t,n.props.value),e[Kl]=zl(n),bl(e,"change",(()=>{e[Kl](ea(e))}))},beforeUpdate(e,{value:t,oldValue:n},r){e[Kl]=zl(r),t!==n&&(e.checked=ae(t,r.props.value))}},Zl={deep:!0,created(e,{value:t,modifiers:{number:n}},r){const o=b(t);bl(e,"change",(()=>{const t=Array.prototype.filter.call(e.options,(e=>e.selected)).map((e=>n?H(ea(e)):ea(e)));e[Kl](e.multiple?o?new Set(t):t:t[0])})),e[Kl]=zl(r)},mounted(e,{value:t}){Xl(e,t)},beforeUpdate(e,t,n){e[Kl]=zl(n)},updated(e,{value:t}){Xl(e,t)}};function Xl(e,t){const n=e.multiple;if(!n||m(t)||b(t)){for(let r=0,o=e.options.length;r<o;r++){const o=e.options[r],i=ea(o);if(n)m(t)?o.selected=ue(t,i)>-1:o.selected=t.has(i);else if(ae(ea(o),t))return void(e.selectedIndex!==r&&(e.selectedIndex=r))}n||-1===e.selectedIndex||(e.selectedIndex=-1)}}function ea(e){return"_value"in e?e._value:e.value}function ta(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const na={created(e,t,n){oa(e,t,n,null,"created")},mounted(e,t,n){oa(e,t,n,null,"mounted")},beforeUpdate(e,t,n,r){oa(e,t,n,r,"beforeUpdate")},updated(e,t,n,r){oa(e,t,n,r,"updated")}};function ra(e,t){switch(e){case"SELECT":return Zl;case"TEXTAREA":return Gl;default:switch(t){case"checkbox":return Yl;case"radio":return Ql;default:return Gl}}}function oa(e,t,n,r,o){const i=ra(e.tagName,n.props&&n.props.type)[o];i&&i(e,t,n,r)}const ia=["ctrl","shift","alt","meta"],sa={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&0!==e.button,middle:e=>"button"in e&&1!==e.button,right:e=>"button"in e&&2!==e.button,exact:(e,t)=>ia.some((n=>e[`${n}Key`]&&!t.includes(n)))},la=(e,t)=>(n,...r)=>{for(let e=0;e<t.length;e++){const r=sa[t[e]];if(r&&r(n,t))return}return e(n,...r)},aa={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},ua=(e,t)=>n=>{if(!("key"in n))return;const r=M(n.key);return t.some((e=>e===r||aa[e]===r))?e(n):void 0},ca=d({patchProp:(e,t,n,r,o=!1,i,s,l,a)=>{"class"===t?function(e,t,n){const r=e[Gs];r&&(t=(t?[t,...r]:[...r]).join(" ")),null==t?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}(e,r,o):"style"===t?function(e,t,n){const r=e.style,o=x(n);if(n&&!o){if(t&&!x(t))for(const e in t)null==n[e]&&vl(r,e,"");for(const e in n)vl(r,e,n[e])}else{const i=r.display;o?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),fl in e&&(r.display=i)}}(e,n,r):f(t)?p(t)||_l(e,t,0,r,s):("."===t[0]?(t=t.slice(1),1):"^"===t[0]?(t=t.slice(1),0):function(e,t,n,r){if(r)return"innerHTML"===t||"textContent"===t||!!(t in e&&El.test(t)&&_(n));if("spellcheck"===t||"draggable"===t||"translate"===t)return!1;if("form"===t)return!1;if("list"===t&&"INPUT"===e.tagName)return!1;if("type"===t&&"TEXTAREA"===e.tagName)return!1;if(El.test(t)&&x(n))return!1;return t in e}(e,t,r,o))?function(e,t,n,r,o,i,s){if("innerHTML"===t||"textContent"===t)return r&&s(r,o,i),void(e[t]=null==n?"":n);const l=e.tagName;if("value"===t&&"PROGRESS"!==l&&!l.includes("-")){e._value=n;const r=null==n?"":n;return("OPTION"===l?e.getAttribute("value"):e.value)!==r&&(e.value=r),void(null==n&&e.removeAttribute(t))}let a=!1;if(""===n||null==n){const r=typeof e[t];"boolean"===r?n=le(n):null==n&&"string"===r?(n="",a=!0):"number"===r&&(n=0,a=!0)}try{e[t]=n}catch(e){}a&&e.removeAttribute(t)}(e,t,r,i,s,l,a):("true-value"===t?e._trueValue=r:"false-value"===t&&(e._falseValue=r),function(e,t,n,r,o){if(r&&t.startsWith("xlink:"))null==n?e.removeAttributeNS(yl,t.slice(6,t.length)):e.setAttributeNS(yl,t,n);else{const r=se(t);null==n||r&&!le(n)?e.removeAttribute(t):e.setAttribute(t,r?"":n)}}(e,t,r,o))}},qs);let fa,pa=!1;function da(){return fa||(fa=mi(ca))}function ha(){return fa=pa?fa:yi(ca),pa=!0,fa}const va=(...e)=>{da().render(...e)},ga=(...e)=>{ha().hydrate(...e)},ma=(...e)=>{const t=da().createApp(...e);const{mount:n}=t;return t.mount=e=>{const r=ba(e);if(!r)return;const o=t._component;_(o)||o.render||o.template||(o.template=r.innerHTML),r.innerHTML="";const i=n(r,!1,r instanceof SVGElement);return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),i},t},ya=(...e)=>{const t=ha().createApp(...e);const{mount:n}=t;return t.mount=e=>{const t=ba(e);if(t)return n(t,!0,t instanceof SVGElement)},t};function ba(e){if(x(e)){return document.querySelector(e)}return e}let wa=!1;const _a=()=>{wa||(wa=!0,Gl.getSSRProps=({value:e})=>({value:e}),Ql.getSSRProps=({value:e},t)=>{if(t.props&&ae(t.props.value,e))return{checked:!0}},Yl.getSSRProps=({value:e},t)=>{if(m(e)){if(t.props&&ue(e,t.props.value)>-1)return{checked:!0}}else if(b(e)){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}},na.getSSRProps=(e,t)=>{if("string"!=typeof t.type)return;const n=ra(t.type.toUpperCase(),t.props&&t.props.type);return n.getSSRProps?n.getSSRProps(e,t):void 0},pl.getSSRProps=({value:e})=>{if(!e)return{style:{display:"none"}}})};function xa(e){throw e}function Sa(e){}function Oa(e,t,n,r){const o=new SyntaxError(String(e));return o.code=e,o.loc=t,o}const ka=Symbol(""),Ea=Symbol(""),Ca=Symbol(""),Pa=Symbol(""),Ta=Symbol(""),Aa=Symbol(""),ja=Symbol(""),Ra=Symbol(""),La=Symbol(""),Ia=Symbol(""),Fa=Symbol(""),Na=Symbol(""),Ma=Symbol(""),Da=Symbol(""),Ba=Symbol(""),Ua=Symbol(""),$a=Symbol(""),Va=Symbol(""),Ha=Symbol(""),za=Symbol(""),qa=Symbol(""),Wa=Symbol(""),Ka=Symbol(""),Ga=Symbol(""),Ya=Symbol(""),Ja=Symbol(""),Qa=Symbol(""),Za=Symbol(""),Xa=Symbol(""),eu=Symbol(""),tu=Symbol(""),nu=Symbol(""),ru=Symbol(""),ou=Symbol(""),iu=Symbol(""),su=Symbol(""),lu=Symbol(""),au=Symbol(""),uu=Symbol(""),cu={[ka]:"Fragment",[Ea]:"Teleport",[Ca]:"Suspense",[Pa]:"KeepAlive",[Ta]:"BaseTransition",[Aa]:"openBlock",[ja]:"createBlock",[Ra]:"createElementBlock",[La]:"createVNode",[Ia]:"createElementVNode",[Fa]:"createCommentVNode",[Na]:"createTextVNode",[Ma]:"createStaticVNode",[Da]:"resolveComponent",[Ba]:"resolveDynamicComponent",[Ua]:"resolveDirective",[$a]:"resolveFilter",[Va]:"withDirectives",[Ha]:"renderList",[za]:"renderSlot",[qa]:"createSlots",[Wa]:"toDisplayString",[Ka]:"mergeProps",[Ga]:"normalizeClass",[Ya]:"normalizeStyle",[Ja]:"normalizeProps",[Qa]:"guardReactiveProps",[Za]:"toHandlers",[Xa]:"camelize",[eu]:"capitalize",[tu]:"toHandlerKey",[nu]:"setBlockTracking",[ru]:"pushScopeId",[ou]:"popScopeId",[iu]:"withCtx",[su]:"unref",[lu]:"isRef",[au]:"withMemo",[uu]:"isMemoSame"};const fu={source:"",start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0}};function pu(e,t,n,r,o,i,s,l=!1,a=!1,u=!1,c=fu){return e&&(l?(e.helper(Aa),e.helper(xu(e.inSSR,u))):e.helper(_u(e.inSSR,u)),s&&e.helper(Va)),{type:13,tag:t,props:n,children:r,patchFlag:o,dynamicProps:i,directives:s,isBlock:l,disableTracking:a,isComponent:u,loc:c}}function du(e,t=fu){return{type:17,loc:t,elements:e}}function hu(e,t=fu){return{type:15,loc:t,properties:e}}function vu(e,t){return{type:16,loc:fu,key:x(e)?gu(e,!0):e,value:t}}function gu(e,t=!1,n=fu,r=0){return{type:4,loc:n,content:e,isStatic:t,constType:t?3:r}}function mu(e,t=fu){return{type:8,loc:t,children:e}}function yu(e,t=[],n=fu){return{type:14,loc:n,callee:e,arguments:t}}function bu(e,t=void 0,n=!1,r=!1,o=fu){return{type:18,params:e,returns:t,newline:n,isSlot:r,loc:o}}function wu(e,t,n,r=!0){return{type:19,test:e,consequent:t,alternate:n,newline:r,loc:fu}}function _u(e,t){return e||t?La:Ia}function xu(e,t){return e||t?ja:Ra}function Su(e,{helper:t,removeHelper:n,inSSR:r}){e.isBlock||(e.isBlock=!0,n(_u(r,e.isComponent)),t(Aa),t(xu(r,e.isComponent)))}const Ou=e=>4===e.type&&e.isStatic,ku=(e,t)=>e===t||e===M(t);function Eu(e){return ku(e,"Teleport")?Ea:ku(e,"Suspense")?Ca:ku(e,"KeepAlive")?Pa:ku(e,"BaseTransition")?Ta:void 0}const Cu=/^\d|[^\$\w]/,Pu=e=>!Cu.test(e),Tu=/[A-Za-z_$\xA0-\uFFFF]/,Au=/[\.\?\w$\xA0-\uFFFF]/,ju=/\s+[.[]\s*|\s*[.[]\s+/g,Ru=e=>{e=e.trim().replace(ju,(e=>e.trim()));let t=0,n=[],r=0,o=0,i=null;for(let s=0;s<e.length;s++){const l=e.charAt(s);switch(t){case 0:if("["===l)n.push(t),t=1,r++;else if("("===l)n.push(t),t=2,o++;else if(!(0===s?Tu:Au).test(l))return!1;break;case 1:"'"===l||'"'===l||"`"===l?(n.push(t),t=3,i=l):"["===l?r++:"]"===l&&(--r||(t=n.pop()));break;case 2:if("'"===l||'"'===l||"`"===l)n.push(t),t=3,i=l;else if("("===l)o++;else if(")"===l){if(s===e.length-1)return!1;--o||(t=n.pop())}break;case 3:l===i&&(t=n.pop(),i=null)}}return!r&&!o};function Lu(e,t,n){const r={source:e.source.slice(t,t+n),start:Iu(e.start,e.source,t),end:e.end};return null!=n&&(r.end=Iu(e.start,e.source,t+n)),r}function Iu(e,t,n=t.length){return Fu(d({},e),t,n)}function Fu(e,t,n=t.length){let r=0,o=-1;for(let e=0;e<n;e++)10===t.charCodeAt(e)&&(r++,o=e);return e.offset+=n,e.line+=r,e.column=-1===o?e.column+n:n-o,e}function Nu(e,t,n=!1){for(let r=0;r<e.props.length;r++){const o=e.props[r];if(7===o.type&&(n||o.exp)&&(x(t)?o.name===t:t.test(o.name)))return o}}function Mu(e,t,n=!1,r=!1){for(let o=0;o<e.props.length;o++){const i=e.props[o];if(6===i.type){if(n)continue;if(i.name===t&&(i.value||r))return i}else if("bind"===i.name&&(i.exp||r)&&Du(i.arg,t))return i}}function Du(e,t){return!(!e||!Ou(e)||e.content!==t)}function Bu(e){return 5===e.type||2===e.type}function Uu(e){return 7===e.type&&"slot"===e.name}function $u(e){return 1===e.type&&3===e.tagType}function Vu(e){return 1===e.type&&2===e.tagType}const Hu=new Set([Ja,Qa]);function zu(e,t=[]){if(e&&!x(e)&&14===e.type){const n=e.callee;if(!x(n)&&Hu.has(n))return zu(e.arguments[0],t.concat(e))}return[e,t]}function qu(e,t,n){let r,o,i=13===e.type?e.props:e.arguments[2],s=[];if(i&&!x(i)&&14===i.type){const e=zu(i);i=e[0],s=e[1],o=s[s.length-1]}if(null==i||x(i))r=hu([t]);else if(14===i.type){const e=i.arguments[0];x(e)||15!==e.type?i.callee===Za?r=yu(n.helper(Ka),[hu([t]),i]):i.arguments.unshift(hu([t])):Wu(t,e)||e.properties.unshift(t),!r&&(r=i)}else 15===i.type?(Wu(t,i)||i.properties.unshift(t),r=i):(r=yu(n.helper(Ka),[hu([t]),i]),o&&o.callee===Qa&&(o=s[s.length-2]));13===e.type?o?o.arguments[0]=r:e.props=r:o?o.arguments[0]=r:e.arguments[2]=r}function Wu(e,t){let n=!1;if(4===e.key.type){const r=e.key.content;n=t.properties.some((e=>4===e.key.type&&e.key.content===r))}return n}function Ku(e,t){return`_${t}_${e.replace(/[^\w]/g,((t,n)=>"-"===t?"_":e.charCodeAt(n).toString()))}`}function Gu(e,t){const n=t.options?t.options.compatConfig:t.compatConfig,r=n&&n[e];return"MODE"===e?r||3:r}function Yu(e,t){const n=Gu("MODE",t),r=Gu(e,t);return 3===n?!0===r:!1!==r}function Ju(e,t,n,...r){return Yu(e,t)}const Qu=/&(gt|lt|amp|apos|quot);/g,Zu={gt:">",lt:"<",amp:"&",apos:"'",quot:'"'},Xu={delimiters:["{{","}}"],getNamespace:()=>0,getTextMode:()=>0,isVoidTag:u,isPreTag:u,isCustomElement:u,decodeEntities:e=>e.replace(Qu,((e,t)=>Zu[t])),onError:xa,onWarn:Sa,comments:!1};function ec(e,t={}){const n=function(e,t){const n=d({},Xu);let r;for(r in t)n[r]=void 0===t[r]?Xu[r]:t[r];return{options:n,column:1,line:1,offset:0,originalSource:e,source:e,inPre:!1,inVPre:!1,onWarn:n.onWarn}}(e,t),r=hc(n);return function(e,t=fu){return{type:0,children:e,helpers:new Set,components:[],directives:[],hoists:[],imports:[],cached:0,temps:0,codegenNode:void 0,loc:t}}(tc(n,0,[]),vc(n,r))}function tc(e,t,n){const r=gc(n),o=r?r.ns:0,i=[];for(;!xc(e,t,n);){const s=e.source;let l;if(0===t||1===t)if(!e.inVPre&&mc(s,e.options.delimiters[0]))l=fc(e,t);else if(0===t&&"<"===s[0])if(1===s.length)_c(e,5,1);else if("!"===s[1])mc(s,"\x3c!--")?l=oc(e):mc(s,"<!DOCTYPE")?l=ic(e):mc(s,"<![CDATA[")?0!==o?l=rc(e,n):(_c(e,1),l=ic(e)):(_c(e,11),l=ic(e));else if("/"===s[1])if(2===s.length)_c(e,5,2);else{if(">"===s[2]){_c(e,14,2),yc(e,3);continue}if(/[a-z]/i.test(s[2])){_c(e,23),ac(e,1,r);continue}_c(e,12,2),l=ic(e)}else/[a-z]/i.test(s[1])?(l=sc(e,n),Yu("COMPILER_NATIVE_TEMPLATE",e)&&l&&"template"===l.tag&&!l.props.some((e=>7===e.type&&lc(e.name)))&&(l=l.children)):"?"===s[1]?(_c(e,21,1),l=ic(e)):_c(e,12,1);if(l||(l=pc(e,t)),m(l))for(let e=0;e<l.length;e++)nc(i,l[e]);else nc(i,l)}let s=!1;if(2!==t&&1!==t){const t="preserve"!==e.options.whitespace;for(let n=0;n<i.length;n++){const r=i[n];if(2===r.type)if(e.inPre)r.content=r.content.replace(/\r\n/g,"\n");else if(/[^\t\r\n\f ]/.test(r.content))t&&(r.content=r.content.replace(/[\t\r\n\f ]+/g," "));else{const e=i[n-1],o=i[n+1];!e||!o||t&&(3===e.type&&3===o.type||3===e.type&&1===o.type||1===e.type&&3===o.type||1===e.type&&1===o.type&&/[\r\n]/.test(r.content))?(s=!0,i[n]=null):r.content=" "}else 3!==r.type||e.options.comments||(s=!0,i[n]=null)}if(e.inPre&&r&&e.options.isPreTag(r.tag)){const e=i[0];e&&2===e.type&&(e.content=e.content.replace(/^\r?\n/,""))}}return s?i.filter(Boolean):i}function nc(e,t){if(2===t.type){const n=gc(e);if(n&&2===n.type&&n.loc.end.offset===t.loc.start.offset)return n.content+=t.content,n.loc.end=t.loc.end,void(n.loc.source+=t.loc.source)}e.push(t)}function rc(e,t){yc(e,9);const n=tc(e,3,t);return 0===e.source.length?_c(e,6):yc(e,3),n}function oc(e){const t=hc(e);let n;const r=/--(\!)?>/.exec(e.source);if(r){r.index<=3&&_c(e,0),r[1]&&_c(e,10),n=e.source.slice(4,r.index);const t=e.source.slice(0,r.index);let o=1,i=0;for(;-1!==(i=t.indexOf("\x3c!--",o));)yc(e,i-o+1),i+4<t.length&&_c(e,16),o=i+1;yc(e,r.index+r[0].length-o+1)}else n=e.source.slice(4),yc(e,e.source.length),_c(e,7);return{type:3,content:n,loc:vc(e,t)}}function ic(e){const t=hc(e),n="?"===e.source[1]?1:2;let r;const o=e.source.indexOf(">");return-1===o?(r=e.source.slice(n),yc(e,e.source.length)):(r=e.source.slice(n,o),yc(e,o+1)),{type:3,content:r,loc:vc(e,t)}}function sc(e,t){const n=e.inPre,r=e.inVPre,o=gc(t),i=ac(e,0,o),s=e.inPre&&!n,l=e.inVPre&&!r;if(i.isSelfClosing||e.options.isVoidTag(i.tag))return s&&(e.inPre=!1),l&&(e.inVPre=!1),i;t.push(i);const a=e.options.getTextMode(i,o),u=tc(e,a,t);t.pop();{const t=i.props.find((e=>6===e.type&&"inline-template"===e.name));if(t&&Ju("COMPILER_INLINE_TEMPLATE",e,t.loc)){const n=vc(e,i.loc.end);t.value={type:2,content:n.source,loc:n}}}if(i.children=u,Sc(e.source,i.tag))ac(e,1,o);else if(_c(e,24,0,i.loc.start),0===e.source.length&&"script"===i.tag.toLowerCase()){const t=u[0];t&&mc(t.loc.source,"\x3c!--")&&_c(e,8)}return i.loc=vc(e,i.loc.start),s&&(e.inPre=!1),l&&(e.inVPre=!1),i}const lc=i("if,else,else-if,for,slot");function ac(e,t,n){const r=hc(e),o=/^<\/?([a-z][^\t\r\n\f />]*)/i.exec(e.source),i=o[1],s=e.options.getNamespace(i,n);yc(e,o[0].length),bc(e);const l=hc(e),a=e.source;e.options.isPreTag(i)&&(e.inPre=!0);let u=uc(e,t);0===t&&!e.inVPre&&u.some((e=>7===e.type&&"pre"===e.name))&&(e.inVPre=!0,d(e,l),e.source=a,u=uc(e,t).filter((e=>"v-pre"!==e.name)));let c=!1;if(0===e.source.length?_c(e,9):(c=mc(e.source,"/>"),1===t&&c&&_c(e,4),yc(e,c?2:1)),1===t)return;let f=0;return e.inVPre||("slot"===i?f=2:"template"===i?u.some((e=>7===e.type&&lc(e.name)))&&(f=3):function(e,t,n){const r=n.options;if(r.isCustomElement(e))return!1;if("component"===e||/^[A-Z]/.test(e)||Eu(e)||r.isBuiltInComponent&&r.isBuiltInComponent(e)||r.isNativeTag&&!r.isNativeTag(e))return!0;for(let e=0;e<t.length;e++){const r=t[e];if(6===r.type){if("is"===r.name&&r.value){if(r.value.content.startsWith("vue:"))return!0;if(Ju("COMPILER_IS_ON_ELEMENT",n,r.loc))return!0}}else{if("is"===r.name)return!0;if("bind"===r.name&&Du(r.arg,"is")&&Ju("COMPILER_IS_ON_ELEMENT",n,r.loc))return!0}}}(i,u,e)&&(f=1)),{type:1,ns:s,tag:i,tagType:f,props:u,isSelfClosing:c,children:[],loc:vc(e,r),codegenNode:void 0}}function uc(e,t){const n=[],r=new Set;for(;e.source.length>0&&!mc(e.source,">")&&!mc(e.source,"/>");){if(mc(e.source,"/")){_c(e,22),yc(e,1),bc(e);continue}1===t&&_c(e,3);const o=cc(e,r);6===o.type&&o.value&&"class"===o.name&&(o.value.content=o.value.content.replace(/\s+/g," ").trim()),0===t&&n.push(o),/^[^\t\r\n\f />]/.test(e.source)&&_c(e,15),bc(e)}return n}function cc(e,t){var n;const r=hc(e),o=/^[^\t\r\n\f />][^\t\r\n\f />=]*/.exec(e.source)[0];t.has(o)&&_c(e,2),t.add(o),"="===o[0]&&_c(e,19);{const t=/["'<]/g;let n;for(;n=t.exec(o);)_c(e,17,n.index)}let i;yc(e,o.length),/^[\t\r\n\f ]*=/.test(e.source)&&(bc(e),yc(e,1),bc(e),i=function(e){const t=hc(e);let n;const r=e.source[0],o='"'===r||"'"===r;if(o){yc(e,1);const t=e.source.indexOf(r);-1===t?n=dc(e,e.source.length,4):(n=dc(e,t,4),yc(e,1))}else{const t=/^[^\t\r\n\f >]+/.exec(e.source);if(!t)return;const r=/["'<=`]/g;let o;for(;o=r.exec(t[0]);)_c(e,18,o.index);n=dc(e,t[0].length,4)}return{content:n,isQuoted:o,loc:vc(e,t)}}(e),i||_c(e,13));const s=vc(e,r);if(!e.inVPre&&/^(v-[A-Za-z0-9-]|:|\.|@|#)/.test(o)){const t=/(?:^v-([a-z0-9-]+))?(?:(?::|^\.|^@|^#)(\[[^\]]+\]|[^\.]+))?(.+)?$/i.exec(o);let l,a=mc(o,"."),u=t[1]||(a||mc(o,":")?"bind":mc(o,"@")?"on":"slot");if(t[2]){const i="slot"===u,s=o.lastIndexOf(t[2],o.length-((null==(n=t[3])?void 0:n.length)||0)),a=vc(e,wc(e,r,s),wc(e,r,s+t[2].length+(i&&t[3]||"").length));let c=t[2],f=!0;c.startsWith("[")?(f=!1,c.endsWith("]")?c=c.slice(1,c.length-1):(_c(e,27),c=c.slice(1))):i&&(c+=t[3]||""),l={type:4,content:c,isStatic:f,constType:f?3:0,loc:a}}if(i&&i.isQuoted){const e=i.loc;e.start.offset++,e.start.column++,e.end=Iu(e.start,i.content),e.source=e.source.slice(1,-1)}const c=t[3]?t[3].slice(1).split("."):[];return a&&c.push("prop"),"bind"===u&&l&&c.includes("sync")&&Ju("COMPILER_V_BIND_SYNC",e,0,l.loc.source)&&(u="model",c.splice(c.indexOf("sync"),1)),{type:7,name:u,exp:i&&{type:4,content:i.content,isStatic:!1,constType:0,loc:i.loc},arg:l,modifiers:c,loc:s}}return!e.inVPre&&mc(o,"v-")&&_c(e,26),{type:6,name:o,value:i&&{type:2,content:i.content,loc:i.loc},loc:s}}function fc(e,t){const[n,r]=e.options.delimiters,o=e.source.indexOf(r,n.length);if(-1===o)return void _c(e,25);const i=hc(e);yc(e,n.length);const s=hc(e),l=hc(e),a=o-n.length,u=e.source.slice(0,a),c=dc(e,a,t),f=c.trim(),p=c.indexOf(f);p>0&&Fu(s,u,p);return Fu(l,u,a-(c.length-f.length-p)),yc(e,r.length),{type:5,content:{type:4,isStatic:!1,constType:0,content:f,loc:vc(e,s,l)},loc:vc(e,i)}}function pc(e,t){const n=3===t?["]]>"]:["<",e.options.delimiters[0]];let r=e.source.length;for(let t=0;t<n.length;t++){const o=e.source.indexOf(n[t],1);-1!==o&&r>o&&(r=o)}const o=hc(e);return{type:2,content:dc(e,r,t),loc:vc(e,o)}}function dc(e,t,n){const r=e.source.slice(0,t);return yc(e,t),2!==n&&3!==n&&r.includes("&")?e.options.decodeEntities(r,4===n):r}function hc(e){const{column:t,line:n,offset:r}=e;return{column:t,line:n,offset:r}}function vc(e,t,n){return{start:t,end:n=n||hc(e),source:e.originalSource.slice(t.offset,n.offset)}}function gc(e){return e[e.length-1]}function mc(e,t){return e.startsWith(t)}function yc(e,t){const{source:n}=e;Fu(e,n,t),e.source=n.slice(t)}function bc(e){const t=/^[\t\r\n\f ]+/.exec(e.source);t&&yc(e,t[0].length)}function wc(e,t,n){return Iu(t,e.originalSource.slice(t.offset,n),n)}function _c(e,t,n,r=hc(e)){n&&(r.offset+=n,r.column+=n),e.options.onError(Oa(t,{start:r,end:r,source:""}))}function xc(e,t,n){const r=e.source;switch(t){case 0:if(mc(r,"</"))for(let e=n.length-1;e>=0;--e)if(Sc(r,n[e].tag))return!0;break;case 1:case 2:{const e=gc(n);if(e&&Sc(r,e.tag))return!0;break}case 3:if(mc(r,"]]>"))return!0}return!r}function Sc(e,t){return mc(e,"</")&&e.slice(2,2+t.length).toLowerCase()===t.toLowerCase()&&/[\t\r\n\f />]/.test(e[2+t.length]||">")}function Oc(e,t){Ec(e,t,kc(e,e.children[0]))}function kc(e,t){const{children:n}=e;return 1===n.length&&1===t.type&&!Vu(t)}function Ec(e,t,n=!1){const{children:r}=e,o=r.length;let i=0;for(let e=0;e<r.length;e++){const o=r[e];if(1===o.type&&0===o.tagType){const e=n?0:Cc(o,t);if(e>0){if(e>=2){o.codegenNode.patchFlag="-1",o.codegenNode=t.hoist(o.codegenNode),i++;continue}}else{const e=o.codegenNode;if(13===e.type){const n=Rc(e);if((!n||512===n||1===n)&&Ac(o,t)>=2){const n=jc(o);n&&(e.props=t.hoist(n))}e.dynamicProps&&(e.dynamicProps=t.hoist(e.dynamicProps))}}}if(1===o.type){const e=1===o.tagType;e&&t.scopes.vSlot++,Ec(o,t),e&&t.scopes.vSlot--}else if(11===o.type)Ec(o,t,1===o.children.length);else if(9===o.type)for(let e=0;e<o.branches.length;e++)Ec(o.branches[e],t,1===o.branches[e].children.length)}if(i&&t.transformHoist&&t.transformHoist(r,t,e),i&&i===o&&1===e.type&&0===e.tagType&&e.codegenNode&&13===e.codegenNode.type&&m(e.codegenNode.children)){const n=t.hoist(du(e.codegenNode.children));t.hmr&&(n.content=`[...${n.content}]`),e.codegenNode.children=n}}function Cc(e,t){const{constantCache:n}=t;switch(e.type){case 1:if(0!==e.tagType)return 0;const r=n.get(e);if(void 0!==r)return r;const o=e.codegenNode;if(13!==o.type)return 0;if(o.isBlock&&"svg"!==e.tag&&"foreignObject"!==e.tag)return 0;if(Rc(o))return n.set(e,0),0;{let r=3;const i=Ac(e,t);if(0===i)return n.set(e,0),0;i<r&&(r=i);for(let o=0;o<e.children.length;o++){const i=Cc(e.children[o],t);if(0===i)return n.set(e,0),0;i<r&&(r=i)}if(r>1)for(let o=0;o<e.props.length;o++){const i=e.props[o];if(7===i.type&&"bind"===i.name&&i.exp){const o=Cc(i.exp,t);if(0===o)return n.set(e,0),0;o<r&&(r=o)}}if(o.isBlock){for(let t=0;t<e.props.length;t++){if(7===e.props[t].type)return n.set(e,0),0}t.removeHelper(Aa),t.removeHelper(xu(t.inSSR,o.isComponent)),o.isBlock=!1,t.helper(_u(t.inSSR,o.isComponent))}return n.set(e,r),r}case 2:case 3:return 3;case 9:case 11:case 10:default:return 0;case 5:case 12:return Cc(e.content,t);case 4:return e.constType;case 8:let i=3;for(let n=0;n<e.children.length;n++){const r=e.children[n];if(x(r)||S(r))continue;const o=Cc(r,t);if(0===o)return 0;o<i&&(i=o)}return i}}const Pc=new Set([Ga,Ya,Ja,Qa]);function Tc(e,t){if(14===e.type&&!x(e.callee)&&Pc.has(e.callee)){const n=e.arguments[0];if(4===n.type)return Cc(n,t);if(14===n.type)return Tc(n,t)}return 0}function Ac(e,t){let n=3;const r=jc(e);if(r&&15===r.type){const{properties:e}=r;for(let r=0;r<e.length;r++){const{key:o,value:i}=e[r],s=Cc(o,t);if(0===s)return s;let l;if(s<n&&(n=s),l=4===i.type?Cc(i,t):14===i.type?Tc(i,t):0,0===l)return l;l<n&&(n=l)}}return n}function jc(e){const t=e.codegenNode;if(13===t.type)return t.props}function Rc(e){const t=e.patchFlag;return t?parseInt(t,10):void 0}function Lc(e,{filename:t="",prefixIdentifiers:n=!1,hoistStatic:r=!1,hmr:o=!1,cacheHandlers:i=!1,nodeTransforms:l=[],directiveTransforms:u={},transformHoist:c=null,isBuiltInComponent:f=a,isCustomElement:p=a,expressionPlugins:d=[],scopeId:h=null,slotted:v=!0,ssr:g=!1,inSSR:m=!1,ssrCssVars:y="",bindingMetadata:b=s,inline:w=!1,isTS:_=!1,onError:S=xa,onWarn:O=Sa,compatConfig:k}){const E=t.replace(/\?.*$/,"").match(/([^/\\]+)\.\w+$/),C={selfName:E&&D(F(E[1])),prefixIdentifiers:n,hoistStatic:r,hmr:o,cacheHandlers:i,nodeTransforms:l,directiveTransforms:u,transformHoist:c,isBuiltInComponent:f,isCustomElement:p,expressionPlugins:d,scopeId:h,slotted:v,ssr:g,inSSR:m,ssrCssVars:y,bindingMetadata:b,inline:w,isTS:_,onError:S,onWarn:O,compatConfig:k,root:e,helpers:new Map,components:new Set,directives:new Set,hoists:[],imports:[],constantCache:new WeakMap,temps:0,cached:0,identifiers:Object.create(null),scopes:{vFor:0,vSlot:0,vPre:0,vOnce:0},parent:null,currentNode:e,childIndex:0,inVOnce:!1,helper(e){const t=C.helpers.get(e)||0;return C.helpers.set(e,t+1),e},removeHelper(e){const t=C.helpers.get(e);if(t){const n=t-1;n?C.helpers.set(e,n):C.helpers.delete(e)}},helperString:e=>`_${cu[C.helper(e)]}`,replaceNode(e){C.parent.children[C.childIndex]=C.currentNode=e},removeNode(e){const t=C.parent.children,n=e?t.indexOf(e):C.currentNode?C.childIndex:-1;e&&e!==C.currentNode?C.childIndex>n&&(C.childIndex--,C.onNodeRemoved()):(C.currentNode=null,C.onNodeRemoved()),C.parent.children.splice(n,1)},onNodeRemoved:()=>{},addIdentifiers(e){},removeIdentifiers(e){},hoist(e){x(e)&&(e=gu(e)),C.hoists.push(e);const t=gu(`_hoisted_${C.hoists.length}`,!1,e.loc,2);return t.hoisted=e,t},cache:(e,t=!1)=>function(e,t,n=!1){return{type:20,index:e,value:t,isVNode:n,loc:fu}}(C.cached++,e,t)};return C.filters=new Set,C}function Ic(e,t){const n=Lc(e,t);Fc(e,n),t.hoistStatic&&Oc(e,n),t.ssr||function(e,t){const{helper:n}=t,{children:r}=e;if(1===r.length){const n=r[0];if(kc(e,n)&&n.codegenNode){const r=n.codegenNode;13===r.type&&Su(r,t),e.codegenNode=r}else e.codegenNode=n}else if(r.length>1){let r=64;K[64];0,e.codegenNode=pu(t,n(ka),void 0,e.children,r+"",void 0,void 0,!0,void 0,!1)}}(e,n),e.helpers=new Set([...n.helpers.keys()]),e.components=[...n.components],e.directives=[...n.directives],e.imports=n.imports,e.hoists=n.hoists,e.temps=n.temps,e.cached=n.cached,e.filters=[...n.filters]}function Fc(e,t){t.currentNode=e;const{nodeTransforms:n}=t,r=[];for(let o=0;o<n.length;o++){const i=n[o](e,t);if(i&&(m(i)?r.push(...i):r.push(i)),!t.currentNode)return;e=t.currentNode}switch(e.type){case 3:t.ssr||t.helper(Fa);break;case 5:t.ssr||t.helper(Wa);break;case 9:for(let n=0;n<e.branches.length;n++)Fc(e.branches[n],t);break;case 10:case 11:case 1:case 0:!function(e,t){let n=0;const r=()=>{n--};for(;n<e.children.length;n++){const o=e.children[n];x(o)||(t.parent=e,t.childIndex=n,t.onNodeRemoved=r,Fc(o,t))}}(e,t)}t.currentNode=e;let o=r.length;for(;o--;)r[o]()}function Nc(e,t){const n=x(e)?t=>t===e:t=>e.test(t);return(e,r)=>{if(1===e.type){const{props:o}=e;if(3===e.tagType&&o.some(Uu))return;const i=[];for(let s=0;s<o.length;s++){const l=o[s];if(7===l.type&&n(l.name)){o.splice(s,1),s--;const n=t(e,l,r);n&&i.push(n)}}return i}}}const Mc="/*#__PURE__*/",Dc=e=>`${cu[e]}: _${cu[e]}`;function Bc(e,{mode:t="function",prefixIdentifiers:n="module"===t,sourceMap:r=!1,filename:o="template.vue.html",scopeId:i=null,optimizeImports:s=!1,runtimeGlobalName:l="Vue",runtimeModuleName:a="vue",ssrRuntimeModuleName:u="vue/server-renderer",ssr:c=!1,isTS:f=!1,inSSR:p=!1}){const d={mode:t,prefixIdentifiers:n,sourceMap:r,filename:o,scopeId:i,optimizeImports:s,runtimeGlobalName:l,runtimeModuleName:a,ssrRuntimeModuleName:u,ssr:c,isTS:f,inSSR:p,source:e.loc.source,code:"",column:1,line:1,offset:0,indentLevel:0,pure:!1,map:void 0,helper:e=>`_${cu[e]}`,push(e,t){d.code+=e},indent(){h(++d.indentLevel)},deindent(e=!1){e?--d.indentLevel:h(--d.indentLevel)},newline(){h(d.indentLevel)}};function h(e){d.push("\n"+"  ".repeat(e))}return d}function Uc(e,t={}){const n=Bc(e,t);t.onContextCreated&&t.onContextCreated(n);const{mode:r,push:o,prefixIdentifiers:i,indent:s,deindent:l,newline:a,scopeId:u,ssr:c}=n,f=Array.from(e.helpers),p=f.length>0,d=!i&&"module"!==r,h=n;!function(e,t){const{ssr:n,prefixIdentifiers:r,push:o,newline:i,runtimeModuleName:s,runtimeGlobalName:l,ssrRuntimeModuleName:a}=t,u=l,c=Array.from(e.helpers);if(c.length>0&&(o(`const _Vue = ${u}\n`),e.hoists.length)){o(`const { ${[La,Ia,Fa,Na,Ma].filter((e=>c.includes(e))).map(Dc).join(", ")} } = _Vue\n`)}(function(e,t){if(!e.length)return;t.pure=!0;const{push:n,newline:r,helper:o,scopeId:i,mode:s}=t;r();for(let o=0;o<e.length;o++){const i=e[o];i&&(n(`const _hoisted_${o+1} = `),zc(i,t),r())}t.pure=!1})(e.hoists,t),i(),o("return ")}(e,h);if(o(`function ${c?"ssrRender":"render"}(${(c?["_ctx","_push","_parent","_attrs"]:["_ctx","_cache"]).join(", ")}) {`),s(),d&&(o("with (_ctx) {"),s(),p&&(o(`const { ${f.map(Dc).join(", ")} } = _Vue`),o("\n"),a())),e.components.length&&($c(e.components,"component",n),(e.directives.length||e.temps>0)&&a()),e.directives.length&&($c(e.directives,"directive",n),e.temps>0&&a()),e.filters&&e.filters.length&&(a(),$c(e.filters,"filter",n),a()),e.temps>0){o("let ");for(let t=0;t<e.temps;t++)o(`${t>0?", ":""}_temp${t}`)}return(e.components.length||e.directives.length||e.temps)&&(o("\n"),a()),c||o("return "),e.codegenNode?zc(e.codegenNode,n):o("null"),d&&(l(),o("}")),l(),o("}"),{ast:e,code:n.code,preamble:"",map:n.map?n.map.toJSON():void 0}}function $c(e,t,{helper:n,push:r,newline:o,isTS:i}){const s=n("filter"===t?$a:"component"===t?Da:Ua);for(let n=0;n<e.length;n++){let l=e[n];const a=l.endsWith("__self");a&&(l=l.slice(0,-6)),r(`const ${Ku(l,t)} = ${s}(${JSON.stringify(l)}${a?", true":""})${i?"!":""}`),n<e.length-1&&o()}}function Vc(e,t){const n=e.length>3||!1;t.push("["),n&&t.indent(),Hc(e,t,n),n&&t.deindent(),t.push("]")}function Hc(e,t,n=!1,r=!0){const{push:o,newline:i}=t;for(let s=0;s<e.length;s++){const l=e[s];x(l)?o(l):m(l)?Vc(l,t):zc(l,t),s<e.length-1&&(n?(r&&o(","),i()):r&&o(", "))}}function zc(e,t){if(x(e))t.push(e);else if(S(e))t.push(t.helper(e));else switch(e.type){case 1:case 9:case 11:case 12:zc(e.codegenNode,t);break;case 2:!function(e,t){t.push(JSON.stringify(e.content),e)}(e,t);break;case 4:qc(e,t);break;case 5:!function(e,t){const{push:n,helper:r,pure:o}=t;o&&n(Mc);n(`${r(Wa)}(`),zc(e.content,t),n(")")}(e,t);break;case 8:Wc(e,t);break;case 3:!function(e,t){const{push:n,helper:r,pure:o}=t;o&&n(Mc);n(`${r(Fa)}(${JSON.stringify(e.content)})`,e)}(e,t);break;case 13:!function(e,t){const{push:n,helper:r,pure:o}=t,{tag:i,props:s,children:l,patchFlag:a,dynamicProps:u,directives:c,isBlock:f,disableTracking:p,isComponent:d}=e;c&&n(r(Va)+"(");f&&n(`(${r(Aa)}(${p?"true":""}), `);o&&n(Mc);const h=f?xu(t.inSSR,d):_u(t.inSSR,d);n(r(h)+"(",e),Hc(function(e){let t=e.length;for(;t--&&null==e[t];);return e.slice(0,t+1).map((e=>e||"null"))}([i,s,l,a,u]),t),n(")"),f&&n(")");c&&(n(", "),zc(c,t),n(")"))}(e,t);break;case 14:!function(e,t){const{push:n,helper:r,pure:o}=t,i=x(e.callee)?e.callee:r(e.callee);o&&n(Mc);n(i+"(",e),Hc(e.arguments,t),n(")")}(e,t);break;case 15:!function(e,t){const{push:n,indent:r,deindent:o,newline:i}=t,{properties:s}=e;if(!s.length)return void n("{}",e);const l=s.length>1||!1;n(l?"{":"{ "),l&&r();for(let e=0;e<s.length;e++){const{key:r,value:o}=s[e];Kc(r,t),n(": "),zc(o,t),e<s.length-1&&(n(","),i())}l&&o(),n(l?"}":" }")}(e,t);break;case 17:!function(e,t){Vc(e.elements,t)}(e,t);break;case 18:!function(e,t){const{push:n,indent:r,deindent:o}=t,{params:i,returns:s,body:l,newline:a,isSlot:u}=e;u&&n(`_${cu[iu]}(`);n("(",e),m(i)?Hc(i,t):i&&zc(i,t);n(") => "),(a||l)&&(n("{"),r());s?(a&&n("return "),m(s)?Vc(s,t):zc(s,t)):l&&zc(l,t);(a||l)&&(o(),n("}"));u&&(e.isNonScopedSlot&&n(", undefined, true"),n(")"))}(e,t);break;case 19:!function(e,t){const{test:n,consequent:r,alternate:o,newline:i}=e,{push:s,indent:l,deindent:a,newline:u}=t;if(4===n.type){const e=!Pu(n.content);e&&s("("),qc(n,t),e&&s(")")}else s("("),zc(n,t),s(")");i&&l(),t.indentLevel++,i||s(" "),s("? "),zc(r,t),t.indentLevel--,i&&u(),i||s(" "),s(": ");const c=19===o.type;c||t.indentLevel++;zc(o,t),c||t.indentLevel--;i&&a(!0)}(e,t);break;case 20:!function(e,t){const{push:n,helper:r,indent:o,deindent:i,newline:s}=t;n(`_cache[${e.index}] || (`),e.isVNode&&(o(),n(`${r(nu)}(-1),`),s());n(`_cache[${e.index}] = `),zc(e.value,t),e.isVNode&&(n(","),s(),n(`${r(nu)}(1),`),s(),n(`_cache[${e.index}]`),i());n(")")}(e,t);break;case 21:Hc(e.body,t,!0,!1)}}function qc(e,t){const{content:n,isStatic:r}=e;t.push(r?JSON.stringify(n):n,e)}function Wc(e,t){for(let n=0;n<e.children.length;n++){const r=e.children[n];x(r)?t.push(r):zc(r,t)}}function Kc(e,t){const{push:n}=t;if(8===e.type)n("["),Wc(e,t),n("]");else if(e.isStatic){n(Pu(e.content)?e.content:JSON.stringify(e.content),e)}else n(`[${e.content}]`,e)}new RegExp("\\b"+"arguments,await,break,case,catch,class,const,continue,debugger,default,delete,do,else,export,extends,finally,for,function,if,import,let,new,return,super,switch,throw,try,var,void,while,with,yield".split(",").join("\\b|\\b")+"\\b");const Gc=Nc(/^(if|else|else-if)$/,((e,t,n)=>function(e,t,n,r){if(!("else"===t.name||t.exp&&t.exp.content.trim())){const r=t.exp?t.exp.loc:e.loc;n.onError(Oa(28,t.loc)),t.exp=gu("true",!1,r)}0;if("if"===t.name){const o=Yc(e,t),i={type:9,loc:e.loc,branches:[o]};if(n.replaceNode(i),r)return r(i,o,!0)}else{const o=n.parent.children;let i=o.indexOf(e);for(;i-- >=-1;){const s=o[i];if(s&&3===s.type)n.removeNode(s);else{if(!s||2!==s.type||s.content.trim().length){if(s&&9===s.type){"else-if"===t.name&&void 0===s.branches[s.branches.length-1].condition&&n.onError(Oa(30,e.loc)),n.removeNode();const o=Yc(e,t);0,s.branches.push(o);const i=r&&r(s,o,!1);Fc(o,n),i&&i(),n.currentNode=null}else n.onError(Oa(30,e.loc));break}n.removeNode(s)}}}}(e,t,n,((e,t,r)=>{const o=n.parent.children;let i=o.indexOf(e),s=0;for(;i-- >=0;){const e=o[i];e&&9===e.type&&(s+=e.branches.length)}return()=>{if(r)e.codegenNode=Jc(t,s,n);else{const r=function(e){for(;;)if(19===e.type){if(19!==e.alternate.type)return e;e=e.alternate}else 20===e.type&&(e=e.value)}(e.codegenNode);r.alternate=Jc(t,s+e.branches.length-1,n)}}}))));function Yc(e,t){const n=3===e.tagType;return{type:10,loc:e.loc,condition:"else"===t.name?void 0:t.exp,children:n&&!Nu(e,"for")?e.children:[e],userKey:Mu(e,"key"),isTemplateIf:n}}function Jc(e,t,n){return e.condition?wu(e.condition,Qc(e,t,n),yu(n.helper(Fa),['""',"true"])):Qc(e,t,n)}function Qc(e,t,n){const{helper:r}=n,o=vu("key",gu(`${t}`,!1,fu,2)),{children:i}=e,s=i[0];if(1!==i.length||1!==s.type){if(1===i.length&&11===s.type){const e=s.codegenNode;return qu(e,o,n),e}{let t=64;K[64];return pu(n,r(ka),hu([o]),i,t+"",void 0,void 0,!0,!1,!1,e.loc)}}{const e=s.codegenNode,t=14===(l=e).type&&l.callee===au?l.arguments[1].returns:l;return 13===t.type&&Su(t,n),qu(t,o,n),e}var l}const Zc=Nc("for",((e,t,n)=>{const{helper:r,removeHelper:o}=n;return function(e,t,n,r){if(!t.exp)return void n.onError(Oa(31,t.loc));const o=nf(t.exp,n);if(!o)return void n.onError(Oa(32,t.loc));const{addIdentifiers:i,removeIdentifiers:s,scopes:l}=n,{source:a,value:u,key:c,index:f}=o,p={type:11,loc:t.loc,source:a,valueAlias:u,keyAlias:c,objectIndexAlias:f,parseResult:o,children:$u(e)?e.children:[e]};n.replaceNode(p),l.vFor++;const d=r&&r(p);return()=>{l.vFor--,d&&d()}}(e,t,n,(t=>{const i=yu(r(Ha),[t.source]),s=$u(e),l=Nu(e,"memo"),a=Mu(e,"key"),u=a&&(6===a.type?gu(a.value.content,!0):a.exp),c=a?vu("key",u):null,f=4===t.source.type&&t.source.constType>0,p=f?64:a?128:256;return t.codegenNode=pu(n,r(ka),void 0,i,p+"",void 0,void 0,!0,!f,!1,e.loc),()=>{let a;const{children:p}=t;const d=1!==p.length||1!==p[0].type,h=Vu(e)?e:s&&1===e.children.length&&Vu(e.children[0])?e.children[0]:null;if(h?(a=h.codegenNode,s&&c&&qu(a,c,n)):d?a=pu(n,r(ka),c?hu([c]):void 0,e.children,"64",void 0,void 0,!0,void 0,!1):(a=p[0].codegenNode,s&&c&&qu(a,c,n),a.isBlock!==!f&&(a.isBlock?(o(Aa),o(xu(n.inSSR,a.isComponent))):o(_u(n.inSSR,a.isComponent))),a.isBlock=!f,a.isBlock?(r(Aa),r(xu(n.inSSR,a.isComponent))):r(_u(n.inSSR,a.isComponent))),l){const e=bu(of(t.parseResult,[gu("_cached")]));e.body={type:21,body:[mu(["const _memo = (",l.exp,")"]),mu(["if (_cached",...u?[" && _cached.key === ",u]:[],` && ${n.helperString(uu)}(_cached, _memo)) return _cached`]),mu(["const _item = ",a]),gu("_item.memo = _memo"),gu("return _item")],loc:fu},i.arguments.push(e,gu("_cache"),gu(String(n.cached++)))}else i.arguments.push(bu(of(t.parseResult),a,!0))}}))}));const Xc=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,ef=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,tf=/^\(|\)$/g;function nf(e,t){const n=e.loc,r=e.content,o=r.match(Xc);if(!o)return;const[,i,s]=o,l={source:rf(n,s.trim(),r.indexOf(s,i.length)),value:void 0,key:void 0,index:void 0};let a=i.trim().replace(tf,"").trim();const u=i.indexOf(a),c=a.match(ef);if(c){a=a.replace(ef,"").trim();const e=c[1].trim();let t;if(e&&(t=r.indexOf(e,u+a.length),l.key=rf(n,e,t)),c[2]){const o=c[2].trim();o&&(l.index=rf(n,o,r.indexOf(o,l.key?t+e.length:u+a.length)))}}return a&&(l.value=rf(n,a,u)),l}function rf(e,t,n){return gu(t,!1,Lu(e,n,t.length))}function of({value:e,key:t,index:n},r=[]){return function(e){let t=e.length;for(;t--&&!e[t];);return e.slice(0,t+1).map(((e,t)=>e||gu("_".repeat(t+1),!1)))}([e,t,n,...r])}const sf=gu("undefined",!1),lf=(e,t)=>{if(1===e.type&&(1===e.tagType||3===e.tagType)){const n=Nu(e,"slot");if(n)return n.exp,t.scopes.vSlot++,()=>{t.scopes.vSlot--}}},af=(e,t,n,r)=>bu(e,n,!1,!0,n.length?n[0].loc:r);function uf(e,t,n=af){t.helper(iu);const{children:r,loc:o}=e,i=[],s=[];let l=t.scopes.vSlot>0||t.scopes.vFor>0;const a=Nu(e,"slot",!0);if(a){const{arg:e,exp:t}=a;e&&!Ou(e)&&(l=!0),i.push(vu(e||gu("default",!0),n(t,void 0,r,o)))}let u=!1,c=!1;const f=[],p=new Set;let d=0;for(let e=0;e<r.length;e++){const o=r[e];let h;if(!$u(o)||!(h=Nu(o,"slot",!0))){3!==o.type&&f.push(o);continue}if(a){t.onError(Oa(37,h.loc));break}u=!0;const{children:v,loc:g}=o,{arg:m=gu("default",!0),exp:y,loc:b}=h;let w;Ou(m)?w=m?m.content:"default":l=!0;const _=Nu(o,"for"),x=n(y,null==_?void 0:_.exp,v,g);let S,O;if(S=Nu(o,"if"))l=!0,s.push(wu(S.exp,cf(m,x,d++),sf));else if(O=Nu(o,/^else(-if)?$/,!0)){let n,o=e;for(;o--&&(n=r[o],3===n.type););if(n&&$u(n)&&Nu(n,"if")){r.splice(e,1),e--;let t=s[s.length-1];for(;19===t.alternate.type;)t=t.alternate;t.alternate=O.exp?wu(O.exp,cf(m,x,d++),sf):cf(m,x,d++)}else t.onError(Oa(30,O.loc))}else if(_){l=!0;const e=_.parseResult||nf(_.exp);e?s.push(yu(t.helper(Ha),[e.source,bu(of(e),cf(m,x),!0)])):t.onError(Oa(32,_.loc))}else{if(w){if(p.has(w)){t.onError(Oa(38,b));continue}p.add(w),"default"===w&&(c=!0)}i.push(vu(m,x))}}if(!a){const e=(e,r)=>{const i=n(e,void 0,r,o);return t.compatConfig&&(i.isNonScopedSlot=!0),vu("default",i)};u?f.length&&f.some((e=>pf(e)))&&(c?t.onError(Oa(39,f[0].loc)):i.push(e(void 0,f))):i.push(e(void 0,r))}const h=l?2:ff(e.children)?3:1;let v=hu(i.concat(vu("_",gu(h+"",!1))),o);return s.length&&(v=yu(t.helper(qa),[v,du(s)])),{slots:v,hasDynamicSlots:l}}function cf(e,t,n){const r=[vu("name",e),vu("fn",t)];return null!=n&&r.push(vu("key",gu(String(n),!0))),hu(r)}function ff(e){for(let t=0;t<e.length;t++){const n=e[t];switch(n.type){case 1:if(2===n.tagType||ff(n.children))return!0;break;case 9:if(ff(n.branches))return!0;break;case 10:case 11:if(ff(n.children))return!0}}return!1}function pf(e){return 2!==e.type&&12!==e.type||(2===e.type?!!e.content.trim():pf(e.content))}const df=new WeakMap,hf=(e,t)=>function(){if(1!==(e=t.currentNode).type||0!==e.tagType&&1!==e.tagType)return;const{tag:n,props:r}=e,o=1===e.tagType;let i=o?function(e,t,n=!1){let{tag:r}=e;const o=yf(r),i=Mu(e,"is");if(i)if(o||Yu("COMPILER_IS_ON_ELEMENT",t)){const e=6===i.type?i.value&&gu(i.value.content,!0):i.exp;if(e)return yu(t.helper(Ba),[e])}else 6===i.type&&i.value.content.startsWith("vue:")&&(r=i.value.content.slice(4));const s=!o&&Nu(e,"is");if(s&&s.exp)return yu(t.helper(Ba),[s.exp]);const l=Eu(r)||t.isBuiltInComponent(r);if(l)return n||t.helper(l),l;return t.helper(Da),t.components.add(r),Ku(r,"component")}(e,t):`"${n}"`;const s=O(i)&&i.callee===Ba;let l,a,u,c,f,p,d=0,h=s||i===Ea||i===Ca||!o&&("svg"===n||"foreignObject"===n);if(r.length>0){const n=vf(e,t,void 0,o,s);l=n.props,d=n.patchFlag,f=n.dynamicPropNames;const r=n.directives;p=r&&r.length?du(r.map((e=>function(e,t){const n=[],r=df.get(e);r?n.push(t.helperString(r)):(t.helper(Ua),t.directives.add(e.name),n.push(Ku(e.name,"directive")));const{loc:o}=e;e.exp&&n.push(e.exp);e.arg&&(e.exp||n.push("void 0"),n.push(e.arg));if(Object.keys(e.modifiers).length){e.arg||(e.exp||n.push("void 0"),n.push("void 0"));const t=gu("true",!1,o);n.push(hu(e.modifiers.map((e=>vu(e,t))),o))}return du(n,e.loc)}(e,t)))):void 0,n.shouldUseBlock&&(h=!0)}if(e.children.length>0){i===Pa&&(h=!0,d|=1024);if(o&&i!==Ea&&i!==Pa){const{slots:n,hasDynamicSlots:r}=uf(e,t);a=n,r&&(d|=1024)}else if(1===e.children.length&&i!==Ea){const n=e.children[0],r=n.type,o=5===r||8===r;o&&0===Cc(n,t)&&(d|=1),a=o||2===r?n:e.children}else a=e.children}0!==d&&(u=String(d),f&&f.length&&(c=function(e){let t="[";for(let n=0,r=e.length;n<r;n++)t+=JSON.stringify(e[n]),n<r-1&&(t+=", ");return t+"]"}(f))),e.codegenNode=pu(t,i,l,a,u,c,p,!!h,!1,o,e.loc)};function vf(e,t,n=e.props,r,o,i=!1){const{tag:s,loc:l,children:a}=e;let u=[];const c=[],p=[],d=a.length>0;let h=!1,v=0,g=!1,m=!1,y=!1,b=!1,w=!1,_=!1;const x=[],O=e=>{u.length&&(c.push(hu(gf(u),l)),u=[]),e&&c.push(e)},k=({key:e,value:n})=>{if(Ou(e)){const i=e.content,s=f(i);if(!s||r&&!o||"onclick"===i.toLowerCase()||"onUpdate:modelValue"===i||j(i)||(b=!0),s&&j(i)&&(_=!0),20===n.type||(4===n.type||8===n.type)&&Cc(n,t)>0)return;"ref"===i?g=!0:"class"===i?m=!0:"style"===i?y=!0:"key"===i||x.includes(i)||x.push(i),!r||"class"!==i&&"style"!==i||x.includes(i)||x.push(i)}else w=!0};for(let o=0;o<n.length;o++){const a=n[o];if(6===a.type){const{loc:e,name:n,value:r}=a;let o=!0;if("ref"===n&&(g=!0,t.scopes.vFor>0&&u.push(vu(gu("ref_for",!0),gu("true")))),"is"===n&&(yf(s)||r&&r.content.startsWith("vue:")||Yu("COMPILER_IS_ON_ELEMENT",t)))continue;u.push(vu(gu(n,!0,Lu(e,0,n.length)),gu(r?r.content:"",o,r?r.loc:e)))}else{const{name:n,arg:o,exp:f,loc:v}=a,g="bind"===n,m="on"===n;if("slot"===n){r||t.onError(Oa(40,v));continue}if("once"===n||"memo"===n)continue;if("is"===n||g&&Du(o,"is")&&(yf(s)||Yu("COMPILER_IS_ON_ELEMENT",t)))continue;if(m&&i)continue;if((g&&Du(o,"key")||m&&d&&Du(o,"vue:before-update"))&&(h=!0),g&&Du(o,"ref")&&t.scopes.vFor>0&&u.push(vu(gu("ref_for",!0),gu("true"))),!o&&(g||m)){if(w=!0,f)if(g){if(O(),Yu("COMPILER_V_BIND_OBJECT_ORDER",t)){c.unshift(f);continue}c.push(f)}else O({type:14,loc:v,callee:t.helper(Za),arguments:r?[f]:[f,"true"]});else t.onError(Oa(g?34:35,v));continue}const y=t.directiveTransforms[n];if(y){const{props:n,needRuntime:r}=y(a,e,t);!i&&n.forEach(k),m&&o&&!Ou(o)?O(hu(n,l)):u.push(...n),r&&(p.push(a),S(r)&&df.set(a,r))}else R(n)||(p.push(a),d&&(h=!0))}}let E;if(c.length?(O(),E=c.length>1?yu(t.helper(Ka),c,l):c[0]):u.length&&(E=hu(gf(u),l)),w?v|=16:(m&&!r&&(v|=2),y&&!r&&(v|=4),x.length&&(v|=8),b&&(v|=32)),h||0!==v&&32!==v||!(g||_||p.length>0)||(v|=512),!t.inSSR&&E)switch(E.type){case 15:let e=-1,n=-1,r=!1;for(let t=0;t<E.properties.length;t++){const o=E.properties[t].key;Ou(o)?"class"===o.content?e=t:"style"===o.content&&(n=t):o.isHandlerKey||(r=!0)}const o=E.properties[e],i=E.properties[n];r?E=yu(t.helper(Ja),[E]):(o&&!Ou(o.value)&&(o.value=yu(t.helper(Ga),[o.value])),i&&(y||4===i.value.type&&"["===i.value.content.trim()[0]||17===i.value.type)&&(i.value=yu(t.helper(Ya),[i.value])));break;case 14:break;default:E=yu(t.helper(Ja),[yu(t.helper(Qa),[E])])}return{props:E,directives:p,patchFlag:v,dynamicPropNames:x,shouldUseBlock:h}}function gf(e){const t=new Map,n=[];for(let r=0;r<e.length;r++){const o=e[r];if(8===o.key.type||!o.key.isStatic){n.push(o);continue}const i=o.key.content,s=t.get(i);s?("style"===i||"class"===i||f(i))&&mf(s,o):(t.set(i,o),n.push(o))}return n}function mf(e,t){17===e.value.type?e.value.elements.push(t.value):e.value=du([e.value,t.value],e.loc)}function yf(e){return"component"===e||"Component"===e}const bf=(e,t)=>{if(Vu(e)){const{children:n,loc:r}=e,{slotName:o,slotProps:i}=function(e,t){let n,r='"default"';const o=[];for(let t=0;t<e.props.length;t++){const n=e.props[t];6===n.type?n.value&&("name"===n.name?r=JSON.stringify(n.value.content):(n.name=F(n.name),o.push(n))):"bind"===n.name&&Du(n.arg,"name")?n.exp&&(r=n.exp):("bind"===n.name&&n.arg&&Ou(n.arg)&&(n.arg.content=F(n.arg.content)),o.push(n))}if(o.length>0){const{props:r,directives:i}=vf(e,t,o,!1,!1);n=r,i.length&&t.onError(Oa(36,i[0].loc))}return{slotName:r,slotProps:n}}(e,t),s=[t.prefixIdentifiers?"_ctx.$slots":"$slots",o,"{}","undefined","true"];let l=2;i&&(s[2]=i,l=3),n.length&&(s[3]=bu([],n,!1,!1,r),l=4),t.scopeId&&!t.slotted&&(l=5),s.splice(l),e.codegenNode=yu(t.helper(za),s,r)}};const wf=/^\s*([\w$_]+|(async\s*)?\([^)]*?\))\s*(:[^=]+)?=>|^\s*(async\s+)?function(?:\s+[\w$]+)?\s*\(/,_f=(e,t,n,r)=>{const{loc:o,modifiers:i,arg:s}=e;let l;if(e.exp||i.length||n.onError(Oa(35,o)),4===s.type)if(s.isStatic){let e=s.content;0,e.startsWith("vue:")&&(e=`vnode-${e.slice(4)}`);l=gu(0!==t.tagType||e.startsWith("vnode")||!/[A-Z]/.test(e)?B(F(e)):`on:${e}`,!0,s.loc)}else l=mu([`${n.helperString(tu)}(`,s,")"]);else l=s,l.children.unshift(`${n.helperString(tu)}(`),l.children.push(")");let a=e.exp;a&&!a.content.trim()&&(a=void 0);let u=n.cacheHandlers&&!a&&!n.inVOnce;if(a){const e=Ru(a.content),t=!(e||wf.test(a.content)),n=a.content.includes(";");0,(t||u&&e)&&(a=mu([`${t?"$event":"(...args)"} => ${n?"{":"("}`,a,n?"}":")"]))}let c={props:[vu(l,a||gu("() => {}",!1,o))]};return r&&(c=r(c)),u&&(c.props[0].value=n.cache(c.props[0].value)),c.props.forEach((e=>e.key.isHandlerKey=!0)),c},xf=(e,t,n)=>{const{exp:r,modifiers:o,loc:i}=e,s=e.arg;return 4!==s.type?(s.children.unshift("("),s.children.push(') || ""')):s.isStatic||(s.content=`${s.content} || ""`),o.includes("camel")&&(4===s.type?s.isStatic?s.content=F(s.content):s.content=`${n.helperString(Xa)}(${s.content})`:(s.children.unshift(`${n.helperString(Xa)}(`),s.children.push(")"))),n.inSSR||(o.includes("prop")&&Sf(s,"."),o.includes("attr")&&Sf(s,"^")),!r||4===r.type&&!r.content.trim()?(n.onError(Oa(34,i)),{props:[vu(s,gu("",!0,i))]}):{props:[vu(s,r)]}},Sf=(e,t)=>{4===e.type?e.isStatic?e.content=t+e.content:e.content=`\`${t}\${${e.content}}\``:(e.children.unshift(`'${t}' + (`),e.children.push(")"))},Of=(e,t)=>{if(0===e.type||1===e.type||11===e.type||10===e.type)return()=>{const n=e.children;let r,o=!1;for(let e=0;e<n.length;e++){const t=n[e];if(Bu(t)){o=!0;for(let o=e+1;o<n.length;o++){const i=n[o];if(!Bu(i)){r=void 0;break}r||(r=n[e]=mu([t],t.loc)),r.children.push(" + ",i),n.splice(o,1),o--}}}if(o&&(1!==n.length||0!==e.type&&(1!==e.type||0!==e.tagType||e.props.find((e=>7===e.type&&!t.directiveTransforms[e.name]))||"template"===e.tag)))for(let e=0;e<n.length;e++){const r=n[e];if(Bu(r)||8===r.type){const o=[];2===r.type&&" "===r.content||o.push(r),t.ssr||0!==Cc(r,t)||o.push("1"),n[e]={type:12,content:r,loc:r.loc,codegenNode:yu(t.helper(Na),o)}}}}},kf=new WeakSet,Ef=(e,t)=>{if(1===e.type&&Nu(e,"once",!0)){if(kf.has(e)||t.inVOnce||t.inSSR)return;return kf.add(e),t.inVOnce=!0,t.helper(nu),()=>{t.inVOnce=!1;const e=t.currentNode;e.codegenNode&&(e.codegenNode=t.cache(e.codegenNode,!0))}}},Cf=(e,t,n)=>{const{exp:r,arg:o}=e;if(!r)return n.onError(Oa(41,e.loc)),Pf();const i=r.loc.source,s=4===r.type?r.content:i,l=n.bindingMetadata[i];if("props"===l||"props-aliased"===l)return n.onError(Oa(44,r.loc)),Pf();if(!s.trim()||!Ru(s))return n.onError(Oa(42,r.loc)),Pf();const a=o||gu("modelValue",!0),u=o?Ou(o)?`onUpdate:${F(o.content)}`:mu(['"onUpdate:" + ',o]):"onUpdate:modelValue";let c;c=mu([`${n.isTS?"($event: any)":"$event"} => ((`,r,") = $event)"]);const f=[vu(a,e.exp),vu(u,c)];if(e.modifiers.length&&1===t.tagType){const t=e.modifiers.map((e=>(Pu(e)?e:JSON.stringify(e))+": true")).join(", "),n=o?Ou(o)?`${o.content}Modifiers`:mu([o,' + "Modifiers"']):"modelModifiers";f.push(vu(n,gu(`{ ${t} }`,!1,e.loc,2)))}return Pf(f)};function Pf(e=[]){return{props:e}}const Tf=/[\w).+\-_$\]]/,Af=(e,t)=>{Yu("COMPILER_FILTER",t)&&(5===e.type&&jf(e.content,t),1===e.type&&e.props.forEach((e=>{7===e.type&&"for"!==e.name&&e.exp&&jf(e.exp,t)})))};function jf(e,t){if(4===e.type)Rf(e,t);else for(let n=0;n<e.children.length;n++){const r=e.children[n];"object"==typeof r&&(4===r.type?Rf(r,t):8===r.type?jf(e,t):5===r.type&&jf(r.content,t))}}function Rf(e,t){const n=e.content;let r,o,i,s,l=!1,a=!1,u=!1,c=!1,f=0,p=0,d=0,h=0,v=[];for(i=0;i<n.length;i++)if(o=r,r=n.charCodeAt(i),l)39===r&&92!==o&&(l=!1);else if(a)34===r&&92!==o&&(a=!1);else if(u)96===r&&92!==o&&(u=!1);else if(c)47===r&&92!==o&&(c=!1);else if(124!==r||124===n.charCodeAt(i+1)||124===n.charCodeAt(i-1)||f||p||d){switch(r){case 34:a=!0;break;case 39:l=!0;break;case 96:u=!0;break;case 40:d++;break;case 41:d--;break;case 91:p++;break;case 93:p--;break;case 123:f++;break;case 125:f--}if(47===r){let e,t=i-1;for(;t>=0&&(e=n.charAt(t)," "===e);t--);e&&Tf.test(e)||(c=!0)}}else void 0===s?(h=i+1,s=n.slice(0,i).trim()):g();function g(){v.push(n.slice(h,i).trim()),h=i+1}if(void 0===s?s=n.slice(0,i).trim():0!==h&&g(),v.length){for(i=0;i<v.length;i++)s=Lf(s,v[i],t);e.content=s}}function Lf(e,t,n){n.helper($a);const r=t.indexOf("(");if(r<0)return n.filters.add(t),`${Ku(t,"filter")}(${e})`;{const o=t.slice(0,r),i=t.slice(r+1);return n.filters.add(o),`${Ku(o,"filter")}(${e}${")"!==i?","+i:i}`}}const If=new WeakSet,Ff=(e,t)=>{if(1===e.type){const n=Nu(e,"memo");if(!n||If.has(e))return;return If.add(e),()=>{const r=e.codegenNode||t.currentNode.codegenNode;r&&13===r.type&&(1!==e.tagType&&Su(r,t),e.codegenNode=yu(t.helper(au),[n.exp,bu(void 0,r),"_cache",String(t.cached++)]))}}};function Nf(e,t={}){const n=t.onError||xa,r="module"===t.mode;!0===t.prefixIdentifiers?n(Oa(47)):r&&n(Oa(48));t.cacheHandlers&&n(Oa(49)),t.scopeId&&!r&&n(Oa(50));const o=x(e)?ec(e,t):e,[i,s]=[[Ef,Gc,Ff,Zc,Af,bf,hf,lf,Of],{on:_f,bind:xf,model:Cf}];return Ic(o,d({},t,{prefixIdentifiers:false,nodeTransforms:[...i,...t.nodeTransforms||[]],directiveTransforms:d({},s,t.directiveTransforms||{})})),Uc(o,d({},t,{prefixIdentifiers:false}))}const Mf=Symbol(""),Df=Symbol(""),Bf=Symbol(""),Uf=Symbol(""),$f=Symbol(""),Vf=Symbol(""),Hf=Symbol(""),zf=Symbol(""),qf=Symbol(""),Wf=Symbol("");var Kf;let Gf;Kf={[Mf]:"vModelRadio",[Df]:"vModelCheckbox",[Bf]:"vModelText",[Uf]:"vModelSelect",[$f]:"vModelDynamic",[Vf]:"withModifiers",[Hf]:"withKeys",[zf]:"vShow",[qf]:"Transition",[Wf]:"TransitionGroup"},Object.getOwnPropertySymbols(Kf).forEach((e=>{cu[e]=Kf[e]}));const Yf=i("style,iframe,script,noscript",!0),Jf={isVoidTag:oe,isNativeTag:e=>ne(e)||re(e),isPreTag:e=>"pre"===e,decodeEntities:function(e,t=!1){return Gf||(Gf=document.createElement("div")),t?(Gf.innerHTML=`<div foo="${e.replace(/"/g,"&quot;")}">`,Gf.children[0].getAttribute("foo")):(Gf.innerHTML=e,Gf.textContent)},isBuiltInComponent:e=>ku(e,"Transition")?qf:ku(e,"TransitionGroup")?Wf:void 0,getNamespace(e,t){let n=t?t.ns:0;if(t&&2===n)if("annotation-xml"===t.tag){if("svg"===e)return 1;t.props.some((e=>6===e.type&&"encoding"===e.name&&null!=e.value&&("text/html"===e.value.content||"application/xhtml+xml"===e.value.content)))&&(n=0)}else/^m(?:[ions]|text)$/.test(t.tag)&&"mglyph"!==e&&"malignmark"!==e&&(n=0);else t&&1===n&&("foreignObject"!==t.tag&&"desc"!==t.tag&&"title"!==t.tag||(n=0));if(0===n){if("svg"===e)return 1;if("math"===e)return 2}return n},getTextMode({tag:e,ns:t}){if(0===t){if("textarea"===e||"title"===e)return 1;if(Yf(e))return 2}return 0}},Qf=(e,t)=>{const n=X(e);return gu(JSON.stringify(n),!1,t,3)};function Zf(e,t){return Oa(e,t)}const Xf=i("passive,once,capture"),ep=i("stop,prevent,self,ctrl,shift,alt,meta,exact,middle"),tp=i("left,right"),np=i("onkeyup,onkeydown,onkeypress",!0),rp=(e,t)=>Ou(e)&&"onclick"===e.content.toLowerCase()?gu(t,!0):4!==e.type?mu(["(",e,`) === "onClick" ? "${t}" : (`,e,")"]):e;const op=(e,t)=>{1!==e.type||0!==e.tagType||"script"!==e.tag&&"style"!==e.tag||t.removeNode()},ip=[e=>{1===e.type&&e.props.forEach(((t,n)=>{6===t.type&&"style"===t.name&&t.value&&(e.props[n]={type:7,name:"bind",arg:gu("style",!0,t.loc),exp:Qf(t.value.content,t.loc),modifiers:[],loc:t.loc})}))}],sp={cloak:()=>({props:[]}),html:(e,t,n)=>{const{exp:r,loc:o}=e;return r||n.onError(Zf(53,o)),t.children.length&&(n.onError(Zf(54,o)),t.children.length=0),{props:[vu(gu("innerHTML",!0,o),r||gu("",!0))]}},text:(e,t,n)=>{const{exp:r,loc:o}=e;return r||n.onError(Zf(55,o)),t.children.length&&(n.onError(Zf(56,o)),t.children.length=0),{props:[vu(gu("textContent",!0),r?Cc(r,n)>0?r:yu(n.helperString(Wa),[r],o):gu("",!0))]}},model:(e,t,n)=>{const r=Cf(e,t,n);if(!r.props.length||1===t.tagType)return r;e.arg&&n.onError(Zf(58,e.arg.loc));const{tag:o}=t,i=n.isCustomElement(o);if("input"===o||"textarea"===o||"select"===o||i){let s=Bf,l=!1;if("input"===o||i){const r=Mu(t,"type");if(r){if(7===r.type)s=$f;else if(r.value)switch(r.value.content){case"radio":s=Mf;break;case"checkbox":s=Df;break;case"file":l=!0,n.onError(Zf(59,e.loc))}}else(function(e){return e.props.some((e=>!(7!==e.type||"bind"!==e.name||e.arg&&4===e.arg.type&&e.arg.isStatic)))})(t)&&(s=$f)}else"select"===o&&(s=Uf);l||(r.needRuntime=n.helper(s))}else n.onError(Zf(57,e.loc));return r.props=r.props.filter((e=>!(4===e.key.type&&"modelValue"===e.key.content))),r},on:(e,t,n)=>_f(e,t,n,(t=>{const{modifiers:r}=e;if(!r.length)return t;let{key:o,value:i}=t.props[0];const{keyModifiers:s,nonKeyModifiers:l,eventOptionModifiers:a}=((e,t,n,r)=>{const o=[],i=[],s=[];for(let r=0;r<t.length;r++){const l=t[r];"native"===l&&Ju("COMPILER_V_ON_NATIVE",n)||Xf(l)?s.push(l):tp(l)?Ou(e)?np(e.content)?o.push(l):i.push(l):(o.push(l),i.push(l)):ep(l)?i.push(l):o.push(l)}return{keyModifiers:o,nonKeyModifiers:i,eventOptionModifiers:s}})(o,r,n,e.loc);if(l.includes("right")&&(o=rp(o,"onContextmenu")),l.includes("middle")&&(o=rp(o,"onMouseup")),l.length&&(i=yu(n.helper(Vf),[i,JSON.stringify(l)])),!s.length||Ou(o)&&!np(o.content)||(i=yu(n.helper(Hf),[i,JSON.stringify(s)])),a.length){const e=a.map(D).join("");o=Ou(o)?gu(`${o.content}${e}`,!0):mu(["(",o,`) + "${e}"`])}return{props:[vu(o,i)]}})),show:(e,t,n)=>{const{exp:r,loc:o}=e;return r||n.onError(Zf(61,o)),{props:[],needRuntime:n.helper(zf)}}};const lp=Object.create(null);ks((function(e,t){if(!x(e)){if(!e.nodeType)return a;e=e.innerHTML}const n=e,o=lp[n];if(o)return o;if("#"===e[0]){const t=document.querySelector(e);0,e=t?t.innerHTML:""}const i=d({hoistStatic:!0,onError:void 0,onWarn:a},t);i.isCustomElement||"undefined"==typeof customElements||(i.isCustomElement=e=>!!customElements.get(e));const{code:s}=function(e,t={}){return Nf(e,d({},Jf,t,{nodeTransforms:[op,...ip,...t.nodeTransforms||[]],directiveTransforms:d({},sp,t.directiveTransforms||{}),transformHoist:null}))}(e,i),l=new Function("Vue",s)(r);return l._rc=!0,lp[n]=l}));var ap=!1;function up(e,t,n){return Array.isArray(e)?(e.length=Math.max(e.length,t),e.splice(t,1,n),n):(e[t]=n,n)}function cp(){return"undefined"!=typeof navigator&&"undefined"!=typeof window?window:void 0!==n.g?n.g:{}}const fp="function"==typeof Proxy,pp="devtools-plugin:setup";let dp,hp,vp;function gp(){return function(){var e;return void 0!==dp||("undefined"!=typeof window&&window.performance?(dp=!0,hp=window.performance):void 0!==n.g&&(null===(e=n.g.perf_hooks)||void 0===e?void 0:e.performance)?(dp=!0,hp=n.g.perf_hooks.performance):dp=!1),dp}()?hp.now():Date.now()}class mp{constructor(e,t){this.target=null,this.targetQueue=[],this.onQueue=[],this.plugin=e,this.hook=t;const n={};if(e.settings)for(const t in e.settings){const r=e.settings[t];n[t]=r.defaultValue}const r=`__vue-devtools-plugin-settings__${e.id}`;let o=Object.assign({},n);try{const e=localStorage.getItem(r),t=JSON.parse(e);Object.assign(o,t)}catch(e){}this.fallbacks={getSettings:()=>o,setSettings(e){try{localStorage.setItem(r,JSON.stringify(e))}catch(e){}o=e},now:()=>gp()},t&&t.on("plugin:settings:set",((e,t)=>{e===this.plugin.id&&this.fallbacks.setSettings(t)})),this.proxiedOn=new Proxy({},{get:(e,t)=>this.target?this.target.on[t]:(...e)=>{this.onQueue.push({method:t,args:e})}}),this.proxiedTarget=new Proxy({},{get:(e,t)=>this.target?this.target[t]:"on"===t?this.proxiedOn:Object.keys(this.fallbacks).includes(t)?(...e)=>(this.targetQueue.push({method:t,args:e,resolve:()=>{}}),this.fallbacks[t](...e)):(...e)=>new Promise((n=>{this.targetQueue.push({method:t,args:e,resolve:n})}))})}async setRealTarget(e){this.target=e;for(const e of this.onQueue)this.target.on[e.method](...e.args);for(const e of this.targetQueue)e.resolve(await this.target[e.method](...e.args))}}function yp(e,t){const n=e,r=cp(),o=cp().__VUE_DEVTOOLS_GLOBAL_HOOK__,i=fp&&n.enableEarlyProxy;if(!o||!r.__VUE_DEVTOOLS_PLUGIN_API_AVAILABLE__&&i){const e=i?new mp(n,o):null;(r.__VUE_DEVTOOLS_PLUGINS__=r.__VUE_DEVTOOLS_PLUGINS__||[]).push({pluginDescriptor:n,setupFn:t,proxy:e}),e&&t(e.proxiedTarget)}else o.emit(pp,e,t)}const bp=e=>vp=e,wp=Symbol();function _p(e){return e&&"object"==typeof e&&"[object Object]"===Object.prototype.toString.call(e)&&"function"!=typeof e.toJSON}var xp;!function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"}(xp||(xp={}));const Sp="undefined"!=typeof window,Op=!1,kp=(()=>"object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof global&&global.global===global?global:"object"==typeof globalThis?globalThis:{HTMLElement:null})();function Ep(e,t,n){const r=new XMLHttpRequest;r.open("GET",e),r.responseType="blob",r.onload=function(){jp(r.response,t,n)},r.onerror=function(){},r.send()}function Cp(e){const t=new XMLHttpRequest;t.open("HEAD",e,!1);try{t.send()}catch(e){}return t.status>=200&&t.status<=299}function Pp(e){try{e.dispatchEvent(new MouseEvent("click"))}catch(t){const n=document.createEvent("MouseEvents");n.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),e.dispatchEvent(n)}}const Tp="object"==typeof navigator?navigator:{userAgent:""},Ap=(()=>/Macintosh/.test(Tp.userAgent)&&/AppleWebKit/.test(Tp.userAgent)&&!/Safari/.test(Tp.userAgent))(),jp=Sp?"undefined"!=typeof HTMLAnchorElement&&"download"in HTMLAnchorElement.prototype&&!Ap?function(e,t="download",n){const r=document.createElement("a");r.download=t,r.rel="noopener","string"==typeof e?(r.href=e,r.origin!==location.origin?Cp(r.href)?Ep(e,t,n):(r.target="_blank",Pp(r)):Pp(r)):(r.href=URL.createObjectURL(e),setTimeout((function(){URL.revokeObjectURL(r.href)}),4e4),setTimeout((function(){Pp(r)}),0))}:"msSaveOrOpenBlob"in Tp?function(e,t="download",n){if("string"==typeof e)if(Cp(e))Ep(e,t,n);else{const t=document.createElement("a");t.href=e,t.target="_blank",setTimeout((function(){Pp(t)}))}else navigator.msSaveOrOpenBlob(function(e,{autoBom:t=!1}={}){return t&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)?new Blob([String.fromCharCode(65279),e],{type:e.type}):e}(e,n),t)}:function(e,t,n,r){(r=r||open("","_blank"))&&(r.document.title=r.document.body.innerText="downloading...");if("string"==typeof e)return Ep(e,t,n);const o="application/octet-stream"===e.type,i=/constructor/i.test(String(kp.HTMLElement))||"safari"in kp,s=/CriOS\/[\d]+/.test(navigator.userAgent);if((s||o&&i||Ap)&&"undefined"!=typeof FileReader){const t=new FileReader;t.onloadend=function(){let e=t.result;if("string"!=typeof e)throw r=null,new Error("Wrong reader.result type");e=s?e:e.replace(/^data:[^;]*;/,"data:attachment/file;"),r?r.location.href=e:location.assign(e),r=null},t.readAsDataURL(e)}else{const t=URL.createObjectURL(e);r?r.location.assign(t):location.href=t,r=null,setTimeout((function(){URL.revokeObjectURL(t)}),4e4)}}:()=>{};function Rp(e,t){"function"==typeof __VUE_DEVTOOLS_TOAST__&&__VUE_DEVTOOLS_TOAST__("🍍 "+e,t)}function Lp(e){return"_a"in e&&"install"in e}function Ip(){if(!("clipboard"in navigator))return Rp("Your browser doesn't support the Clipboard API","error"),!0}function Fp(e){return!!(e instanceof Error&&e.message.toLowerCase().includes("document is not focused"))&&(Rp('You need to activate the "Emulate a focused page" setting in the "Rendering" panel of devtools.',"warn"),!0)}let Np;async function Mp(e){try{const t=(Np||(Np=document.createElement("input"),Np.type="file",Np.accept=".json"),function(){return new Promise(((e,t)=>{Np.onchange=async()=>{const t=Np.files;if(!t)return e(null);const n=t.item(0);return e(n?{text:await n.text(),file:n}:null)},Np.oncancel=()=>e(null),Np.onerror=t,Np.click()}))}),n=await t();if(!n)return;const{text:r,file:o}=n;Dp(e,JSON.parse(r)),Rp(`Global state imported from "${o.name}".`)}catch(e){Rp("Failed to import the state from JSON. Check the console for more details.","error")}}function Dp(e,t){for(const n in t){const r=e.state.value[n];r?Object.assign(r,t[n]):e.state.value[n]=t[n]}}function Bp(e){return{_custom:{display:e}}}const Up="🍍 Pinia (root)",$p="_root";function Vp(e){return Lp(e)?{id:$p,label:Up}:{id:e.$id,label:e.$id}}function Hp(e){return e?Array.isArray(e)?e.reduce(((e,t)=>(e.keys.push(t.key),e.operations.push(t.type),e.oldValue[t.key]=t.oldValue,e.newValue[t.key]=t.newValue,e)),{oldValue:{},keys:[],operations:[],newValue:{}}):{operation:Bp(e.type),key:Bp(e.key),oldValue:e.oldValue,newValue:e.newValue}:{}}function zp(e){switch(e){case xp.direct:return"mutation";case xp.patchFunction:case xp.patchObject:return"$patch";default:return"unknown"}}let qp=!0;const Wp=[],Kp="pinia:mutations",Gp="pinia",{assign:Yp}=Object,Jp=e=>"🍍 "+e;function Qp(e,t){yp({id:"dev.esm.pinia",label:"Pinia 🍍",logo:"https://pinia.vuejs.org/logo.svg",packageName:"pinia",homepage:"https://pinia.vuejs.org",componentStateTypes:Wp,app:e},(n=>{"function"!=typeof n.now&&Rp("You seem to be using an outdated version of Vue Devtools. Are you still using the Beta release instead of the stable one? You can find the links at https://devtools.vuejs.org/guide/installation.html."),n.addTimelineLayer({id:Kp,label:"Pinia 🍍",color:15064968}),n.addInspector({id:Gp,label:"Pinia 🍍",icon:"storage",treeFilterPlaceholder:"Search stores",actions:[{icon:"content_copy",action:()=>{!async function(e){if(!Ip())try{await navigator.clipboard.writeText(JSON.stringify(e.state.value)),Rp("Global state copied to clipboard.")}catch(e){if(Fp(e))return;Rp("Failed to serialize the state. Check the console for more details.","error")}}(t)},tooltip:"Serialize and copy the state"},{icon:"content_paste",action:async()=>{await async function(e){if(!Ip())try{Dp(e,JSON.parse(await navigator.clipboard.readText())),Rp("Global state pasted from clipboard.")}catch(e){if(Fp(e))return;Rp("Failed to deserialize the state from clipboard. Check the console for more details.","error")}}(t),n.sendInspectorTree(Gp),n.sendInspectorState(Gp)},tooltip:"Replace the state with the content of your clipboard"},{icon:"save",action:()=>{!async function(e){try{jp(new Blob([JSON.stringify(e.state.value)],{type:"text/plain;charset=utf-8"}),"pinia-state.json")}catch(e){Rp("Failed to export the state as JSON. Check the console for more details.","error")}}(t)},tooltip:"Save the state as a JSON file"},{icon:"folder_open",action:async()=>{await Mp(t),n.sendInspectorTree(Gp),n.sendInspectorState(Gp)},tooltip:"Import the state from a JSON file"}],nodeActions:[{icon:"restore",tooltip:'Reset the state (with "$reset")',action:e=>{const n=t._s.get(e);n?"function"!=typeof n.$reset?Rp(`Cannot reset "${e}" store because it doesn't have a "$reset" method implemented.`,"warn"):(n.$reset(),Rp(`Store "${e}" reset.`)):Rp(`Cannot reset "${e}" store because it wasn't found.`,"warn")}}]}),n.on.inspectComponent(((e,t)=>{const n=e.componentInstance&&e.componentInstance.proxy;if(n&&n._pStores){const t=e.componentInstance.proxy._pStores;Object.values(t).forEach((t=>{e.instanceData.state.push({type:Jp(t.$id),key:"state",editable:!0,value:t._isOptionsAPI?{_custom:{value:It(t.$state),actions:[{icon:"restore",tooltip:"Reset the state of this store",action:()=>t.$reset()}]}}:Object.keys(t.$state).reduce(((e,n)=>(e[n]=t.$state[n],e)),{})}),t._getters&&t._getters.length&&e.instanceData.state.push({type:Jp(t.$id),key:"getters",editable:!1,value:t._getters.reduce(((e,n)=>{try{e[n]=t[n]}catch(t){e[n]=t}return e}),{})})}))}})),n.on.getInspectorTree((n=>{if(n.app===e&&n.inspectorId===Gp){let e=[t];e=e.concat(Array.from(t._s.values())),n.rootNodes=(n.filter?e.filter((e=>"$id"in e?e.$id.toLowerCase().includes(n.filter.toLowerCase()):Up.toLowerCase().includes(n.filter.toLowerCase()))):e).map(Vp)}})),n.on.getInspectorState((n=>{if(n.app===e&&n.inspectorId===Gp){const e=n.nodeId===$p?t:t._s.get(n.nodeId);if(!e)return;e&&(n.state=function(e){if(Lp(e)){const t=Array.from(e._s.keys()),n=e._s,r={state:t.map((t=>({editable:!0,key:t,value:e.state.value[t]}))),getters:t.filter((e=>n.get(e)._getters)).map((e=>{const t=n.get(e);return{editable:!1,key:e,value:t._getters.reduce(((e,n)=>(e[n]=t[n],e)),{})}}))};return r}const t={state:Object.keys(e.$state).map((t=>({editable:!0,key:t,value:e.$state[t]})))};return e._getters&&e._getters.length&&(t.getters=e._getters.map((t=>({editable:!1,key:t,value:e[t]})))),e._customProperties.size&&(t.customProperties=Array.from(e._customProperties).map((t=>({editable:!0,key:t,value:e[t]})))),t}(e))}})),n.on.editInspectorState(((n,r)=>{if(n.app===e&&n.inspectorId===Gp){const e=n.nodeId===$p?t:t._s.get(n.nodeId);if(!e)return Rp(`store "${n.nodeId}" not found`,"error");const{path:r}=n;Lp(e)?r.unshift("state"):1===r.length&&e._customProperties.has(r[0])&&!(r[0]in e.$state)||r.unshift("$state"),qp=!1,n.set(e,r,n.state.value),qp=!0}})),n.on.editComponentState((e=>{if(e.type.startsWith("🍍")){const n=e.type.replace(/^🍍\s*/,""),r=t._s.get(n);if(!r)return Rp(`store "${n}" not found`,"error");const{path:o}=e;if("state"!==o[0])return Rp(`Invalid path for store "${n}":\n${o}\nOnly state can be modified.`);o[0]="$state",qp=!1,e.set(r,o,e.state.value),qp=!0}}))}))}let Zp,Xp=0;function ed(e,t,n){const r=t.reduce(((t,n)=>(t[n]=It(e)[n],t)),{});for(const t in r)e[t]=function(){const o=Xp,i=n?new Proxy(e,{get:(...e)=>(Zp=o,Reflect.get(...e)),set:(...e)=>(Zp=o,Reflect.set(...e))}):e;Zp=o;const s=r[t].apply(i,arguments);return Zp=void 0,s}}function td({app:e,store:t,options:n}){if(t.$id.startsWith("__hot:"))return;t._isOptionsAPI=!!n.state,ed(t,Object.keys(n.actions),t._isOptionsAPI);const r=t._hotUpdate;It(t)._hotUpdate=function(e){r.apply(this,arguments),ed(t,Object.keys(e._hmrPayload.actions),!!t._isOptionsAPI)},function(e,t){Wp.includes(Jp(t.$id))||Wp.push(Jp(t.$id)),yp({id:"dev.esm.pinia",label:"Pinia 🍍",logo:"https://pinia.vuejs.org/logo.svg",packageName:"pinia",homepage:"https://pinia.vuejs.org",componentStateTypes:Wp,app:e,settings:{logStoreChanges:{label:"Notify about new/deleted stores",type:"boolean",defaultValue:!0}}},(e=>{const n="function"==typeof e.now?e.now.bind(e):Date.now;t.$onAction((({after:r,onError:o,name:i,args:s})=>{const l=Xp++;e.addTimelineEvent({layerId:Kp,event:{time:n(),title:"🛫 "+i,subtitle:"start",data:{store:Bp(t.$id),action:Bp(i),args:s},groupId:l}}),r((r=>{Zp=void 0,e.addTimelineEvent({layerId:Kp,event:{time:n(),title:"🛬 "+i,subtitle:"end",data:{store:Bp(t.$id),action:Bp(i),args:s,result:r},groupId:l}})})),o((r=>{Zp=void 0,e.addTimelineEvent({layerId:Kp,event:{time:n(),logType:"error",title:"💥 "+i,subtitle:"end",data:{store:Bp(t.$id),action:Bp(i),args:s,error:r},groupId:l}})}))}),!0),t._customProperties.forEach((r=>{dr((()=>Wt(t[r])),((t,o)=>{e.notifyComponentUpdate(),e.sendInspectorState(Gp),qp&&e.addTimelineEvent({layerId:Kp,event:{time:n(),title:"Change",subtitle:r,data:{newValue:t,oldValue:o},groupId:Zp}})}),{deep:!0})})),t.$subscribe((({events:r,type:o},i)=>{if(e.notifyComponentUpdate(),e.sendInspectorState(Gp),!qp)return;const s={time:n(),title:zp(o),data:Yp({store:Bp(t.$id)},Hp(r)),groupId:Zp};o===xp.patchFunction?s.subtitle="⤵️":o===xp.patchObject?s.subtitle="🧩":r&&!Array.isArray(r)&&(s.subtitle=r.type),r&&(s.data["rawEvent(s)"]={_custom:{display:"DebuggerEvent",type:"object",tooltip:"raw DebuggerEvent[]",value:r}}),e.addTimelineEvent({layerId:Kp,event:s})}),{detached:!0,flush:"sync"});const r=t._hotUpdate;t._hotUpdate=Ft((o=>{r(o),e.addTimelineEvent({layerId:Kp,event:{time:n(),title:"🔥 "+t.$id,subtitle:"HMR update",data:{store:Bp(t.$id),info:Bp("HMR update")}}}),e.notifyComponentUpdate(),e.sendInspectorTree(Gp),e.sendInspectorState(Gp)}));const{$dispose:o}=t;t.$dispose=()=>{o(),e.notifyComponentUpdate(),e.sendInspectorTree(Gp),e.sendInspectorState(Gp),e.getSettings().logStoreChanges&&Rp(`Disposed "${t.$id}" store 🗑`)},e.notifyComponentUpdate(),e.sendInspectorTree(Gp),e.sendInspectorState(Gp),e.getSettings().logStoreChanges&&Rp(`"${t.$id}" store installed 🆕`)}))}(e,t)}const nd=()=>{};function rd(e,t,n,r=nd){e.push(t);const o=()=>{const n=e.indexOf(t);n>-1&&(e.splice(n,1),r())};return!n&&ge()&&me(o),o}function od(e,...t){e.slice().forEach((e=>{e(...t)}))}const id=e=>e();function sd(e,t){e instanceof Map&&t instanceof Map&&t.forEach(((t,n)=>e.set(n,t))),e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const n in t){if(!t.hasOwnProperty(n))continue;const r=t[n],o=e[n];_p(o)&&_p(r)&&e.hasOwnProperty(n)&&!Ut(r)&&!At(r)?e[n]=sd(o,r):e[n]=r}return e}const ld=Symbol(),ad=new WeakMap;const{assign:ud}=Object;function cd(e){return!(!Ut(e)||!e.effect)}function fd(e,t,n={},r,o,i){let s;const l=ud({actions:{}},n);const a={deep:!0};let u,c;let f,p=[],d=[];const h=r.state.value[e];i||h||(ap?up(r.state.value,e,{}):r.state.value[e]={});const v=$t({});let g;function m(t){let n;u=c=!1,"function"==typeof t?(t(r.state.value[e]),n={type:xp.patchFunction,storeId:e,events:f}):(sd(r.state.value[e],t),n={type:xp.patchObject,payload:t,storeId:e,events:f});const o=g=Symbol();bn().then((()=>{g===o&&(u=!0)})),c=!0,od(p,n,r.state.value[e])}const y=i?function(){const{state:e}=n,t=e?e():{};this.$patch((e=>{ud(e,t)}))}:nd;function b(t,n){return function(){bp(r);const o=Array.from(arguments),i=[],s=[];let l;od(d,{args:o,name:t,store:x,after:function(e){i.push(e)},onError:function(e){s.push(e)}});try{l=n.apply(this&&this.$id===e?this:x,o)}catch(e){throw od(s,e),e}return l instanceof Promise?l.then((e=>(od(i,e),e))).catch((e=>(od(s,e),Promise.reject(e)))):(od(i,l),l)}}const w=Ft({actions:{},getters:{},state:[],hotState:v}),_={_p:r,$id:e,$onAction:rd.bind(null,d),$patch:m,$reset:y,$subscribe(t,n={}){const o=rd(p,t,n.detached,(()=>i())),i=s.run((()=>dr((()=>r.state.value[e]),(r=>{("sync"===n.flush?c:u)&&t({storeId:e,type:xp.direct,events:f},r)}),ud({},a,n))));return o},$dispose:function(){s.stop(),p=[],d=[],r._s.delete(e)}};ap&&(_._r=!1);const x=kt(Op?ud({_hmrPayload:w,_customProperties:Ft(new Set)},_):_);r._s.set(e,x);const S=(r._a&&r._a.runWithContext||id)((()=>r._e.run((()=>(s=he()).run(t)))));for(const t in S){const n=S[t];if(Ut(n)&&!cd(n)||At(n))i||(!h||(O=n,ap?ad.has(O):_p(O)&&O.hasOwnProperty(ld))||(Ut(n)?n.value=h[t]:sd(n,h[t])),ap?up(r.state.value[e],t,n):r.state.value[e][t]=n);else if("function"==typeof n){const e=b(t,n);ap?up(S,t,e):S[t]=e,l.actions[t]=n}else 0}var O;if(ap?Object.keys(S).forEach((e=>{up(x,e,S[e])})):(ud(x,S),ud(It(x),S)),Object.defineProperty(x,"$state",{get:()=>r.state.value[e],set:e=>{m((t=>{ud(t,e)}))}}),Op){const e={writable:!0,configurable:!0,enumerable:!1};["_p","_hmrPayload","_getters","_customProperties"].forEach((t=>{Object.defineProperty(x,t,ud({value:x[t]},e))}))}return ap&&(x._r=!0),r._p.forEach((e=>{if(Op){const t=s.run((()=>e({store:x,app:r._a,pinia:r,options:l})));Object.keys(t||{}).forEach((e=>x._customProperties.add(e))),ud(x,t)}else ud(x,s.run((()=>e({store:x,app:r._a,pinia:r,options:l}))))})),h&&i&&n.hydrate&&n.hydrate(x.$state,h),u=!0,c=!0,x}function pd(e,t,n){let r,o;const i="function"==typeof t;function s(e,n){const s=Jo();(e=e||(s?Yo(wp,null):null))&&bp(e),(e=vp)._s.has(r)||(i?fd(r,t,o,e):function(e,t,n,r){const{state:o,actions:i,getters:s}=t,l=n.state.value[e];let a;a=fd(e,(function(){l||(ap?up(n.state.value,e,o?o():{}):n.state.value[e]=o?o():{});const t=Zt(n.state.value[e]);return ud(t,i,Object.keys(s||{}).reduce(((t,r)=>(t[r]=Ft(Rs((()=>{bp(n);const t=n._s.get(e);if(!ap||t._r)return s[r].call(t,t)}))),t)),{}))}),t,n,0,!0)}(r,o,e));return e._s.get(r)}return"string"==typeof e?(r=e,o=i?n:t):(o=e,r=e.id),s.$id=r,s}function dd(e,t){return function(){return e.apply(t,arguments)}}const{toString:hd}=Object.prototype,{getPrototypeOf:vd}=Object,gd=(md=Object.create(null),e=>{const t=hd.call(e);return md[t]||(md[t]=t.slice(8,-1).toLowerCase())});var md;const yd=e=>(e=e.toLowerCase(),t=>gd(t)===e),bd=e=>t=>typeof t===e,{isArray:wd}=Array,_d=bd("undefined");const xd=yd("ArrayBuffer");const Sd=bd("string"),Od=bd("function"),kd=bd("number"),Ed=e=>null!==e&&"object"==typeof e,Cd=e=>{if("object"!==gd(e))return!1;const t=vd(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||Symbol.toStringTag in e||Symbol.iterator in e)},Pd=yd("Date"),Td=yd("File"),Ad=yd("Blob"),jd=yd("FileList"),Rd=yd("URLSearchParams");function Ld(e,t,{allOwnKeys:n=!1}={}){if(null==e)return;let r,o;if("object"!=typeof e&&(e=[e]),wd(e))for(r=0,o=e.length;r<o;r++)t.call(null,e[r],r,e);else{const o=n?Object.getOwnPropertyNames(e):Object.keys(e),i=o.length;let s;for(r=0;r<i;r++)s=o[r],t.call(null,e[s],s,e)}}function Id(e,t){t=t.toLowerCase();const n=Object.keys(e);let r,o=n.length;for(;o-- >0;)if(r=n[o],t===r.toLowerCase())return r;return null}const Fd="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:global,Nd=e=>!_d(e)&&e!==Fd;const Md=(Dd="undefined"!=typeof Uint8Array&&vd(Uint8Array),e=>Dd&&e instanceof Dd);var Dd;const Bd=yd("HTMLFormElement"),Ud=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),$d=yd("RegExp"),Vd=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};Ld(n,((n,o)=>{let i;!1!==(i=t(n,o,e))&&(r[o]=i||n)})),Object.defineProperties(e,r)},Hd="abcdefghijklmnopqrstuvwxyz",zd="0123456789",qd={DIGIT:zd,ALPHA:Hd,ALPHA_DIGIT:Hd+Hd.toUpperCase()+zd};const Wd=yd("AsyncFunction"),Kd={isArray:wd,isArrayBuffer:xd,isBuffer:function(e){return null!==e&&!_d(e)&&null!==e.constructor&&!_d(e.constructor)&&Od(e.constructor.isBuffer)&&e.constructor.isBuffer(e)},isFormData:e=>{let t;return e&&("function"==typeof FormData&&e instanceof FormData||Od(e.append)&&("formdata"===(t=gd(e))||"object"===t&&Od(e.toString)&&"[object FormData]"===e.toString()))},isArrayBufferView:function(e){let t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&xd(e.buffer),t},isString:Sd,isNumber:kd,isBoolean:e=>!0===e||!1===e,isObject:Ed,isPlainObject:Cd,isUndefined:_d,isDate:Pd,isFile:Td,isBlob:Ad,isRegExp:$d,isFunction:Od,isStream:e=>Ed(e)&&Od(e.pipe),isURLSearchParams:Rd,isTypedArray:Md,isFileList:jd,forEach:Ld,merge:function e(){const{caseless:t}=Nd(this)&&this||{},n={},r=(r,o)=>{const i=t&&Id(n,o)||o;Cd(n[i])&&Cd(r)?n[i]=e(n[i],r):Cd(r)?n[i]=e({},r):wd(r)?n[i]=r.slice():n[i]=r};for(let e=0,t=arguments.length;e<t;e++)arguments[e]&&Ld(arguments[e],r);return n},extend:(e,t,n,{allOwnKeys:r}={})=>(Ld(t,((t,r)=>{n&&Od(t)?e[r]=dd(t,n):e[r]=t}),{allOwnKeys:r}),e),trim:e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,""),stripBOM:e=>(65279===e.charCodeAt(0)&&(e=e.slice(1)),e),inherits:(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},toFlatObject:(e,t,n,r)=>{let o,i,s;const l={};if(t=t||{},null==e)return t;do{for(o=Object.getOwnPropertyNames(e),i=o.length;i-- >0;)s=o[i],r&&!r(s,e,t)||l[s]||(t[s]=e[s],l[s]=!0);e=!1!==n&&vd(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},kindOf:gd,kindOfTest:yd,endsWith:(e,t,n)=>{e=String(e),(void 0===n||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return-1!==r&&r===n},toArray:e=>{if(!e)return null;if(wd(e))return e;let t=e.length;if(!kd(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},forEachEntry:(e,t)=>{const n=(e&&e[Symbol.iterator]).call(e);let r;for(;(r=n.next())&&!r.done;){const n=r.value;t.call(e,n[0],n[1])}},matchAll:(e,t)=>{let n;const r=[];for(;null!==(n=e.exec(t));)r.push(n);return r},isHTMLForm:Bd,hasOwnProperty:Ud,hasOwnProp:Ud,reduceDescriptors:Vd,freezeMethods:e=>{Vd(e,((t,n)=>{if(Od(e)&&-1!==["arguments","caller","callee"].indexOf(n))return!1;const r=e[n];Od(r)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")}))}))},toObjectSet:(e,t)=>{const n={},r=e=>{e.forEach((e=>{n[e]=!0}))};return wd(e)?r(e):r(String(e).split(t)),n},toCamelCase:e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,(function(e,t,n){return t.toUpperCase()+n})),noop:()=>{},toFiniteNumber:(e,t)=>(e=+e,Number.isFinite(e)?e:t),findKey:Id,global:Fd,isContextDefined:Nd,ALPHABET:qd,generateString:(e=16,t=qd.ALPHA_DIGIT)=>{let n="";const{length:r}=t;for(;e--;)n+=t[Math.random()*r|0];return n},isSpecCompliantForm:function(e){return!!(e&&Od(e.append)&&"FormData"===e[Symbol.toStringTag]&&e[Symbol.iterator])},toJSONObject:e=>{const t=new Array(10),n=(e,r)=>{if(Ed(e)){if(t.indexOf(e)>=0)return;if(!("toJSON"in e)){t[r]=e;const o=wd(e)?[]:{};return Ld(e,((e,t)=>{const i=n(e,r+1);!_d(i)&&(o[t]=i)})),t[r]=void 0,o}}return e};return n(e,0)},isAsyncFn:Wd,isThenable:e=>e&&(Ed(e)||Od(e))&&Od(e.then)&&Od(e.catch)};function Gd(e,t,n,r,o){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),o&&(this.response=o)}Kd.inherits(Gd,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:Kd.toJSONObject(this.config),code:this.code,status:this.response&&this.response.status?this.response.status:null}}});const Yd=Gd.prototype,Jd={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach((e=>{Jd[e]={value:e}})),Object.defineProperties(Gd,Jd),Object.defineProperty(Yd,"isAxiosError",{value:!0}),Gd.from=(e,t,n,r,o,i)=>{const s=Object.create(Yd);return Kd.toFlatObject(e,s,(function(e){return e!==Error.prototype}),(e=>"isAxiosError"!==e)),Gd.call(s,e.message,t,n,r,o),s.cause=e,s.name=e.name,i&&Object.assign(s,i),s};const Qd=Gd;var Zd=n(764).lW;function Xd(e){return Kd.isPlainObject(e)||Kd.isArray(e)}function eh(e){return Kd.endsWith(e,"[]")?e.slice(0,-2):e}function th(e,t,n){return e?e.concat(t).map((function(e,t){return e=eh(e),!n&&t?"["+e+"]":e})).join(n?".":""):t}const nh=Kd.toFlatObject(Kd,{},null,(function(e){return/^is[A-Z]/.test(e)}));const rh=function(e,t,n){if(!Kd.isObject(e))throw new TypeError("target must be an object");t=t||new FormData;const r=(n=Kd.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,(function(e,t){return!Kd.isUndefined(t[e])}))).metaTokens,o=n.visitor||u,i=n.dots,s=n.indexes,l=(n.Blob||"undefined"!=typeof Blob&&Blob)&&Kd.isSpecCompliantForm(t);if(!Kd.isFunction(o))throw new TypeError("visitor must be a function");function a(e){if(null===e)return"";if(Kd.isDate(e))return e.toISOString();if(!l&&Kd.isBlob(e))throw new Qd("Blob is not supported. Use a Buffer instead.");return Kd.isArrayBuffer(e)||Kd.isTypedArray(e)?l&&"function"==typeof Blob?new Blob([e]):Zd.from(e):e}function u(e,n,o){let l=e;if(e&&!o&&"object"==typeof e)if(Kd.endsWith(n,"{}"))n=r?n:n.slice(0,-2),e=JSON.stringify(e);else if(Kd.isArray(e)&&function(e){return Kd.isArray(e)&&!e.some(Xd)}(e)||(Kd.isFileList(e)||Kd.endsWith(n,"[]"))&&(l=Kd.toArray(e)))return n=eh(n),l.forEach((function(e,r){!Kd.isUndefined(e)&&null!==e&&t.append(!0===s?th([n],r,i):null===s?n:n+"[]",a(e))})),!1;return!!Xd(e)||(t.append(th(o,n,i),a(e)),!1)}const c=[],f=Object.assign(nh,{defaultVisitor:u,convertValue:a,isVisitable:Xd});if(!Kd.isObject(e))throw new TypeError("data must be an object");return function e(n,r){if(!Kd.isUndefined(n)){if(-1!==c.indexOf(n))throw Error("Circular reference detected in "+r.join("."));c.push(n),Kd.forEach(n,(function(n,i){!0===(!(Kd.isUndefined(n)||null===n)&&o.call(t,n,Kd.isString(i)?i.trim():i,r,f))&&e(n,r?r.concat(i):[i])})),c.pop()}}(e),t};function oh(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,(function(e){return t[e]}))}function ih(e,t){this._pairs=[],e&&rh(e,this,t)}const sh=ih.prototype;sh.append=function(e,t){this._pairs.push([e,t])},sh.toString=function(e){const t=e?function(t){return e.call(this,t,oh)}:oh;return this._pairs.map((function(e){return t(e[0])+"="+t(e[1])}),"").join("&")};const lh=ih;function ah(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function uh(e,t,n){if(!t)return e;const r=n&&n.encode||ah,o=n&&n.serialize;let i;if(i=o?o(t,n):Kd.isURLSearchParams(t)?t.toString():new lh(t,n).toString(r),i){const t=e.indexOf("#");-1!==t&&(e=e.slice(0,t)),e+=(-1===e.indexOf("?")?"?":"&")+i}return e}const ch=class{constructor(){this.handlers=[]}use(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){Kd.forEach(this.handlers,(function(t){null!==t&&e(t)}))}},fh={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},ph={isBrowser:!0,classes:{URLSearchParams:"undefined"!=typeof URLSearchParams?URLSearchParams:lh,FormData:"undefined"!=typeof FormData?FormData:null,Blob:"undefined"!=typeof Blob?Blob:null},protocols:["http","https","file","blob","url","data"]},dh="undefined"!=typeof window&&"undefined"!=typeof document,hh=(vh="undefined"!=typeof navigator&&navigator.product,dh&&["ReactNative","NativeScript","NS"].indexOf(vh)<0);var vh;const gh="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&"function"==typeof self.importScripts,mh={...o,...ph};const yh=function(e){function t(e,n,r,o){let i=e[o++];const s=Number.isFinite(+i),l=o>=e.length;if(i=!i&&Kd.isArray(r)?r.length:i,l)return Kd.hasOwnProp(r,i)?r[i]=[r[i],n]:r[i]=n,!s;r[i]&&Kd.isObject(r[i])||(r[i]=[]);return t(e,n,r[i],o)&&Kd.isArray(r[i])&&(r[i]=function(e){const t={},n=Object.keys(e);let r;const o=n.length;let i;for(r=0;r<o;r++)i=n[r],t[i]=e[i];return t}(r[i])),!s}if(Kd.isFormData(e)&&Kd.isFunction(e.entries)){const n={};return Kd.forEachEntry(e,((e,r)=>{t(function(e){return Kd.matchAll(/\w+|\[(\w*)]/g,e).map((e=>"[]"===e[0]?"":e[1]||e[0]))}(e),r,n,0)})),n}return null};const bh={transitional:fh,adapter:["xhr","http"],transformRequest:[function(e,t){const n=t.getContentType()||"",r=n.indexOf("application/json")>-1,o=Kd.isObject(e);o&&Kd.isHTMLForm(e)&&(e=new FormData(e));if(Kd.isFormData(e))return r&&r?JSON.stringify(yh(e)):e;if(Kd.isArrayBuffer(e)||Kd.isBuffer(e)||Kd.isStream(e)||Kd.isFile(e)||Kd.isBlob(e))return e;if(Kd.isArrayBufferView(e))return e.buffer;if(Kd.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();let i;if(o){if(n.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return rh(e,new mh.classes.URLSearchParams,Object.assign({visitor:function(e,t,n,r){return mh.isNode&&Kd.isBuffer(e)?(this.append(t,e.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)}},t))}(e,this.formSerializer).toString();if((i=Kd.isFileList(e))||n.indexOf("multipart/form-data")>-1){const t=this.env&&this.env.FormData;return rh(i?{"files[]":e}:e,t&&new t,this.formSerializer)}}return o||r?(t.setContentType("application/json",!1),function(e,t,n){if(Kd.isString(e))try{return(t||JSON.parse)(e),Kd.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(n||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){const t=this.transitional||bh.transitional,n=t&&t.forcedJSONParsing,r="json"===this.responseType;if(e&&Kd.isString(e)&&(n&&!this.responseType||r)){const n=!(t&&t.silentJSONParsing)&&r;try{return JSON.parse(e)}catch(e){if(n){if("SyntaxError"===e.name)throw Qd.from(e,Qd.ERR_BAD_RESPONSE,this,null,this.response);throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:mh.classes.FormData,Blob:mh.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};Kd.forEach(["delete","get","head","post","put","patch"],(e=>{bh.headers[e]={}}));const wh=bh,_h=Kd.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),xh=Symbol("internals");function Sh(e){return e&&String(e).trim().toLowerCase()}function Oh(e){return!1===e||null==e?e:Kd.isArray(e)?e.map(Oh):String(e)}function kh(e,t,n,r,o){return Kd.isFunction(r)?r.call(this,t,n):(o&&(t=n),Kd.isString(t)?Kd.isString(r)?-1!==t.indexOf(r):Kd.isRegExp(r)?r.test(t):void 0:void 0)}class Eh{constructor(e){e&&this.set(e)}set(e,t,n){const r=this;function o(e,t,n){const o=Sh(t);if(!o)throw new Error("header name must be a non-empty string");const i=Kd.findKey(r,o);(!i||void 0===r[i]||!0===n||void 0===n&&!1!==r[i])&&(r[i||t]=Oh(e))}const i=(e,t)=>Kd.forEach(e,((e,n)=>o(e,n,t)));return Kd.isPlainObject(e)||e instanceof this.constructor?i(e,t):Kd.isString(e)&&(e=e.trim())&&!/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim())?i((e=>{const t={};let n,r,o;return e&&e.split("\n").forEach((function(e){o=e.indexOf(":"),n=e.substring(0,o).trim().toLowerCase(),r=e.substring(o+1).trim(),!n||t[n]&&_h[n]||("set-cookie"===n?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)})),t})(e),t):null!=e&&o(t,e,n),this}get(e,t){if(e=Sh(e)){const n=Kd.findKey(this,e);if(n){const e=this[n];if(!t)return e;if(!0===t)return function(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}(e);if(Kd.isFunction(t))return t.call(this,e,n);if(Kd.isRegExp(t))return t.exec(e);throw new TypeError("parser must be boolean|regexp|function")}}}has(e,t){if(e=Sh(e)){const n=Kd.findKey(this,e);return!(!n||void 0===this[n]||t&&!kh(0,this[n],n,t))}return!1}delete(e,t){const n=this;let r=!1;function o(e){if(e=Sh(e)){const o=Kd.findKey(n,e);!o||t&&!kh(0,n[o],o,t)||(delete n[o],r=!0)}}return Kd.isArray(e)?e.forEach(o):o(e),r}clear(e){const t=Object.keys(this);let n=t.length,r=!1;for(;n--;){const o=t[n];e&&!kh(0,this[o],o,e,!0)||(delete this[o],r=!0)}return r}normalize(e){const t=this,n={};return Kd.forEach(this,((r,o)=>{const i=Kd.findKey(n,o);if(i)return t[i]=Oh(r),void delete t[o];const s=e?function(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,((e,t,n)=>t.toUpperCase()+n))}(o):String(o).trim();s!==o&&delete t[o],t[s]=Oh(r),n[s]=!0})),this}concat(...e){return this.constructor.concat(this,...e)}toJSON(e){const t=Object.create(null);return Kd.forEach(this,((n,r)=>{null!=n&&!1!==n&&(t[r]=e&&Kd.isArray(n)?n.join(", "):n)})),t}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map((([e,t])=>e+": "+t)).join("\n")}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(e){return e instanceof this?e:new this(e)}static concat(e,...t){const n=new this(e);return t.forEach((e=>n.set(e))),n}static accessor(e){const t=(this[xh]=this[xh]={accessors:{}}).accessors,n=this.prototype;function r(e){const r=Sh(e);t[r]||(!function(e,t){const n=Kd.toCamelCase(" "+t);["get","set","has"].forEach((r=>{Object.defineProperty(e,r+n,{value:function(e,n,o){return this[r].call(this,t,e,n,o)},configurable:!0})}))}(n,e),t[r]=!0)}return Kd.isArray(e)?e.forEach(r):r(e),this}}Eh.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]),Kd.reduceDescriptors(Eh.prototype,(({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(e){this[n]=e}}})),Kd.freezeMethods(Eh);const Ch=Eh;function Ph(e,t){const n=this||wh,r=t||n,o=Ch.from(r.headers);let i=r.data;return Kd.forEach(e,(function(e){i=e.call(n,i,o.normalize(),t?t.status:void 0)})),o.normalize(),i}function Th(e){return!(!e||!e.__CANCEL__)}function Ah(e,t,n){Qd.call(this,null==e?"canceled":e,Qd.ERR_CANCELED,t,n),this.name="CanceledError"}Kd.inherits(Ah,Qd,{__CANCEL__:!0});const jh=Ah;const Rh=mh.hasStandardBrowserEnv?{write(e,t,n,r,o,i){const s=[e+"="+encodeURIComponent(t)];Kd.isNumber(n)&&s.push("expires="+new Date(n).toGMTString()),Kd.isString(r)&&s.push("path="+r),Kd.isString(o)&&s.push("domain="+o),!0===i&&s.push("secure"),document.cookie=s.join("; ")},read(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,"",Date.now()-864e5)}}:{write(){},read:()=>null,remove(){}};function Lh(e,t){return e&&!/^([a-z][a-z\d+\-.]*:)?\/\//i.test(t)?function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}(e,t):t}const Ih=mh.hasStandardBrowserEnv?function(){const e=/(msie|trident)/i.test(navigator.userAgent),t=document.createElement("a");let n;function r(n){let r=n;return e&&(t.setAttribute("href",r),r=t.href),t.setAttribute("href",r),{href:t.href,protocol:t.protocol?t.protocol.replace(/:$/,""):"",host:t.host,search:t.search?t.search.replace(/^\?/,""):"",hash:t.hash?t.hash.replace(/^#/,""):"",hostname:t.hostname,port:t.port,pathname:"/"===t.pathname.charAt(0)?t.pathname:"/"+t.pathname}}return n=r(window.location.href),function(e){const t=Kd.isString(e)?r(e):e;return t.protocol===n.protocol&&t.host===n.host}}():function(){return!0};const Fh=function(e,t){e=e||10;const n=new Array(e),r=new Array(e);let o,i=0,s=0;return t=void 0!==t?t:1e3,function(l){const a=Date.now(),u=r[s];o||(o=a),n[i]=l,r[i]=a;let c=s,f=0;for(;c!==i;)f+=n[c++],c%=e;if(i=(i+1)%e,i===s&&(s=(s+1)%e),a-o<t)return;const p=u&&a-u;return p?Math.round(1e3*f/p):void 0}};function Nh(e,t){let n=0;const r=Fh(50,250);return o=>{const i=o.loaded,s=o.lengthComputable?o.total:void 0,l=i-n,a=r(l);n=i;const u={loaded:i,total:s,progress:s?i/s:void 0,bytes:l,rate:a||void 0,estimated:a&&s&&i<=s?(s-i)/a:void 0,event:o};u[t?"download":"upload"]=!0,e(u)}}const Mh="undefined"!=typeof XMLHttpRequest&&function(e){return new Promise((function(t,n){let r=e.data;const o=Ch.from(e.headers).normalize();let i,s,{responseType:l,withXSRFToken:a}=e;function u(){e.cancelToken&&e.cancelToken.unsubscribe(i),e.signal&&e.signal.removeEventListener("abort",i)}if(Kd.isFormData(r))if(mh.hasStandardBrowserEnv||mh.hasStandardBrowserWebWorkerEnv)o.setContentType(!1);else if(!1!==(s=o.getContentType())){const[e,...t]=s?s.split(";").map((e=>e.trim())).filter(Boolean):[];o.setContentType([e||"multipart/form-data",...t].join("; "))}let c=new XMLHttpRequest;if(e.auth){const t=e.auth.username||"",n=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";o.set("Authorization","Basic "+btoa(t+":"+n))}const f=Lh(e.baseURL,e.url);function p(){if(!c)return;const r=Ch.from("getAllResponseHeaders"in c&&c.getAllResponseHeaders());!function(e,t,n){const r=n.config.validateStatus;n.status&&r&&!r(n.status)?t(new Qd("Request failed with status code "+n.status,[Qd.ERR_BAD_REQUEST,Qd.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n)):e(n)}((function(e){t(e),u()}),(function(e){n(e),u()}),{data:l&&"text"!==l&&"json"!==l?c.response:c.responseText,status:c.status,statusText:c.statusText,headers:r,config:e,request:c}),c=null}if(c.open(e.method.toUpperCase(),uh(f,e.params,e.paramsSerializer),!0),c.timeout=e.timeout,"onloadend"in c?c.onloadend=p:c.onreadystatechange=function(){c&&4===c.readyState&&(0!==c.status||c.responseURL&&0===c.responseURL.indexOf("file:"))&&setTimeout(p)},c.onabort=function(){c&&(n(new Qd("Request aborted",Qd.ECONNABORTED,e,c)),c=null)},c.onerror=function(){n(new Qd("Network Error",Qd.ERR_NETWORK,e,c)),c=null},c.ontimeout=function(){let t=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded";const r=e.transitional||fh;e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(new Qd(t,r.clarifyTimeoutError?Qd.ETIMEDOUT:Qd.ECONNABORTED,e,c)),c=null},mh.hasStandardBrowserEnv&&(a&&Kd.isFunction(a)&&(a=a(e)),a||!1!==a&&Ih(f))){const t=e.xsrfHeaderName&&e.xsrfCookieName&&Rh.read(e.xsrfCookieName);t&&o.set(e.xsrfHeaderName,t)}void 0===r&&o.setContentType(null),"setRequestHeader"in c&&Kd.forEach(o.toJSON(),(function(e,t){c.setRequestHeader(t,e)})),Kd.isUndefined(e.withCredentials)||(c.withCredentials=!!e.withCredentials),l&&"json"!==l&&(c.responseType=e.responseType),"function"==typeof e.onDownloadProgress&&c.addEventListener("progress",Nh(e.onDownloadProgress,!0)),"function"==typeof e.onUploadProgress&&c.upload&&c.upload.addEventListener("progress",Nh(e.onUploadProgress)),(e.cancelToken||e.signal)&&(i=t=>{c&&(n(!t||t.type?new jh(null,e,c):t),c.abort(),c=null)},e.cancelToken&&e.cancelToken.subscribe(i),e.signal&&(e.signal.aborted?i():e.signal.addEventListener("abort",i)));const d=function(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}(f);d&&-1===mh.protocols.indexOf(d)?n(new Qd("Unsupported protocol "+d+":",Qd.ERR_BAD_REQUEST,e)):c.send(r||null)}))},Dh={http:null,xhr:Mh};Kd.forEach(Dh,((e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch(e){}Object.defineProperty(e,"adapterName",{value:t})}}));const Bh=e=>`- ${e}`,Uh=e=>Kd.isFunction(e)||null===e||!1===e,$h=e=>{e=Kd.isArray(e)?e:[e];const{length:t}=e;let n,r;const o={};for(let i=0;i<t;i++){let t;if(n=e[i],r=n,!Uh(n)&&(r=Dh[(t=String(n)).toLowerCase()],void 0===r))throw new Qd(`Unknown adapter '${t}'`);if(r)break;o[t||"#"+i]=r}if(!r){const e=Object.entries(o).map((([e,t])=>`adapter ${e} `+(!1===t?"is not supported by the environment":"is not available in the build")));let n=t?e.length>1?"since :\n"+e.map(Bh).join("\n"):" "+Bh(e[0]):"as no adapter specified";throw new Qd("There is no suitable adapter to dispatch the request "+n,"ERR_NOT_SUPPORT")}return r};function Vh(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new jh(null,e)}function Hh(e){Vh(e),e.headers=Ch.from(e.headers),e.data=Ph.call(e,e.transformRequest),-1!==["post","put","patch"].indexOf(e.method)&&e.headers.setContentType("application/x-www-form-urlencoded",!1);return $h(e.adapter||wh.adapter)(e).then((function(t){return Vh(e),t.data=Ph.call(e,e.transformResponse,t),t.headers=Ch.from(t.headers),t}),(function(t){return Th(t)||(Vh(e),t&&t.response&&(t.response.data=Ph.call(e,e.transformResponse,t.response),t.response.headers=Ch.from(t.response.headers))),Promise.reject(t)}))}const zh=e=>e instanceof Ch?e.toJSON():e;function qh(e,t){t=t||{};const n={};function r(e,t,n){return Kd.isPlainObject(e)&&Kd.isPlainObject(t)?Kd.merge.call({caseless:n},e,t):Kd.isPlainObject(t)?Kd.merge({},t):Kd.isArray(t)?t.slice():t}function o(e,t,n){return Kd.isUndefined(t)?Kd.isUndefined(e)?void 0:r(void 0,e,n):r(e,t,n)}function i(e,t){if(!Kd.isUndefined(t))return r(void 0,t)}function s(e,t){return Kd.isUndefined(t)?Kd.isUndefined(e)?void 0:r(void 0,e):r(void 0,t)}function l(n,o,i){return i in t?r(n,o):i in e?r(void 0,n):void 0}const a={url:i,method:i,data:i,baseURL:s,transformRequest:s,transformResponse:s,paramsSerializer:s,timeout:s,timeoutMessage:s,withCredentials:s,withXSRFToken:s,adapter:s,responseType:s,xsrfCookieName:s,xsrfHeaderName:s,onUploadProgress:s,onDownloadProgress:s,decompress:s,maxContentLength:s,maxBodyLength:s,beforeRedirect:s,transport:s,httpAgent:s,httpsAgent:s,cancelToken:s,socketPath:s,responseEncoding:s,validateStatus:l,headers:(e,t)=>o(zh(e),zh(t),!0)};return Kd.forEach(Object.keys(Object.assign({},e,t)),(function(r){const i=a[r]||o,s=i(e[r],t[r],r);Kd.isUndefined(s)&&i!==l||(n[r]=s)})),n}const Wh="1.6.2",Kh={};["object","boolean","number","function","string","symbol"].forEach(((e,t)=>{Kh[e]=function(n){return typeof n===e||"a"+(t<1?"n ":" ")+e}}));const Gh={};Kh.transitional=function(e,t,n){return(r,o,i)=>{if(!1===e)throw new Qd(function(e,t){return"[Axios v1.6.2] Transitional option '"+e+"'"+t+(n?". "+n:"")}(o," has been removed"+(t?" in "+t:"")),Qd.ERR_DEPRECATED);return t&&!Gh[o]&&(Gh[o]=!0),!e||e(r,o,i)}};const Yh={assertOptions:function(e,t,n){if("object"!=typeof e)throw new Qd("options must be an object",Qd.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let o=r.length;for(;o-- >0;){const i=r[o],s=t[i];if(s){const t=e[i],n=void 0===t||s(t,i,e);if(!0!==n)throw new Qd("option "+i+" must be "+n,Qd.ERR_BAD_OPTION_VALUE)}else if(!0!==n)throw new Qd("Unknown option "+i,Qd.ERR_BAD_OPTION)}},validators:Kh},Jh=Yh.validators;class Qh{constructor(e){this.defaults=e,this.interceptors={request:new ch,response:new ch}}request(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{},t=qh(this.defaults,t);const{transitional:n,paramsSerializer:r,headers:o}=t;void 0!==n&&Yh.assertOptions(n,{silentJSONParsing:Jh.transitional(Jh.boolean),forcedJSONParsing:Jh.transitional(Jh.boolean),clarifyTimeoutError:Jh.transitional(Jh.boolean)},!1),null!=r&&(Kd.isFunction(r)?t.paramsSerializer={serialize:r}:Yh.assertOptions(r,{encode:Jh.function,serialize:Jh.function},!0)),t.method=(t.method||this.defaults.method||"get").toLowerCase();let i=o&&Kd.merge(o.common,o[t.method]);o&&Kd.forEach(["delete","get","head","post","put","patch","common"],(e=>{delete o[e]})),t.headers=Ch.concat(i,o);const s=[];let l=!0;this.interceptors.request.forEach((function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(l=l&&e.synchronous,s.unshift(e.fulfilled,e.rejected))}));const a=[];let u;this.interceptors.response.forEach((function(e){a.push(e.fulfilled,e.rejected)}));let c,f=0;if(!l){const e=[Hh.bind(this),void 0];for(e.unshift.apply(e,s),e.push.apply(e,a),c=e.length,u=Promise.resolve(t);f<c;)u=u.then(e[f++],e[f++]);return u}c=s.length;let p=t;for(f=0;f<c;){const e=s[f++],t=s[f++];try{p=e(p)}catch(e){t.call(this,e);break}}try{u=Hh.call(this,p)}catch(e){return Promise.reject(e)}for(f=0,c=a.length;f<c;)u=u.then(a[f++],a[f++]);return u}getUri(e){return uh(Lh((e=qh(this.defaults,e)).baseURL,e.url),e.params,e.paramsSerializer)}}Kd.forEach(["delete","get","head","options"],(function(e){Qh.prototype[e]=function(t,n){return this.request(qh(n||{},{method:e,url:t,data:(n||{}).data}))}})),Kd.forEach(["post","put","patch"],(function(e){function t(t){return function(n,r,o){return this.request(qh(o||{},{method:e,headers:t?{"Content-Type":"multipart/form-data"}:{},url:n,data:r}))}}Qh.prototype[e]=t(),Qh.prototype[e+"Form"]=t(!0)}));const Zh=Qh;class Xh{constructor(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");let t;this.promise=new Promise((function(e){t=e}));const n=this;this.promise.then((e=>{if(!n._listeners)return;let t=n._listeners.length;for(;t-- >0;)n._listeners[t](e);n._listeners=null})),this.promise.then=e=>{let t;const r=new Promise((e=>{n.subscribe(e),t=e})).then(e);return r.cancel=function(){n.unsubscribe(t)},r},e((function(e,r,o){n.reason||(n.reason=new jh(e,r,o),t(n.reason))}))}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;const t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}static source(){let e;const t=new Xh((function(t){e=t}));return{token:t,cancel:e}}}const ev=Xh;const tv={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(tv).forEach((([e,t])=>{tv[t]=e}));const nv=tv;const rv=function e(t){const n=new Zh(t),r=dd(Zh.prototype.request,n);return Kd.extend(r,Zh.prototype,n,{allOwnKeys:!0}),Kd.extend(r,n,null,{allOwnKeys:!0}),r.create=function(n){return e(qh(t,n))},r}(wh);rv.Axios=Zh,rv.CanceledError=jh,rv.CancelToken=ev,rv.isCancel=Th,rv.VERSION=Wh,rv.toFormData=rh,rv.AxiosError=Qd,rv.Cancel=rv.CanceledError,rv.all=function(e){return Promise.all(e)},rv.spread=function(e){return function(t){return e.apply(null,t)}},rv.isAxiosError=function(e){return Kd.isObject(e)&&!0===e.isAxiosError},rv.mergeConfig=qh,rv.AxiosHeaders=Ch,rv.formToJSON=e=>yh(Kd.isHTMLForm(e)?new FormData(e):e),rv.getAdapter=$h,rv.HttpStatusCode=nv,rv.default=rv;const ov=rv,iv="undefined"!=typeof window;function sv(e){return e.__esModule||"Module"===e[Symbol.toStringTag]}const lv=Object.assign;function av(e,t){const n={};for(const r in t){const o=t[r];n[r]=cv(o)?o.map(e):e(o)}return n}const uv=()=>{},cv=Array.isArray;const fv=/\/$/,pv=e=>e.replace(fv,"");function dv(e,t,n="/"){let r,o={},i="",s="";const l=t.indexOf("#");let a=t.indexOf("?");return l<a&&l>=0&&(a=-1),a>-1&&(r=t.slice(0,a),i=t.slice(a+1,l>-1?l:t.length),o=e(i)),l>-1&&(r=r||t.slice(0,l),s=t.slice(l,t.length)),r=function(e,t){if(e.startsWith("/"))return e;0;if(!e)return t;const n=t.split("/"),r=e.split("/"),o=r[r.length-1];".."!==o&&"."!==o||r.push("");let i,s,l=n.length-1;for(i=0;i<r.length;i++)if(s=r[i],"."!==s){if(".."!==s)break;l>1&&l--}return n.slice(0,l).join("/")+"/"+r.slice(i-(i===r.length?1:0)).join("/")}(null!=r?r:t,n),{fullPath:r+(i&&"?")+i+s,path:r,query:o,hash:s}}function hv(e,t){return t&&e.toLowerCase().startsWith(t.toLowerCase())?e.slice(t.length)||"/":e}function vv(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function gv(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!mv(e[n],t[n]))return!1;return!0}function mv(e,t){return cv(e)?yv(e,t):cv(t)?yv(t,e):e===t}function yv(e,t){return cv(t)?e.length===t.length&&e.every(((e,n)=>e===t[n])):1===e.length&&e[0]===t}var bv,wv;!function(e){e.pop="pop",e.push="push"}(bv||(bv={})),function(e){e.back="back",e.forward="forward",e.unknown=""}(wv||(wv={}));function _v(e){if(!e)if(iv){const t=document.querySelector("base");e=(e=t&&t.getAttribute("href")||"/").replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return"/"!==e[0]&&"#"!==e[0]&&(e="/"+e),pv(e)}const xv=/^[^#]+#/;function Sv(e,t){return e.replace(xv,"#")+t}const Ov=()=>({left:window.pageXOffset,top:window.pageYOffset});function kv(e){let t;if("el"in e){const n=e.el,r="string"==typeof n&&n.startsWith("#");0;const o="string"==typeof n?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=function(e,t){const n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(null!=t.left?t.left:window.pageXOffset,null!=t.top?t.top:window.pageYOffset)}function Ev(e,t){return(history.state?history.state.position-t:-1)+e}const Cv=new Map;let Pv=()=>location.protocol+"//"+location.host;function Tv(e,t){const{pathname:n,search:r,hash:o}=t,i=e.indexOf("#");if(i>-1){let t=o.includes(e.slice(i))?e.slice(i).length:1,n=o.slice(t);return"/"!==n[0]&&(n="/"+n),hv(n,"")}return hv(n,e)+r+o}function Av(e,t,n,r=!1,o=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:o?Ov():null}}function jv(e){const t=function(e){const{history:t,location:n}=window,r={value:Tv(e,n)},o={value:t.state};function i(r,i,s){const l=e.indexOf("#"),a=l>-1?(n.host&&document.querySelector("base")?e:e.slice(l))+r:Pv()+e+r;try{t[s?"replaceState":"pushState"](i,"",a),o.value=i}catch(e){n[s?"replace":"assign"](a)}}return o.value||i(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0),{location:r,state:o,push:function(e,n){const s=lv({},o.value,t.state,{forward:e,scroll:Ov()});i(s.current,s,!0),i(e,lv({},Av(r.value,e,null),{position:s.position+1},n),!1),r.value=e},replace:function(e,n){i(e,lv({},t.state,Av(o.value.back,e,o.value.forward,!0),n,{position:o.value.position}),!0),r.value=e}}}(e=_v(e)),n=function(e,t,n,r){let o=[],i=[],s=null;const l=({state:i})=>{const l=Tv(e,location),a=n.value,u=t.value;let c=0;if(i){if(n.value=l,t.value=i,s&&s===a)return void(s=null);c=u?i.position-u.position:0}else r(l);o.forEach((e=>{e(n.value,a,{delta:c,type:bv.pop,direction:c?c>0?wv.forward:wv.back:wv.unknown})}))};function a(){const{history:e}=window;e.state&&e.replaceState(lv({},e.state,{scroll:Ov()}),"")}return window.addEventListener("popstate",l),window.addEventListener("beforeunload",a,{passive:!0}),{pauseListeners:function(){s=n.value},listen:function(e){o.push(e);const t=()=>{const t=o.indexOf(e);t>-1&&o.splice(t,1)};return i.push(t),t},destroy:function(){for(const e of i)e();i=[],window.removeEventListener("popstate",l),window.removeEventListener("beforeunload",a)}}}(e,t.state,t.location,t.replace);const r=lv({location:"",base:e,go:function(e,t=!0){t||n.pauseListeners(),history.go(e)},createHref:Sv.bind(null,e)},t,n);return Object.defineProperty(r,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(r,"state",{enumerable:!0,get:()=>t.state.value}),r}function Rv(e){return"string"==typeof e||"symbol"==typeof e}const Lv={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},Iv=Symbol("");var Fv;!function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"}(Fv||(Fv={}));function Nv(e,t){return lv(new Error,{type:e,[Iv]:!0},t)}function Mv(e,t){return e instanceof Error&&Iv in e&&(null==t||!!(e.type&t))}const Dv="[^/]+?",Bv={sensitive:!1,strict:!1,start:!0,end:!0},Uv=/[.+*?^${}()[\]/\\]/g;function $v(e,t){let n=0;for(;n<e.length&&n<t.length;){const r=t[n]-e[n];if(r)return r;n++}return e.length<t.length?1===e.length&&80===e[0]?-1:1:e.length>t.length?1===t.length&&80===t[0]?1:-1:0}function Vv(e,t){let n=0;const r=e.score,o=t.score;for(;n<r.length&&n<o.length;){const e=$v(r[n],o[n]);if(e)return e;n++}if(1===Math.abs(o.length-r.length)){if(Hv(r))return 1;if(Hv(o))return-1}return o.length-r.length}function Hv(e){const t=e[e.length-1];return e.length>0&&t[t.length-1]<0}const zv={type:0,value:""},qv=/[a-zA-Z0-9_]/;function Wv(e,t,n){const r=function(e,t){const n=lv({},Bv,t),r=[];let o=n.start?"^":"";const i=[];for(const t of e){const e=t.length?[]:[90];n.strict&&!t.length&&(o+="/");for(let r=0;r<t.length;r++){const s=t[r];let l=40+(n.sensitive?.25:0);if(0===s.type)r||(o+="/"),o+=s.value.replace(Uv,"\\$&"),l+=40;else if(1===s.type){const{value:e,repeatable:n,optional:a,regexp:u}=s;i.push({name:e,repeatable:n,optional:a});const c=u||Dv;if(c!==Dv){l+=10;try{new RegExp(`(${c})`)}catch(t){throw new Error(`Invalid custom RegExp for param "${e}" (${c}): `+t.message)}}let f=n?`((?:${c})(?:/(?:${c}))*)`:`(${c})`;r||(f=a&&t.length<2?`(?:/${f})`:"/"+f),a&&(f+="?"),o+=f,l+=20,a&&(l+=-8),n&&(l+=-20),".*"===c&&(l+=-50)}e.push(l)}r.push(e)}if(n.strict&&n.end){const e=r.length-1;r[e][r[e].length-1]+=.7000000000000001}n.strict||(o+="/?"),n.end?o+="$":n.strict&&(o+="(?:/|$)");const s=new RegExp(o,n.sensitive?"":"i");return{re:s,score:r,keys:i,parse:function(e){const t=e.match(s),n={};if(!t)return null;for(let e=1;e<t.length;e++){const r=t[e]||"",o=i[e-1];n[o.name]=r&&o.repeatable?r.split("/"):r}return n},stringify:function(t){let n="",r=!1;for(const o of e){r&&n.endsWith("/")||(n+="/"),r=!1;for(const e of o)if(0===e.type)n+=e.value;else if(1===e.type){const{value:i,repeatable:s,optional:l}=e,a=i in t?t[i]:"";if(cv(a)&&!s)throw new Error(`Provided param "${i}" is an array but it is not repeatable (* or + modifiers)`);const u=cv(a)?a.join("/"):a;if(!u){if(!l)throw new Error(`Missing required param "${i}"`);o.length<2&&(n.endsWith("/")?n=n.slice(0,-1):r=!0)}n+=u}}return n||"/"}}}(function(e){if(!e)return[[]];if("/"===e)return[[zv]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(e){throw new Error(`ERR (${n})/"${u}": ${e}`)}let n=0,r=n;const o=[];let i;function s(){i&&o.push(i),i=[]}let l,a=0,u="",c="";function f(){u&&(0===n?i.push({type:0,value:u}):1===n||2===n||3===n?(i.length>1&&("*"===l||"+"===l)&&t(`A repeatable param (${u}) must be alone in its segment. eg: '/:ids+.`),i.push({type:1,value:u,regexp:c,repeatable:"*"===l||"+"===l,optional:"*"===l||"?"===l})):t("Invalid state to consume buffer"),u="")}function p(){u+=l}for(;a<e.length;)if(l=e[a++],"\\"!==l||2===n)switch(n){case 0:"/"===l?(u&&f(),s()):":"===l?(f(),n=1):p();break;case 4:p(),n=r;break;case 1:"("===l?n=2:qv.test(l)?p():(f(),n=0,"*"!==l&&"?"!==l&&"+"!==l&&a--);break;case 2:")"===l?"\\"==c[c.length-1]?c=c.slice(0,-1)+l:n=3:c+=l;break;case 3:f(),n=0,"*"!==l&&"?"!==l&&"+"!==l&&a--,c="";break;default:t("Unknown state")}else r=n,n=4;return 2===n&&t(`Unfinished custom RegExp for param "${u}"`),f(),s(),o}(e.path),n);const o=lv(r,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function Kv(e,t){const n=[],r=new Map;function o(e,n,r){const l=!r,a=function(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:Yv(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}}}(e);a.aliasOf=r&&r.record;const u=Zv(t,e),c=[a];if("alias"in e){const t="string"==typeof e.alias?[e.alias]:e.alias;for(const e of t)c.push(lv({},a,{components:r?r.record.components:a.components,path:e,aliasOf:r?r.record:a}))}let f,p;for(const t of c){const{path:c}=t;if(n&&"/"!==c[0]){const e=n.record.path,r="/"===e[e.length-1]?"":"/";t.path=n.record.path+(c&&r+c)}if(f=Wv(t,n,u),r?r.alias.push(f):(p=p||f,p!==f&&p.alias.push(f),l&&e.name&&!Jv(f)&&i(e.name)),a.children){const e=a.children;for(let t=0;t<e.length;t++)o(e[t],f,r&&r.children[t])}r=r||f,(f.record.components&&Object.keys(f.record.components).length||f.record.name||f.record.redirect)&&s(f)}return p?()=>{i(p)}:uv}function i(e){if(Rv(e)){const t=r.get(e);t&&(r.delete(e),n.splice(n.indexOf(t),1),t.children.forEach(i),t.alias.forEach(i))}else{const t=n.indexOf(e);t>-1&&(n.splice(t,1),e.record.name&&r.delete(e.record.name),e.children.forEach(i),e.alias.forEach(i))}}function s(e){let t=0;for(;t<n.length&&Vv(e,n[t])>=0&&(e.record.path!==n[t].record.path||!Xv(e,n[t]));)t++;n.splice(t,0,e),e.record.name&&!Jv(e)&&r.set(e.record.name,e)}return t=Zv({strict:!1,end:!0,sensitive:!1},t),e.forEach((e=>o(e))),{addRoute:o,resolve:function(e,t){let o,i,s,l={};if("name"in e&&e.name){if(o=r.get(e.name),!o)throw Nv(1,{location:e});0,s=o.record.name,l=lv(Gv(t.params,o.keys.filter((e=>!e.optional)).map((e=>e.name))),e.params&&Gv(e.params,o.keys.map((e=>e.name)))),i=o.stringify(l)}else if("path"in e)i=e.path,o=n.find((e=>e.re.test(i))),o&&(l=o.parse(i),s=o.record.name);else{if(o=t.name?r.get(t.name):n.find((e=>e.re.test(t.path))),!o)throw Nv(1,{location:e,currentLocation:t});s=o.record.name,l=lv({},t.params,e.params),i=o.stringify(l)}const a=[];let u=o;for(;u;)a.unshift(u.record),u=u.parent;return{name:s,path:i,params:l,matched:a,meta:Qv(a)}},removeRoute:i,getRoutes:function(){return n},getRecordMatcher:function(e){return r.get(e)}}}function Gv(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function Yv(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const r in e.components)t[r]="object"==typeof n?n[r]:n;return t}function Jv(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Qv(e){return e.reduce(((e,t)=>lv(e,t.meta)),{})}function Zv(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}function Xv(e,t){return t.children.some((t=>t===e||Xv(e,t)))}const eg=/#/g,tg=/&/g,ng=/\//g,rg=/=/g,og=/\?/g,ig=/\+/g,sg=/%5B/g,lg=/%5D/g,ag=/%5E/g,ug=/%60/g,cg=/%7B/g,fg=/%7C/g,pg=/%7D/g,dg=/%20/g;function hg(e){return encodeURI(""+e).replace(fg,"|").replace(sg,"[").replace(lg,"]")}function vg(e){return hg(e).replace(ig,"%2B").replace(dg,"+").replace(eg,"%23").replace(tg,"%26").replace(ug,"`").replace(cg,"{").replace(pg,"}").replace(ag,"^")}function gg(e){return null==e?"":function(e){return hg(e).replace(eg,"%23").replace(og,"%3F")}(e).replace(ng,"%2F")}function mg(e){try{return decodeURIComponent(""+e)}catch(e){}return""+e}function yg(e){const t={};if(""===e||"?"===e)return t;const n=("?"===e[0]?e.slice(1):e).split("&");for(let e=0;e<n.length;++e){const r=n[e].replace(ig," "),o=r.indexOf("="),i=mg(o<0?r:r.slice(0,o)),s=o<0?null:mg(r.slice(o+1));if(i in t){let e=t[i];cv(e)||(e=t[i]=[e]),e.push(s)}else t[i]=s}return t}function bg(e){let t="";for(let n in e){const r=e[n];if(n=vg(n).replace(rg,"%3D"),null==r){void 0!==r&&(t+=(t.length?"&":"")+n);continue}const o=cv(r)?r.map((e=>e&&vg(e))):[r&&vg(r)];o.forEach((e=>{void 0!==e&&(t+=(t.length?"&":"")+n,null!=e&&(t+="="+e))}))}return t}function wg(e){const t={};for(const n in e){const r=e[n];void 0!==r&&(t[n]=cv(r)?r.map((e=>null==e?null:""+e)):null==r?r:""+r)}return t}const _g=Symbol(""),xg=Symbol(""),Sg=Symbol(""),Og=Symbol(""),kg=Symbol("");function Eg(){let e=[];return{add:function(t){return e.push(t),()=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)}},list:()=>e.slice(),reset:function(){e=[]}}}function Cg(e,t,n,r,o){const i=r&&(r.enterCallbacks[o]=r.enterCallbacks[o]||[]);return()=>new Promise(((s,l)=>{const a=e=>{var a;!1===e?l(Nv(4,{from:n,to:t})):e instanceof Error?l(e):"string"==typeof(a=e)||a&&"object"==typeof a?l(Nv(2,{from:t,to:e})):(i&&r.enterCallbacks[o]===i&&"function"==typeof e&&i.push(e),s())},u=e.call(r&&r.instances[o],t,n,a);let c=Promise.resolve(u);e.length<3&&(c=c.then(a)),c.catch((e=>l(e)))}))}function Pg(e,t,n,r){const o=[];for(const s of e){0;for(const e in s.components){let l=s.components[e];if("beforeRouteEnter"===t||s.instances[e])if("object"==typeof(i=l)||"displayName"in i||"props"in i||"__vccOpts"in i){const i=(l.__vccOpts||l)[t];i&&o.push(Cg(i,n,r,s,e))}else{let i=l();0,o.push((()=>i.then((o=>{if(!o)return Promise.reject(new Error(`Couldn't resolve component "${e}" at "${s.path}"`));const i=sv(o)?o.default:o;s.components[e]=i;const l=(i.__vccOpts||i)[t];return l&&Cg(l,n,r,s,e)()}))))}}}var i;return o}function Tg(e){const t=Yo(Sg),n=Yo(Og),r=Rs((()=>t.resolve(Wt(e.to)))),o=Rs((()=>{const{matched:e}=r.value,{length:t}=e,o=e[t-1],i=n.matched;if(!o||!i.length)return-1;const s=i.findIndex(vv.bind(null,o));if(s>-1)return s;const l=jg(e[t-2]);return t>1&&jg(o)===l&&i[i.length-1].path!==l?i.findIndex(vv.bind(null,e[t-2])):s})),i=Rs((()=>o.value>-1&&function(e,t){for(const n in t){const r=t[n],o=e[n];if("string"==typeof r){if(r!==o)return!1}else if(!cv(o)||o.length!==r.length||r.some(((e,t)=>e!==o[t])))return!1}return!0}(n.params,r.value.params))),s=Rs((()=>o.value>-1&&o.value===n.matched.length-1&&gv(n.params,r.value.params)));return{route:r,href:Rs((()=>r.value.href)),isActive:i,isExactActive:s,navigate:function(n={}){return function(e){if(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)return;if(e.defaultPrevented)return;if(void 0!==e.button&&0!==e.button)return;if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}e.preventDefault&&e.preventDefault();return!0}(n)?t[Wt(e.replace)?"replace":"push"](Wt(e.to)).catch(uv):Promise.resolve()}}}const Ag=Lr({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:Tg,setup(e,{slots:t}){const n=kt(Tg(e)),{options:r}=Yo(Sg),o=Rs((()=>({[Rg(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[Rg(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive})));return()=>{const r=t.default&&t.default(n);return e.custom?r:Ls("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},r)}}});function jg(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Rg=(e,t,n)=>null!=e?e:null!=t?t:n;function Lg(e,t){if(!e)return null;const n=e(t);return 1===n.length?n[0]:n}const Ig=Lr({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const r=Yo(kg),o=Rs((()=>e.route||r.value)),i=Yo(xg,0),s=Rs((()=>{let e=Wt(i);const{matched:t}=o.value;let n;for(;(n=t[e])&&!n.components;)e++;return e})),l=Rs((()=>o.value.matched[s.value]));Go(xg,Rs((()=>s.value+1))),Go(_g,l),Go(kg,o);const a=$t();return dr((()=>[a.value,l.value,e.name]),(([e,t,n],[r,o,i])=>{t&&(t.instances[n]=e,o&&o!==t&&e&&e===r&&(t.leaveGuards.size||(t.leaveGuards=o.leaveGuards),t.updateGuards.size||(t.updateGuards=o.updateGuards))),!e||!t||o&&vv(t,o)&&r||(t.enterCallbacks[n]||[]).forEach((t=>t(e)))}),{flush:"post"}),()=>{const r=o.value,i=e.name,s=l.value,u=s&&s.components[i];if(!u)return Lg(n.default,{Component:u,route:r});const c=s.props[i],f=c?!0===c?r.params:"function"==typeof c?c(r):c:null,p=Ls(u,lv({},f,t,{onVnodeUnmounted:e=>{e.component.isUnmounted&&(s.instances[i]=null)},ref:a}));return Lg(n.default,{Component:p,route:r})||p}}});function Fg(){return Yo(Sg)}function Ng(){return Yo(Og)}function Mg(e,t,...n){if(e in t){let r=t[e];return"function"==typeof r?r(...n):r}let r=new Error(`Tried to handle "${e}" but there is no handler defined. Only defined handlers are: ${Object.keys(t).map((e=>`"${e}"`)).join(", ")}.`);throw Error.captureStackTrace&&Error.captureStackTrace(r,Mg),r}var Dg=(e=>(e[e.None=0]="None",e[e.RenderStrategy=1]="RenderStrategy",e[e.Static=2]="Static",e))(Dg||{}),Bg=(e=>(e[e.Unmount=0]="Unmount",e[e.Hidden=1]="Hidden",e))(Bg||{});function Ug({visible:e=!0,features:t=0,ourProps:n,theirProps:r,...o}){var i;let s=Hg(r,n),l=Object.assign(o,{props:s});if(e||2&t&&s.static)return $g(l);if(1&t){return Mg(null==(i=s.unmount)||i?0:1,{0:()=>null,1:()=>$g({...o,props:{...s,hidden:!0,style:{display:"none"}}})})}return $g(l)}function $g({props:e,attrs:t,slots:n,slot:r,name:o}){var i,s;let{as:l,...a}=zg(e,["unmount","static"]),u=null==(i=n.default)?void 0:i.call(n,r),c={};if(r){let e=!1,t=[];for(let[n,o]of Object.entries(r))"boolean"==typeof o&&(e=!0),!0===o&&t.push(n);e&&(c["data-headlessui-state"]=t.join(" "))}if("template"===l){if(u=Vg(null!=u?u:[]),Object.keys(a).length>0||Object.keys(t).length>0){let[e,...n]=null!=u?u:[];if(!function(e){return null!=e&&("string"==typeof e.type||"object"==typeof e.type||"function"==typeof e.type)}(e)||n.length>0)throw new Error(['Passing props on "template"!',"",`The current component <${o} /> is rendering a "template".`,"However we need to passthrough the following props:",Object.keys(a).concat(Object.keys(t)).map((e=>e.trim())).filter(((e,t,n)=>n.indexOf(e)===t)).sort(((e,t)=>e.localeCompare(t))).map((e=>`  - ${e}`)).join("\n"),"","You can apply a few solutions:",['Add an `as="..."` prop, to ensure that we render an actual element instead of a "template".',"Render a single element as the child so that we can forward the props onto that element."].map((e=>`  - ${e}`)).join("\n")].join("\n"));let r=Hg(null!=(s=e.props)?s:{},a),i=es(e,r);for(let e in r)e.startsWith("on")&&(i.props||(i.props={}),i.props[e]=r[e]);return i}return Array.isArray(u)&&1===u.length?u[0]:u}return Ls(l,Object.assign({},a,c),{default:()=>u})}function Vg(e){return e.flatMap((e=>e.type===Ai?Vg(e.children):[e]))}function Hg(...e){if(0===e.length)return{};if(1===e.length)return e[0];let t={},n={};for(let r of e)for(let e in r)e.startsWith("on")&&"function"==typeof r[e]?(null!=n[e]||(n[e]=[]),n[e].push(r[e])):t[e]=r[e];if(t.disabled||t["aria-disabled"])return Object.assign(t,Object.fromEntries(Object.keys(n).map((e=>[e,void 0]))));for(let e in n)Object.assign(t,{[e](t,...r){let o=n[e];for(let e of o){if(t instanceof Event&&t.defaultPrevented)return;e(t,...r)}}});return t}function zg(e,t=[]){let n=Object.assign({},e);for(let e of t)e in n&&delete n[e];return n}let qg=0;function Wg(){return++qg}var Kg=(e=>(e.Space=" ",e.Enter="Enter",e.Escape="Escape",e.Backspace="Backspace",e.Delete="Delete",e.ArrowLeft="ArrowLeft",e.ArrowUp="ArrowUp",e.ArrowRight="ArrowRight",e.ArrowDown="ArrowDown",e.Home="Home",e.End="End",e.PageUp="PageUp",e.PageDown="PageDown",e.Tab="Tab",e))(Kg||{});var Gg=(e=>(e[e.First=0]="First",e[e.Previous=1]="Previous",e[e.Next=2]="Next",e[e.Last=3]="Last",e[e.Specific=4]="Specific",e[e.Nothing=5]="Nothing",e))(Gg||{});function Yg(e,t){let n=t.resolveItems();if(n.length<=0)return null;let r=t.resolveActiveIndex(),o=null!=r?r:-1,i=(()=>{switch(e.focus){case 0:return n.findIndex((e=>!t.resolveDisabled(e)));case 1:{let e=n.slice().reverse().findIndex(((e,n,r)=>!(-1!==o&&r.length-n-1>=o)&&!t.resolveDisabled(e)));return-1===e?e:n.length-1-e}case 2:return n.findIndex(((e,n)=>!(n<=o)&&!t.resolveDisabled(e)));case 3:{let e=n.slice().reverse().findIndex((e=>!t.resolveDisabled(e)));return-1===e?e:n.length-1-e}case 4:return n.findIndex((n=>t.resolveId(n)===e.id));case 5:return null;default:!function(e){throw new Error("Unexpected object: "+e)}(e)}})();return-1===i?r:i}function Jg(e){var t;return null==e||null==e.value?null:null!=(t=e.value.$el)?t:e.value}var Qg=Object.defineProperty,Zg=(e,t,n)=>(((e,t,n)=>{t in e?Qg(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n})(e,"symbol"!=typeof t?t+"":t,n),n);let Xg=new class{constructor(){Zg(this,"current",this.detect()),Zg(this,"currentId",0)}set(e){this.current!==e&&(this.currentId=0,this.current=e)}reset(){this.set(this.detect())}nextId(){return++this.currentId}get isServer(){return"server"===this.current}get isClient(){return"client"===this.current}detect(){return"undefined"==typeof window||"undefined"==typeof document?"server":"client"}};function em(e){if(Xg.isServer)return null;if(e instanceof Node)return e.ownerDocument;if(null!=e&&e.hasOwnProperty("value")){let t=Jg(e);if(t)return t.ownerDocument}return document}let tm=Symbol("Context");var nm=(e=>(e[e.Open=1]="Open",e[e.Closed=2]="Closed",e[e.Closing=4]="Closing",e[e.Opening=8]="Opening",e))(nm||{});function rm(){return Yo(tm,null)}function om(e){Go(tm,e)}function im(e,t){if(e)return e;let n=null!=t?t:"button";return"string"==typeof n&&"button"===n.toLowerCase()?"button":void 0}function sm(e,t){let n=$t(im(e.value.type,e.value.as));return Jr((()=>{n.value=im(e.value.type,e.value.as)})),ur((()=>{var e;n.value||Jg(t)&&Jg(t)instanceof HTMLButtonElement&&(null==(e=Jg(t))||!e.hasAttribute("type"))&&(n.value="button")})),n}let lm=["[contentEditable=true]","[tabindex]","a[href]","area[href]","button:not([disabled])","iframe","input:not([disabled])","select:not([disabled])","textarea:not([disabled])"].map((e=>`${e}:not([tabindex='-1'])`)).join(",");var am=(e=>(e[e.First=1]="First",e[e.Previous=2]="Previous",e[e.Next=4]="Next",e[e.Last=8]="Last",e[e.WrapAround=16]="WrapAround",e[e.NoScroll=32]="NoScroll",e))(am||{}),um=(e=>(e[e.Error=0]="Error",e[e.Overflow=1]="Overflow",e[e.Success=2]="Success",e[e.Underflow=3]="Underflow",e))(um||{}),cm=(e=>(e[e.Previous=-1]="Previous",e[e.Next=1]="Next",e))(cm||{});function fm(e=document.body){return null==e?[]:Array.from(e.querySelectorAll(lm)).sort(((e,t)=>Math.sign((e.tabIndex||Number.MAX_SAFE_INTEGER)-(t.tabIndex||Number.MAX_SAFE_INTEGER))))}var pm=(e=>(e[e.Strict=0]="Strict",e[e.Loose=1]="Loose",e))(pm||{});function dm(e,t=0){var n;return e!==(null==(n=em(e))?void 0:n.body)&&Mg(t,{0:()=>e.matches(lm),1(){let t=e;for(;null!==t;){if(t.matches(lm))return!0;t=t.parentElement}return!1}})}function hm(e){let t=em(e);bn((()=>{t&&!dm(t.activeElement,0)&&gm(e)}))}var vm=(e=>(e[e.Keyboard=0]="Keyboard",e[e.Mouse=1]="Mouse",e))(vm||{});function gm(e){null==e||e.focus({preventScroll:!0})}"undefined"!=typeof window&&"undefined"!=typeof document&&(document.addEventListener("keydown",(e=>{e.metaKey||e.altKey||e.ctrlKey||(document.documentElement.dataset.headlessuiFocusVisible="")}),!0),document.addEventListener("click",(e=>{1===e.detail?delete document.documentElement.dataset.headlessuiFocusVisible:0===e.detail&&(document.documentElement.dataset.headlessuiFocusVisible="")}),!0));let mm=["textarea","input"].join(",");function ym(e,t=(e=>e)){return e.slice().sort(((e,n)=>{let r=t(e),o=t(n);if(null===r||null===o)return 0;let i=r.compareDocumentPosition(o);return i&Node.DOCUMENT_POSITION_FOLLOWING?-1:i&Node.DOCUMENT_POSITION_PRECEDING?1:0}))}function bm(e,t,{sorted:n=!0,relativeTo:r=null,skipElements:o=[]}={}){var i;let s=null!=(i=Array.isArray(e)?e.length>0?e[0].ownerDocument:document:null==e?void 0:e.ownerDocument)?i:document,l=Array.isArray(e)?n?ym(e):e:fm(e);o.length>0&&l.length>1&&(l=l.filter((e=>!o.includes(e)))),r=null!=r?r:s.activeElement;let a,u=(()=>{if(5&t)return 1;if(10&t)return-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),c=(()=>{if(1&t)return 0;if(2&t)return Math.max(0,l.indexOf(r))-1;if(4&t)return Math.max(0,l.indexOf(r))+1;if(8&t)return l.length-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),f=32&t?{preventScroll:!0}:{},p=0,d=l.length;do{if(p>=d||p+d<=0)return 0;let e=c+p;if(16&t)e=(e+d)%d;else{if(e<0)return 3;if(e>=d)return 1}a=l[e],null==a||a.focus(f),p+=u}while(a!==s.activeElement);return 6&t&&function(e){var t,n;return null!=(n=null==(t=null==e?void 0:e.matches)?void 0:t.call(e,mm))&&n}(a)&&a.select(),2}function wm(e,t,n){Xg.isServer||ur((r=>{document.addEventListener(e,t,n),r((()=>document.removeEventListener(e,t,n)))}))}function _m(e,t,n){Xg.isServer||ur((r=>{window.addEventListener(e,t,n),r((()=>window.removeEventListener(e,t,n)))}))}function xm(e,t,n=Rs((()=>!0))){function r(r,o){if(!n.value||r.defaultPrevented)return;let i=o(r);if(null===i||!i.getRootNode().contains(i))return;let s=function e(t){return"function"==typeof t?e(t()):Array.isArray(t)||t instanceof Set?t:[t]}(e);for(let e of s){if(null===e)continue;let t=e instanceof HTMLElement?e:Jg(e);if(null!=t&&t.contains(i)||r.composed&&r.composedPath().includes(t))return}return!dm(i,pm.Loose)&&-1!==i.tabIndex&&r.preventDefault(),t(r,i)}let o=$t(null);wm("pointerdown",(e=>{var t,r;n.value&&(o.value=(null==(r=null==(t=e.composedPath)?void 0:t.call(e))?void 0:r[0])||e.target)}),!0),wm("mousedown",(e=>{var t,r;n.value&&(o.value=(null==(r=null==(t=e.composedPath)?void 0:t.call(e))?void 0:r[0])||e.target)}),!0),wm("click",(e=>{o.value&&(r(e,(()=>o.value)),o.value=null)}),!0),wm("touchend",(e=>r(e,(()=>e.target instanceof HTMLElement?e.target:null))),!0),_m("blur",(e=>r(e,(()=>window.document.activeElement instanceof HTMLIFrameElement?window.document.activeElement:null))),!0)}function Sm(e){return[e.screenX,e.screenY]}function Om(){let e=$t([-1,-1]);return{wasMoved(t){let n=Sm(t);return(e.value[0]!==n[0]||e.value[1]!==n[1])&&(e.value=n,!0)},update(t){e.value=Sm(t)}}}let km=/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g;function Em(e){var t,n;let r=null!=(t=e.innerText)?t:"",o=e.cloneNode(!0);if(!(o instanceof HTMLElement))return r;let i=!1;for(let e of o.querySelectorAll('[hidden],[aria-hidden],[role="img"]'))e.remove(),i=!0;let s=i?null!=(n=o.innerText)?n:"":r;return km.test(s)&&(s=s.replace(km,"")),s}function Cm(e){let t=$t(""),n=$t("");return()=>{let r=Jg(e);if(!r)return"";let o=r.innerText;if(t.value===o)return n.value;let i=function(e){let t=e.getAttribute("aria-label");if("string"==typeof t)return t.trim();let n=e.getAttribute("aria-labelledby");if(n){let e=n.split(" ").map((e=>{let t=document.getElementById(e);if(t){let e=t.getAttribute("aria-label");return"string"==typeof e?e.trim():Em(t).trim()}return null})).filter(Boolean);if(e.length>0)return e.join(", ")}return Em(e).trim()}(r).trim().toLowerCase();return t.value=o,n.value=i,i}}var Pm=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(Pm||{}),Tm=(e=>(e[e.Pointer=0]="Pointer",e[e.Other=1]="Other",e))(Tm||{});let Am=Symbol("MenuContext");function jm(e){let t=Yo(Am,null);if(null===t){let t=new Error(`<${e} /> is missing a parent <Menu /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,jm),t}return t}let Rm=Lr({name:"Menu",props:{as:{type:[Object,String],default:"template"}},setup(e,{slots:t,attrs:n}){let r=$t(1),o=$t(null),i=$t(null),s=$t([]),l=$t(""),a=$t(null),u=$t(1);function c(e=(e=>e)){let t=null!==a.value?s.value[a.value]:null,n=ym(e(s.value.slice()),(e=>Jg(e.dataRef.domRef))),r=t?n.indexOf(t):null;return-1===r&&(r=null),{items:n,activeItemIndex:r}}let f={menuState:r,buttonRef:o,itemsRef:i,items:s,searchQuery:l,activeItemIndex:a,activationTrigger:u,closeMenu:()=>{r.value=1,a.value=null},openMenu:()=>r.value=0,goToItem(e,t,n){let r=c(),o=Yg(e===Gg.Specific?{focus:Gg.Specific,id:t}:{focus:e},{resolveItems:()=>r.items,resolveActiveIndex:()=>r.activeItemIndex,resolveId:e=>e.id,resolveDisabled:e=>e.dataRef.disabled});l.value="",a.value=o,u.value=null!=n?n:1,s.value=r.items},search(e){let t=""!==l.value?0:1;l.value+=e.toLowerCase();let n=(null!==a.value?s.value.slice(a.value+t).concat(s.value.slice(0,a.value+t)):s.value).find((e=>e.dataRef.textValue.startsWith(l.value)&&!e.dataRef.disabled)),r=n?s.value.indexOf(n):-1;-1===r||r===a.value||(a.value=r,u.value=1)},clearSearch(){l.value=""},registerItem(e,t){let n=c((n=>[...n,{id:e,dataRef:t}]));s.value=n.items,a.value=n.activeItemIndex,u.value=1},unregisterItem(e){let t=c((t=>{let n=t.findIndex((t=>t.id===e));return-1!==n&&t.splice(n,1),t}));s.value=t.items,a.value=t.activeItemIndex,u.value=1}};return xm([o,i],((e,t)=>{var n;f.closeMenu(),dm(t,pm.Loose)||(e.preventDefault(),null==(n=Jg(o))||n.focus())}),Rs((()=>0===r.value))),Go(Am,f),om(Rs((()=>Mg(r.value,{0:nm.Open,1:nm.Closed})))),()=>{let o={open:0===r.value,close:f.closeMenu};return Ug({ourProps:{},theirProps:e,slot:o,slots:t,attrs:n,name:"Menu"})}}}),Lm=Lr({name:"MenuButton",props:{disabled:{type:Boolean,default:!1},as:{type:[Object,String],default:"button"},id:{type:String,default:()=>`headlessui-menu-button-${Wg()}`}},setup(e,{attrs:t,slots:n,expose:r}){let o=jm("MenuButton");function i(e){switch(e.key){case Kg.Space:case Kg.Enter:case Kg.ArrowDown:e.preventDefault(),e.stopPropagation(),o.openMenu(),bn((()=>{var e;null==(e=Jg(o.itemsRef))||e.focus({preventScroll:!0}),o.goToItem(Gg.First)}));break;case Kg.ArrowUp:e.preventDefault(),e.stopPropagation(),o.openMenu(),bn((()=>{var e;null==(e=Jg(o.itemsRef))||e.focus({preventScroll:!0}),o.goToItem(Gg.Last)}))}}function s(e){if(e.key===Kg.Space)e.preventDefault()}function l(t){e.disabled||(0===o.menuState.value?(o.closeMenu(),bn((()=>{var e;return null==(e=Jg(o.buttonRef))?void 0:e.focus({preventScroll:!0})}))):(t.preventDefault(),o.openMenu(),function(e){requestAnimationFrame((()=>requestAnimationFrame(e)))}((()=>{var e;return null==(e=Jg(o.itemsRef))?void 0:e.focus({preventScroll:!0})}))))}r({el:o.buttonRef,$el:o.buttonRef});let a=sm(Rs((()=>({as:e.as,type:t.type}))),o.buttonRef);return()=>{var r;let u={open:0===o.menuState.value},{id:c,...f}=e;return Ug({ourProps:{ref:o.buttonRef,id:c,type:a.value,"aria-haspopup":"menu","aria-controls":null==(r=Jg(o.itemsRef))?void 0:r.id,"aria-expanded":0===o.menuState.value,onKeydown:i,onKeyup:s,onClick:l},theirProps:f,slot:u,attrs:t,slots:n,name:"MenuButton"})}}}),Im=Lr({name:"MenuItems",props:{as:{type:[Object,String],default:"div"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},id:{type:String,default:()=>`headlessui-menu-items-${Wg()}`}},setup(e,{attrs:t,slots:n,expose:r}){let o=jm("MenuItems"),i=$t(null);function s(e){var t;switch(i.value&&clearTimeout(i.value),e.key){case Kg.Space:if(""!==o.searchQuery.value)return e.preventDefault(),e.stopPropagation(),o.search(e.key);case Kg.Enter:if(e.preventDefault(),e.stopPropagation(),null!==o.activeItemIndex.value){null==(t=Jg(o.items.value[o.activeItemIndex.value].dataRef.domRef))||t.click()}o.closeMenu(),hm(Jg(o.buttonRef));break;case Kg.ArrowDown:return e.preventDefault(),e.stopPropagation(),o.goToItem(Gg.Next);case Kg.ArrowUp:return e.preventDefault(),e.stopPropagation(),o.goToItem(Gg.Previous);case Kg.Home:case Kg.PageUp:return e.preventDefault(),e.stopPropagation(),o.goToItem(Gg.First);case Kg.End:case Kg.PageDown:return e.preventDefault(),e.stopPropagation(),o.goToItem(Gg.Last);case Kg.Escape:e.preventDefault(),e.stopPropagation(),o.closeMenu(),bn((()=>{var e;return null==(e=Jg(o.buttonRef))?void 0:e.focus({preventScroll:!0})}));break;case Kg.Tab:e.preventDefault(),e.stopPropagation(),o.closeMenu(),bn((()=>function(e,t){return bm(fm(),t,{relativeTo:e})}(Jg(o.buttonRef),e.shiftKey?am.Previous:am.Next)));break;default:1===e.key.length&&(o.search(e.key),i.value=setTimeout((()=>o.clearSearch()),350))}}function l(e){if(e.key===Kg.Space)e.preventDefault()}r({el:o.itemsRef,$el:o.itemsRef}),function({container:e,accept:t,walk:n,enabled:r}){ur((()=>{let o=e.value;if(!o||void 0!==r&&!r.value)return;let i=em(e);if(!i)return;let s=Object.assign((e=>t(e)),{acceptNode:t}),l=i.createTreeWalker(o,NodeFilter.SHOW_ELEMENT,s,!1);for(;l.nextNode();)n(l.currentNode)}))}({container:Rs((()=>Jg(o.itemsRef))),enabled:Rs((()=>0===o.menuState.value)),accept:e=>"menuitem"===e.getAttribute("role")?NodeFilter.FILTER_REJECT:e.hasAttribute("role")?NodeFilter.FILTER_SKIP:NodeFilter.FILTER_ACCEPT,walk(e){e.setAttribute("role","none")}});let a=rm(),u=Rs((()=>null!==a?(a.value&nm.Open)===nm.Open:0===o.menuState.value));return()=>{var r,i;let a={open:0===o.menuState.value},{id:c,...f}=e;return Ug({ourProps:{"aria-activedescendant":null===o.activeItemIndex.value||null==(r=o.items.value[o.activeItemIndex.value])?void 0:r.id,"aria-labelledby":null==(i=Jg(o.buttonRef))?void 0:i.id,id:c,onKeydown:s,onKeyup:l,role:"menu",tabIndex:0,ref:o.itemsRef},theirProps:f,slot:a,attrs:t,slots:n,features:Dg.RenderStrategy|Dg.Static,visible:u.value,name:"MenuItems"})}}}),Fm=Lr({name:"MenuItem",inheritAttrs:!1,props:{as:{type:[Object,String],default:"template"},disabled:{type:Boolean,default:!1},id:{type:String,default:()=>`headlessui-menu-item-${Wg()}`}},setup(e,{slots:t,attrs:n,expose:r}){let o=jm("MenuItem"),i=$t(null);r({el:i,$el:i});let s=Rs((()=>null!==o.activeItemIndex.value&&o.items.value[o.activeItemIndex.value].id===e.id)),l=Cm(i),a=Rs((()=>({disabled:e.disabled,get textValue(){return l()},domRef:i})));function u(t){if(e.disabled)return t.preventDefault();o.closeMenu(),hm(Jg(o.buttonRef))}function c(){if(e.disabled)return o.goToItem(Gg.Nothing);o.goToItem(Gg.Specific,e.id)}Jr((()=>o.registerItem(e.id,a))),eo((()=>o.unregisterItem(e.id))),ur((()=>{0===o.menuState.value&&s.value&&0!==o.activationTrigger.value&&bn((()=>{var e,t;return null==(t=null==(e=Jg(i))?void 0:e.scrollIntoView)?void 0:t.call(e,{block:"nearest"})}))}));let f=Om();function p(e){f.update(e)}function d(t){f.wasMoved(t)&&(e.disabled||s.value||o.goToItem(Gg.Specific,e.id,0))}function h(t){f.wasMoved(t)&&(e.disabled||s.value&&o.goToItem(Gg.Nothing))}return()=>{let{disabled:r}=e,l={active:s.value,disabled:r,close:o.closeMenu},{id:a,...f}=e;return Ug({ourProps:{id:a,ref:i,role:"menuitem",tabIndex:!0===r?void 0:-1,"aria-disabled":!0===r||void 0,disabled:void 0,onClick:u,onFocus:c,onPointerenter:p,onMouseenter:p,onPointermove:d,onMousemove:d,onPointerleave:h,onMouseleave:h},theirProps:{...n,...f},slot:l,attrs:n,slots:t,name:"MenuItem"})}}});function Nm(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[Ji("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M6 18L18 6M6 6l12 12"})])}function Mm(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[Ji("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M10.5 19.5L3 12m0 0l7.5-7.5M3 12h18"})])}function Dm(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[Ji("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z"})])}function Bm(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[Ji("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0"})])}function Um(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[Ji("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M2.25 12.75V12A2.25 2.25 0 014.5 9.75h15A2.25 2.25 0 0121.75 12v.75m-8.69-6.44l-2.12-2.12a1.5 1.5 0 00-1.061-.44H4.5A2.25 2.25 0 002.25 6v12a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9a2.25 2.25 0 00-2.25-2.25h-5.379a1.5 1.5 0 01-1.06-.44z"})])}function $m(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[Ji("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M3.75 9.776c.112-.017.227-.026.344-.026h15.812c.117 0 .232.009.344.026m-16.5 0a2.25 2.25 0 00-1.883 2.542l.857 6a2.25 2.25 0 002.227 1.932H19.05a2.25 2.25 0 002.227-1.932l.857-6a2.25 2.25 0 00-1.883-2.542m-16.5 0V6A2.25 2.25 0 016 3.75h3.879a1.5 1.5 0 011.06.44l2.122 2.12a1.5 1.5 0 001.06.44H18A2.25 2.25 0 0120.25 9v.776"})])}function Vm(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[Ji("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M8.25 4.5l7.5 7.5-7.5 7.5"})])}function Hm(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[Ji("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M12 6.75a.75.75 0 110-1.5.75.75 0 010 1.5zM12 12.75a.75.75 0 110-1.5.75.75 0 010 1.5zM12 18.75a.75.75 0 110-1.5.75.75 0 010 1.5z"})])}function zm(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[Ji("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M20.25 6.375c0 2.278-3.694 4.125-8.25 4.125S3.75 8.653 3.75 6.375m16.5 0c0-2.278-3.694-4.125-8.25-4.125S3.75 4.097 3.75 6.375m16.5 0v11.25c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125V6.375m16.5 0v3.75m-16.5-3.75v3.75m16.5 0v3.75C20.25 16.153 16.556 18 12 18s-8.25-1.847-8.25-4.125v-3.75m16.5 0c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125"})])}function qm(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[Ji("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0l3.181 3.183a8.25 8.25 0 0013.803-3.7M4.031 9.865a8.25 8.25 0 0113.803-3.7l3.181 3.182m0-4.991v4.99"})])}var Wm=pd({id:"hosts",state:function(){return{selectedHostIdentifier:null}},getters:{supportsHosts:function(){return LogViewer.supports_hosts},hosts:function(){return LogViewer.hosts||[]},hasRemoteHosts:function(){return this.hosts.some((function(e){return e.is_remote}))},selectedHost:function(){var e=this;return this.hosts.find((function(t){return t.identifier===e.selectedHostIdentifier}))},localHost:function(){return this.hosts.find((function(e){return!e.is_remote}))},hostQueryParam:function(){return this.selectedHost&&this.selectedHost.is_remote?this.selectedHost.identifier:void 0}},actions:{selectHost:function(e){var t;this.supportsHosts||(e=null),"string"==typeof e&&(e=this.hosts.find((function(t){return t.identifier===e}))),e||(e=this.hosts.find((function(e){return!e.is_remote}))),this.selectedHostIdentifier=(null===(t=e)||void 0===t?void 0:t.identifier)||null}}});var Km;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;const Gm="undefined"!=typeof window,Ym=(Object.prototype.toString,e=>"function"==typeof e),Jm=e=>"string"==typeof e,Qm=()=>{};Gm&&(null==(Km=null==window?void 0:window.navigator)?void 0:Km.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent);function Zm(e){return"function"==typeof e?e():Wt(e)}function Xm(e,t){return function(...n){return new Promise(((r,o)=>{Promise.resolve(e((()=>t.apply(this,n)),{fn:t,thisArg:this,args:n})).then(r).catch(o)}))}}const ey=e=>e();function ty(e){return!!ge()&&(me(e),!0)}Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;var ny=Object.getOwnPropertySymbols,ry=Object.prototype.hasOwnProperty,oy=Object.prototype.propertyIsEnumerable,iy=(e,t)=>{var n={};for(var r in e)ry.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&ny)for(var r of ny(e))t.indexOf(r)<0&&oy.call(e,r)&&(n[r]=e[r]);return n};function sy(e,t,n={}){const r=n,{eventFilter:o=ey}=r,i=iy(r,["eventFilter"]);return dr(e,Xm(o,t),i)}Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;var ly=Object.defineProperty,ay=Object.defineProperties,uy=Object.getOwnPropertyDescriptors,cy=Object.getOwnPropertySymbols,fy=Object.prototype.hasOwnProperty,py=Object.prototype.propertyIsEnumerable,dy=(e,t,n)=>t in e?ly(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,hy=(e,t)=>{for(var n in t||(t={}))fy.call(t,n)&&dy(e,n,t[n]);if(cy)for(var n of cy(t))py.call(t,n)&&dy(e,n,t[n]);return e},vy=(e,t)=>ay(e,uy(t)),gy=(e,t)=>{var n={};for(var r in e)fy.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&cy)for(var r of cy(e))t.indexOf(r)<0&&py.call(e,r)&&(n[r]=e[r]);return n};function my(e,t,n={}){const r=n,{eventFilter:o}=r,i=gy(r,["eventFilter"]),{eventFilter:s,pause:l,resume:a,isActive:u}=function(e=ey){const t=$t(!0);return{isActive:Ct(t),pause:function(){t.value=!1},resume:function(){t.value=!0},eventFilter:(...n)=>{t.value&&e(...n)}}}(o);return{stop:sy(e,t,vy(hy({},i),{eventFilter:s})),pause:l,resume:a,isActive:u}}Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;function yy(e){var t;const n=Zm(e);return null!=(t=null==n?void 0:n.$el)?t:n}const by=Gm?window:void 0;Gm&&window.document,Gm&&window.navigator,Gm&&window.location;function wy(...e){let t,n,r,o;if(Jm(e[0])||Array.isArray(e[0])?([n,r,o]=e,t=by):[t,n,r,o]=e,!t)return Qm;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const i=[],s=()=>{i.forEach((e=>e())),i.length=0},l=dr((()=>[yy(t),Zm(o)]),(([e,t])=>{s(),e&&i.push(...n.flatMap((n=>r.map((r=>((e,t,n,r)=>(e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)))(e,n,r,t))))))}),{immediate:!0,flush:"post"}),a=()=>{l(),s()};return ty(a),a}Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;const _y="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},xy="__vueuse_ssr_handlers__";_y[xy]=_y[xy]||{};const Sy=_y[xy];function Oy(e,t){return Sy[e]||t}function ky(e){return null==e?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":"boolean"==typeof e?"boolean":"string"==typeof e?"string":"object"==typeof e?"object":Number.isNaN(e)?"any":"number"}var Ey=Object.defineProperty,Cy=Object.getOwnPropertySymbols,Py=Object.prototype.hasOwnProperty,Ty=Object.prototype.propertyIsEnumerable,Ay=(e,t,n)=>t in e?Ey(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,jy=(e,t)=>{for(var n in t||(t={}))Py.call(t,n)&&Ay(e,n,t[n]);if(Cy)for(var n of Cy(t))Ty.call(t,n)&&Ay(e,n,t[n]);return e};const Ry={boolean:{read:e=>"true"===e,write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},Ly="vueuse-storage";function Iy(e,t,n,r={}){var o;const{flush:i="pre",deep:s=!0,listenToStorageChanges:l=!0,writeDefaults:a=!0,mergeDefaults:u=!1,shallow:c,window:f=by,eventFilter:p,onError:d=(e=>{})}=r,h=(c?Vt:$t)(t);if(!n)try{n=Oy("getDefaultStorage",(()=>{var e;return null==(e=by)?void 0:e.localStorage}))()}catch(e){d(e)}if(!n)return h;const v=Zm(t),g=ky(v),m=null!=(o=r.serializer)?o:Ry[g],{pause:y,resume:b}=my(h,(()=>function(t){try{if(null==t)n.removeItem(e);else{const r=m.write(t),o=n.getItem(e);o!==r&&(n.setItem(e,r),f&&f.dispatchEvent(new CustomEvent(Ly,{detail:{key:e,oldValue:o,newValue:r,storageArea:n}})))}}catch(e){d(e)}}(h.value)),{flush:i,deep:s,eventFilter:p});return f&&l&&(wy(f,"storage",w),wy(f,Ly,(function(e){w(e.detail)}))),w(),h;function w(t){if(!t||t.storageArea===n)if(t&&null==t.key)h.value=v;else if(!t||t.key===e){y();try{h.value=function(t){const r=t?t.newValue:n.getItem(e);if(null==r)return a&&null!==v&&n.setItem(e,m.write(v)),v;if(!t&&u){const e=m.read(r);return Ym(u)?u(e,v):"object"!==g||Array.isArray(e)?e:jy(jy({},v),e)}return"string"!=typeof r?r:m.read(r)}(t)}catch(e){d(e)}finally{t?bn(b):b()}}}}Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;new Map;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;function Fy(e,t,n={}){const{window:r=by}=n;return Iy(e,t,null==r?void 0:r.localStorage,n)}Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;var Ny,My;(My=Ny||(Ny={})).UP="UP",My.RIGHT="RIGHT",My.DOWN="DOWN",My.LEFT="LEFT",My.NONE="NONE";Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;var Dy=Object.defineProperty,By=Object.getOwnPropertySymbols,Uy=Object.prototype.hasOwnProperty,$y=Object.prototype.propertyIsEnumerable,Vy=(e,t,n)=>t in e?Dy(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;((e,t)=>{for(var n in t||(t={}))Uy.call(t,n)&&Vy(e,n,t[n]);if(By)for(var n of By(t))$y.call(t,n)&&Vy(e,n,t[n])})({linear:function(e){return e}},{easeInSine:[.12,0,.39,0],easeOutSine:[.61,1,.88,1],easeInOutSine:[.37,0,.63,1],easeInQuad:[.11,0,.5,0],easeOutQuad:[.5,1,.89,1],easeInOutQuad:[.45,0,.55,1],easeInCubic:[.32,0,.67,0],easeOutCubic:[.33,1,.68,1],easeInOutCubic:[.65,0,.35,1],easeInQuart:[.5,0,.75,0],easeOutQuart:[.25,1,.5,1],easeInOutQuart:[.76,0,.24,1],easeInQuint:[.64,0,.78,0],easeOutQuint:[.22,1,.36,1],easeInOutQuint:[.83,0,.17,1],easeInExpo:[.7,0,.84,0],easeOutExpo:[.16,1,.3,1],easeInOutExpo:[.87,0,.13,1],easeInCirc:[.55,0,1,.45],easeOutCirc:[0,.55,.45,1],easeInOutCirc:[.85,0,.15,1],easeInBack:[.36,0,.66,-.56],easeOutBack:[.34,1.56,.64,1],easeInOutBack:[.68,-.6,.32,1.6]});var Hy=pd({id:"search",state:function(){return{query:"",searchMoreRoute:null,searching:!1,percentScanned:0,error:null}},getters:{hasQuery:function(e){return""!==String(e.query).trim()}},actions:{init:function(){this.checkSearchProgress()},setQuery:function(e){this.query=e},update:function(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0;this.query=e,this.error=t&&""!==t?t:null,this.searchMoreRoute=n,this.searching=r,this.percentScanned=o,this.searching&&this.checkSearchProgress()},checkSearchProgress:function(){var e=this,t=this.query;if(""!==t){var n="?"+new URLSearchParams({query:t});ov.get(this.searchMoreRoute+n).then((function(n){var r=n.data;if(e.query===t){var o=e.searching;e.searching=r.hasMoreResults,e.percentScanned=r.percentScanned,e.searching?e.checkSearchProgress():o&&!e.searching&&window.dispatchEvent(new CustomEvent("reload-results"))}}))}}}}),zy=pd({id:"pagination",state:function(){return{page:1,pagination:{}}},getters:{currentPage:function(e){return 1!==e.page?Number(e.page):null},links:function(e){var t;return((null===(t=e.pagination)||void 0===t?void 0:t.links)||[]).slice(1,-1)},linksShort:function(e){var t;return((null===(t=e.pagination)||void 0===t?void 0:t.links_short)||[]).slice(1,-1)},hasPages:function(e){var t;return(null===(t=e.pagination)||void 0===t?void 0:t.last_page)>1},hasMorePages:function(e){var t;return null!==(null===(t=e.pagination)||void 0===t?void 0:t.next_page_url)}},actions:{setPagination:function(e){var t,n;(this.pagination=e,(null===(t=this.pagination)||void 0===t?void 0:t.last_page)<this.page)&&(this.page=null===(n=this.pagination)||void 0===n?void 0:n.last_page)},setPage:function(e){this.page=Number(e)}}}),qy=pd({id:"severity",state:function(){return{allLevels:[],excludedLevels:Fy("excludedLevels",[]),levelCounts:[]}},getters:{levelsFound:function(e){return(e.levelCounts||[]).filter((function(e){return e.count>0}))},totalResults:function(){return this.levelsFound.reduce((function(e,t){return e+t.count}),0)},levelsSelected:function(){return this.levelsFound.filter((function(e){return e.selected}))},totalResultsSelected:function(){return this.levelsSelected.reduce((function(e,t){return e+t.count}),0)}},actions:{setLevelCounts:function(e){e.hasOwnProperty("length")?this.levelCounts=e:this.levelCounts=Object.values(e),this.allLevels=e.map((function(e){return e.level}))},selectAllLevels:function(){this.excludedLevels=[],this.levelCounts.forEach((function(e){return e.selected=!0}))},deselectAllLevels:function(){this.excludedLevels=this.allLevels,this.levelCounts.forEach((function(e){return e.selected=!1}))},toggleLevel:function(e){var t=this.levelCounts.find((function(t){return t.level===e}))||{};this.excludedLevels.includes(e)?(this.excludedLevels=this.excludedLevels.filter((function(t){return t!==e})),t.selected=!0):(this.excludedLevels.push(e),t.selected=!1)}}}),Wy=n(486),Ky={System:"System",Light:"Light",Dark:"Dark"},Gy=[{label:"Datetime",data_key:"datetime"},{label:"Severity",data_key:"level"},{label:"Message",data_key:"message"}],Yy=pd({id:"logViewer",state:function(){return{theme:Fy("logViewerTheme",Ky.System),shorterStackTraces:Fy("logViewerShorterStackTraces",!1),direction:Fy("logViewerDirection","desc"),resultsPerPage:Fy("logViewerResultsPerPage",25),helpSlideOverOpen:!1,loading:!1,error:null,logs:[],columns:Gy,levelCounts:[],performance:{},hasMoreResults:!1,percentScanned:100,abortController:null,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight,stacksOpen:[],stacksInView:[],stackTops:{},containerTop:0,showLevelsDropdown:!0}},getters:{selectedFile:function(){return nb().selectedFile},isOpen:function(e){return function(t){return e.stacksOpen.includes(t)}},isMobile:function(e){return e.viewportWidth<=1023},tableRowHeight:function(){return this.isMobile?29:36},headerHeight:function(){return this.isMobile?0:36},shouldBeSticky:function(e){var t=this;return function(n){return t.isOpen(n)&&e.stacksInView.includes(n)}},stickTopPosition:function(){var e=this;return function(t){var n=e.pixelsAboveFold(t);return n<0?Math.max(e.headerHeight-e.tableRowHeight,e.headerHeight+n)+"px":e.headerHeight+"px"}},pixelsAboveFold:function(e){var t=this;return function(n){var r=document.getElementById("tbody-"+n);if(!r)return!1;var o=r.getClientRects()[0];return o.top+o.height-t.tableRowHeight-t.headerHeight-e.containerTop}},isInViewport:function(){var e=this;return function(t){return e.pixelsAboveFold(t)>-e.tableRowHeight}}},actions:{setViewportDimensions:function(e,t){this.viewportWidth=e,this.viewportHeight=t;var n=document.querySelector(".log-item-container");n&&(this.containerTop=n.getBoundingClientRect().top)},toggleTheme:function(){switch(this.theme){case Ky.System:this.theme=Ky.Light;break;case Ky.Light:this.theme=Ky.Dark;break;default:this.theme=Ky.System}this.syncTheme()},syncTheme:function(){var e=this.theme;e===Ky.Dark||e===Ky.System&&window.matchMedia("(prefers-color-scheme: dark)").matches?document.documentElement.classList.add("dark"):document.documentElement.classList.remove("dark")},toggle:function(e){this.isOpen(e)?this.stacksOpen=this.stacksOpen.filter((function(t){return t!==e})):this.stacksOpen.push(e),this.onScroll()},onScroll:function(){var e=this;this.stacksOpen.forEach((function(t){e.isInViewport(t)?(e.stacksInView.includes(t)||e.stacksInView.push(t),e.stackTops[t]=e.stickTopPosition(t)):(e.stacksInView=e.stacksInView.filter((function(e){return e!==t})),delete e.stackTops[t])}))},reset:function(){this.stacksOpen=[],this.stacksInView=[],this.stackTops={};var e=document.querySelector(".log-item-container");e&&(this.containerTop=e.getBoundingClientRect().top,e.scrollTo(0,0))},loadLogs:(0,Wy.debounce)((function(){var e,t=this,n=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).silently,r=void 0!==n&&n,o=Wm(),i=nb(),s=Hy(),l=zy(),a=qy();if(0!==i.folders.length&&(this.abortController&&this.abortController.abort(),this.selectedFile||s.hasQuery)){this.abortController=new AbortController;var u={host:o.hostQueryParam,file:null===(e=this.selectedFile)||void 0===e?void 0:e.identifier,direction:this.direction,query:s.query,page:l.currentPage,per_page:this.resultsPerPage,exclude_levels:It(a.excludedLevels.length>0?a.excludedLevels:""),exclude_file_types:It(i.fileTypesExcluded.length>0?i.fileTypesExcluded:""),shorter_stack_traces:this.shorterStackTraces};r||(this.loading=!0),ov.get("".concat(LogViewer.basePath,"/api/logs"),{params:u,signal:this.abortController.signal}).then((function(e){var n=e.data;t.logs=u.host?n.logs.map((function(e){var t={host:u.host,file:e.file_identifier,query:"log-index:".concat(e.index)};return e.url="".concat(window.location.host).concat(LogViewer.basePath,"?").concat(new URLSearchParams(t)),e})):n.logs,t.columns=n.columns||Gy,t.hasMoreResults=n.hasMoreResults,t.percentScanned=n.percentScanned,t.error=n.error||null,t.performance=n.performance||{},a.setLevelCounts(n.levelCounts),l.setPagination(n.pagination),t.loading=!1,r||bn((function(){t.reset(),n.expandAutomatically&&t.stacksOpen.push(0)})),t.hasMoreResults&&t.loadLogs({silently:!0})})).catch((function(e){var n;if("ERR_CANCELED"===e.code)return t.hasMoreResults=!1,void(t.percentScanned=100);t.loading=!1,t.error=e.message,null!==(n=e.response)&&void 0!==n&&null!==(n=n.data)&&void 0!==n&&n.message&&(t.error+=": "+e.response.data.message)}))}}),10)}});function Jy(e){return Jy="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Jy(e)}function Qy(e){return function(e){if(Array.isArray(e))return Zy(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return Zy(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Zy(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Zy(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function Xy(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function eb(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Xy(Object(n),!0).forEach((function(t){tb(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Xy(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function tb(e,t,n){return(t=function(e){var t=function(e,t){if("object"!==Jy(e)||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!==Jy(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===Jy(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var nb=pd({id:"files",state:function(){return{folders:[],direction:Fy("fileViewerDirection","desc"),selectedFileIdentifier:null,fileTypesAvailable:[],selectedFileTypes:Fy("selectedFileTypes",[]),error:null,clearingCache:{},cacheRecentlyCleared:{},deleting:{},abortController:null,loading:!1,checkBoxesVisibility:!1,filesChecked:[],openFolderIdentifiers:[],foldersInView:[],containerTop:0,sidebarOpen:!1}},getters:{selectedHost:function(){return Wm().selectedHost},hostQueryParam:function(){return Wm().hostQueryParam},filteredFolders:function(e){return e.folders.map((function(t){return eb(eb({},t),{},{files:t.files.filter((function(t){return e.selectedFileTypes.includes(t.type.value)}))})})).filter((function(e){return e.files.length>0}))},files:function(e){return e.folders.flatMap((function(e){return e.files}))},selectedFile:function(e){return e.files.find((function(t){return t.identifier===e.selectedFileIdentifier}))},foldersOpen:function(e){return e.openFolderIdentifiers.map((function(t){return e.folders.find((function(e){return e.identifier===t}))}))},isOpen:function(){var e=this;return function(t){return e.foldersOpen.map((function(e){return e.identifier})).includes(t.identifier)}},isChecked:function(e){return function(t){return e.filesChecked.includes("string"==typeof t?t:t.identifier)}},shouldBeSticky:function(e){var t=this;return function(n){return t.isOpen(n)&&e.foldersInView.map((function(e){return e.identifier})).includes(n.identifier)}},isInViewport:function(){var e=this;return function(t){return e.pixelsAboveFold(t)>-36}},pixelsAboveFold:function(e){return function(t){var n=document.getElementById("folder-"+t);if(!n)return!1;var r=n.getClientRects()[0];return r.top+r.height-e.containerTop}},hasFilesChecked:function(e){return e.filesChecked.length>0},fileTypesSelected:function(e){return e.fileTypesAvailable.filter((function(t){return e.selectedFileTypes.includes(t.identifier)}))},fileTypesExcluded:function(e){return e.fileTypesAvailable.filter((function(t){return!e.selectedFileTypes.includes(t.identifier)})).map((function(e){return e.identifier}))},selectedFileTypesString:function(){var e=this.fileTypesSelected.map((function(e){return e.name}));return 0===e.length?"Please select at least one file type":1===e.length?e[0]:2===e.length?e.join(" and "):3===e.length?e.slice(0,-1).join(", ")+" and "+e.slice(-1):e.slice(0,3).join(", ")+" and "+(e.length-3)+" more"}},actions:{setDirection:function(e){this.direction=e},selectFile:function(e){this.selectedFileIdentifier!==e&&(this.selectedFileIdentifier=e,this.openFolderForActiveFile(),this.sidebarOpen=!1)},openFolderForActiveFile:function(){var e=this;if(this.selectedFile){var t=this.folders.find((function(t){return t.files.some((function(t){return t.identifier===e.selectedFile.identifier}))}));t&&!this.isOpen(t)&&this.toggle(t)}},openRootFolderIfNoneOpen:function(){var e=this.folders.find((function(e){return e.is_root}));e&&0===this.openFolderIdentifiers.length&&this.openFolderIdentifiers.push(e.identifier)},loadFolders:function(){var e=this;return this.abortController&&this.abortController.abort(),this.selectedHost?(this.abortController=new AbortController,this.loading=!0,ov.get("".concat(LogViewer.basePath,"/api/folders"),{params:{host:this.hostQueryParam,direction:this.direction},signal:this.abortController.signal}).then((function(t){var n=t.data;e.folders=n,e.error=n.error||null,e.loading=!1,0===e.openFolderIdentifiers.length&&(e.openFolderForActiveFile(),e.openRootFolderIfNoneOpen()),e.setAvailableFileTypes(n),e.onScroll()})).catch((function(t){var n;"ERR_CANCELED"!==t.code&&(e.loading=!1,e.error=t.message,null!==(n=t.response)&&void 0!==n&&null!==(n=n.data)&&void 0!==n&&n.message&&(e.error+=": "+t.response.data.message))}))):(this.folders=[],this.error=null,void(this.loading=!1))},setAvailableFileTypes:function(e){var t=e.flatMap((function(e){return e.files.map((function(e){return e.type}))})),n=Qy(new Set(t.map((function(e){return e.value}))));this.fileTypesAvailable=n.map((function(e){return{identifier:e,name:t.find((function(t){return t.value===e})).name,count:t.filter((function(t){return t.value===e})).length}})),this.selectedFileTypes&&0!==this.selectedFileTypes.length||(this.selectedFileTypes=n)},toggle:function(e){this.isOpen(e)?this.openFolderIdentifiers=this.openFolderIdentifiers.filter((function(t){return t!==e.identifier})):this.openFolderIdentifiers.push(e.identifier),this.onScroll()},onScroll:function(){var e=this;this.foldersOpen.forEach((function(t){e.isInViewport(t)?e.foldersInView.includes(t)||e.foldersInView.push(t):e.foldersInView=e.foldersInView.filter((function(e){return e!==t}))}))},reset:function(){this.openFolderIdentifiers=[],this.foldersInView=[];var e=document.getElementById("file-list-container");e&&(this.containerTop=e.getBoundingClientRect().top,e.scrollTo(0,0))},toggleSidebar:function(){this.sidebarOpen=!this.sidebarOpen},checkBoxToggle:function(e){this.isChecked(e)?this.filesChecked=this.filesChecked.filter((function(t){return t!==e})):this.filesChecked.push(e)},toggleCheckboxVisibility:function(){this.checkBoxesVisibility=!this.checkBoxesVisibility},resetChecks:function(){this.filesChecked=[],this.checkBoxesVisibility=!1},clearCacheForFile:function(e){var t=this;return this.clearingCache[e.identifier]=!0,ov.post("".concat(LogViewer.basePath,"/api/files/").concat(e.identifier,"/clear-cache"),{},{params:{host:this.hostQueryParam}}).then((function(){e.identifier===t.selectedFileIdentifier&&Yy().loadLogs(),t.cacheRecentlyCleared[e.identifier]=!0,setTimeout((function(){return t.cacheRecentlyCleared[e.identifier]=!1}),2e3)})).catch((function(e){})).finally((function(){return t.clearingCache[e.identifier]=!1}))},deleteFile:function(e){var t=this;return ov.delete("".concat(LogViewer.basePath,"/api/files/").concat(e.identifier),{params:{host:this.hostQueryParam}}).then((function(){return t.loadFolders()}))},clearCacheForFolder:function(e){var t=this;return this.clearingCache[e.identifier]=!0,ov.post("".concat(LogViewer.basePath,"/api/folders/").concat(e.identifier,"/clear-cache"),{},{params:{host:this.hostQueryParam}}).then((function(){e.files.some((function(e){return e.identifier===t.selectedFileIdentifier}))&&Yy().loadLogs(),t.cacheRecentlyCleared[e.identifier]=!0,setTimeout((function(){return t.cacheRecentlyCleared[e.identifier]=!1}),2e3)})).catch((function(e){})).finally((function(){t.clearingCache[e.identifier]=!1}))},deleteFolder:function(e){var t=this;return this.deleting[e.identifier]=!0,ov.delete("".concat(LogViewer.basePath,"/api/folders/").concat(e.identifier),{params:{host:this.hostQueryParam}}).then((function(){return t.loadFolders()})).catch((function(e){})).finally((function(){t.deleting[e.identifier]=!1}))},deleteSelectedFiles:function(){return ov.post("".concat(LogViewer.basePath,"/api/delete-multiple-files"),{files:this.filesChecked},{params:{host:this.hostQueryParam}})},clearCacheForAllFiles:function(){var e=this;this.clearingCache["*"]=!0,ov.post("".concat(LogViewer.basePath,"/api/clear-cache-all"),{},{params:{host:this.hostQueryParam}}).then((function(){e.cacheRecentlyCleared["*"]=!0,setTimeout((function(){return e.cacheRecentlyCleared["*"]=!1}),2e3),Yy().loadLogs()})).catch((function(e){})).finally((function(){return e.clearingCache["*"]=!1}))}}}),rb=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(e=e||"",t)try{e=e.replace(new RegExp(t,"gi"),"<mark>$&</mark>")}catch(e){}return ob(e).replace(/&lt;mark&gt;/g,"<mark>").replace(/&lt;\/mark&gt;/g,"</mark>").replace(/&lt;br\/&gt;/g,"<br/>")},ob=function(e){var t={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#039;"};return e.replace(/[&<>"']/g,(function(e){return t[e]}))},ib=function(e){var t=document.createElement("textarea");t.value=e,t.setAttribute("readonly",""),t.style.position="absolute",t.style.left="-9999px",document.body.appendChild(t);var n=document.getSelection().rangeCount>0&&document.getSelection().getRangeAt(0);t.select(),document.execCommand("copy"),document.body.removeChild(t),n&&(document.getSelection().removeAllRanges(),document.getSelection().addRange(n))},sb=function(e,t,n){var r=e.currentRoute.value,o={host:r.query.host||void 0,file:r.query.file||void 0,query:r.query.query||void 0,page:r.query.page||void 0};"host"===t?(o.file=void 0,o.page=void 0):"file"===t&&void 0!==o.page&&(o.page=void 0),o[t]=n?String(n):void 0,e.push({name:"home",query:o})},lb=function(){var e=$t({});return{dropdownDirections:e,calculateDropdownDirection:function(t){e.value[t.dataset.toggleId]=function(e){window.innerWidth||document.documentElement.clientWidth;var t=window.innerHeight||document.documentElement.clientHeight;return e.getBoundingClientRect().bottom+190<t?"down":"up"}(t)}}},ab={class:"animate-spin",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},ub=[Ji("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"},null,-1),Ji("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"},null,-1)];var cb=n(744);const fb={},pb=(0,cb.Z)(fb,[["render",function(e,t){return Ni(),Vi("svg",ab,ub)}]]);var db="file-item-info",hb="log-level-icon",vb="log-link.large-screen",gb={Files:"f",Logs:"l",Hosts:"h",Severity:"s",Settings:"g",Search:"/",Refresh:"r",ShortcutHelp:"?"},mb=function(e,t){for(var n=Array.from(document.querySelectorAll(".".concat(t))),r=n.findIndex((function(t){return t===e}))-1;r>=0&&null===n[r].offsetParent;)r--;return n[r]?n[r]:null},yb=function(e,t){for(var n=Array.from(document.querySelectorAll(".".concat(t))),r=n.findIndex((function(t){return t===e}))+1;r<n.length&&null===n[r].offsetParent;)r++;return n[r]?n[r]:null},bb=function(e,t){return Array.from(document.querySelectorAll(".".concat(t))).findIndex((function(t){return t===e}))},wb=function(e){var t;if("INPUT"!==e.target.tagName&&(!e.metaKey&&!e.ctrlKey))if(e.key===gb.ShortcutHelp){e.preventDefault();var n=Yy();n.helpSlideOverOpen=!n.helpSlideOverOpen}else if(e.key===gb.Files)e.preventDefault(),function(){var e=document.querySelector(".file-item-container.active .file-item-info");if(e)e.focus();else{var t=document.querySelector(".file-item-container .file-item-info");null==t||t.focus()}}();else if(e.key===gb.Logs)e.preventDefault(),(t=Array.from(document.querySelectorAll(".".concat(hb)))).length>0&&t[0].focus();else if(e.key===gb.Hosts){e.preventDefault();var r=document.getElementById("hosts-toggle-button");null==r||r.click()}else if(e.key===gb.Severity){e.preventDefault();var o=document.getElementById("severity-dropdown-toggle");null==o||o.click()}else if(e.key===gb.Settings){e.preventDefault();var i=document.querySelector("#desktop-site-settings .menu-button");null==i||i.click()}else if(e.key===gb.Search){e.preventDefault();var s=document.getElementById("query");null==s||s.focus()}else if(e.key===gb.Refresh){e.preventDefault();var l=document.getElementById("reload-logs-button");null==l||l.click()}},_b=function(e){if("ArrowLeft"===e.key)e.preventDefault(),function(){var e=document.querySelector(".file-item-container.active .file-item-info");if(e)e.nextElementSibling.focus();else{var t,n=document.querySelector(".file-item-container .file-item-info");null==n||null===(t=n.nextElementSibling)||void 0===t||t.focus()}}();else if("ArrowRight"===e.key){var t=bb(document.activeElement,hb),n=Array.from(document.querySelectorAll(".".concat(vb)));n.length>t&&(e.preventDefault(),n[t].focus())}else if("ArrowUp"===e.key){var r=mb(document.activeElement,hb);r&&(e.preventDefault(),r.focus())}else if("ArrowDown"===e.key){var o=yb(document.activeElement,hb);o&&(e.preventDefault(),o.focus())}},xb=function(e){if("ArrowLeft"===e.key){var t=bb(document.activeElement,vb),n=Array.from(document.querySelectorAll(".".concat(hb)));n.length>t&&(e.preventDefault(),n[t].focus())}else if("ArrowUp"===e.key){var r=mb(document.activeElement,vb);r&&(e.preventDefault(),r.focus())}else if("ArrowDown"===e.key){var o=yb(document.activeElement,vb);o&&(e.preventDefault(),o.focus())}else if("Enter"===e.key||" "===e.key){e.preventDefault();var i=document.activeElement;i.click(),i.focus()}},Sb=function(e){if("ArrowUp"===e.key){var t=mb(document.activeElement,db);t&&(e.preventDefault(),t.focus())}else if("ArrowDown"===e.key){var n=yb(document.activeElement,db);n&&(e.preventDefault(),n.focus())}else"ArrowRight"===e.key&&(e.preventDefault(),document.activeElement.nextElementSibling.focus())},Ob=function(e){if("ArrowLeft"===e.key)e.preventDefault(),document.activeElement.previousElementSibling.focus();else if("ArrowRight"===e.key){e.preventDefault();var t=Array.from(document.querySelectorAll(".".concat(hb)));t.length>0&&t[0].focus()}};function kb(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[Ji("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M12 9.75v6.75m0 0l-3-3m3 3l3-3m-8.25 6a4.5 4.5 0 01-1.41-8.775 5.25 5.25 0 0110.233-2.33 3 3 0 013.758 3.848A3.752 3.752 0 0118 19.5H6.75z"})])}const Eb={__name:"DownloadLink",props:["url"],setup:function(e){var t=e,n=function(){ov.get("".concat(t.url,"/request")).then((function(e){r(e.data.url)})).catch((function(e){e.response&&e.response.data&&alert("".concat(e.message,": ").concat(e.response.data.message,". Check developer console for more info."))}))},r=function(e){var t=document.createElement("a");t.href=e,t.setAttribute("download",""),document.body.appendChild(t),t.click(),document.body.removeChild(t)};return function(e,t){return Ni(),Vi("button",{onClick:n},[lo(e.$slots,"default",{},(function(){return[Qi(Wt(kb),{class:"w-4 h-4 mr-2"}),ts(" Download ")]}))])}}};function Cb(e){return Cb="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Cb(e)}function Pb(){Pb=function(){return t};var e,t={},n=Object.prototype,r=n.hasOwnProperty,o=Object.defineProperty||function(e,t,n){e[t]=n.value},i="function"==typeof Symbol?Symbol:{},s=i.iterator||"@@iterator",l=i.asyncIterator||"@@asyncIterator",a=i.toStringTag||"@@toStringTag";function u(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{u({},"")}catch(e){u=function(e,t,n){return e[t]=n}}function c(e,t,n,r){var i=t&&t.prototype instanceof m?t:m,s=Object.create(i.prototype),l=new A(r||[]);return o(s,"_invoke",{value:E(e,n,l)}),s}function f(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}t.wrap=c;var p="suspendedStart",d="suspendedYield",h="executing",v="completed",g={};function m(){}function y(){}function b(){}var w={};u(w,s,(function(){return this}));var _=Object.getPrototypeOf,x=_&&_(_(j([])));x&&x!==n&&r.call(x,s)&&(w=x);var S=b.prototype=m.prototype=Object.create(w);function O(e){["next","throw","return"].forEach((function(t){u(e,t,(function(e){return this._invoke(t,e)}))}))}function k(e,t){function n(o,i,s,l){var a=f(e[o],e,i);if("throw"!==a.type){var u=a.arg,c=u.value;return c&&"object"==Cb(c)&&r.call(c,"__await")?t.resolve(c.__await).then((function(e){n("next",e,s,l)}),(function(e){n("throw",e,s,l)})):t.resolve(c).then((function(e){u.value=e,s(u)}),(function(e){return n("throw",e,s,l)}))}l(a.arg)}var i;o(this,"_invoke",{value:function(e,r){function o(){return new t((function(t,o){n(e,r,t,o)}))}return i=i?i.then(o,o):o()}})}function E(t,n,r){var o=p;return function(i,s){if(o===h)throw new Error("Generator is already running");if(o===v){if("throw"===i)throw s;return{value:e,done:!0}}for(r.method=i,r.arg=s;;){var l=r.delegate;if(l){var a=C(l,r);if(a){if(a===g)continue;return a}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(o===p)throw o=v,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);o=h;var u=f(t,n,r);if("normal"===u.type){if(o=r.done?v:d,u.arg===g)continue;return{value:u.arg,done:r.done}}"throw"===u.type&&(o=v,r.method="throw",r.arg=u.arg)}}}function C(t,n){var r=n.method,o=t.iterator[r];if(o===e)return n.delegate=null,"throw"===r&&t.iterator.return&&(n.method="return",n.arg=e,C(t,n),"throw"===n.method)||"return"!==r&&(n.method="throw",n.arg=new TypeError("The iterator does not provide a '"+r+"' method")),g;var i=f(o,t.iterator,n.arg);if("throw"===i.type)return n.method="throw",n.arg=i.arg,n.delegate=null,g;var s=i.arg;return s?s.done?(n[t.resultName]=s.value,n.next=t.nextLoc,"return"!==n.method&&(n.method="next",n.arg=e),n.delegate=null,g):s:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,g)}function P(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function T(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function A(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(P,this),this.reset(!0)}function j(t){if(t||""===t){var n=t[s];if(n)return n.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var o=-1,i=function n(){for(;++o<t.length;)if(r.call(t,o))return n.value=t[o],n.done=!1,n;return n.value=e,n.done=!0,n};return i.next=i}}throw new TypeError(Cb(t)+" is not iterable")}return y.prototype=b,o(S,"constructor",{value:b,configurable:!0}),o(b,"constructor",{value:y,configurable:!0}),y.displayName=u(b,a,"GeneratorFunction"),t.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===y||"GeneratorFunction"===(t.displayName||t.name))},t.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,b):(e.__proto__=b,u(e,a,"GeneratorFunction")),e.prototype=Object.create(S),e},t.awrap=function(e){return{__await:e}},O(k.prototype),u(k.prototype,l,(function(){return this})),t.AsyncIterator=k,t.async=function(e,n,r,o,i){void 0===i&&(i=Promise);var s=new k(c(e,n,r,o),i);return t.isGeneratorFunction(n)?s:s.next().then((function(e){return e.done?e.value:s.next()}))},O(S),u(S,a,"Generator"),u(S,s,(function(){return this})),u(S,"toString",(function(){return"[object Generator]"})),t.keys=function(e){var t=Object(e),n=[];for(var r in t)n.push(r);return n.reverse(),function e(){for(;n.length;){var r=n.pop();if(r in t)return e.value=r,e.done=!1,e}return e.done=!0,e}},t.values=j,A.prototype={constructor:A,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=e,this.done=!1,this.delegate=null,this.method="next",this.arg=e,this.tryEntries.forEach(T),!t)for(var n in this)"t"===n.charAt(0)&&r.call(this,n)&&!isNaN(+n.slice(1))&&(this[n]=e)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var n=this;function o(r,o){return l.type="throw",l.arg=t,n.next=r,o&&(n.method="next",n.arg=e),!!o}for(var i=this.tryEntries.length-1;i>=0;--i){var s=this.tryEntries[i],l=s.completion;if("root"===s.tryLoc)return o("end");if(s.tryLoc<=this.prev){var a=r.call(s,"catchLoc"),u=r.call(s,"finallyLoc");if(a&&u){if(this.prev<s.catchLoc)return o(s.catchLoc,!0);if(this.prev<s.finallyLoc)return o(s.finallyLoc)}else if(a){if(this.prev<s.catchLoc)return o(s.catchLoc,!0)}else{if(!u)throw new Error("try statement without catch or finally");if(this.prev<s.finallyLoc)return o(s.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&r.call(o,"finallyLoc")&&this.prev<o.finallyLoc){var i=o;break}}i&&("break"===e||"continue"===e)&&i.tryLoc<=t&&t<=i.finallyLoc&&(i=null);var s=i?i.completion:{};return s.type=e,s.arg=t,i?(this.method="next",this.next=i.finallyLoc,g):this.complete(s)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),g},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),T(n),g}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var o=r.arg;T(n)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,n,r){return this.delegate={iterator:j(t),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=e),g}},t}function Tb(e,t,n,r,o,i,s){try{var l=e[i](s),a=l.value}catch(e){return void n(e)}l.done?t(a):Promise.resolve(a).then(r,o)}var Ab={class:"file-item group"},jb={key:0,class:"sr-only"},Rb={key:1,class:"sr-only"},Lb={key:2,class:"my-auto mr-2"},Ib=["onClick","checked","value"],Fb={class:"file-name"},Nb=Ji("span",{class:"sr-only"},"Name:",-1),Mb={class:"file-size"},Db=Ji("span",{class:"sr-only"},"Size:",-1),Bb={class:"py-2"},Ub={class:"text-brand-500"},$b=Ji("div",{class:"divider"},null,-1);const Vb={__name:"FileListItem",props:{logFile:{type:Object,required:!0},showSelectToggle:{type:Boolean,default:!1}},emits:["selectForDeletion"],setup:function(e,t){t.emit;var n=e,r=nb(),o=Fg(),i=lb(),s=i.dropdownDirections,l=i.calculateDropdownDirection,a=Rs((function(){return r.selectedFile&&r.selectedFile.identifier===n.logFile.identifier})),u=function(){var e,t=(e=Pb().mark((function e(){return Pb().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!confirm("Are you sure you want to delete the log file '".concat(n.logFile.name,"'? THIS ACTION CANNOT BE UNDONE."))){e.next=6;break}return e.next=3,r.deleteFile(n.logFile);case 3:return n.logFile.identifier===r.selectedFileIdentifier&&sb(o,"file",null),e.next=6,r.loadFolders();case 6:case"end":return e.stop()}}),e)})),function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function s(e){Tb(i,r,o,s,l,"next",e)}function l(e){Tb(i,r,o,s,l,"throw",e)}s(void 0)}))});return function(){return t.apply(this,arguments)}}(),c=function(){r.checkBoxToggle(n.logFile.identifier)},f=function(){r.toggleCheckboxVisibility(),c()};return function(t,n){return Ni(),Vi("div",{class:ee(["file-item-container",[a.value?"active":""]])},[Qi(Wt(Rm),null,{default:$n((function(){return[Ji("div",Ab,[Ji("button",{class:"file-item-info",onKeydown:n[0]||(n[0]=function(){return Wt(Sb)&&Wt(Sb).apply(void 0,arguments)})},[a.value?rs("",!0):(Ni(),Vi("span",jb,"Select log file")),a.value?(Ni(),Vi("span",Rb,"Deselect log file")):rs("",!0),e.logFile.can_delete?yr((Ni(),Vi("span",Lb,[Ji("input",{type:"checkbox",onClick:la(c,["stop"]),checked:Wt(r).isChecked(e.logFile),value:Wt(r).isChecked(e.logFile)},null,8,Ib)],512)),[[pl,Wt(r).checkBoxesVisibility]]):rs("",!0),Ji("span",Fb,[Nb,ts(ce(e.logFile.name),1)]),Ji("span",Mb,[Db,ts(ce(e.logFile.size_formatted),1)])],32),Qi(Wt(Lm),{as:"button",class:"file-dropdown-toggle group-hover:border-brand-600 group-hover:dark:border-brand-800","data-toggle-id":e.logFile.identifier,onKeydown:Wt(Ob),onClick:n[1]||(n[1]=la((function(e){return Wt(l)(e.target)}),["stop"]))},{default:$n((function(){return[Qi(Wt(Hm),{class:"w-4 h-4 pointer-events-none"})]})),_:1},8,["data-toggle-id","onKeydown"])]),Qi(Ys,{"leave-active-class":"transition ease-in duration-100","leave-from-class":"opacity-100 scale-100","leave-to-class":"opacity-0 scale-90","enter-active-class":"transition ease-out duration-100","enter-from-class":"opacity-0 scale-90","enter-to-class":"opacity-100 scale-100"},{default:$n((function(){return[Qi(Wt(Im),{as:"div",class:ee(["dropdown w-48",[Wt(s)[e.logFile.identifier]]])},{default:$n((function(){return[Ji("div",Bb,[Qi(Wt(Fm),{onClick:n[2]||(n[2]=la((function(t){return Wt(r).clearCacheForFile(e.logFile)}),["stop","prevent"]))},{default:$n((function(t){return[Ji("button",{class:ee([t.active?"active":""])},[yr(Qi(Wt(zm),{class:"h-4 w-4 mr-2"},null,512),[[pl,!Wt(r).clearingCache[e.logFile.identifier]]]),yr(Qi(pb,null,null,512),[[pl,Wt(r).clearingCache[e.logFile.identifier]]]),yr(Ji("span",null,"Clear index",512),[[pl,!Wt(r).cacheRecentlyCleared[e.logFile.identifier]&&!Wt(r).clearingCache[e.logFile.identifier]]]),yr(Ji("span",null,"Clearing...",512),[[pl,!Wt(r).cacheRecentlyCleared[e.logFile.identifier]&&Wt(r).clearingCache[e.logFile.identifier]]]),yr(Ji("span",Ub,"Index cleared",512),[[pl,Wt(r).cacheRecentlyCleared[e.logFile.identifier]]])],2)]})),_:1}),e.logFile.can_download?(Ni(),Hi(Wt(Fm),{key:0,onClick:n[3]||(n[3]=la((function(){}),["stop"]))},{default:$n((function(t){var n=t.active;return[Qi(Eb,{url:e.logFile.download_url,class:ee([n?"active":""])},null,8,["url","class"])]})),_:1})):rs("",!0),e.logFile.can_delete?(Ni(),Vi(Ai,{key:1},[$b,Qi(Wt(Fm),{onClick:la(u,["stop","prevent"])},{default:$n((function(e){return[Ji("button",{class:ee([e.active?"active":""])},[Qi(Wt(Bm),{class:"w-4 h-4 mr-2"}),ts(" Delete ")],2)]})),_:1},8,["onClick"]),Qi(Wt(Fm),{onClick:la(f,["stop"])},{default:$n((function(e){return[Ji("button",{class:ee([e.active?"active":""])},[Qi(Wt(Bm),{class:"w-4 h-4 mr-2"}),ts(" Delete Multiple ")],2)]})),_:1},8,["onClick"])],64)):rs("",!0)])]})),_:1},8,["class"])]})),_:1})]})),_:1})],2)}}},Hb=Vb;function zb(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[Ji("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M10.343 3.94c.09-.542.56-.94 1.11-.94h1.093c.55 0 1.02.398 1.11.94l.149.894c.07.424.384.764.78.93.398.164.855.142 1.205-.108l.737-.527a1.125 1.125 0 011.45.12l.773.774c.39.389.44 1.002.12 1.45l-.527.737c-.25.35-.272.806-.107 1.204.165.397.505.71.93.78l.893.15c.543.09.94.56.94 1.109v1.094c0 .55-.397 1.02-.94 1.11l-.893.149c-.425.07-.765.383-.93.78-.165.398-.143.854.107 1.204l.527.738c.32.447.269 1.06-.12 1.45l-.774.773a1.125 1.125 0 01-1.449.12l-.738-.527c-.35-.25-.806-.272-1.203-.107-.397.165-.71.505-.781.929l-.149.894c-.09.542-.56.94-1.11.94h-1.094c-.55 0-1.019-.398-1.11-.94l-.148-.894c-.071-.424-.384-.764-.781-.93-.398-.164-.854-.142-1.204.108l-.738.527c-.447.32-1.06.269-1.45-.12l-.773-.774a1.125 1.125 0 01-.12-1.45l.527-.737c.25-.35.273-.806.108-1.204-.165-.397-.505-.71-.93-.78l-.894-.15c-.542-.09-.94-.56-.94-1.109v-1.094c0-.55.398-1.02.94-1.11l.894-.149c.424-.07.765-.383.93-.78.165-.398.143-.854-.107-1.204l-.527-.738a1.125 1.125 0 01.12-1.45l.773-.773a1.125 1.125 0 011.45-.12l.737.527c.35.25.807.272 1.204.107.397-.165.71-.505.78-.929l.15-.894z"}),Ji("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"})])}function qb(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[Ji("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M7.217 10.907a2.25 2.25 0 100 2.186m0-2.186c.18.324.283.696.283 1.093s-.103.77-.283 1.093m0-2.186l9.566-5.314m-9.566 7.5l9.566 5.314m0 0a2.25 2.25 0 103.935 2.186 2.25 2.25 0 00-3.935-2.186zm0-12.814a2.25 2.25 0 103.933-2.185 2.25 2.25 0 00-3.933 2.185z"})])}function Wb(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[Ji("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M9 17.25v1.007a3 3 0 01-.879 2.122L7.5 21h9l-.621-.621A3 3 0 0115 18.257V17.25m6-12V15a2.25 2.25 0 01-2.25 2.25H5.25A2.25 2.25 0 013 15V5.25m18 0A2.25 2.25 0 0018.75 3H5.25A2.25 2.25 0 003 5.25m18 0V12a2.25 2.25 0 01-2.25 2.25H5.25A2.25 2.25 0 013 12V5.25"})])}function Kb(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[Ji("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M12 3v2.25m6.364.386l-1.591 1.591M21 12h-2.25m-.386 6.364l-1.591-1.591M12 18.75V21m-4.773-4.227l-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0z"})])}function Gb(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[Ji("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M21.752 15.002A9.718 9.718 0 0118 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 003 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 009.002-5.998z"})])}function Yb(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[Ji("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9 5.25h.008v.008H12v-.008z"})])}function Jb(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true"},[Ji("path",{"fill-rule":"evenodd",d:"M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z","clip-rule":"evenodd"})])}var Qb={class:"checkmark w-[18px] h-[18px] bg-gray-50 dark:bg-gray-800 rounded border dark:border-gray-600 inline-flex items-center justify-center"};const Zb={__name:"Checkmark",props:{checked:{type:Boolean,required:!0}},setup:function(e){return function(t,n){return Ni(),Vi("div",Qb,[e.checked?(Ni(),Hi(Wt(Jb),{key:0,width:"18",height:"18",class:"w-full h-full"})):rs("",!0)])}}};var Xb=Ji("span",{class:"sr-only"},"Settings dropdown",-1),ew={class:"py-2"},tw=Ji("div",{class:"label"},"Settings",-1),nw=Ji("span",{class:"ml-3"},"Shorter stack traces",-1),rw=Ji("div",{class:"divider"},null,-1),ow=Ji("div",{class:"label"},"Actions",-1),iw={class:"text-brand-500"},sw={class:"text-brand-500"},lw=Ji("div",{class:"divider"},null,-1),aw=["innerHTML"];const uw={__name:"SiteSettingsDropdown",setup:function(e){var t=Yy(),n=nb(),r=$t(!1),o=function(){ib(window.location.href),r.value=!0,setTimeout((function(){return r.value=!1}),2e3)};return dr((function(){return t.shorterStackTraces}),(function(){return t.loadLogs()})),function(e,i){return Ni(),Hi(Wt(Rm),{as:"div",class:"relative"},{default:$n((function(){return[Qi(Wt(Lm),{as:"button",class:"menu-button"},{default:$n((function(){return[Xb,Qi(Wt(zb),{class:"w-5 h-5"})]})),_:1}),Qi(Ys,{"leave-active-class":"transition ease-in duration-100","leave-from-class":"opacity-100 scale-100","leave-to-class":"opacity-0 scale-90","enter-active-class":"transition ease-out duration-100","enter-from-class":"opacity-0 scale-90","enter-to-class":"opacity-100 scale-100"},{default:$n((function(){return[Qi(Wt(Im),{as:"div",style:{"min-width":"250px"},class:"dropdown"},{default:$n((function(){return[Ji("div",ew,[tw,Qi(Wt(Fm),null,{default:$n((function(e){return[Ji("button",{class:ee([e.active?"active":""]),onClick:i[0]||(i[0]=la((function(e){return Wt(t).shorterStackTraces=!Wt(t).shorterStackTraces}),["stop","prevent"]))},[Qi(Zb,{checked:Wt(t).shorterStackTraces},null,8,["checked"]),nw],2)]})),_:1}),rw,ow,Qi(Wt(Fm),{onClick:la(Wt(n).clearCacheForAllFiles,["stop","prevent"])},{default:$n((function(e){return[Ji("button",{class:ee([e.active?"active":""])},[yr(Qi(Wt(zm),{class:"w-4 h-4 mr-1.5"},null,512),[[pl,!Wt(n).clearingCache["*"]]]),yr(Qi(pb,{class:"w-4 h-4 mr-1.5"},null,512),[[pl,Wt(n).clearingCache["*"]]]),yr(Ji("span",null,"Clear indices for all files",512),[[pl,!Wt(n).cacheRecentlyCleared["*"]&&!Wt(n).clearingCache["*"]]]),yr(Ji("span",null,"Please wait...",512),[[pl,!Wt(n).cacheRecentlyCleared["*"]&&Wt(n).clearingCache["*"]]]),yr(Ji("span",iw,"File indices cleared",512),[[pl,Wt(n).cacheRecentlyCleared["*"]]])],2)]})),_:1},8,["onClick"]),Qi(Wt(Fm),{onClick:la(o,["stop","prevent"])},{default:$n((function(e){return[Ji("button",{class:ee([e.active?"active":""])},[Qi(Wt(qb),{class:"w-4 h-4"}),yr(Ji("span",null,"Share this page",512),[[pl,!r.value]]),yr(Ji("span",sw,"Link copied!",512),[[pl,r.value]])],2)]})),_:1},8,["onClick"]),lw,Qi(Wt(Fm),{onClick:i[1]||(i[1]=la((function(e){return Wt(t).toggleTheme()}),["stop","prevent"]))},{default:$n((function(e){return[Ji("button",{class:ee([e.active?"active":""])},[yr(Qi(Wt(Wb),{class:"w-4 h-4"},null,512),[[pl,Wt(t).theme===Wt(Ky).System]]),yr(Qi(Wt(Kb),{class:"w-4 h-4"},null,512),[[pl,Wt(t).theme===Wt(Ky).Light]]),yr(Qi(Wt(Gb),{class:"w-4 h-4"},null,512),[[pl,Wt(t).theme===Wt(Ky).Dark]]),Ji("span",null,[ts("Theme: "),Ji("span",{innerHTML:Wt(t).theme,class:"font-semibold"},null,8,aw)])],2)]})),_:1}),Qi(Wt(Fm),null,{default:$n((function(e){var n=e.active;return[Ji("button",{onClick:i[2]||(i[2]=function(e){return Wt(t).helpSlideOverOpen=!0}),class:ee([n?"active":""])},[Qi(Wt(Yb),{class:"w-4 h-4"}),ts(" Keyboard Shortcuts ")],2)]})),_:1})])]})),_:1})]})),_:1})]})),_:1})}}};var cw=(e=>(e[e.None=1]="None",e[e.Focusable=2]="Focusable",e[e.Hidden=4]="Hidden",e))(cw||{});let fw=Lr({name:"Hidden",props:{as:{type:[Object,String],default:"div"},features:{type:Number,default:1}},setup:(e,{slots:t,attrs:n})=>()=>{let{features:r,...o}=e;return Ug({ourProps:{"aria-hidden":2==(2&r)||void 0,style:{position:"fixed",top:1,left:1,width:1,height:0,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0",...4==(4&r)&&2!=(2&r)&&{display:"none"}}},theirProps:o,slot:{},attrs:n,slots:t,name:"Hidden"})}});function pw(e={},t=null,n=[]){for(let[r,o]of Object.entries(e))hw(n,dw(t,r),o);return n}function dw(e,t){return e?e+"["+t+"]":t}function hw(e,t,n){if(Array.isArray(n))for(let[r,o]of n.entries())hw(e,dw(t,r.toString()),o);else n instanceof Date?e.push([t,n.toISOString()]):"boolean"==typeof n?e.push([t,n?"1":"0"]):"string"==typeof n?e.push([t,n]):"number"==typeof n?e.push([t,`${n}`]):null==n?e.push([t,""]):pw(n,t,e)}function vw(e,t){return e===t}var gw=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(gw||{}),mw=(e=>(e[e.Single=0]="Single",e[e.Multi=1]="Multi",e))(mw||{}),yw=(e=>(e[e.Pointer=0]="Pointer",e[e.Other=1]="Other",e))(yw||{});let bw=Symbol("ListboxContext");function ww(e){let t=Yo(bw,null);if(null===t){let t=new Error(`<${e} /> is missing a parent <Listbox /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,ww),t}return t}let _w=Lr({name:"Listbox",emits:{"update:modelValue":e=>!0},props:{as:{type:[Object,String],default:"template"},disabled:{type:[Boolean],default:!1},by:{type:[String,Function],default:()=>vw},horizontal:{type:[Boolean],default:!1},modelValue:{type:[Object,String,Number,Boolean],default:void 0},defaultValue:{type:[Object,String,Number,Boolean],default:void 0},form:{type:String,optional:!0},name:{type:String,optional:!0},multiple:{type:[Boolean],default:!1}},inheritAttrs:!1,setup(e,{slots:t,attrs:n,emit:r}){let o=$t(1),i=$t(null),s=$t(null),l=$t(null),a=$t([]),u=$t(""),c=$t(null),f=$t(1);function p(e=(e=>e)){let t=null!==c.value?a.value[c.value]:null,n=ym(e(a.value.slice()),(e=>Jg(e.dataRef.domRef))),r=t?n.indexOf(t):null;return-1===r&&(r=null),{options:n,activeOptionIndex:r}}let d=Rs((()=>e.multiple?1:0)),[h,v]=function(e,t,n){let r=$t(null==n?void 0:n.value),o=Rs((()=>void 0!==e.value));return[Rs((()=>o.value?e.value:r.value)),function(e){return o.value||(r.value=e),null==t?void 0:t(e)}]}(Rs((()=>e.modelValue)),(e=>r("update:modelValue",e)),Rs((()=>e.defaultValue))),g=Rs((()=>void 0===h.value?Mg(d.value,{1:[],0:void 0}):h.value)),m={listboxState:o,value:g,mode:d,compare(t,n){if("string"==typeof e.by){let r=e.by;return(null==t?void 0:t[r])===(null==n?void 0:n[r])}return e.by(t,n)},orientation:Rs((()=>e.horizontal?"horizontal":"vertical")),labelRef:i,buttonRef:s,optionsRef:l,disabled:Rs((()=>e.disabled)),options:a,searchQuery:u,activeOptionIndex:c,activationTrigger:f,closeListbox(){e.disabled||1!==o.value&&(o.value=1,c.value=null)},openListbox(){e.disabled||0!==o.value&&(o.value=0)},goToOption(t,n,r){if(e.disabled||1===o.value)return;let i=p(),s=Yg(t===Gg.Specific?{focus:Gg.Specific,id:n}:{focus:t},{resolveItems:()=>i.options,resolveActiveIndex:()=>i.activeOptionIndex,resolveId:e=>e.id,resolveDisabled:e=>e.dataRef.disabled});u.value="",c.value=s,f.value=null!=r?r:1,a.value=i.options},search(t){if(e.disabled||1===o.value)return;let n=""!==u.value?0:1;u.value+=t.toLowerCase();let r=(null!==c.value?a.value.slice(c.value+n).concat(a.value.slice(0,c.value+n)):a.value).find((e=>e.dataRef.textValue.startsWith(u.value)&&!e.dataRef.disabled)),i=r?a.value.indexOf(r):-1;-1===i||i===c.value||(c.value=i,f.value=1)},clearSearch(){e.disabled||1!==o.value&&""!==u.value&&(u.value="")},registerOption(e,t){let n=p((n=>[...n,{id:e,dataRef:t}]));a.value=n.options,c.value=n.activeOptionIndex},unregisterOption(e){let t=p((t=>{let n=t.findIndex((t=>t.id===e));return-1!==n&&t.splice(n,1),t}));a.value=t.options,c.value=t.activeOptionIndex,f.value=1},theirOnChange(t){e.disabled||v(t)},select(t){e.disabled||v(Mg(d.value,{0:()=>t,1:()=>{let e=It(m.value.value).slice(),n=It(t),r=e.findIndex((e=>m.compare(n,It(e))));return-1===r?e.push(n):e.splice(r,1),e}}))}};xm([s,l],((e,t)=>{var n;m.closeListbox(),dm(t,pm.Loose)||(e.preventDefault(),null==(n=Jg(s))||n.focus())}),Rs((()=>0===o.value))),Go(bw,m),om(Rs((()=>Mg(o.value,{0:nm.Open,1:nm.Closed}))));let y=Rs((()=>{var e;return null==(e=Jg(s))?void 0:e.closest("form")}));return Jr((()=>{dr([y],(()=>{if(y.value&&void 0!==e.defaultValue)return y.value.addEventListener("reset",t),()=>{var e;null==(e=y.value)||e.removeEventListener("reset",t)};function t(){m.theirOnChange(e.defaultValue)}}),{immediate:!0})})),()=>{let{name:r,modelValue:i,disabled:s,form:l,...a}=e,u={open:0===o.value,disabled:s,value:g.value};return Ls(Ai,[...null!=r&&null!=g.value?pw({[r]:g.value}).map((([e,t])=>Ls(fw,function(e){let t=Object.assign({},e);for(let e in t)void 0===t[e]&&delete t[e];return t}({features:cw.Hidden,key:e,as:"input",type:"hidden",hidden:!0,readOnly:!0,form:l,name:e,value:t})))):[],Ug({ourProps:{},theirProps:{...n,...zg(a,["defaultValue","onUpdate:modelValue","horizontal","multiple","by"])},slot:u,slots:t,attrs:n,name:"Listbox"})])}}}),xw=Lr({name:"ListboxLabel",props:{as:{type:[Object,String],default:"label"},id:{type:String,default:()=>`headlessui-listbox-label-${Wg()}`}},setup(e,{attrs:t,slots:n}){let r=ww("ListboxLabel");function o(){var e;null==(e=Jg(r.buttonRef))||e.focus({preventScroll:!0})}return()=>{let i={open:0===r.listboxState.value,disabled:r.disabled.value},{id:s,...l}=e;return Ug({ourProps:{id:s,ref:r.labelRef,onClick:o},theirProps:l,slot:i,attrs:t,slots:n,name:"ListboxLabel"})}}}),Sw=Lr({name:"ListboxButton",props:{as:{type:[Object,String],default:"button"},id:{type:String,default:()=>`headlessui-listbox-button-${Wg()}`}},setup(e,{attrs:t,slots:n,expose:r}){let o=ww("ListboxButton");function i(e){switch(e.key){case Kg.Space:case Kg.Enter:case Kg.ArrowDown:e.preventDefault(),o.openListbox(),bn((()=>{var e;null==(e=Jg(o.optionsRef))||e.focus({preventScroll:!0}),o.value.value||o.goToOption(Gg.First)}));break;case Kg.ArrowUp:e.preventDefault(),o.openListbox(),bn((()=>{var e;null==(e=Jg(o.optionsRef))||e.focus({preventScroll:!0}),o.value.value||o.goToOption(Gg.Last)}))}}function s(e){if(e.key===Kg.Space)e.preventDefault()}function l(e){o.disabled.value||(0===o.listboxState.value?(o.closeListbox(),bn((()=>{var e;return null==(e=Jg(o.buttonRef))?void 0:e.focus({preventScroll:!0})}))):(e.preventDefault(),o.openListbox(),function(e){requestAnimationFrame((()=>requestAnimationFrame(e)))}((()=>{var e;return null==(e=Jg(o.optionsRef))?void 0:e.focus({preventScroll:!0})}))))}r({el:o.buttonRef,$el:o.buttonRef});let a=sm(Rs((()=>({as:e.as,type:t.type}))),o.buttonRef);return()=>{var r,u;let c={open:0===o.listboxState.value,disabled:o.disabled.value,value:o.value.value},{id:f,...p}=e;return Ug({ourProps:{ref:o.buttonRef,id:f,type:a.value,"aria-haspopup":"listbox","aria-controls":null==(r=Jg(o.optionsRef))?void 0:r.id,"aria-expanded":0===o.listboxState.value,"aria-labelledby":o.labelRef.value?[null==(u=Jg(o.labelRef))?void 0:u.id,f].join(" "):void 0,disabled:!0===o.disabled.value||void 0,onKeydown:i,onKeyup:s,onClick:l},theirProps:p,slot:c,attrs:t,slots:n,name:"ListboxButton"})}}}),Ow=Lr({name:"ListboxOptions",props:{as:{type:[Object,String],default:"ul"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},id:{type:String,default:()=>`headlessui-listbox-options-${Wg()}`}},setup(e,{attrs:t,slots:n,expose:r}){let o=ww("ListboxOptions"),i=$t(null);function s(e){switch(i.value&&clearTimeout(i.value),e.key){case Kg.Space:if(""!==o.searchQuery.value)return e.preventDefault(),e.stopPropagation(),o.search(e.key);case Kg.Enter:if(e.preventDefault(),e.stopPropagation(),null!==o.activeOptionIndex.value){let e=o.options.value[o.activeOptionIndex.value];o.select(e.dataRef.value)}0===o.mode.value&&(o.closeListbox(),bn((()=>{var e;return null==(e=Jg(o.buttonRef))?void 0:e.focus({preventScroll:!0})})));break;case Mg(o.orientation.value,{vertical:Kg.ArrowDown,horizontal:Kg.ArrowRight}):return e.preventDefault(),e.stopPropagation(),o.goToOption(Gg.Next);case Mg(o.orientation.value,{vertical:Kg.ArrowUp,horizontal:Kg.ArrowLeft}):return e.preventDefault(),e.stopPropagation(),o.goToOption(Gg.Previous);case Kg.Home:case Kg.PageUp:return e.preventDefault(),e.stopPropagation(),o.goToOption(Gg.First);case Kg.End:case Kg.PageDown:return e.preventDefault(),e.stopPropagation(),o.goToOption(Gg.Last);case Kg.Escape:e.preventDefault(),e.stopPropagation(),o.closeListbox(),bn((()=>{var e;return null==(e=Jg(o.buttonRef))?void 0:e.focus({preventScroll:!0})}));break;case Kg.Tab:e.preventDefault(),e.stopPropagation();break;default:1===e.key.length&&(o.search(e.key),i.value=setTimeout((()=>o.clearSearch()),350))}}r({el:o.optionsRef,$el:o.optionsRef});let l=rm(),a=Rs((()=>null!==l?(l.value&nm.Open)===nm.Open:0===o.listboxState.value));return()=>{var r,i,l,u;let c={open:0===o.listboxState.value},{id:f,...p}=e;return Ug({ourProps:{"aria-activedescendant":null===o.activeOptionIndex.value||null==(r=o.options.value[o.activeOptionIndex.value])?void 0:r.id,"aria-multiselectable":1===o.mode.value||void 0,"aria-labelledby":null!=(u=null==(i=Jg(o.labelRef))?void 0:i.id)?u:null==(l=Jg(o.buttonRef))?void 0:l.id,"aria-orientation":o.orientation.value,id:f,onKeydown:s,role:"listbox",tabIndex:0,ref:o.optionsRef},theirProps:p,slot:c,attrs:t,slots:n,features:Dg.RenderStrategy|Dg.Static,visible:a.value,name:"ListboxOptions"})}}}),kw=Lr({name:"ListboxOption",props:{as:{type:[Object,String],default:"li"},value:{type:[Object,String,Number,Boolean]},disabled:{type:Boolean,default:!1},id:{type:String,default:()=>`headlessui-listbox.option-${Wg()}`}},setup(e,{slots:t,attrs:n,expose:r}){let o=ww("ListboxOption"),i=$t(null);r({el:i,$el:i});let s=Rs((()=>null!==o.activeOptionIndex.value&&o.options.value[o.activeOptionIndex.value].id===e.id)),l=Rs((()=>Mg(o.mode.value,{0:()=>o.compare(It(o.value.value),It(e.value)),1:()=>It(o.value.value).some((t=>o.compare(It(t),It(e.value))))}))),a=Rs((()=>Mg(o.mode.value,{1:()=>{var t;let n=It(o.value.value);return(null==(t=o.options.value.find((e=>n.some((t=>o.compare(It(t),It(e.dataRef.value)))))))?void 0:t.id)===e.id},0:()=>l.value}))),u=Cm(i),c=Rs((()=>({disabled:e.disabled,value:e.value,get textValue(){return u()},domRef:i})));function f(t){if(e.disabled)return t.preventDefault();o.select(e.value),0===o.mode.value&&(o.closeListbox(),bn((()=>{var e;return null==(e=Jg(o.buttonRef))?void 0:e.focus({preventScroll:!0})})))}function p(){if(e.disabled)return o.goToOption(Gg.Nothing);o.goToOption(Gg.Specific,e.id)}Jr((()=>o.registerOption(e.id,c))),eo((()=>o.unregisterOption(e.id))),Jr((()=>{dr([o.listboxState,l],(()=>{0===o.listboxState.value&&l.value&&Mg(o.mode.value,{1:()=>{a.value&&o.goToOption(Gg.Specific,e.id)},0:()=>{o.goToOption(Gg.Specific,e.id)}})}),{immediate:!0})})),ur((()=>{0===o.listboxState.value&&s.value&&0!==o.activationTrigger.value&&bn((()=>{var e,t;return null==(t=null==(e=Jg(i))?void 0:e.scrollIntoView)?void 0:t.call(e,{block:"nearest"})}))}));let d=Om();function h(e){d.update(e)}function v(t){d.wasMoved(t)&&(e.disabled||s.value||o.goToOption(Gg.Specific,e.id,0))}function g(t){d.wasMoved(t)&&(e.disabled||s.value&&o.goToOption(Gg.Nothing))}return()=>{let{disabled:r}=e,o={active:s.value,selected:l.value,disabled:r},{id:a,value:u,disabled:c,...d}=e;return Ug({ourProps:{id:a,ref:i,role:"option",tabIndex:!0===r?void 0:-1,"aria-disabled":!0===r||void 0,"aria-selected":l.value,disabled:void 0,onClick:f,onFocus:p,onPointerenter:h,onMouseenter:h,onPointermove:v,onMousemove:v,onPointerleave:g,onMouseleave:g},theirProps:d,slot:o,attrs:n,slots:t,name:"ListboxOption"})}}});function Ew(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true"},[Ji("path",{"fill-rule":"evenodd",d:"M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z","clip-rule":"evenodd"})])}var Cw={class:"relative mt-1"},Pw={class:"block truncate"},Tw={class:"pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2"};const Aw={__name:"HostSelector",setup:function(e){var t=Fg(),n=Wm();return dr((function(){return n.selectedHost}),(function(e){sb(t,"host",null!=e&&e.is_remote?e.identifier:null)})),function(e,t){return Ni(),Hi(Wt(_w),{as:"div",modelValue:Wt(n).selectedHostIdentifier,"onUpdate:modelValue":t[0]||(t[0]=function(e){return Wt(n).selectedHostIdentifier=e})},{default:$n((function(){return[Qi(Wt(xw),{class:"ml-1 block text-sm text-gray-500 dark:text-gray-400"},{default:$n((function(){return[ts("Select host")]})),_:1}),Ji("div",Cw,[Qi(Wt(Sw),{id:"hosts-toggle-button",class:"cursor-pointer relative text-gray-800 dark:text-gray-200 w-full cursor-default rounded-md border border-gray-300 dark:border-gray-700 bg-white dark:bg-gray-800 py-2 pl-4 pr-10 text-left hover:border-brand-600 hover:dark:border-brand-800 focus:border-brand-500 focus:outline-none focus:ring-1 focus:ring-brand-500 text-sm"},{default:$n((function(){var e;return[Ji("span",Pw,ce((null===(e=Wt(n).selectedHost)||void 0===e?void 0:e.name)||"Please select a server"),1),Ji("span",Tw,[Qi(Wt(Ew),{class:"h-5 w-5 text-gray-400","aria-hidden":"true"})])]})),_:1}),Qi(Ys,{"leave-active-class":"transition ease-in duration-100","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:$n((function(){return[Qi(Wt(Ow),{class:"absolute z-20 mt-1 max-h-60 w-full overflow-auto rounded-md shadow-md bg-white dark:bg-gray-800 py-1 border border-gray-200 dark:border-gray-700 ring-1 ring-brand ring-opacity-5 focus:outline-none text-sm"},{default:$n((function(){return[(Ni(!0),Vi(Ai,null,io(Wt(n).hosts,(function(e){return Ni(),Hi(Wt(kw),{as:"template",key:e.identifier,value:e.identifier},{default:$n((function(t){var n=t.active,r=t.selected;return[Ji("li",{class:ee([n?"text-white bg-brand-600":"text-gray-900 dark:text-gray-300","relative cursor-default select-none py-2 pl-3 pr-9"])},[Ji("span",{class:ee([r?"font-semibold":"font-normal","block truncate"])},ce(e.name),3),r?(Ni(),Vi("span",{key:0,class:ee([n?"text-white":"text-brand-600","absolute inset-y-0 right-0 flex items-center pr-4"])},[Qi(Wt(Jb),{class:"h-5 w-5","aria-hidden":"true"})],2)):rs("",!0)],2)]})),_:2},1032,["value"])})),128))]})),_:1})]})),_:1})])]})),_:1},8,["modelValue"])}}},jw=Aw;var Rw={class:"relative mt-1"},Lw={class:"block truncate"},Iw={class:"pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2"};const Fw={__name:"FileTypeSelector",setup:function(e){Fg();var t=nb();return function(e,n){return Ni(),Hi(Wt(_w),{as:"div",modelValue:Wt(t).selectedFileTypes,"onUpdate:modelValue":n[0]||(n[0]=function(e){return Wt(t).selectedFileTypes=e}),multiple:""},{default:$n((function(){return[Qi(Wt(xw),{class:"ml-1 block text-sm text-gray-500 dark:text-gray-400"},{default:$n((function(){return[ts("Selected file types")]})),_:1}),Ji("div",Rw,[Qi(Wt(Sw),{id:"hosts-toggle-button",class:"cursor-pointer relative text-gray-800 dark:text-gray-200 w-full cursor-default rounded-md border border-gray-300 dark:border-gray-700 bg-white dark:bg-gray-800 py-2 pl-4 pr-10 text-left hover:border-brand-600 hover:dark:border-brand-800 focus:border-brand-500 focus:outline-none focus:ring-1 focus:ring-brand-500 text-sm"},{default:$n((function(){return[Ji("span",Lw,ce(Wt(t).selectedFileTypesString),1),Ji("span",Iw,[Qi(Wt(Ew),{class:"h-5 w-5 text-gray-400","aria-hidden":"true"})])]})),_:1}),Qi(Ys,{"leave-active-class":"transition ease-in duration-100","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:$n((function(){return[Qi(Wt(Ow),{class:"absolute z-20 mt-1 max-h-60 w-full overflow-auto rounded-md shadow-md bg-white dark:bg-gray-800 py-1 border border-gray-200 dark:border-gray-700 ring-1 ring-brand ring-opacity-5 focus:outline-none text-sm"},{default:$n((function(){return[(Ni(!0),Vi(Ai,null,io(Wt(t).fileTypesAvailable,(function(e){return Ni(),Hi(Wt(kw),{as:"template",key:e.identifier,value:e.identifier},{default:$n((function(t){var n=t.active,r=t.selected;return[Ji("li",{class:ee([n?"text-white bg-brand-600":"text-gray-900 dark:text-gray-300","relative cursor-default select-none py-2 pl-3 pr-9"])},[Ji("span",{class:ee([r?"font-semibold":"font-normal","block truncate"])},ce(e.name),3),r?(Ni(),Vi("span",{key:0,class:ee([n?"text-white":"text-brand-600","absolute inset-y-0 right-0 flex items-center pr-4"])},[Qi(Wt(Jb),{class:"h-5 w-5","aria-hidden":"true"})],2)):rs("",!0)],2)]})),_:2},1032,["value"])})),128))]})),_:1})]})),_:1})])]})),_:1},8,["modelValue"])}}};function Nw(e){return Nw="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Nw(e)}function Mw(){Mw=function(){return t};var e,t={},n=Object.prototype,r=n.hasOwnProperty,o=Object.defineProperty||function(e,t,n){e[t]=n.value},i="function"==typeof Symbol?Symbol:{},s=i.iterator||"@@iterator",l=i.asyncIterator||"@@asyncIterator",a=i.toStringTag||"@@toStringTag";function u(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{u({},"")}catch(e){u=function(e,t,n){return e[t]=n}}function c(e,t,n,r){var i=t&&t.prototype instanceof m?t:m,s=Object.create(i.prototype),l=new A(r||[]);return o(s,"_invoke",{value:E(e,n,l)}),s}function f(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}t.wrap=c;var p="suspendedStart",d="suspendedYield",h="executing",v="completed",g={};function m(){}function y(){}function b(){}var w={};u(w,s,(function(){return this}));var _=Object.getPrototypeOf,x=_&&_(_(j([])));x&&x!==n&&r.call(x,s)&&(w=x);var S=b.prototype=m.prototype=Object.create(w);function O(e){["next","throw","return"].forEach((function(t){u(e,t,(function(e){return this._invoke(t,e)}))}))}function k(e,t){function n(o,i,s,l){var a=f(e[o],e,i);if("throw"!==a.type){var u=a.arg,c=u.value;return c&&"object"==Nw(c)&&r.call(c,"__await")?t.resolve(c.__await).then((function(e){n("next",e,s,l)}),(function(e){n("throw",e,s,l)})):t.resolve(c).then((function(e){u.value=e,s(u)}),(function(e){return n("throw",e,s,l)}))}l(a.arg)}var i;o(this,"_invoke",{value:function(e,r){function o(){return new t((function(t,o){n(e,r,t,o)}))}return i=i?i.then(o,o):o()}})}function E(t,n,r){var o=p;return function(i,s){if(o===h)throw new Error("Generator is already running");if(o===v){if("throw"===i)throw s;return{value:e,done:!0}}for(r.method=i,r.arg=s;;){var l=r.delegate;if(l){var a=C(l,r);if(a){if(a===g)continue;return a}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(o===p)throw o=v,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);o=h;var u=f(t,n,r);if("normal"===u.type){if(o=r.done?v:d,u.arg===g)continue;return{value:u.arg,done:r.done}}"throw"===u.type&&(o=v,r.method="throw",r.arg=u.arg)}}}function C(t,n){var r=n.method,o=t.iterator[r];if(o===e)return n.delegate=null,"throw"===r&&t.iterator.return&&(n.method="return",n.arg=e,C(t,n),"throw"===n.method)||"return"!==r&&(n.method="throw",n.arg=new TypeError("The iterator does not provide a '"+r+"' method")),g;var i=f(o,t.iterator,n.arg);if("throw"===i.type)return n.method="throw",n.arg=i.arg,n.delegate=null,g;var s=i.arg;return s?s.done?(n[t.resultName]=s.value,n.next=t.nextLoc,"return"!==n.method&&(n.method="next",n.arg=e),n.delegate=null,g):s:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,g)}function P(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function T(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function A(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(P,this),this.reset(!0)}function j(t){if(t||""===t){var n=t[s];if(n)return n.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var o=-1,i=function n(){for(;++o<t.length;)if(r.call(t,o))return n.value=t[o],n.done=!1,n;return n.value=e,n.done=!0,n};return i.next=i}}throw new TypeError(Nw(t)+" is not iterable")}return y.prototype=b,o(S,"constructor",{value:b,configurable:!0}),o(b,"constructor",{value:y,configurable:!0}),y.displayName=u(b,a,"GeneratorFunction"),t.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===y||"GeneratorFunction"===(t.displayName||t.name))},t.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,b):(e.__proto__=b,u(e,a,"GeneratorFunction")),e.prototype=Object.create(S),e},t.awrap=function(e){return{__await:e}},O(k.prototype),u(k.prototype,l,(function(){return this})),t.AsyncIterator=k,t.async=function(e,n,r,o,i){void 0===i&&(i=Promise);var s=new k(c(e,n,r,o),i);return t.isGeneratorFunction(n)?s:s.next().then((function(e){return e.done?e.value:s.next()}))},O(S),u(S,a,"Generator"),u(S,s,(function(){return this})),u(S,"toString",(function(){return"[object Generator]"})),t.keys=function(e){var t=Object(e),n=[];for(var r in t)n.push(r);return n.reverse(),function e(){for(;n.length;){var r=n.pop();if(r in t)return e.value=r,e.done=!1,e}return e.done=!0,e}},t.values=j,A.prototype={constructor:A,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=e,this.done=!1,this.delegate=null,this.method="next",this.arg=e,this.tryEntries.forEach(T),!t)for(var n in this)"t"===n.charAt(0)&&r.call(this,n)&&!isNaN(+n.slice(1))&&(this[n]=e)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var n=this;function o(r,o){return l.type="throw",l.arg=t,n.next=r,o&&(n.method="next",n.arg=e),!!o}for(var i=this.tryEntries.length-1;i>=0;--i){var s=this.tryEntries[i],l=s.completion;if("root"===s.tryLoc)return o("end");if(s.tryLoc<=this.prev){var a=r.call(s,"catchLoc"),u=r.call(s,"finallyLoc");if(a&&u){if(this.prev<s.catchLoc)return o(s.catchLoc,!0);if(this.prev<s.finallyLoc)return o(s.finallyLoc)}else if(a){if(this.prev<s.catchLoc)return o(s.catchLoc,!0)}else{if(!u)throw new Error("try statement without catch or finally");if(this.prev<s.finallyLoc)return o(s.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&r.call(o,"finallyLoc")&&this.prev<o.finallyLoc){var i=o;break}}i&&("break"===e||"continue"===e)&&i.tryLoc<=t&&t<=i.finallyLoc&&(i=null);var s=i?i.completion:{};return s.type=e,s.arg=t,i?(this.method="next",this.next=i.finallyLoc,g):this.complete(s)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),g},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),T(n),g}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var o=r.arg;T(n)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,n,r){return this.delegate={iterator:j(t),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=e),g}},t}function Dw(e,t,n,r,o,i,s){try{var l=e[i](s),a=l.value}catch(e){return void n(e)}l.done?t(a):Promise.resolve(a).then(r,o)}function Bw(e){return function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function s(e){Dw(i,r,o,s,l,"next",e)}function l(e){Dw(i,r,o,s,l,"throw",e)}s(void 0)}))}}var Uw={class:"flex flex-col h-full py-5"},$w={class:"mx-3 md:mx-0 mb-1"},Vw={class:"sm:flex sm:flex-col-reverse"},Hw={class:"font-semibold text-brand-700 dark:text-brand-600 text-2xl flex items-center"},zw={class:"md:hidden flex-1 flex justify-end"},qw={type:"button",class:"menu-button"},Ww={key:0},Kw=["href"],Gw={key:0,class:"bg-yellow-100 dark:bg-yellow-900 bg-opacity-75 dark:bg-opacity-40 border border-yellow-300 dark:border-yellow-800 rounded-md px-2 py-1 mt-2 text-xs leading-5 text-yellow-700 dark:text-yellow-400"},Yw=Ji("code",{class:"font-mono px-2 py-1 bg-gray-100 dark:bg-gray-900 rounded"},"php artisan log-viewer:publish",-1),Jw={key:3,class:"flex justify-between items-baseline mt-6"},Qw={class:"ml-1 block text-sm text-gray-500 dark:text-gray-400 truncate"},Zw={class:"text-sm text-gray-500 dark:text-gray-400"},Xw=Ji("label",{for:"file-sort-direction",class:"sr-only"},"Sort direction",-1),e_=[Ji("option",{value:"desc"},"Newest first",-1),Ji("option",{value:"asc"},"Oldest first",-1)],t_={key:4,class:"mx-1 mt-1 text-red-600 text-xs"},n_=Ji("p",{class:"text-sm text-gray-600 dark:text-gray-400"},"Please select files to delete and confirm or cancel deletion.",-1),r_=["onClick"],o_={id:"file-list-container",class:"relative h-full overflow-hidden"},i_=["id"],s_=["onClick"],l_={class:"file-item group"},a_={key:0,class:"sr-only"},u_={key:1,class:"sr-only"},c_={class:"file-icon group-hover:hidden group-focus:hidden"},f_={class:"file-icon hidden group-hover:inline-block group-focus:inline-block"},p_={class:"file-name"},d_={key:0},h_=Ji("span",{class:"text-gray-500 dark:text-gray-400"},"root",-1),v_={key:1},g_=Ji("span",{class:"sr-only"},"Open folder options",-1),m_={class:"py-2"},y_={class:"text-brand-500"},b_=Ji("div",{class:"divider"},null,-1),w_=["onClick","disabled"],__={class:"folder-files pl-3 ml-1 border-l border-gray-200 dark:border-gray-800"},x_={key:0,class:"text-center text-sm text-gray-600 dark:text-gray-400"},S_=Ji("p",{class:"mb-5"},"No log files were found.",-1),O_={class:"flex items-center justify-center px-1"},k_=Ji("div",{class:"pointer-events-none absolute z-10 bottom-0 h-4 w-full bg-gradient-to-t from-gray-100 dark:from-gray-900 to-transparent"},null,-1),E_={class:"absolute inset-y-0 left-3 right-7 lg:left-0 lg:right-0 z-10"},C_={class:"rounded-md bg-white text-gray-800 dark:bg-gray-700 dark:text-gray-200 opacity-90 w-full h-full flex items-center justify-center"};const P_={__name:"FileList",setup:function(e){var t=Fg(),n=Ng(),r=Wm(),o=nb(),i=lb(),s=i.dropdownDirections,l=i.calculateDropdownDirection,a=function(){var e=Bw(Mw().mark((function e(n){return Mw().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!confirm("Are you sure you want to delete the log folder '".concat(n.path,"'? THIS ACTION CANNOT BE UNDONE."))){e.next=4;break}return e.next=3,o.deleteFolder(n);case 3:n.files.some((function(e){return e.identifier===o.selectedFileIdentifier}))&&sb(t,"file",null);case 4:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),u=function(){var e=Bw(Mw().mark((function e(){return Mw().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!confirm("Are you sure you want to delete selected log files? THIS ACTION CANNOT BE UNDONE.")){e.next=7;break}return e.next=3,o.deleteSelectedFiles();case 3:return o.filesChecked.includes(o.selectedFileIdentifier)&&sb(t,"file",null),o.resetChecks(),e.next=7,o.loadFolders();case 7:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();return Jr(Bw(Mw().mark((function e(){return Mw().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r.selectHost(n.query.host||null);case 1:case"end":return e.stop()}}),e)})))),dr((function(){return o.direction}),(function(){return o.loadFolders()})),function(e,i){var c,f;return Ni(),Vi("nav",Uw,[Ji("div",$w,[Ji("div",Vw,[Ji("h1",Hw,[ts(" Log Viewer "),Ji("span",zw,[Qi(uw,{class:"ml-2"}),Ji("button",qw,[Qi(Wt(Nm),{class:"w-5 h-5 ml-2",onClick:Wt(o).toggleSidebar},null,8,["onClick"])])])]),e.LogViewer.back_to_system_url?(Ni(),Vi("div",Ww,[Ji("a",{href:e.LogViewer.back_to_system_url,class:"rounded shrink inline-flex items-center text-sm text-gray-500 dark:text-gray-400 hover:text-brand-800 dark:hover:text-brand-600 focus:outline-none focus:ring-2 focus:ring-brand-500 dark:focus:ring-brand-700 mt-0"},[Qi(Wt(Mm),{class:"h-3 w-3 mr-1.5"}),ts(" "+ce(e.LogViewer.back_to_system_label||"Back to ".concat(e.LogViewer.app_name)),1)],8,Kw)])):rs("",!0)]),e.LogViewer.assets_outdated?(Ni(),Vi("div",Gw,[Qi(Wt(Dm),{class:"h-4 w-4 mr-1 inline"}),ts(" Front-end assets are outdated. To update, please run "),Yw])):rs("",!0),Wt(r).supportsHosts&&Wt(r).hasRemoteHosts?(Ni(),Hi(jw,{key:1,class:"mb-8 mt-6"})):rs("",!0),Wt(o).fileTypesAvailable&&Wt(o).fileTypesAvailable.length>1?(Ni(),Hi(Fw,{key:2,class:"mb-8 mt-6"})):rs("",!0),(null===(c=Wt(o).filteredFolders)||void 0===c?void 0:c.length)>0?(Ni(),Vi("div",Jw,[Ji("div",Qw,"Log files on "+ce(null===(f=Wt(o).selectedHost)||void 0===f?void 0:f.name),1),Ji("div",Zw,[Xw,yr(Ji("select",{id:"file-sort-direction",class:"select","onUpdate:modelValue":i[0]||(i[0]=function(e){return Wt(o).direction=e})},e_,512),[[Zl,Wt(o).direction]])])])):rs("",!0),Wt(o).error?(Ni(),Vi("p",t_,ce(Wt(o).error),1)):rs("",!0)]),yr(Ji("div",null,[n_,Ji("div",{class:ee(["grid grid-flow-col pr-4 mt-2",[Wt(o).hasFilesChecked?"justify-between":"justify-end"]])},[yr(Ji("button",{onClick:la(u,["stop"]),class:"button inline-flex"},[Qi(Wt(Bm),{class:"w-5 mr-1"}),ts(" Delete selected files ")],8,r_),[[pl,Wt(o).hasFilesChecked]]),Ji("button",{class:"button inline-flex",onClick:i[1]||(i[1]=la((function(e){return Wt(o).resetChecks()}),["stop"]))},[ts(" Cancel "),Qi(Wt(Nm),{class:"w-5 ml-1"})])],2)],512),[[pl,Wt(o).checkBoxesVisibility]]),Ji("div",o_,[Ji("div",{class:"file-list",onScroll:i[6]||(i[6]=function(e){return Wt(o).onScroll(e)})},[(Ni(!0),Vi(Ai,null,io(Wt(o).filteredFolders,(function(e){return Ni(),Vi("div",{key:e.identifier,id:"folder-".concat(e.identifier),class:"relative folder-container"},[Qi(Wt(Rm),null,{default:$n((function(t){var n=t.open;return[Ji("div",{class:ee(["folder-item-container",[Wt(o).isOpen(e)?"active-folder":"",Wt(o).shouldBeSticky(e)?"sticky "+(n?"z-20":"z-10"):""]]),onClick:function(t){return Wt(o).toggle(e)}},[Ji("div",l_,[Ji("button",{class:"file-item-info group",onKeydown:i[2]||(i[2]=function(){return Wt(Sb)&&Wt(Sb).apply(void 0,arguments)})},[Wt(o).isOpen(e)?rs("",!0):(Ni(),Vi("span",a_,"Open folder")),Wt(o).isOpen(e)?(Ni(),Vi("span",u_,"Close folder")):rs("",!0),Ji("span",c_,[yr(Qi(Wt(Um),{class:"w-5 h-5"},null,512),[[pl,!Wt(o).isOpen(e)]]),yr(Qi(Wt($m),{class:"w-5 h-5"},null,512),[[pl,Wt(o).isOpen(e)]])]),Ji("span",f_,[Qi(Wt(Vm),{class:ee([Wt(o).isOpen(e)?"rotate-90":"","transition duration-100"])},null,8,["class"])]),Ji("span",p_,[String(e.clean_path||"").startsWith("root")?(Ni(),Vi("span",d_,[h_,ts(ce(String(e.clean_path).substring(4)),1)])):(Ni(),Vi("span",v_,ce(e.clean_path),1))])],32),Qi(Wt(Lm),{as:"button",class:"file-dropdown-toggle group-hover:border-brand-600 group-hover:dark:border-brand-800","data-toggle-id":e.identifier,onKeydown:Wt(Ob),onClick:i[3]||(i[3]=la((function(e){return Wt(l)(e.target)}),["stop"]))},{default:$n((function(){return[g_,Qi(Wt(Hm),{class:"w-4 h-4 pointer-events-none"})]})),_:2},1032,["data-toggle-id","onKeydown"])]),Qi(Ys,{"leave-active-class":"transition ease-in duration-100","leave-from-class":"opacity-100 scale-100","leave-to-class":"opacity-0 scale-90","enter-active-class":"transition ease-out duration-100","enter-from-class":"opacity-0 scale-90","enter-to-class":"opacity-100 scale-100"},{default:$n((function(){return[yr(Qi(Wt(Im),{static:"",as:"div",class:ee(["dropdown w-48",[Wt(s)[e.identifier]]])},{default:$n((function(){return[Ji("div",m_,[Qi(Wt(Fm),{onClick:la((function(t){return Wt(o).clearCacheForFolder(e)}),["stop","prevent"])},{default:$n((function(t){return[Ji("button",{class:ee([t.active?"active":""])},[yr(Qi(Wt(zm),{class:"w-4 h-4 mr-2"},null,512),[[pl,!Wt(o).clearingCache[e.identifier]]]),yr(Qi(pb,{class:"w-4 h-4 mr-2"},null,512),[[pl,Wt(o).clearingCache[e.identifier]]]),yr(Ji("span",null,"Clear indices",512),[[pl,!Wt(o).cacheRecentlyCleared[e.identifier]&&!Wt(o).clearingCache[e.identifier]]]),yr(Ji("span",null,"Clearing...",512),[[pl,!Wt(o).cacheRecentlyCleared[e.identifier]&&Wt(o).clearingCache[e.identifier]]]),yr(Ji("span",y_,"Indices cleared",512),[[pl,Wt(o).cacheRecentlyCleared[e.identifier]]])],2)]})),_:2},1032,["onClick"]),e.can_download?(Ni(),Hi(Wt(Fm),{key:0},{default:$n((function(t){var n=t.active;return[Qi(Eb,{url:e.download_url,onClick:i[4]||(i[4]=la((function(){}),["stop"])),class:ee([n?"active":""])},null,8,["url","class"])]})),_:2},1024)):rs("",!0),e.can_delete?(Ni(),Vi(Ai,{key:1},[b_,Qi(Wt(Fm),null,{default:$n((function(t){var n=t.active;return[Ji("button",{onClick:la((function(t){return a(e)}),["stop"]),disabled:Wt(o).deleting[e.identifier],class:ee([n?"active":""])},[yr(Qi(Wt(Bm),{class:"w-4 h-4 mr-2"},null,512),[[pl,!Wt(o).deleting[e.identifier]]]),yr(Qi(pb,null,null,512),[[pl,Wt(o).deleting[e.identifier]]]),ts(" Delete ")],10,w_)]})),_:2},1024)],64)):rs("",!0)])]})),_:2},1032,["class"]),[[pl,n]])]})),_:2},1024)],10,s_)]})),_:2},1024),yr(Ji("div",__,[(Ni(!0),Vi(Ai,null,io(e.files||[],(function(e){return Ni(),Hi(Hb,{key:e.identifier,"log-file":e,onClick:function(r){return o=e.identifier,void(n.query.file&&n.query.file===o?sb(t,"file",null):sb(t,"file",o));var o}},null,8,["log-file","onClick"])})),128))],512),[[pl,Wt(o).isOpen(e)]])],8,i_)})),128)),0===Wt(o).folders.length?(Ni(),Vi("div",x_,[S_,Ji("div",O_,[Ji("button",{onClick:i[5]||(i[5]=la((function(e){return Wt(o).loadFolders()}),["prevent"])),class:"inline-flex items-center px-4 py-2 text-left text-sm bg-white hover:bg-gray-50 outline-brand-500 dark:outline-brand-800 text-gray-900 dark:text-gray-200 rounded-md dark:bg-gray-700 dark:hover:bg-gray-600"},[Qi(Wt(qm),{class:"w-4 h-4 mr-1.5"}),ts(" Refresh file list ")])])])):rs("",!0)],32),k_,yr(Ji("div",E_,[Ji("div",C_,[Qi(pb,{class:"w-14 h-14"})])],512),[[pl,Wt(o).loading]])])])}}},T_=P_;function A_(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true"},[Ji("path",{"fill-rule":"evenodd",d:"M4.755 10.059a7.5 7.5 0 0112.548-3.364l1.903 1.903h-3.183a.75.75 0 100 1.5h4.992a.75.75 0 00.75-.75V4.356a.75.75 0 00-1.5 0v3.18l-1.9-1.9A9 9 0 003.306 9.67a.75.75 0 101.45.388zm15.408 3.352a.75.75 0 00-.919.53 7.5 7.5 0 01-12.548 3.364l-1.902-1.903h3.183a.75.75 0 000-1.5H2.984a.75.75 0 00-.75.75v4.992a.75.75 0 001.5 0v-3.18l1.9 1.9a9 9 0 0015.059-4.035.75.75 0 00-.53-.918z","clip-rule":"evenodd"})])}function j_(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true"},[Ji("path",{"fill-rule":"evenodd",d:"M3 6.75A.75.75 0 013.75 6h16.5a.75.75 0 010 1.5H3.75A.75.75 0 013 6.75zM3 12a.75.75 0 01.75-.75h16.5a.75.75 0 010 1.5H3.75A.75.75 0 013 12zm0 5.25a.75.75 0 01.75-.75h16.5a.75.75 0 010 1.5H3.75a.75.75 0 01-.75-.75z","clip-rule":"evenodd"})])}function R_(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[Ji("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M13.5 4.5L21 12m0 0l-7.5 7.5M21 12H3"})])}var L_={class:"pagination"},I_={class:"previous"},F_=["disabled"],N_=Ji("span",{class:"sm:hidden"},"Previous page",-1),M_={class:"sm:hidden border-transparent text-gray-500 dark:text-gray-400 border-t-2 pt-3 px-4 inline-flex items-center text-sm font-medium"},D_={class:"pages"},B_={key:0,class:"border-brand-500 text-brand-600 dark:border-brand-600 dark:text-brand-500","aria-current":"page"},U_={key:1},$_=["onClick"],V_={class:"next"},H_=["disabled"],z_=Ji("span",{class:"sm:hidden"},"Next page",-1);const q_={__name:"Pagination",props:{loading:{type:Boolean,required:!0},short:{type:Boolean,default:!1}},setup:function(e){var t=zy(),n=Fg(),r=Ng(),o=(Rs((function(){return Number(r.query.page)||1})),function(e){e<1&&(e=1),t.pagination&&e>t.pagination.last_page&&(e=t.pagination.last_page),sb(n,"page",e>1?Number(e):null)}),i=function(){return o(t.page+1)},s=function(){return o(t.page-1)};return function(n,r){return Ni(),Vi("nav",L_,[Ji("div",I_,[1!==Wt(t).page?(Ni(),Vi("button",{key:0,onClick:s,disabled:e.loading,rel:"prev"},[Qi(Wt(Mm),{class:"h-5 w-5"}),N_],8,F_)):rs("",!0)]),Ji("div",M_,[Ji("span",null,ce(Wt(t).page),1)]),Ji("div",D_,[(Ni(!0),Vi(Ai,null,io(e.short?Wt(t).linksShort:Wt(t).links,(function(e){return Ni(),Vi(Ai,null,[e.active?(Ni(),Vi("button",B_,ce(Number(e.label).toLocaleString()),1)):"..."===e.label?(Ni(),Vi("span",U_,ce(e.label),1)):(Ni(),Vi("button",{key:2,onClick:function(t){return o(Number(e.label))},class:"border-transparent text-gray-500 dark:text-gray-400 hover:text-gray-700 hover:border-gray-300 dark:hover:text-gray-300 dark:hover:border-gray-400"},ce(Number(e.label).toLocaleString()),9,$_))],64)})),256))]),Ji("div",V_,[Wt(t).hasMorePages?(Ni(),Vi("button",{key:0,onClick:i,disabled:e.loading,rel:"next"},[z_,Qi(Wt(R_),{class:"h-5 w-5"})],8,H_)):rs("",!0)])])}}},W_=q_;function K_(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[Ji("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M19.5 8.25l-7.5 7.5-7.5-7.5"})])}var G_={class:"flex items-center"},Y_={class:"opacity-90 mr-1"},J_={class:"font-semibold"},Q_={class:"opacity-90 mr-1"},Z_={class:"font-semibold"},X_={key:2,class:"opacity-90"},ex={key:3,class:"opacity-90"},tx={class:"py-2"},nx={class:"label flex justify-between"},rx={key:0,class:"no-results"},ox={class:"flex-1 inline-flex justify-between"},ix={class:"log-count"};const sx={__name:"LevelButtons",setup:function(e){var t=Yy(),n=qy();return dr((function(){return n.excludedLevels}),(function(){return t.loadLogs()})),function(e,r){return Ni(),Vi("div",G_,[Qi(Wt(Rm),{as:"div",class:"mr-5 relative log-levels-selector"},{default:$n((function(){return[Qi(Wt(Lm),{as:"button",id:"severity-dropdown-toggle",class:ee(["dropdown-toggle badge none",Wt(n).levelsSelected.length>0?"active":""])},{default:$n((function(){return[Wt(n).levelsSelected.length>2?(Ni(),Vi(Ai,{key:0},[Ji("span",Y_,ce(Wt(n).totalResultsSelected.toLocaleString()+(Wt(t).hasMoreResults?"+":""))+" entries in",1),Ji("strong",J_,ce(Wt(n).levelsSelected[0].level_name)+" + "+ce(Wt(n).levelsSelected.length-1)+" more",1)],64)):Wt(n).levelsSelected.length>0?(Ni(),Vi(Ai,{key:1},[Ji("span",Q_,ce(Wt(n).totalResultsSelected.toLocaleString()+(Wt(t).hasMoreResults?"+":""))+" entries in",1),Ji("strong",Z_,ce(Wt(n).levelsSelected.map((function(e){return e.level_name})).join(", ")),1)],64)):Wt(n).levelsFound.length>0?(Ni(),Vi("span",X_,ce(Wt(n).totalResults.toLocaleString()+(Wt(t).hasMoreResults?"+":""))+" entries found. None selected",1)):(Ni(),Vi("span",ex,"No entries found")),Qi(Wt(K_),{class:"w-4 h-4"})]})),_:1},8,["class"]),Qi(Ys,{"leave-active-class":"transition ease-in duration-100","leave-from-class":"opacity-100 scale-100","leave-to-class":"opacity-0 scale-90","enter-active-class":"transition ease-out duration-100","enter-from-class":"opacity-0 scale-90","enter-to-class":"opacity-100 scale-100"},{default:$n((function(){return[Qi(Wt(Im),{as:"div",class:"dropdown down left min-w-[240px]"},{default:$n((function(){return[Ji("div",tx,[Ji("div",nx,[ts(" Severity "),Wt(n).levelsFound.length>0?(Ni(),Vi(Ai,{key:0},[Wt(n).levelsSelected.length===Wt(n).levelsFound.length?(Ni(),Hi(Wt(Fm),{key:0,onClick:la(Wt(n).deselectAllLevels,["stop"])},{default:$n((function(e){return[Ji("a",{class:ee(["inline-link px-2 -mr-2 py-1 -my-1 rounded-md cursor-pointer text-brand-700 dark:text-brand-500 font-normal",[e.active?"active":""]])}," Deselect all ",2)]})),_:1},8,["onClick"])):(Ni(),Hi(Wt(Fm),{key:1,onClick:la(Wt(n).selectAllLevels,["stop"])},{default:$n((function(e){return[Ji("a",{class:ee(["inline-link px-2 -mr-2 py-1 -my-1 rounded-md cursor-pointer text-brand-700 dark:text-brand-500 font-normal",[e.active?"active":""]])}," Select all ",2)]})),_:1},8,["onClick"]))],64)):rs("",!0)]),0===Wt(n).levelsFound.length?(Ni(),Vi("div",rx,"There are no severity filters to display because no entries have been found.")):(Ni(!0),Vi(Ai,{key:1},io(Wt(n).levelsFound,(function(e){return Ni(),Hi(Wt(Fm),{onClick:la((function(t){return Wt(n).toggleLevel(e.level)}),["stop","prevent"])},{default:$n((function(t){return[Ji("button",{class:ee([t.active?"active":""])},[Qi(Zb,{class:"checkmark mr-2.5",checked:e.selected},null,8,["checked"]),Ji("span",ox,[Ji("span",{class:ee(["log-level",e.level_class])},ce(e.level_name),3),Ji("span",ix,ce(Number(e.count).toLocaleString()),1)])],2)]})),_:2},1032,["onClick"])})),256))])]})),_:1})]})),_:1})]})),_:1})])}}};function lx(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[Ji("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z"})])}var ax={class:"flex-1"},ux={class:"prefix-icon"},cx=Ji("label",{for:"query",class:"sr-only"},"Search",-1),fx={class:"relative flex-1 m-1"},px=["onKeydown"],dx={class:"clear-search"},hx={class:"submit-search"},vx={key:0,disabled:"disabled"},gx={class:"hidden xl:inline ml-1"},mx={class:"hidden xl:inline ml-1"},yx={class:"relative h-0 w-full overflow-visible"},bx=["innerHTML"];const wx={__name:"SearchInput",setup:function(e){var t=Hy(),n=Yy(),r=Fg(),o=Ng(),i=Rs((function(){return n.selectedFile})),s=$t(o.query.query||""),l=function(){var e;sb(r,"query",""===s.value?null:s.value),null===(e=document.getElementById("query-submit"))||void 0===e||e.focus()},a=function(){s.value="",l()};return dr((function(){return o.query.query}),(function(e){return s.value=e||""})),function(e,r){return Ni(),Vi("div",ax,[Ji("div",{class:ee(["search",{"has-error":Wt(n).error}])},[Ji("div",ux,[cx,yr(Qi(Wt(lx),{class:"h-4 w-4"},null,512),[[pl,!Wt(n).hasMoreResults]]),yr(Qi(pb,{class:"w-4 h-4"},null,512),[[pl,Wt(n).hasMoreResults]])]),Ji("div",fx,[yr(Ji("input",{"onUpdate:modelValue":r[0]||(r[0]=function(e){return s.value=e}),name:"query",id:"query",type:"text",onKeydown:[ua(l,["enter"]),r[1]||(r[1]=ua((function(e){return e.target.blur()}),["esc"]))]},null,40,px),[[Gl,s.value]]),yr(Ji("div",dx,[Ji("button",{onClick:a},[Qi(Wt(Nm),{class:"h-4 w-4"})])],512),[[pl,Wt(t).hasQuery]])]),Ji("div",hx,[Wt(n).hasMoreResults?(Ni(),Vi("button",vx,[Ji("span",null,[ts("Searching"),Ji("span",gx,ce(i.value?i.value.name:"all files"),1),ts("...")])])):(Ni(),Vi("button",{key:1,onClick:l,id:"query-submit"},[Ji("span",null,[ts("Search"),Ji("span",mx,ce(i.value?'in "'+i.value.name+'"':"all files"),1)]),Qi(Wt(R_),{class:"h-4 w-4"})]))])],2),Ji("div",yx,[yr(Ji("div",{class:"search-progress-bar",style:Y({width:Wt(n).percentScanned+"%"})},null,4),[[pl,Wt(n).hasMoreResults]])]),yr(Ji("p",{class:"mt-1 text-red-600 text-xs",innerHTML:Wt(n).error},null,8,bx),[[pl,Wt(n).error]])])}}},_x=wx;function xx(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true"},[Ji("path",{"fill-rule":"evenodd",d:"M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z","clip-rule":"evenodd"})])}function Sx(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true"},[Ji("path",{"fill-rule":"evenodd",d:"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z","clip-rule":"evenodd"})])}function Ox(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true"},[Ji("path",{"fill-rule":"evenodd",d:"M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12zm13.36-1.814a.75.75 0 10-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 00-1.06 1.06l2.25 2.25a.75.75 0 001.14-.094l3.75-5.25z","clip-rule":"evenodd"})])}function kx(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true"},[Ji("path",{"fill-rule":"evenodd",d:"M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12zm8.706-1.442c1.146-.573 2.437.463 2.126 1.706l-.709 2.836.042-.02a.75.75 0 01.67 1.34l-.04.022c-1.147.573-2.438-.463-2.127-1.706l.71-2.836-.042.02a.75.75 0 11-.671-1.34l.041-.022zM12 9a.75.75 0 100-1.5.75.75 0 000 1.5z","clip-rule":"evenodd"})])}function Ex(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true"},[Ji("path",{"fill-rule":"evenodd",d:"M16.28 11.47a.75.75 0 010 1.06l-7.5 7.5a.75.75 0 01-1.06-1.06L14.69 12 7.72 5.03a.75.75 0 011.06-1.06l7.5 7.5z","clip-rule":"evenodd"})])}function Cx(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[Ji("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M13.19 8.688a4.5 4.5 0 011.242 7.244l-4.5 4.5a4.5 4.5 0 01-6.364-6.364l1.757-1.757m13.35-.622l1.757-1.757a4.5 4.5 0 00-6.364-6.364l-4.5 4.5a4.5 4.5 0 001.242 7.244"})])}function Px(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true"},[Ji("path",{d:"M7.493 18.75c-.425 0-.82-.236-.975-.632A7.48 7.48 0 016 15.375c0-1.75.599-3.358 1.602-4.634.151-.192.373-.309.6-.397.473-.183.89-.514 1.212-.924a9.042 9.042 0 012.861-2.4c.723-.384 1.35-.956 1.653-1.715a4.498 4.498 0 00.322-1.672V3a.75.75 0 01.75-.75 2.25 2.25 0 012.25 2.25c0 1.152-.26 2.243-.723 3.218-.266.558.107 1.282.725 1.282h3.126c1.026 0 1.945.694 2.054 1.715.045.422.068.85.068 1.285a11.95 11.95 0 01-2.649 7.521c-.388.482-.987.729-1.605.729H14.23c-.483 0-.964-.078-1.423-.23l-3.114-1.04a4.501 4.501 0 00-1.423-.23h-.777zM2.331 10.977a11.969 11.969 0 00-.831 4.398 12 12 0 00.52 3.507c.26.85 1.084 1.368 1.973 1.368H4.9c.445 0 .72-.498.523-.898a8.963 8.963 0 01-.924-3.977c0-1.708.476-3.305 1.302-4.666.245-.403-.028-.959-.5-.959H4.25c-.832 0-1.612.453-1.918 1.227z"})])}var Tx=["onClick"],Ax={class:"sr-only"},jx={class:"text-green-600 dark:text-green-500 hidden md:inline"};const Rx={__name:"LogCopyButton",props:{log:{type:Object,required:!0}},setup:function(e){var t=e,n=$t(!1),r=function(){ib(t.log.url),n.value=!0,setTimeout((function(){return n.value=!1}),1e3)};return function(t,o){return Ni(),Vi("button",{class:"log-link group",onClick:la(r,["stop"]),onKeydown:o[0]||(o[0]=function(){return Wt(xb)&&Wt(xb).apply(void 0,arguments)}),title:"Copy link to this log entry"},[Ji("span",Ax,"Log index "+ce(e.log.index)+". Click the button to copy link to this log entry.",1),yr(Ji("span",{class:"hidden md:inline group-hover:underline"},ce(Number(e.log.index).toLocaleString()),513),[[pl,!n.value]]),yr(Qi(Wt(Cx),{class:"md:opacity-75 group-hover:opacity-100"},null,512),[[pl,!n.value]]),yr(Qi(Wt(Px),{class:"text-green-600 dark:text-green-500 md:hidden"},null,512),[[pl,n.value]]),yr(Ji("span",jx,"Copied!",512),[[pl,n.value]])],40,Tx)}}};var Lx={key:0,class:"tabs-container"},Ix={class:"border-b border-gray-200 dark:border-gray-800"},Fx={class:"-mb-px flex space-x-6","aria-label":"Tabs"},Nx=["onClick","aria-current"];const Mx={__name:"TabContainer",props:{tabs:{type:Array,required:!0}},setup:function(e){var t=$t(e.tabs[0]);Go("currentTab",t);var n=function(e){return t.value&&t.value.value===e.value};return function(r,o){return Ni(),Vi("div",null,[e.tabs&&e.tabs.length>1?(Ni(),Vi("div",Lx,[Ji("div",Ix,[Ji("nav",Fx,[(Ni(!0),Vi(Ai,null,io(e.tabs,(function(e){return Ni(),Vi("a",{key:e.name,href:"#",onClick:la((function(n){return t.value=e}),["prevent"]),class:ee([n(e)?"border-brand-500 dark:border-brand-400 text-brand-600 dark:text-brand-500":"border-transparent text-gray-500 dark:text-gray-400 hover:border-gray-300 hover:text-gray-700 dark:hover:text-gray-200","whitespace-nowrap border-b-2 py-2 px-1 text-sm font-medium focus:outline-brand-500"]),"aria-current":n(e)?"page":void 0},ce(e.name),11,Nx)})),128))])])])):rs("",!0),lo(r.$slots,"default")])}}};var Dx={key:0};const Bx={__name:"TabContent",props:{tabValue:{type:String,required:!0}},setup:function(e){var t=e,n=Yo("currentTab"),r=Rs((function(){return n.value&&n.value.value===t.tabValue}));return function(e,t){return r.value?(Ni(),Vi("div",Dx,[lo(e.$slots,"default")])):rs("",!0)}}};function Ux(e,t){return Ni(),Vi("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true"},[Ji("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M18.375 12.739l-7.693 7.693a4.5 4.5 0 01-6.364-6.364l10.94-10.94A3 3 0 1119.5 7.372L8.552 18.32m.009-.01l-.01.01m5.699-9.941l-7.81 7.81a1.5 1.5 0 002.112 2.13"})])}var $x={class:"mail-preview-attributes"},Vx={key:0},Hx=Ji("td",{class:"font-semibold"},"From",-1),zx={key:1},qx=Ji("td",{class:"font-semibold"},"To",-1),Wx={key:2},Kx=Ji("td",{class:"font-semibold"},"Message ID",-1),Gx={key:3},Yx=Ji("td",{class:"font-semibold"},"Subject",-1),Jx={key:4},Qx=Ji("td",{class:"font-semibold"},"Attachments",-1),Zx={class:"flex items-center"},Xx={class:"opacity-60"},eS=["onClick"];const tS={__name:"MailPreviewAttributes",props:["mail"],setup:function(e){return function(t,n){return Ni(),Vi("div",$x,[Ji("table",null,[e.mail.from?(Ni(),Vi("tr",Vx,[Hx,Ji("td",null,ce(e.mail.from),1)])):rs("",!0),e.mail.to?(Ni(),Vi("tr",zx,[qx,Ji("td",null,ce(e.mail.to),1)])):rs("",!0),e.mail.id?(Ni(),Vi("tr",Wx,[Kx,Ji("td",null,ce(e.mail.id),1)])):rs("",!0),e.mail.subject?(Ni(),Vi("tr",Gx,[Yx,Ji("td",null,ce(e.mail.subject),1)])):rs("",!0),e.mail.attachments&&e.mail.attachments.length>0?(Ni(),Vi("tr",Jx,[Qx,Ji("td",null,[(Ni(!0),Vi(Ai,null,io(e.mail.attachments,(function(t,n){return Ni(),Vi("div",{key:"mail-".concat(e.mail.id,"-attachment-").concat(n),class:"mail-attachment-button"},[Ji("div",Zx,[Qi(Wt(Ux),{class:"h-4 w-4 text-gray-500 dark:text-gray-400 mr-1"}),Ji("span",null,[ts(ce(t.filename)+" ",1),Ji("span",Xx,"("+ce(t.size_formatted)+")",1)])]),Ji("div",null,[Ji("a",{href:"#",onClick:la((function(e){return function(e){for(var t=atob(e.content),n=new Array(t.length),r=0;r<t.length;r++)n[r]=t.charCodeAt(r);var o=new Uint8Array(n),i=new Blob([o],{type:e.content_type||"application/octet-stream"}),s=URL.createObjectURL(i),l=document.createElement("a");l.href=s,l.download=e.filename,l.click(),URL.revokeObjectURL(s)}(t)}),["prevent"]),class:"text-blue-600 hover:text-blue-700 dark:text-blue-500 dark:hover:text-blue-400"},"Download",8,eS)])])})),128))])])):rs("",!0)])])}}},nS=tS;var rS={class:"mail-preview"},oS=["srcdoc"];const iS={__name:"MailHtmlPreview",props:{mail:{type:Object}},setup:function(e){var t=$t(null),n=$t(600),r=function(){var e;n.value=((null===(e=t.value)||void 0===e||null===(e=e.contentWindow)||void 0===e||null===(e=e.document)||void 0===e||null===(e=e.body)||void 0===e?void 0:e.clientHeight)||580)+20};return function(o,i){return Ni(),Vi("div",rS,[Qi(nS,{mail:e.mail},null,8,["mail"]),e.mail.html?(Ni(),Vi("iframe",{key:0,class:"mail-preview-html",style:Y({height:"".concat(n.value,"px")}),srcdoc:e.mail.html,onLoad:r,ref_key:"iframe",ref:t},null,44,oS)):rs("",!0)])}}};var sS={class:"mail-preview"},lS=["textContent"];const aS={__name:"MailTextPreview",props:{mail:{type:Object}},setup:function(e){$t(null),$t(600);return function(t,n){return Ni(),Vi("div",sS,[Qi(nS,{mail:e.mail},null,8,["mail"]),e.mail.text?(Ni(),Vi("pre",{key:0,class:"mail-preview-text",textContent:ce(e.mail.text)},null,8,lS)):rs("",!0)])}}};function uS(e){return function(e){if(Array.isArray(e))return cS(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return cS(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return cS(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function cS(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var fS={class:"table-fixed min-w-full max-w-full border-separate",style:{"border-spacing":"0"}},pS={class:"bg-gray-50"},dS=Ji("th",{class:"hidden lg:table-cell"},[Ji("span",{class:"sr-only"},"Expand/Collapse")],-1),hS={scope:"col"},vS=Ji("th",{scope:"col",class:"hidden lg:table-cell"},[Ji("span",{class:"sr-only"},"Log index")],-1),gS=["id","data-index"],mS=["onClick"],yS={class:"log-level hidden lg:table-cell"},bS={class:"flex items-center lg:pl-2"},wS=["aria-expanded"],_S={key:0,class:"sr-only"},xS={key:1,class:"sr-only"},SS={class:"w-full h-full group-hover:hidden group-focus:hidden"},OS={class:"w-full h-full hidden group-hover:inline-block group-focus:inline-block"},kS=["innerHTML"],ES={class:"lg:hidden"},CS=["innerHTML"],PS=["innerHTML"],TS={class:"whitespace-nowrap text-gray-500 dark:text-gray-300 dark:opacity-90 text-xs hidden lg:table-cell"},AS={colspan:"6"},jS={class:"lg:hidden flex justify-between px-2 pt-2 pb-1 text-xs"},RS={class:"flex-1"},LS=Ji("span",{class:"font-semibold"},"Datetime:",-1),IS=["innerHTML"],FS=Ji("p",{class:"mx-2 lg:mx-8 pt-2 border-t font-semibold text-gray-700 dark:text-gray-400 text-xs lg:text-sm"},"Context:",-1),NS=["innerHTML"],MS={key:1,class:"py-4 px-8 text-gray-500 italic"},DS={key:1,class:"log-group"},BS={colspan:"6"},US={class:"bg-white text-gray-600 dark:bg-gray-800 dark:text-gray-200 p-12"},$S=Ji("div",{class:"text-center font-semibold"},"No results",-1),VS={class:"text-center mt-6"},HS=["onClick"];const zS={__name:"BaseLogTable",emits:["clearSelectedFile","clearQuery"],setup:function(e,t){var n=t.emit,r=nb(),o=Yy(),i=Hy(),s=qy(),l=n,a=function(){l("clearSelectedFile")},u=function(){l("clearQuery")},c=function(e,t){var n=t.split(".").reduce((function(e,t){return e&&e[t]}),e);return void 0===n?"":String(n)},f=function(e){return e.context&&Object.keys(e.context).length>0},p=function(e){return[].concat(uS(function(e){var t=[];return e.extra&&e.extra.mail_preview?(e.extra.mail_preview.html&&t.push({name:"HTML preview",value:"mail_html_preview"}),e.extra.mail_preview.text&&t.push({name:"Text preview",value:"mail_text_preview"}),t):t}(e)),[{name:"Raw",value:"raw"}]).filter(Boolean)};return function(e,t){var n,l;return Ni(),Vi("table",fS,[Ji("thead",pS,[Ji("tr",null,[dS,(Ni(!0),Vi(Ai,null,io(Wt(o).columns,(function(e){return Ni(),Vi("th",hS,[Ji("div",null,ce(e.label),1)])})),256)),vS])]),Wt(o).logs&&Wt(o).logs.length>0?(Ni(!0),Vi(Ai,{key:0},io(Wt(o).logs,(function(n,r){return Ni(),Vi("tbody",{key:r,class:ee([0===r?"first":"","log-group"]),id:"tbody-".concat(r),"data-index":r},[Ji("tr",{onClick:function(e){return Wt(o).toggle(r)},class:ee(["log-item group",n.level_class,Wt(o).isOpen(r)?"active":"",Wt(o).shouldBeSticky(r)?"sticky z-2":""]),style:Y({top:Wt(o).stackTops[r]||0})},[Ji("td",yS,[Ji("div",bS,[Ji("button",{"aria-expanded":Wt(o).isOpen(r),onKeydown:t[0]||(t[0]=function(){return Wt(_b)&&Wt(_b).apply(void 0,arguments)}),class:"log-level-icon opacity-75 w-5 h-5 hidden lg:block group focus:opacity-100 focus:outline-none focus:ring-2 focus:ring-brand-500 rounded-md"},[Wt(o).isOpen(r)?rs("",!0):(Ni(),Vi("span",_S,"Expand log entry")),Wt(o).isOpen(r)?(Ni(),Vi("span",xS,"Collapse log entry")):rs("",!0),Ji("span",SS,["danger"===n.level_class?(Ni(),Hi(Wt(xx),{key:0})):"warning"===n.level_class?(Ni(),Hi(Wt(Sx),{key:1})):"success"===n.level_class?(Ni(),Hi(Wt(Ox),{key:2})):(Ni(),Hi(Wt(kx),{key:3}))]),Ji("span",OS,[Qi(Wt(Ex),{class:ee([Wt(o).isOpen(r)?"rotate-90":"","transition duration-100"])},null,8,["class"])])],40,wS)])]),(Ni(!0),Vi(Ai,null,io(Wt(o).columns,(function(e,t){return Ni(),Vi(Ai,null,["level"===e.data_path?(Ni(),Vi("td",{key:"".concat(n.index,"-column-").concat(t),class:"log-level truncate"},[Ji("span",null,ce(n.level_name),1)])):"datetime"===e.data_path?(Ni(),Vi("td",{key:"".concat(n.index,"-column-").concat(t),class:"whitespace-nowrap text-gray-900 dark:text-gray-200"},[Ji("span",{class:"hidden lg:inline",innerHTML:Wt(rb)(n.datetime,Wt(i).query)},null,8,kS),Ji("span",ES,ce(n.time),1)])):"message"===e.data_path?(Ni(),Vi("td",{key:"".concat(n.index,"-column-").concat(t),class:"max-w-[1px] w-full truncate text-gray-500 dark:text-gray-300 dark:opacity-90"},[Ji("span",{innerHTML:Wt(rb)("".concat(n.message),Wt(i).query)},null,8,CS)])):(Ni(),Vi("td",{key:"".concat(n.index,"-column-").concat(t),class:ee(["text-gray-500 dark:text-gray-300 dark:opacity-90",e.class||""])},[Ji("span",{innerHTML:Wt(rb)(c(n,e.data_path),Wt(i).query)},null,8,PS)],2))],64)})),256)),Ji("td",TS,[Qi(Rx,{log:n,class:"pr-2 large-screen"},null,8,["log"])])],14,mS),yr(Ji("tr",null,[Ji("td",AS,[Ji("div",jS,[Ji("div",RS,[LS,ts(" "+ce(n.datetime),1)]),Ji("div",null,[Qi(Rx,{log:n},null,8,["log"])])]),Wt(o).isOpen(r)?(Ni(),Hi(Mx,{key:0,tabs:p(n)},{default:$n((function(){return[n.extra&&n.extra.mail_preview&&n.extra.mail_preview.html?(Ni(),Hi(Bx,{key:0,"tab-value":"mail_html_preview"},{default:$n((function(){return[Qi(iS,{mail:n.extra.mail_preview},null,8,["mail"])]})),_:2},1024)):rs("",!0),n.extra&&n.extra.mail_preview&&n.extra.mail_preview.text?(Ni(),Hi(Bx,{key:1,"tab-value":"mail_text_preview"},{default:$n((function(){return[Qi(aS,{mail:n.extra.mail_preview},null,8,["mail"])]})),_:2},1024)):rs("",!0),Qi(Bx,{"tab-value":"raw"},{default:$n((function(){return[Ji("pre",{class:"log-stack",innerHTML:Wt(rb)(n.full_text,Wt(i).query)},null,8,IS),f(n)?(Ni(),Vi(Ai,{key:0},[FS,Ji("pre",{class:"log-stack",innerHTML:Wt(rb)((t=n.context,JSON.stringify(t,(function(e,t){return"string"==typeof t?t.replaceAll("\n","<br/>"):t}),2)),Wt(i).query)},null,8,NS)],64)):rs("",!0),n.extra&&n.extra.log_text_incomplete?(Ni(),Vi("div",MS,[ts(" The contents of this log have been cut short to the first "+ce(e.LogViewer.max_log_size_formatted)+". The full size of this log entry is ",1),Ji("strong",null,ce(n.extra.log_size_formatted),1)])):rs("",!0)];var t})),_:2},1024)]})),_:2},1032,["tabs"])):rs("",!0)])],512),[[pl,Wt(o).isOpen(r)]])],10,gS)})),128)):(Ni(),Vi("tbody",DS,[Ji("tr",null,[Ji("td",BS,[Ji("div",US,[$S,Ji("div",VS,[(null===(n=Wt(i).query)||void 0===n?void 0:n.length)>0?(Ni(),Vi("button",{key:0,class:"px-3 py-2 border dark:border-gray-700 text-gray-800 dark:text-gray-200 hover:border-brand-600 dark:hover:border-brand-700 rounded-md",onClick:u},"Clear search query ")):rs("",!0),(null===(l=Wt(i).query)||void 0===l?void 0:l.length)>0&&Wt(r).selectedFile?(Ni(),Vi("button",{key:1,class:"px-3 ml-3 py-2 border dark:border-gray-700 text-gray-800 dark:text-gray-200 hover:border-brand-600 dark:hover:border-brand-700 rounded-md",onClick:la(a,["prevent"])},"Search all files ",8,HS)):rs("",!0),Wt(s).levelsFound.length>0&&0===Wt(s).levelsSelected.length?(Ni(),Vi("button",{key:2,class:"px-3 ml-3 py-2 border dark:border-gray-700 text-gray-800 dark:text-gray-200 hover:border-brand-600 dark:hover:border-brand-700 rounded-md",onClick:t[1]||(t[1]=function(){var e;return Wt(s).selectAllLevels&&(e=Wt(s)).selectAllLevels.apply(e,arguments)})},"Select all severities ")):rs("",!0)])])])])]))])}}},qS=zS;var WS={class:"h-full w-full py-5 log-list"},KS={class:"flex flex-col h-full w-full md:mx-3 mb-4"},GS={class:"md:px-4 mb-4 flex flex-col-reverse lg:flex-row items-start"},YS={key:0,class:"flex items-center mr-5 mt-3 md:mt-0"},JS={class:"w-full lg:w-auto flex-1 flex justify-end min-h-[38px]"},QS={class:"hidden md:block ml-5"},ZS={class:"hidden md:block"},XS={class:"md:hidden"},eO={type:"button",class:"menu-button"},tO={key:0,class:"relative overflow-hidden h-full text-sm"},nO={class:"mx-2 mt-1 mb-2 text-right lg:mx-0 lg:mt-0 lg:mb-0 lg:absolute lg:top-2 lg:right-6 z-20 text-sm text-gray-500 dark:text-gray-400"},rO=Ji("label",{for:"log-sort-direction",class:"sr-only"},"Sort direction",-1),oO=[Ji("option",{value:"desc"},"Newest first",-1),Ji("option",{value:"asc"},"Oldest first",-1)],iO=Ji("label",{for:"items-per-page",class:"sr-only"},"Items per page",-1),sO=[ns('<option value="10">10 items per page</option><option value="25">25 items per page</option><option value="50">50 items per page</option><option value="100">100 items per page</option><option value="250">250 items per page</option><option value="500">500 items per page</option>',6)],lO={class:"inline-block min-w-full max-w-full align-middle"},aO={class:"absolute inset-0 top-9 md:px-4 z-20"},uO={class:"rounded-md bg-white text-gray-800 dark:bg-gray-700 dark:text-gray-200 opacity-90 w-full h-full flex items-center justify-center"},cO={key:1,class:"flex h-full items-center justify-center text-gray-600 dark:text-gray-400"},fO={key:0},pO={key:1},dO={key:2,class:"md:px-4"},hO={class:"hidden lg:block"},vO={class:"lg:hidden"};const gO={__name:"LogList",setup:function(e){Fg();var t=nb(),n=Yy(),r=Hy(),o=zy(),i=(qy(),Rs((function(){return t.selectedFile||String(r.query||"").trim().length>0}))),s=Rs((function(){return n.logs&&(n.logs.length>0||!n.hasMoreResults)&&(n.selectedFile||r.hasQuery)}));return dr([function(){return n.direction},function(){return n.resultsPerPage}],(function(){return n.loadLogs()})),function(e,r){return Ni(),Vi("div",WS,[Ji("div",KS,[Ji("div",GS,[i.value?(Ni(),Vi("div",YS,[Qi(sx)])):rs("",!0),Ji("div",JS,[Qi(_x),Ji("div",QS,[Ji("button",{onClick:r[0]||(r[0]=function(e){return Wt(n).loadLogs()}),id:"reload-logs-button",title:"Reload current results",class:"menu-button"},[Qi(Wt(A_),{class:"w-5 h-5"})])]),Ji("div",ZS,[Qi(uw,{class:"ml-2",id:"desktop-site-settings"})]),Ji("div",XS,[Ji("button",eO,[Qi(Wt(j_),{class:"w-5 h-5 ml-2",onClick:Wt(t).toggleSidebar},null,8,["onClick"])])])])]),s.value?(Ni(),Vi("div",tO,[Ji("div",nO,[rO,yr(Ji("select",{id:"log-sort-direction","onUpdate:modelValue":r[1]||(r[1]=function(e){return Wt(n).direction=e}),class:"select mr-4"},oO,512),[[Zl,Wt(n).direction]]),iO,yr(Ji("select",{id:"items-per-page","onUpdate:modelValue":r[2]||(r[2]=function(e){return Wt(n).resultsPerPage=e}),class:"select"},sO,512),[[Zl,Wt(n).resultsPerPage]])]),Ji("div",{class:"log-item-container h-full overflow-y-auto md:px-4",onScroll:r[3]||(r[3]=function(e){return Wt(n).onScroll(e)})},[Ji("div",lO,[Qi(qS)])],32),yr(Ji("div",aO,[Ji("div",uO,[Qi(pb,{class:"w-14 h-14"})])],512),[[pl,Wt(n).loading&&(!Wt(n).isMobile||!Wt(t).sidebarOpen)]])])):(Ni(),Vi("div",cO,[Wt(n).hasMoreResults?(Ni(),Vi("span",fO,"Searching...")):(Ni(),Vi("span",pO,"Select a file or start searching..."))])),s.value&&Wt(o).hasPages?(Ni(),Vi("div",dO,[Ji("div",hO,[Qi(W_,{loading:Wt(n).loading},null,8,["loading"])]),Ji("div",vO,[Qi(W_,{loading:Wt(n).loading,short:!0},null,8,["loading"])])])):rs("",!0)])])}}};function mO(e){"function"==typeof queueMicrotask?queueMicrotask(e):Promise.resolve().then(e).catch((e=>setTimeout((()=>{throw e}))))}function yO(){let e=[],t={addEventListener:(e,n,r,o)=>(e.addEventListener(n,r,o),t.add((()=>e.removeEventListener(n,r,o)))),requestAnimationFrame(...e){let n=requestAnimationFrame(...e);t.add((()=>cancelAnimationFrame(n)))},nextFrame(...e){t.requestAnimationFrame((()=>{t.requestAnimationFrame(...e)}))},setTimeout(...e){let n=setTimeout(...e);t.add((()=>clearTimeout(n)))},microTask(...e){let n={current:!0};return mO((()=>{n.current&&e[0]()})),t.add((()=>{n.current=!1}))},style(e,t,n){let r=e.style.getPropertyValue(t);return Object.assign(e.style,{[t]:n}),this.add((()=>{Object.assign(e.style,{[t]:r})}))},group(e){let t=yO();return e(t),this.add((()=>t.dispose()))},add:t=>(e.push(t),()=>{let n=e.indexOf(t);if(n>=0)for(let t of e.splice(n,1))t()}),dispose(){for(let t of e.splice(0))t()}};return t}function bO(e,...t){e&&t.length>0&&e.classList.add(...t)}function wO(e,...t){e&&t.length>0&&e.classList.remove(...t)}var _O=(e=>(e.Finished="finished",e.Cancelled="cancelled",e))(_O||{});function xO(e,t,n,r,o,i){let s=yO(),l=void 0!==i?function(e){let t={called:!1};return(...n)=>{if(!t.called)return t.called=!0,e(...n)}}(i):()=>{};return wO(e,...o),bO(e,...t,...n),s.nextFrame((()=>{wO(e,...n),bO(e,...r),s.add(function(e,t){let n=yO();if(!e)return n.dispose;let{transitionDuration:r,transitionDelay:o}=getComputedStyle(e),[i,s]=[r,o].map((e=>{let[t=0]=e.split(",").filter(Boolean).map((e=>e.includes("ms")?parseFloat(e):1e3*parseFloat(e))).sort(((e,t)=>t-e));return t}));return 0!==i?n.setTimeout((()=>t("finished")),i+s):t("finished"),n.add((()=>t("cancelled"))),n.dispose}(e,(n=>(wO(e,...r,...t),bO(e,...o),l(n)))))})),s.add((()=>wO(e,...t,...n,...r,...o))),s.add((()=>l("cancelled"))),s.dispose}function SO(e=""){return e.split(" ").filter((e=>e.trim().length>1))}let OO=Symbol("TransitionContext");var kO=(e=>(e.Visible="visible",e.Hidden="hidden",e))(kO||{});let EO=Symbol("NestingContext");function CO(e){return"children"in e?CO(e.children):e.value.filter((({state:e})=>"visible"===e)).length>0}function PO(e){let t=$t([]),n=$t(!1);function r(r,o=Bg.Hidden){let i=t.value.findIndex((({id:e})=>e===r));-1!==i&&(Mg(o,{[Bg.Unmount](){t.value.splice(i,1)},[Bg.Hidden](){t.value[i].state="hidden"}}),!CO(t)&&n.value&&(null==e||e()))}return Jr((()=>n.value=!0)),eo((()=>n.value=!1)),{children:t,register:function(e){let n=t.value.find((({id:t})=>t===e));return n?"visible"!==n.state&&(n.state="visible"):t.value.push({id:e,state:"visible"}),()=>r(e,Bg.Unmount)},unregister:r}}let TO=Dg.RenderStrategy,AO=Lr({props:{as:{type:[Object,String],default:"div"},show:{type:[Boolean],default:null},unmount:{type:[Boolean],default:!0},appear:{type:[Boolean],default:!1},enter:{type:[String],default:""},enterFrom:{type:[String],default:""},enterTo:{type:[String],default:""},entered:{type:[String],default:""},leave:{type:[String],default:""},leaveFrom:{type:[String],default:""},leaveTo:{type:[String],default:""}},emits:{beforeEnter:()=>!0,afterEnter:()=>!0,beforeLeave:()=>!0,afterLeave:()=>!0},setup(e,{emit:t,attrs:n,slots:r,expose:o}){let i=$t(0);function s(){i.value|=nm.Opening,t("beforeEnter")}function l(){i.value&=~nm.Opening,t("afterEnter")}function a(){i.value|=nm.Closing,t("beforeLeave")}function u(){i.value&=~nm.Closing,t("afterLeave")}if(null===Yo(OO,null)&&null!==rm())return()=>Ls(RO,{...e,onBeforeEnter:s,onAfterEnter:l,onBeforeLeave:a,onAfterLeave:u},r);let c=$t(null),f=Rs((()=>e.unmount?Bg.Unmount:Bg.Hidden));o({el:c,$el:c});let{show:p,appear:d}=function(){let e=Yo(OO,null);if(null===e)throw new Error("A <TransitionChild /> is used but it is missing a parent <TransitionRoot />.");return e}(),{register:h,unregister:v}=function(){let e=Yo(EO,null);if(null===e)throw new Error("A <TransitionChild /> is used but it is missing a parent <TransitionRoot />.");return e}(),g=$t(p.value?"visible":"hidden"),m={value:!0},y=Wg(),b={value:!1},w=PO((()=>{!b.value&&"hidden"!==g.value&&(g.value="hidden",v(y),u())}));Jr((()=>{let e=h(y);eo(e)})),ur((()=>{if(f.value===Bg.Hidden&&y){if(p.value&&"visible"!==g.value)return void(g.value="visible");Mg(g.value,{hidden:()=>v(y),visible:()=>h(y)})}}));let _=SO(e.enter),x=SO(e.enterFrom),S=SO(e.enterTo),O=SO(e.entered),k=SO(e.leave),E=SO(e.leaveFrom),C=SO(e.leaveTo);return Jr((()=>{ur((()=>{if("visible"===g.value){let e=Jg(c);if(e instanceof Comment&&""===e.data)throw new Error("Did you forget to passthrough the `ref` to the actual DOM node?")}}))})),Jr((()=>{dr([p],((e,t,n)=>{(function(e){let t=m.value&&!d.value,n=Jg(c);!n||!(n instanceof HTMLElement)||t||(b.value=!0,p.value&&s(),p.value||a(),e(p.value?xO(n,_,x,S,O,(e=>{b.value=!1,e===_O.Finished&&l()})):xO(n,k,E,C,O,(e=>{b.value=!1,e===_O.Finished&&(CO(w)||(g.value="hidden",v(y),u()))}))))})(n),m.value=!1}),{immediate:!0})})),Go(EO,w),om(Rs((()=>Mg(g.value,{visible:nm.Open,hidden:nm.Closed})|i.value))),()=>{let{appear:t,show:o,enter:i,enterFrom:s,enterTo:l,entered:a,leave:u,leaveFrom:f,leaveTo:h,...v}=e,m={ref:c};return Ug({theirProps:{...v,...d.value&&p.value&&Xg.isServer?{class:ee([n.class,v.class,..._,...x])}:{}},ourProps:m,slot:{},slots:r,attrs:n,features:TO,visible:"visible"===g.value,name:"TransitionChild"})}}}),jO=AO,RO=Lr({inheritAttrs:!1,props:{as:{type:[Object,String],default:"div"},show:{type:[Boolean],default:null},unmount:{type:[Boolean],default:!0},appear:{type:[Boolean],default:!1},enter:{type:[String],default:""},enterFrom:{type:[String],default:""},enterTo:{type:[String],default:""},entered:{type:[String],default:""},leave:{type:[String],default:""},leaveFrom:{type:[String],default:""},leaveTo:{type:[String],default:""}},emits:{beforeEnter:()=>!0,afterEnter:()=>!0,beforeLeave:()=>!0,afterLeave:()=>!0},setup(e,{emit:t,attrs:n,slots:r}){let o=rm(),i=Rs((()=>null===e.show&&null!==o?(o.value&nm.Open)===nm.Open:e.show));ur((()=>{if(![!0,!1].includes(i.value))throw new Error('A <Transition /> is used but it is missing a `:show="true | false"` prop.')}));let s=$t(i.value?"visible":"hidden"),l=PO((()=>{s.value="hidden"})),a=$t(!0),u={show:i,appear:Rs((()=>e.appear||!a.value))};return Jr((()=>{ur((()=>{a.value=!1,i.value?s.value="visible":CO(l)||(s.value="hidden")}))})),Go(EO,l),Go(OO,u),()=>{let o=zg(e,["show","appear","unmount","onBeforeEnter","onBeforeLeave","onAfterEnter","onAfterLeave"]),i={unmount:e.unmount};return Ug({ourProps:{...i,as:"template"},theirProps:{},slot:{},slots:{...r,default:()=>[Ls(jO,{onBeforeEnter:()=>t("beforeEnter"),onAfterEnter:()=>t("afterEnter"),onBeforeLeave:()=>t("beforeLeave"),onAfterLeave:()=>t("afterLeave"),...n,...i,...o},r.default)]},attrs:{},features:TO,visible:"visible"===s.value,name:"Transition"})}}});var LO=(e=>(e[e.Forwards=0]="Forwards",e[e.Backwards=1]="Backwards",e))(LO||{});function IO(e,t,n,r){Xg.isServer||ur((o=>{(e=null!=e?e:window).addEventListener(t,n,r),o((()=>e.removeEventListener(t,n,r)))}))}function FO(e){if(!e)return new Set;if("function"==typeof e)return new Set(e());let t=new Set;for(let n of e.value){let e=Jg(n);e instanceof HTMLElement&&t.add(e)}return t}var NO=(e=>(e[e.None=1]="None",e[e.InitialFocus=2]="InitialFocus",e[e.TabLock=4]="TabLock",e[e.FocusLock=8]="FocusLock",e[e.RestoreFocus=16]="RestoreFocus",e[e.All=30]="All",e))(NO||{});let MO=Object.assign(Lr({name:"FocusTrap",props:{as:{type:[Object,String],default:"div"},initialFocus:{type:Object,default:null},features:{type:Number,default:30},containers:{type:[Object,Function],default:$t(new Set)}},inheritAttrs:!1,setup(e,{attrs:t,slots:n,expose:r}){let o=$t(null);r({el:o,$el:o});let i=Rs((()=>em(o))),s=$t(!1);Jr((()=>s.value=!0)),eo((()=>s.value=!1)),function({ownerDocument:e},t){let n=function(e){let t=$t(DO.slice());return dr([e],(([e],[n])=>{!0===n&&!1===e?mO((()=>{t.value.splice(0)})):!1===n&&!0===e&&(t.value=DO.slice())}),{flush:"post"}),()=>{var e;return null!=(e=t.value.find((e=>null!=e&&e.isConnected)))?e:null}}(t);Jr((()=>{ur((()=>{var r,o;t.value||(null==(r=e.value)?void 0:r.activeElement)===(null==(o=e.value)?void 0:o.body)&&gm(n())}),{flush:"post"})})),eo((()=>{t.value&&gm(n())}))}({ownerDocument:i},Rs((()=>s.value&&Boolean(16&e.features))));let l=function({ownerDocument:e,container:t,initialFocus:n},r){let o=$t(null),i=$t(!1);return Jr((()=>i.value=!0)),eo((()=>i.value=!1)),Jr((()=>{dr([t,n,r],((s,l)=>{if(s.every(((e,t)=>(null==l?void 0:l[t])===e))||!r.value)return;let a=Jg(t);a&&mO((()=>{var t,r;if(!i.value)return;let s=Jg(n),l=null==(t=e.value)?void 0:t.activeElement;if(s){if(s===l)return void(o.value=l)}else if(a.contains(l))return void(o.value=l);s?gm(s):(bm(a,am.First|am.NoScroll),um.Error),o.value=null==(r=e.value)?void 0:r.activeElement}))}),{immediate:!0,flush:"post"})})),o}({ownerDocument:i,container:o,initialFocus:Rs((()=>e.initialFocus))},Rs((()=>s.value&&Boolean(2&e.features))));!function({ownerDocument:e,container:t,containers:n,previousActiveElement:r},o){var i;IO(null==(i=e.value)?void 0:i.defaultView,"focus",(e=>{if(!o.value)return;let i=FO(n);Jg(t)instanceof HTMLElement&&i.add(Jg(t));let s=r.value;if(!s)return;let l=e.target;l&&l instanceof HTMLElement?BO(i,l)?(r.value=l,gm(l)):(e.preventDefault(),e.stopPropagation(),gm(s)):gm(r.value)}),!0)}({ownerDocument:i,container:o,containers:e.containers,previousActiveElement:l},Rs((()=>s.value&&Boolean(8&e.features))));let a=function(){let e=$t(0);return _m("keydown",(t=>{"Tab"===t.key&&(e.value=t.shiftKey?1:0)})),e}();function u(e){let t=Jg(o);t&&Mg(a.value,{[LO.Forwards]:()=>{bm(t,am.First,{skipElements:[e.relatedTarget]})},[LO.Backwards]:()=>{bm(t,am.Last,{skipElements:[e.relatedTarget]})}})}let c=$t(!1);function f(e){"Tab"===e.key&&(c.value=!0,requestAnimationFrame((()=>{c.value=!1})))}function p(t){if(!s.value)return;let n=FO(e.containers);Jg(o)instanceof HTMLElement&&n.add(Jg(o));let r=t.relatedTarget;r instanceof HTMLElement&&"true"!==r.dataset.headlessuiFocusGuard&&(BO(n,r)||(c.value?bm(Jg(o),Mg(a.value,{[LO.Forwards]:()=>am.Next,[LO.Backwards]:()=>am.Previous})|am.WrapAround,{relativeTo:t.target}):t.target instanceof HTMLElement&&gm(t.target)))}return()=>{let r={ref:o,onKeydown:f,onFocusout:p},{features:i,initialFocus:s,containers:l,...a}=e;return Ls(Ai,[Boolean(4&i)&&Ls(fw,{as:"button",type:"button","data-headlessui-focus-guard":!0,onFocus:u,features:cw.Focusable}),Ug({ourProps:r,theirProps:{...t,...a},slot:{},attrs:t,slots:n,name:"FocusTrap"}),Boolean(4&i)&&Ls(fw,{as:"button",type:"button","data-headlessui-focus-guard":!0,onFocus:u,features:cw.Focusable})])}}}),{features:NO}),DO=[];function BO(e,t){for(let n of e)if(n.contains(t))return!0;return!1}!function(e){function t(){"loading"!==document.readyState&&(e(),document.removeEventListener("DOMContentLoaded",t))}"undefined"!=typeof window&&"undefined"!=typeof document&&(document.addEventListener("DOMContentLoaded",t),t())}((()=>{function e(e){e.target instanceof HTMLElement&&e.target!==document.body&&DO[0]!==e.target&&(DO.unshift(e.target),DO=DO.filter((e=>null!=e&&e.isConnected)),DO.splice(10))}window.addEventListener("click",e,{capture:!0}),window.addEventListener("mousedown",e,{capture:!0}),window.addEventListener("focus",e,{capture:!0}),document.body.addEventListener("click",e,{capture:!0}),document.body.addEventListener("mousedown",e,{capture:!0}),document.body.addEventListener("focus",e,{capture:!0})}));let UO=new Map,$O=new Map;function VO(e,t=$t(!0)){ur((n=>{var r;if(!t.value)return;let o=Jg(e);if(!o)return;n((function(){var e;if(!o)return;let t=null!=(e=$O.get(o))?e:1;if(1===t?$O.delete(o):$O.set(o,t-1),1!==t)return;let n=UO.get(o);n&&(null===n["aria-hidden"]?o.removeAttribute("aria-hidden"):o.setAttribute("aria-hidden",n["aria-hidden"]),o.inert=n.inert,UO.delete(o))}));let i=null!=(r=$O.get(o))?r:0;$O.set(o,i+1),0===i&&(UO.set(o,{"aria-hidden":o.getAttribute("aria-hidden"),inert:o.inert}),o.setAttribute("aria-hidden","true"),o.inert=!0)}))}let HO=Symbol("ForcePortalRootContext");let zO=Lr({name:"ForcePortalRoot",props:{as:{type:[Object,String],default:"template"},force:{type:Boolean,default:!1}},setup:(e,{slots:t,attrs:n})=>(Go(HO,e.force),()=>{let{force:r,...o}=e;return Ug({theirProps:o,ourProps:{},slot:{},slots:t,attrs:n,name:"ForcePortalRoot"})})});let qO=Lr({name:"Portal",props:{as:{type:[Object,String],default:"div"}},setup(e,{slots:t,attrs:n}){let r=$t(null),o=Rs((()=>em(r))),i=Yo(HO,!1),s=Yo(KO,null),l=$t(!0===i||null==s?function(e){let t=em(e);if(!t){if(null===e)return null;throw new Error(`[Headless UI]: Cannot find ownerDocument for contextElement: ${e}`)}let n=t.getElementById("headlessui-portal-root");if(n)return n;let r=t.createElement("div");return r.setAttribute("id","headlessui-portal-root"),t.body.appendChild(r)}(r.value):s.resolveTarget());ur((()=>{i||null!=s&&(l.value=s.resolveTarget())}));let a=Yo(WO,null);return Jr((()=>{let e=Jg(r);e&&a&&eo(a.register(e))})),eo((()=>{var e,t;let n=null==(e=o.value)?void 0:e.getElementById("headlessui-portal-root");n&&l.value===n&&l.value.children.length<=0&&(null==(t=l.value.parentElement)||t.removeChild(l.value))})),()=>{if(null===l.value)return null;let o={ref:r,"data-headlessui-portal":""};return Ls(Pi,{to:l.value},Ug({ourProps:o,theirProps:e,slot:{},attrs:n,slots:t,name:"Portal"}))}}}),WO=Symbol("PortalParentContext");let KO=Symbol("PortalGroupContext"),GO=Lr({name:"PortalGroup",props:{as:{type:[Object,String],default:"template"},target:{type:Object,default:null}},setup(e,{attrs:t,slots:n}){let r=kt({resolveTarget:()=>e.target});return Go(KO,r),()=>{let{target:r,...o}=e;return Ug({theirProps:o,ourProps:{},slot:{},attrs:t,slots:n,name:"PortalGroup"})}}}),YO=Symbol("StackContext");var JO=(e=>(e[e.Add=0]="Add",e[e.Remove=1]="Remove",e))(JO||{});function QO({type:e,enabled:t,element:n,onUpdate:r}){let o=Yo(YO,(()=>{}));function i(...e){null==r||r(...e),o(...e)}Jr((()=>{dr(t,((t,r)=>{t?i(0,e,n):!0===r&&i(1,e,n)}),{immediate:!0,flush:"sync"})})),eo((()=>{t.value&&i(1,e,n)})),Go(YO,i)}let ZO=Symbol("DescriptionContext");Lr({name:"Description",props:{as:{type:[Object,String],default:"p"},id:{type:String,default:()=>`headlessui-description-${Wg()}`}},setup(e,{attrs:t,slots:n}){let r=function(){let e=Yo(ZO,null);if(null===e)throw new Error("Missing parent");return e}();return Jr((()=>eo(r.register(e.id)))),()=>{let{name:o="Description",slot:i=$t({}),props:s={}}=r,{id:l,...a}=e,u={...Object.entries(s).reduce(((e,[t,n])=>Object.assign(e,{[t]:Wt(n)})),{}),id:l};return Ug({ourProps:u,theirProps:a,slot:i.value,attrs:t,slots:n,name:o})}}});function XO(){let e;return{before({doc:t}){var n;let r=t.documentElement;e=(null!=(n=t.defaultView)?n:window).innerWidth-r.clientWidth},after({doc:t,d:n}){let r=t.documentElement,o=r.clientWidth-r.offsetWidth,i=e-o;n.style(r,"paddingRight",`${i}px`)}}}function ek(){return/iPhone/gi.test(window.navigator.platform)||/Mac/gi.test(window.navigator.platform)&&window.navigator.maxTouchPoints>0}function tk(){if(!ek())return{};let e;return{before(){e=window.pageYOffset},after({doc:t,d:n,meta:r}){function o(e){return r.containers.flatMap((e=>e())).some((t=>t.contains(e)))}if("auto"!==window.getComputedStyle(t.documentElement).scrollBehavior){let e=yO();e.style(t.documentElement,"scroll-behavior","auto"),n.add((()=>n.microTask((()=>e.dispose()))))}n.style(t.body,"marginTop",`-${e}px`),window.scrollTo(0,0);let i=null;n.addEventListener(t,"click",(e=>{if(e.target instanceof HTMLElement)try{let n=e.target.closest("a");if(!n)return;let{hash:r}=new URL(n.href),s=t.querySelector(r);s&&!o(s)&&(i=s)}catch{}}),!0),n.addEventListener(t,"touchmove",(e=>{e.target instanceof HTMLElement&&!o(e.target)&&e.preventDefault()}),{passive:!1}),n.add((()=>{window.scrollTo(0,window.pageYOffset+e),i&&i.isConnected&&(i.scrollIntoView({block:"nearest"}),i=null)}))}}}function nk(e){let t={};for(let n of e)Object.assign(t,n(t));return t}let rk=function(e,t){let n=e(),r=new Set;return{getSnapshot:()=>n,subscribe:e=>(r.add(e),()=>r.delete(e)),dispatch(e,...o){let i=t[e].call(n,...o);i&&(n=i,r.forEach((e=>e())))}}}((()=>new Map),{PUSH(e,t){var n;let r=null!=(n=this.get(e))?n:{doc:e,count:0,d:yO(),meta:new Set};return r.count++,r.meta.add(t),this.set(e,r),this},POP(e,t){let n=this.get(e);return n&&(n.count--,n.meta.delete(t)),this},SCROLL_PREVENT({doc:e,d:t,meta:n}){let r={doc:e,d:t,meta:nk(n)},o=[tk(),XO(),{before({doc:e,d:t}){t.style(e.documentElement,"overflow","hidden")}}];o.forEach((({before:e})=>null==e?void 0:e(r))),o.forEach((({after:e})=>null==e?void 0:e(r)))},SCROLL_ALLOW({d:e}){e.dispose()},TEARDOWN({doc:e}){this.delete(e)}});function ok(e,t,n){let r=function(e){let t=Vt(e.getSnapshot());return eo(e.subscribe((()=>{t.value=e.getSnapshot()}))),t}(rk),o=Rs((()=>{let t=e.value?r.value.get(e.value):void 0;return!!t&&t.count>0}));return dr([e,t],(([e,t],[r],o)=>{if(!e||!t)return;rk.dispatch("PUSH",e,n);let i=!1;o((()=>{i||(rk.dispatch("POP",null!=r?r:e,n),i=!0)}))}),{immediate:!0}),o}rk.subscribe((()=>{let e=rk.getSnapshot(),t=new Map;for(let[n]of e)t.set(n,n.documentElement.style.overflow);for(let n of e.values()){let e="hidden"===t.get(n.doc),r=0!==n.count;(r&&!e||!r&&e)&&rk.dispatch(n.count>0?"SCROLL_PREVENT":"SCROLL_ALLOW",n),0===n.count&&rk.dispatch("TEARDOWN",n)}}));var ik=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(ik||{});let sk=Symbol("DialogContext");function lk(e){let t=Yo(sk,null);if(null===t){let t=new Error(`<${e} /> is missing a parent <Dialog /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,lk),t}return t}let ak="DC8F892D-2EBD-447C-A4C8-A03058436FF4",uk=Lr({name:"Dialog",inheritAttrs:!1,props:{as:{type:[Object,String],default:"div"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},open:{type:[Boolean,String],default:ak},initialFocus:{type:Object,default:null},id:{type:String,default:()=>`headlessui-dialog-${Wg()}`}},emits:{close:e=>!0},setup(e,{emit:t,attrs:n,slots:r,expose:o}){var i;let s=$t(!1);Jr((()=>{s.value=!0}));let l=$t(0),a=rm(),u=Rs((()=>e.open===ak&&null!==a?(a.value&nm.Open)===nm.Open:e.open)),c=$t(null),f=Rs((()=>em(c)));if(o({el:c,$el:c}),e.open===ak&&null===a)throw new Error("You forgot to provide an `open` prop to the `Dialog`.");if("boolean"!=typeof u.value)throw new Error(`You provided an \`open\` prop to the \`Dialog\`, but the value is not a boolean. Received: ${u.value===ak?void 0:e.open}`);let p=Rs((()=>s.value&&u.value?0:1)),d=Rs((()=>0===p.value)),h=Rs((()=>l.value>1)),v=null!==Yo(sk,null),[g,m]=function(){let e=Yo(WO,null),t=$t([]);function n(n){let r=t.value.indexOf(n);-1!==r&&t.value.splice(r,1),e&&e.unregister(n)}let r={register:function(r){return t.value.push(r),e&&e.register(r),()=>n(r)},unregister:n,portals:t};return[t,Lr({name:"PortalWrapper",setup:(e,{slots:t})=>(Go(WO,r),()=>{var e;return null==(e=t.default)?void 0:e.call(t)})})]}(),{resolveContainers:y,mainTreeNodeRef:b,MainTreeNode:w}=function({defaultContainers:e=[],portals:t,mainTreeNodeRef:n}={}){let r=$t(null),o=em(r);function i(){var n;let i=[];for(let t of e)null!==t&&(t instanceof HTMLElement?i.push(t):"value"in t&&t.value instanceof HTMLElement&&i.push(t.value));if(null!=t&&t.value)for(let e of t.value)i.push(e);for(let e of null!=(n=null==o?void 0:o.querySelectorAll("html > *, body > *"))?n:[])e!==document.body&&e!==document.head&&e instanceof HTMLElement&&"headlessui-portal-root"!==e.id&&(e.contains(Jg(r))||i.some((t=>e.contains(t)))||i.push(e));return i}return{resolveContainers:i,contains:e=>i().some((t=>t.contains(e))),mainTreeNodeRef:r,MainTreeNode:()=>null!=n?null:Ls(fw,{features:cw.Hidden,ref:r})}}({portals:g,defaultContainers:[Rs((()=>{var e;return null!=(e=T.panelRef.value)?e:c.value}))]}),_=Rs((()=>h.value?"parent":"leaf")),x=Rs((()=>null!==a&&(a.value&nm.Closing)===nm.Closing)),S=Rs((()=>!v&&!x.value&&d.value)),O=Rs((()=>{var e,t,n;return null!=(n=Array.from(null!=(t=null==(e=f.value)?void 0:e.querySelectorAll("body > *"))?t:[]).find((e=>"headlessui-portal-root"!==e.id&&(e.contains(Jg(b))&&e instanceof HTMLElement))))?n:null}));VO(O,S);let k=Rs((()=>!!h.value||d.value)),E=Rs((()=>{var e,t,n;return null!=(n=Array.from(null!=(t=null==(e=f.value)?void 0:e.querySelectorAll("[data-headlessui-portal]"))?t:[]).find((e=>e.contains(Jg(b))&&e instanceof HTMLElement)))?n:null}));VO(E,k),QO({type:"Dialog",enabled:Rs((()=>0===p.value)),element:c,onUpdate:(e,t)=>{if("Dialog"===t)return Mg(e,{[JO.Add]:()=>l.value+=1,[JO.Remove]:()=>l.value-=1})}});let C=function({slot:e=$t({}),name:t="Description",props:n={}}={}){let r=$t([]);return Go(ZO,{register:function(e){return r.value.push(e),()=>{let t=r.value.indexOf(e);-1!==t&&r.value.splice(t,1)}},slot:e,name:t,props:n}),Rs((()=>r.value.length>0?r.value.join(" "):void 0))}({name:"DialogDescription",slot:Rs((()=>({open:u.value})))}),P=$t(null),T={titleId:P,panelRef:$t(null),dialogState:p,setTitleId(e){P.value!==e&&(P.value=e)},close(){t("close",!1)}};Go(sk,T);let A=Rs((()=>!(!d.value||h.value)));xm(y,((e,t)=>{T.close(),bn((()=>null==t?void 0:t.focus()))}),A);let j=Rs((()=>!(h.value||0!==p.value)));IO(null==(i=f.value)?void 0:i.defaultView,"keydown",(e=>{j.value&&(e.defaultPrevented||e.key===Kg.Escape&&(e.preventDefault(),e.stopPropagation(),T.close()))}));let R=Rs((()=>!(x.value||0!==p.value||v)));return ok(f,R,(e=>{var t;return{containers:[...null!=(t=e.containers)?t:[],y]}})),ur((e=>{if(0!==p.value)return;let t=Jg(c);if(!t)return;let n=new ResizeObserver((e=>{for(let t of e){let e=t.target.getBoundingClientRect();0===e.x&&0===e.y&&0===e.width&&0===e.height&&T.close()}}));n.observe(t),e((()=>n.disconnect()))})),()=>{let{id:t,open:o,initialFocus:i,...s}=e,l={...n,ref:c,id:t,role:"dialog","aria-modal":0===p.value||void 0,"aria-labelledby":P.value,"aria-describedby":C.value},a={open:0===p.value};return Ls(zO,{force:!0},(()=>[Ls(qO,(()=>Ls(GO,{target:c.value},(()=>Ls(zO,{force:!1},(()=>Ls(MO,{initialFocus:i,containers:y,features:d.value?Mg(_.value,{parent:MO.features.RestoreFocus,leaf:MO.features.All&~MO.features.FocusLock}):MO.features.None},(()=>Ls(m,{},(()=>Ug({ourProps:l,theirProps:{...s,...n},slot:a,attrs:n,slots:r,visible:0===p.value,features:Dg.RenderStrategy|Dg.Static,name:"Dialog"}))))))))))),Ls(w)]))}}}),ck=(Lr({name:"DialogOverlay",props:{as:{type:[Object,String],default:"div"},id:{type:String,default:()=>`headlessui-dialog-overlay-${Wg()}`}},setup(e,{attrs:t,slots:n}){let r=lk("DialogOverlay");function o(e){e.target===e.currentTarget&&(e.preventDefault(),e.stopPropagation(),r.close())}return()=>{let{id:i,...s}=e;return Ug({ourProps:{id:i,"aria-hidden":!0,onClick:o},theirProps:s,slot:{open:0===r.dialogState.value},attrs:t,slots:n,name:"DialogOverlay"})}}}),Lr({name:"DialogBackdrop",props:{as:{type:[Object,String],default:"div"},id:{type:String,default:()=>`headlessui-dialog-backdrop-${Wg()}`}},inheritAttrs:!1,setup(e,{attrs:t,slots:n,expose:r}){let o=lk("DialogBackdrop"),i=$t(null);return r({el:i,$el:i}),Jr((()=>{if(null===o.panelRef.value)throw new Error("A <DialogBackdrop /> component is being used, but a <DialogPanel /> component is missing.")})),()=>{let{id:r,...s}=e,l={id:r,ref:i,"aria-hidden":!0};return Ls(zO,{force:!0},(()=>Ls(qO,(()=>Ug({ourProps:l,theirProps:{...t,...s},slot:{open:0===o.dialogState.value},attrs:t,slots:n,name:"DialogBackdrop"})))))}}}),Lr({name:"DialogPanel",props:{as:{type:[Object,String],default:"div"},id:{type:String,default:()=>`headlessui-dialog-panel-${Wg()}`}},setup(e,{attrs:t,slots:n,expose:r}){let o=lk("DialogPanel");function i(e){e.stopPropagation()}return r({el:o.panelRef,$el:o.panelRef}),()=>{let{id:r,...s}=e;return Ug({ourProps:{id:r,ref:o.panelRef,onClick:i},theirProps:s,slot:{open:0===o.dialogState.value},attrs:t,slots:n,name:"DialogPanel"})}}})),fk=Lr({name:"DialogTitle",props:{as:{type:[Object,String],default:"h2"},id:{type:String,default:()=>`headlessui-dialog-title-${Wg()}`}},setup(e,{attrs:t,slots:n}){let r=lk("DialogTitle");return Jr((()=>{r.setTitleId(e.id),eo((()=>r.setTitleId(null)))})),()=>{let{id:o,...i}=e;return Ug({ourProps:{id:o},theirProps:i,slot:{open:0===r.dialogState.value},attrs:t,slots:n,name:"DialogTitle"})}}});var pk=Ji("div",{class:"fixed inset-0"},null,-1),dk={class:"fixed inset-0 overflow-hidden"},hk={class:"absolute inset-0 overflow-hidden"},vk={class:"pointer-events-none fixed inset-y-0 right-0 flex max-w-full pl-10"},gk={class:"flex h-full flex-col overflow-y-scroll bg-white py-6 shadow-xl"},mk={class:"px-4 sm:px-6"},yk={class:"flex items-start justify-between"},bk={class:"ml-3 flex h-7 items-center"},wk=Ji("span",{class:"sr-only"},"Close panel",-1),_k={class:"relative mt-6 flex-1 px-4 sm:px-6"},xk={class:"keyboard-shortcut"},Sk={class:"shortcut"},Ok=Ji("span",{class:"description"},"Select a host",-1),kk={class:"keyboard-shortcut"},Ek={class:"shortcut"},Ck=Ji("span",{class:"description"},"Jump to file selection",-1),Pk={class:"keyboard-shortcut"},Tk={class:"shortcut"},Ak=Ji("span",{class:"description"},"Jump to logs",-1),jk={class:"keyboard-shortcut"},Rk={class:"shortcut"},Lk=Ji("span",{class:"description"},"Severity selection",-1),Ik={class:"keyboard-shortcut"},Fk={class:"shortcut"},Nk=Ji("span",{class:"description"},"Settings",-1),Mk={class:"keyboard-shortcut"},Dk={class:"shortcut"},Bk=Ji("span",{class:"description"},"Search",-1),Uk={class:"keyboard-shortcut"},$k={class:"shortcut"},Vk=Ji("span",{class:"description"},"Refresh logs",-1),Hk={class:"keyboard-shortcut"},zk={class:"shortcut"},qk=Ji("span",{class:"description"},"Keyboard shortcuts help",-1);const Wk={__name:"KeyboardShortcutsOverlay",setup:function(e){var t=Yy();return function(e,n){return Ni(),Hi(Wt(RO),{as:"template",show:Wt(t).helpSlideOverOpen},{default:$n((function(){return[Qi(Wt(uk),{as:"div",class:"relative z-20",onClose:n[1]||(n[1]=function(e){return Wt(t).helpSlideOverOpen=!1})},{default:$n((function(){return[pk,Ji("div",dk,[Ji("div",hk,[Ji("div",vk,[Qi(Wt(AO),{as:"template",enter:"transform transition ease-in-out duration-200 sm:duration-300","enter-from":"translate-x-full","enter-to":"translate-x-0",leave:"transform transition ease-in-out duration-200 sm:duration-300","leave-from":"translate-x-0","leave-to":"translate-x-full"},{default:$n((function(){return[Qi(Wt(ck),{class:"pointer-events-auto w-screen max-w-md"},{default:$n((function(){return[Ji("div",gk,[Ji("div",mk,[Ji("div",yk,[Qi(Wt(fk),{class:"text-base font-semibold leading-6 text-gray-900"},{default:$n((function(){return[ts("Keyboard Shortcuts")]})),_:1}),Ji("div",bk,[Ji("button",{type:"button",class:"rounded-md bg-white text-gray-400 hover:text-gray-500 focus:outline-none focus:ring-2 focus:ring-brand-500 focus:ring-offset-2",onClick:n[0]||(n[0]=function(e){return Wt(t).helpSlideOverOpen=!1})},[wk,Qi(Wt(Nm),{class:"h-6 w-6","aria-hidden":"true"})])])])]),Ji("div",_k,[Ji("div",xk,[Ji("span",Sk,ce(Wt(gb).Hosts),1),Ok]),Ji("div",kk,[Ji("span",Ek,ce(Wt(gb).Files),1),Ck]),Ji("div",Pk,[Ji("span",Tk,ce(Wt(gb).Logs),1),Ak]),Ji("div",jk,[Ji("span",Rk,ce(Wt(gb).Severity),1),Lk]),Ji("div",Ik,[Ji("span",Fk,ce(Wt(gb).Settings),1),Nk]),Ji("div",Mk,[Ji("span",Dk,ce(Wt(gb).Search),1),Bk]),Ji("div",Uk,[Ji("span",$k,ce(Wt(gb).Refresh),1),Vk]),Ji("div",Hk,[Ji("span",zk,ce(Wt(gb).ShortcutHelp),1),qk])])])]})),_:1})]})),_:1})])])])]})),_:1})]})),_:1},8,["show"])}}};function Kk(e){return Kk="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Kk(e)}function Gk(){Gk=function(){return t};var e,t={},n=Object.prototype,r=n.hasOwnProperty,o=Object.defineProperty||function(e,t,n){e[t]=n.value},i="function"==typeof Symbol?Symbol:{},s=i.iterator||"@@iterator",l=i.asyncIterator||"@@asyncIterator",a=i.toStringTag||"@@toStringTag";function u(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{u({},"")}catch(e){u=function(e,t,n){return e[t]=n}}function c(e,t,n,r){var i=t&&t.prototype instanceof m?t:m,s=Object.create(i.prototype),l=new A(r||[]);return o(s,"_invoke",{value:E(e,n,l)}),s}function f(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}t.wrap=c;var p="suspendedStart",d="suspendedYield",h="executing",v="completed",g={};function m(){}function y(){}function b(){}var w={};u(w,s,(function(){return this}));var _=Object.getPrototypeOf,x=_&&_(_(j([])));x&&x!==n&&r.call(x,s)&&(w=x);var S=b.prototype=m.prototype=Object.create(w);function O(e){["next","throw","return"].forEach((function(t){u(e,t,(function(e){return this._invoke(t,e)}))}))}function k(e,t){function n(o,i,s,l){var a=f(e[o],e,i);if("throw"!==a.type){var u=a.arg,c=u.value;return c&&"object"==Kk(c)&&r.call(c,"__await")?t.resolve(c.__await).then((function(e){n("next",e,s,l)}),(function(e){n("throw",e,s,l)})):t.resolve(c).then((function(e){u.value=e,s(u)}),(function(e){return n("throw",e,s,l)}))}l(a.arg)}var i;o(this,"_invoke",{value:function(e,r){function o(){return new t((function(t,o){n(e,r,t,o)}))}return i=i?i.then(o,o):o()}})}function E(t,n,r){var o=p;return function(i,s){if(o===h)throw new Error("Generator is already running");if(o===v){if("throw"===i)throw s;return{value:e,done:!0}}for(r.method=i,r.arg=s;;){var l=r.delegate;if(l){var a=C(l,r);if(a){if(a===g)continue;return a}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(o===p)throw o=v,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);o=h;var u=f(t,n,r);if("normal"===u.type){if(o=r.done?v:d,u.arg===g)continue;return{value:u.arg,done:r.done}}"throw"===u.type&&(o=v,r.method="throw",r.arg=u.arg)}}}function C(t,n){var r=n.method,o=t.iterator[r];if(o===e)return n.delegate=null,"throw"===r&&t.iterator.return&&(n.method="return",n.arg=e,C(t,n),"throw"===n.method)||"return"!==r&&(n.method="throw",n.arg=new TypeError("The iterator does not provide a '"+r+"' method")),g;var i=f(o,t.iterator,n.arg);if("throw"===i.type)return n.method="throw",n.arg=i.arg,n.delegate=null,g;var s=i.arg;return s?s.done?(n[t.resultName]=s.value,n.next=t.nextLoc,"return"!==n.method&&(n.method="next",n.arg=e),n.delegate=null,g):s:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,g)}function P(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function T(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function A(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(P,this),this.reset(!0)}function j(t){if(t||""===t){var n=t[s];if(n)return n.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var o=-1,i=function n(){for(;++o<t.length;)if(r.call(t,o))return n.value=t[o],n.done=!1,n;return n.value=e,n.done=!0,n};return i.next=i}}throw new TypeError(Kk(t)+" is not iterable")}return y.prototype=b,o(S,"constructor",{value:b,configurable:!0}),o(b,"constructor",{value:y,configurable:!0}),y.displayName=u(b,a,"GeneratorFunction"),t.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===y||"GeneratorFunction"===(t.displayName||t.name))},t.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,b):(e.__proto__=b,u(e,a,"GeneratorFunction")),e.prototype=Object.create(S),e},t.awrap=function(e){return{__await:e}},O(k.prototype),u(k.prototype,l,(function(){return this})),t.AsyncIterator=k,t.async=function(e,n,r,o,i){void 0===i&&(i=Promise);var s=new k(c(e,n,r,o),i);return t.isGeneratorFunction(n)?s:s.next().then((function(e){return e.done?e.value:s.next()}))},O(S),u(S,a,"Generator"),u(S,s,(function(){return this})),u(S,"toString",(function(){return"[object Generator]"})),t.keys=function(e){var t=Object(e),n=[];for(var r in t)n.push(r);return n.reverse(),function e(){for(;n.length;){var r=n.pop();if(r in t)return e.value=r,e.done=!1,e}return e.done=!0,e}},t.values=j,A.prototype={constructor:A,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=e,this.done=!1,this.delegate=null,this.method="next",this.arg=e,this.tryEntries.forEach(T),!t)for(var n in this)"t"===n.charAt(0)&&r.call(this,n)&&!isNaN(+n.slice(1))&&(this[n]=e)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var n=this;function o(r,o){return l.type="throw",l.arg=t,n.next=r,o&&(n.method="next",n.arg=e),!!o}for(var i=this.tryEntries.length-1;i>=0;--i){var s=this.tryEntries[i],l=s.completion;if("root"===s.tryLoc)return o("end");if(s.tryLoc<=this.prev){var a=r.call(s,"catchLoc"),u=r.call(s,"finallyLoc");if(a&&u){if(this.prev<s.catchLoc)return o(s.catchLoc,!0);if(this.prev<s.finallyLoc)return o(s.finallyLoc)}else if(a){if(this.prev<s.catchLoc)return o(s.catchLoc,!0)}else{if(!u)throw new Error("try statement without catch or finally");if(this.prev<s.finallyLoc)return o(s.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&r.call(o,"finallyLoc")&&this.prev<o.finallyLoc){var i=o;break}}i&&("break"===e||"continue"===e)&&i.tryLoc<=t&&t<=i.finallyLoc&&(i=null);var s=i?i.completion:{};return s.type=e,s.arg=t,i?(this.method="next",this.next=i.finallyLoc,g):this.complete(s)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),g},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),T(n),g}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var o=r.arg;T(n)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,n,r){return this.delegate={iterator:j(t),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=e),g}},t}function Yk(e,t,n,r,o,i,s){try{var l=e[i](s),a=l.value}catch(e){return void n(e)}l.done?t(a):Promise.resolve(a).then(r,o)}var Jk={class:"md:pl-88 flex flex-col flex-1 min-h-screen max-h-screen max-w-full"},Qk={class:"absolute bottom-4 right-4 flex items-center"},Zk={class:"text-xs text-gray-500 dark:text-gray-400 mr-5 -mb-0.5"},Xk=Ji("span",{class:"hidden md:inline"},"Memory: ",-1),eE={class:"font-semibold"},tE=Ji("span",{class:"mx-1.5"},"·",-1),nE=Ji("span",{class:"hidden md:inline"},"Duration: ",-1),rE={class:"font-semibold"},oE=Ji("span",{class:"mx-1.5"},"·",-1),iE=Ji("span",{class:"hidden md:inline"},"Version: ",-1),sE={class:"font-semibold"};const lE={__name:"Home",setup:function(e){var t=Wm(),n=Yy(),r=nb(),o=Hy(),i=zy(),s=Ng(),l=Fg();return Yr((function(){n.syncTheme(),document.addEventListener("keydown",wb)})),Xr((function(){document.removeEventListener("keydown",wb)})),Jr((function(){setInterval(n.syncTheme,1e3)})),dr((function(){return s.query}),(function(e){r.selectFile(e.file||null),i.setPage(e.page||1),o.setQuery(e.query||""),n.loadLogs()}),{immediate:!0}),dr((function(){return s.query.host}),function(){var e,o=(e=Gk().mark((function e(o){return Gk().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t.selectHost(o||null),o&&!t.selectedHostIdentifier&&sb(l,"host",null),r.reset(),e.next=5,r.loadFolders();case 5:n.loadLogs();case 6:case"end":return e.stop()}}),e)})),function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function s(e){Yk(i,r,o,s,l,"next",e)}function l(e){Yk(i,r,o,s,l,"throw",e)}s(void 0)}))});return function(e){return o.apply(this,arguments)}}(),{immediate:!0}),Jr((function(){window.onresize=function(){n.setViewportDimensions(window.innerWidth,window.innerHeight)}})),function(e,t){var o;return Ni(),Vi(Ai,null,[Ji("div",{class:ee(["absolute z-20 top-0 bottom-10 bg-gray-100 dark:bg-gray-900 md:left-0 md:flex md:w-88 md:flex-col md:fixed md:inset-y-0",[Wt(r).sidebarOpen?"left-0 right-0 md:left-auto md:right-auto":"-left-[200%] right-[200%] md:left-auto md:right-auto"]])},[Qi(T_)],2),Ji("div",Jk,[Qi(gO,{class:"pb-16 md:pb-12"})]),Ji("div",Qk,[Ji("p",Zk,[null!==(o=Wt(n).performance)&&void 0!==o&&o.requestTime?(Ni(),Vi(Ai,{key:0},[Ji("span",null,[Xk,Ji("span",eE,ce(Wt(n).performance.memoryUsage),1)]),tE,Ji("span",null,[nE,Ji("span",rE,ce(Wt(n).performance.requestTime),1)]),oE],64)):rs("",!0),Ji("span",null,[iE,Ji("span",sE,ce(e.LogViewer.version),1)])])]),Qi(Wk)],64)}}},aE=lE;function uE(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,i,s,l=[],a=!0,u=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;a=!1}else for(;!(a=(r=i.call(n)).done)&&(l.push(r.value),l.length!==t);a=!0);}catch(e){u=!0,o=e}finally{try{if(!a&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw o}}return l}}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return cE(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return cE(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function cE(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var fE=document.head.querySelector('meta[name="csrf-token"]');ov.defaults.headers.common["X-Requested-With"]="XMLHttpRequest",fE&&(ov.defaults.headers.common["X-CSRF-TOKEN"]=fE.content);for(var pE=0,dE=Object.entries(window.LogViewer.headers||{});pE<dE.length;pE++){var hE=uE(dE[pE],2),vE=hE[0],gE=hE[1];ov.defaults.headers.common[vE]=gE}window.LogViewer.basePath="/"+window.LogViewer.path,window.location.pathname.startsWith(window.LogViewer.basePath)||(window.LogViewer.basePath=window.location.pathname);var mE=window.LogViewer.basePath+"/";""!==window.LogViewer.path&&"/"!==window.LogViewer.path||(mE="/",window.LogViewer.basePath="");var yE=function(e){const t=Kv(e.routes,e),n=e.parseQuery||yg,r=e.stringifyQuery||bg,o=e.history,i=Eg(),s=Eg(),l=Eg(),a=Vt(Lv);let u=Lv;iv&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const c=av.bind(null,(e=>""+e)),f=av.bind(null,gg),p=av.bind(null,mg);function d(e,i){if(i=lv({},i||a.value),"string"==typeof e){const r=dv(n,e,i.path),s=t.resolve({path:r.path},i),l=o.createHref(r.fullPath);return lv(r,s,{params:p(s.params),hash:mg(r.hash),redirectedFrom:void 0,href:l})}let s;if("path"in e)s=lv({},e,{path:dv(n,e.path,i.path).path});else{const t=lv({},e.params);for(const e in t)null==t[e]&&delete t[e];s=lv({},e,{params:f(t)}),i.params=f(i.params)}const l=t.resolve(s,i),u=e.hash||"";l.params=c(p(l.params));const d=function(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}(r,lv({},e,{hash:(h=u,hg(h).replace(cg,"{").replace(pg,"}").replace(ag,"^")),path:l.path}));var h;const v=o.createHref(d);return lv({fullPath:d,hash:u,query:r===bg?wg(e.query):e.query||{}},l,{redirectedFrom:void 0,href:v})}function h(e){return"string"==typeof e?dv(n,e,a.value.path):lv({},e)}function v(e,t){if(u!==e)return Nv(8,{from:t,to:e})}function g(e){return y(e)}function m(e){const t=e.matched[e.matched.length-1];if(t&&t.redirect){const{redirect:n}=t;let r="function"==typeof n?n(e):n;return"string"==typeof r&&(r=r.includes("?")||r.includes("#")?r=h(r):{path:r},r.params={}),lv({query:e.query,hash:e.hash,params:"path"in r?{}:e.params},r)}}function y(e,t){const n=u=d(e),o=a.value,i=e.state,s=e.force,l=!0===e.replace,c=m(n);if(c)return y(lv(h(c),{state:"object"==typeof c?lv({},i,c.state):i,force:s,replace:l}),t||n);const f=n;let p;return f.redirectedFrom=t,!s&&function(e,t,n){const r=t.matched.length-1,o=n.matched.length-1;return r>-1&&r===o&&vv(t.matched[r],n.matched[o])&&gv(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}(r,o,n)&&(p=Nv(16,{to:f,from:o}),j(o,o,!0,!1)),(p?Promise.resolve(p):_(f,o)).catch((e=>Mv(e)?Mv(e,2)?e:A(e):T(e,f,o))).then((e=>{if(e){if(Mv(e,2))return y(lv({replace:l},h(e.to),{state:"object"==typeof e.to?lv({},i,e.to.state):i,force:s}),t||f)}else e=S(f,o,!0,l,i);return x(f,o,e),e}))}function b(e,t){const n=v(e,t);return n?Promise.reject(n):Promise.resolve()}function w(e){const t=I.values().next().value;return t&&"function"==typeof t.runWithContext?t.runWithContext(e):e()}function _(e,t){let n;const[r,o,l]=function(e,t){const n=[],r=[],o=[],i=Math.max(t.matched.length,e.matched.length);for(let s=0;s<i;s++){const i=t.matched[s];i&&(e.matched.find((e=>vv(e,i)))?r.push(i):n.push(i));const l=e.matched[s];l&&(t.matched.find((e=>vv(e,l)))||o.push(l))}return[n,r,o]}(e,t);n=Pg(r.reverse(),"beforeRouteLeave",e,t);for(const o of r)o.leaveGuards.forEach((r=>{n.push(Cg(r,e,t))}));const a=b.bind(null,e,t);return n.push(a),N(n).then((()=>{n=[];for(const r of i.list())n.push(Cg(r,e,t));return n.push(a),N(n)})).then((()=>{n=Pg(o,"beforeRouteUpdate",e,t);for(const r of o)r.updateGuards.forEach((r=>{n.push(Cg(r,e,t))}));return n.push(a),N(n)})).then((()=>{n=[];for(const r of l)if(r.beforeEnter)if(cv(r.beforeEnter))for(const o of r.beforeEnter)n.push(Cg(o,e,t));else n.push(Cg(r.beforeEnter,e,t));return n.push(a),N(n)})).then((()=>(e.matched.forEach((e=>e.enterCallbacks={})),n=Pg(l,"beforeRouteEnter",e,t),n.push(a),N(n)))).then((()=>{n=[];for(const r of s.list())n.push(Cg(r,e,t));return n.push(a),N(n)})).catch((e=>Mv(e,8)?e:Promise.reject(e)))}function x(e,t,n){l.list().forEach((r=>w((()=>r(e,t,n)))))}function S(e,t,n,r,i){const s=v(e,t);if(s)return s;const l=t===Lv,u=iv?history.state:{};n&&(r||l?o.replace(e.fullPath,lv({scroll:l&&u&&u.scroll},i)):o.push(e.fullPath,i)),a.value=e,j(e,t,n,l),A()}let O;function k(){O||(O=o.listen(((e,t,n)=>{if(!F.listening)return;const r=d(e),i=m(r);if(i)return void y(lv(i,{replace:!0}),r).catch(uv);u=r;const s=a.value;iv&&function(e,t){Cv.set(e,t)}(Ev(s.fullPath,n.delta),Ov()),_(r,s).catch((e=>Mv(e,12)?e:Mv(e,2)?(y(e.to,r).then((e=>{Mv(e,20)&&!n.delta&&n.type===bv.pop&&o.go(-1,!1)})).catch(uv),Promise.reject()):(n.delta&&o.go(-n.delta,!1),T(e,r,s)))).then((e=>{(e=e||S(r,s,!1))&&(n.delta&&!Mv(e,8)?o.go(-n.delta,!1):n.type===bv.pop&&Mv(e,20)&&o.go(-1,!1)),x(r,s,e)})).catch(uv)})))}let E,C=Eg(),P=Eg();function T(e,t,n){A(e);const r=P.list();return r.length&&r.forEach((r=>r(e,t,n))),Promise.reject(e)}function A(e){return E||(E=!e,k(),C.list().forEach((([t,n])=>e?n(e):t())),C.reset()),e}function j(t,n,r,o){const{scrollBehavior:i}=e;if(!iv||!i)return Promise.resolve();const s=!r&&function(e){const t=Cv.get(e);return Cv.delete(e),t}(Ev(t.fullPath,0))||(o||!r)&&history.state&&history.state.scroll||null;return bn().then((()=>i(t,n,s))).then((e=>e&&kv(e))).catch((e=>T(e,t,n)))}const R=e=>o.go(e);let L;const I=new Set,F={currentRoute:a,listening:!0,addRoute:function(e,n){let r,o;return Rv(e)?(r=t.getRecordMatcher(e),o=n):o=e,t.addRoute(o,r)},removeRoute:function(e){const n=t.getRecordMatcher(e);n&&t.removeRoute(n)},hasRoute:function(e){return!!t.getRecordMatcher(e)},getRoutes:function(){return t.getRoutes().map((e=>e.record))},resolve:d,options:e,push:g,replace:function(e){return g(lv(h(e),{replace:!0}))},go:R,back:()=>R(-1),forward:()=>R(1),beforeEach:i.add,beforeResolve:s.add,afterEach:l.add,onError:P.add,isReady:function(){return E&&a.value!==Lv?Promise.resolve():new Promise(((e,t)=>{C.add([e,t])}))},install(e){e.component("RouterLink",Ag),e.component("RouterView",Ig),e.config.globalProperties.$router=this,Object.defineProperty(e.config.globalProperties,"$route",{enumerable:!0,get:()=>Wt(a)}),iv&&!L&&a.value===Lv&&(L=!0,g(o.location).catch((e=>{0})));const t={};for(const e in Lv)Object.defineProperty(t,e,{get:()=>a.value[e],enumerable:!0});e.provide(Sg,this),e.provide(Og,Et(t)),e.provide(kg,a);const n=e.unmount;I.add(e),e.unmount=function(){I.delete(e),I.size<1&&(u=Lv,O&&O(),O=null,a.value=Lv,L=!1,E=!1),n()}}};function N(e){return e.reduce(((e,t)=>e.then((()=>w(t)))),Promise.resolve())}return F}({routes:[{path:LogViewer.basePath,name:"home",component:aE}],history:jv(),base:mE}),bE=function(){const e=he(!0),t=e.run((()=>$t({})));let n=[],r=[];const o=Ft({install(e){bp(o),ap||(o._a=e,e.provide(wp,o),e.config.globalProperties.$pinia=o,Op&&Qp(e,o),r.forEach((e=>n.push(e))),r=[])},use(e){return this._a||ap?n.push(e):r.push(e),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return Op&&"undefined"!=typeof Proxy&&o.use(td),o}(),wE=ma({router:yE});wE.use(yE),wE.use(bE),wE.mixin({computed:{LogViewer:function(){return window.LogViewer}}}),wE.mount("#log-viewer")},742:(e,t)=>{"use strict";t.byteLength=function(e){var t=l(e),n=t[0],r=t[1];return 3*(n+r)/4-r},t.toByteArray=function(e){var t,n,i=l(e),s=i[0],a=i[1],u=new o(function(e,t,n){return 3*(t+n)/4-n}(0,s,a)),c=0,f=a>0?s-4:s;for(n=0;n<f;n+=4)t=r[e.charCodeAt(n)]<<18|r[e.charCodeAt(n+1)]<<12|r[e.charCodeAt(n+2)]<<6|r[e.charCodeAt(n+3)],u[c++]=t>>16&255,u[c++]=t>>8&255,u[c++]=255&t;2===a&&(t=r[e.charCodeAt(n)]<<2|r[e.charCodeAt(n+1)]>>4,u[c++]=255&t);1===a&&(t=r[e.charCodeAt(n)]<<10|r[e.charCodeAt(n+1)]<<4|r[e.charCodeAt(n+2)]>>2,u[c++]=t>>8&255,u[c++]=255&t);return u},t.fromByteArray=function(e){for(var t,r=e.length,o=r%3,i=[],s=16383,l=0,u=r-o;l<u;l+=s)i.push(a(e,l,l+s>u?u:l+s));1===o?(t=e[r-1],i.push(n[t>>2]+n[t<<4&63]+"==")):2===o&&(t=(e[r-2]<<8)+e[r-1],i.push(n[t>>10]+n[t>>4&63]+n[t<<2&63]+"="));return i.join("")};for(var n=[],r=[],o="undefined"!=typeof Uint8Array?Uint8Array:Array,i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s=0;s<64;++s)n[s]=i[s],r[i.charCodeAt(s)]=s;function l(e){var t=e.length;if(t%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var n=e.indexOf("=");return-1===n&&(n=t),[n,n===t?0:4-n%4]}function a(e,t,r){for(var o,i,s=[],l=t;l<r;l+=3)o=(e[l]<<16&16711680)+(e[l+1]<<8&65280)+(255&e[l+2]),s.push(n[(i=o)>>18&63]+n[i>>12&63]+n[i>>6&63]+n[63&i]);return s.join("")}r["-".charCodeAt(0)]=62,r["_".charCodeAt(0)]=63},764:(e,t,n)=>{"use strict";var r=n(742),o=n(645),i=n(826);function s(){return a.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function l(e,t){if(s()<t)throw new RangeError("Invalid typed array length");return a.TYPED_ARRAY_SUPPORT?(e=new Uint8Array(t)).__proto__=a.prototype:(null===e&&(e=new a(t)),e.length=t),e}function a(e,t,n){if(!(a.TYPED_ARRAY_SUPPORT||this instanceof a))return new a(e,t,n);if("number"==typeof e){if("string"==typeof t)throw new Error("If encoding is specified then the first argument must be a string");return f(this,e)}return u(this,e,t,n)}function u(e,t,n,r){if("number"==typeof t)throw new TypeError('"value" argument must not be a number');return"undefined"!=typeof ArrayBuffer&&t instanceof ArrayBuffer?function(e,t,n,r){if(t.byteLength,n<0||t.byteLength<n)throw new RangeError("'offset' is out of bounds");if(t.byteLength<n+(r||0))throw new RangeError("'length' is out of bounds");t=void 0===n&&void 0===r?new Uint8Array(t):void 0===r?new Uint8Array(t,n):new Uint8Array(t,n,r);a.TYPED_ARRAY_SUPPORT?(e=t).__proto__=a.prototype:e=p(e,t);return e}(e,t,n,r):"string"==typeof t?function(e,t,n){"string"==typeof n&&""!==n||(n="utf8");if(!a.isEncoding(n))throw new TypeError('"encoding" must be a valid string encoding');var r=0|h(t,n);e=l(e,r);var o=e.write(t,n);o!==r&&(e=e.slice(0,o));return e}(e,t,n):function(e,t){if(a.isBuffer(t)){var n=0|d(t.length);return 0===(e=l(e,n)).length||t.copy(e,0,0,n),e}if(t){if("undefined"!=typeof ArrayBuffer&&t.buffer instanceof ArrayBuffer||"length"in t)return"number"!=typeof t.length||(r=t.length)!=r?l(e,0):p(e,t);if("Buffer"===t.type&&i(t.data))return p(e,t.data)}var r;throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(e,t)}function c(e){if("number"!=typeof e)throw new TypeError('"size" argument must be a number');if(e<0)throw new RangeError('"size" argument must not be negative')}function f(e,t){if(c(t),e=l(e,t<0?0:0|d(t)),!a.TYPED_ARRAY_SUPPORT)for(var n=0;n<t;++n)e[n]=0;return e}function p(e,t){var n=t.length<0?0:0|d(t.length);e=l(e,n);for(var r=0;r<n;r+=1)e[r]=255&t[r];return e}function d(e){if(e>=s())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+s().toString(16)+" bytes");return 0|e}function h(e,t){if(a.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var n=e.length;if(0===n)return 0;for(var r=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return $(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return V(e).length;default:if(r)return $(e).length;t=(""+t).toLowerCase(),r=!0}}function v(e,t,n){var r=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return A(this,t,n);case"utf8":case"utf-8":return E(this,t,n);case"ascii":return P(this,t,n);case"latin1":case"binary":return T(this,t,n);case"base64":return k(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return j(this,t,n);default:if(r)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),r=!0}}function g(e,t,n){var r=e[t];e[t]=e[n],e[n]=r}function m(e,t,n,r,o){if(0===e.length)return-1;if("string"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=o?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(o)return-1;n=e.length-1}else if(n<0){if(!o)return-1;n=0}if("string"==typeof t&&(t=a.from(t,r)),a.isBuffer(t))return 0===t.length?-1:y(e,t,n,r,o);if("number"==typeof t)return t&=255,a.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):y(e,[t],n,r,o);throw new TypeError("val must be string, number or Buffer")}function y(e,t,n,r,o){var i,s=1,l=e.length,a=t.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(e.length<2||t.length<2)return-1;s=2,l/=2,a/=2,n/=2}function u(e,t){return 1===s?e[t]:e.readUInt16BE(t*s)}if(o){var c=-1;for(i=n;i<l;i++)if(u(e,i)===u(t,-1===c?0:i-c)){if(-1===c&&(c=i),i-c+1===a)return c*s}else-1!==c&&(i-=i-c),c=-1}else for(n+a>l&&(n=l-a),i=n;i>=0;i--){for(var f=!0,p=0;p<a;p++)if(u(e,i+p)!==u(t,p)){f=!1;break}if(f)return i}return-1}function b(e,t,n,r){n=Number(n)||0;var o=e.length-n;r?(r=Number(r))>o&&(r=o):r=o;var i=t.length;if(i%2!=0)throw new TypeError("Invalid hex string");r>i/2&&(r=i/2);for(var s=0;s<r;++s){var l=parseInt(t.substr(2*s,2),16);if(isNaN(l))return s;e[n+s]=l}return s}function w(e,t,n,r){return H($(t,e.length-n),e,n,r)}function _(e,t,n,r){return H(function(e){for(var t=[],n=0;n<e.length;++n)t.push(255&e.charCodeAt(n));return t}(t),e,n,r)}function x(e,t,n,r){return _(e,t,n,r)}function S(e,t,n,r){return H(V(t),e,n,r)}function O(e,t,n,r){return H(function(e,t){for(var n,r,o,i=[],s=0;s<e.length&&!((t-=2)<0);++s)r=(n=e.charCodeAt(s))>>8,o=n%256,i.push(o),i.push(r);return i}(t,e.length-n),e,n,r)}function k(e,t,n){return 0===t&&n===e.length?r.fromByteArray(e):r.fromByteArray(e.slice(t,n))}function E(e,t,n){n=Math.min(e.length,n);for(var r=[],o=t;o<n;){var i,s,l,a,u=e[o],c=null,f=u>239?4:u>223?3:u>191?2:1;if(o+f<=n)switch(f){case 1:u<128&&(c=u);break;case 2:128==(192&(i=e[o+1]))&&(a=(31&u)<<6|63&i)>127&&(c=a);break;case 3:i=e[o+1],s=e[o+2],128==(192&i)&&128==(192&s)&&(a=(15&u)<<12|(63&i)<<6|63&s)>2047&&(a<55296||a>57343)&&(c=a);break;case 4:i=e[o+1],s=e[o+2],l=e[o+3],128==(192&i)&&128==(192&s)&&128==(192&l)&&(a=(15&u)<<18|(63&i)<<12|(63&s)<<6|63&l)>65535&&a<1114112&&(c=a)}null===c?(c=65533,f=1):c>65535&&(c-=65536,r.push(c>>>10&1023|55296),c=56320|1023&c),r.push(c),o+=f}return function(e){var t=e.length;if(t<=C)return String.fromCharCode.apply(String,e);var n="",r=0;for(;r<t;)n+=String.fromCharCode.apply(String,e.slice(r,r+=C));return n}(r)}t.lW=a,t.h2=50,a.TYPED_ARRAY_SUPPORT=void 0!==n.g.TYPED_ARRAY_SUPPORT?n.g.TYPED_ARRAY_SUPPORT:function(){try{var e=new Uint8Array(1);return e.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===e.foo()&&"function"==typeof e.subarray&&0===e.subarray(1,1).byteLength}catch(e){return!1}}(),s(),a.poolSize=8192,a._augment=function(e){return e.__proto__=a.prototype,e},a.from=function(e,t,n){return u(null,e,t,n)},a.TYPED_ARRAY_SUPPORT&&(a.prototype.__proto__=Uint8Array.prototype,a.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&a[Symbol.species]===a&&Object.defineProperty(a,Symbol.species,{value:null,configurable:!0})),a.alloc=function(e,t,n){return function(e,t,n,r){return c(t),t<=0?l(e,t):void 0!==n?"string"==typeof r?l(e,t).fill(n,r):l(e,t).fill(n):l(e,t)}(null,e,t,n)},a.allocUnsafe=function(e){return f(null,e)},a.allocUnsafeSlow=function(e){return f(null,e)},a.isBuffer=function(e){return!(null==e||!e._isBuffer)},a.compare=function(e,t){if(!a.isBuffer(e)||!a.isBuffer(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var n=e.length,r=t.length,o=0,i=Math.min(n,r);o<i;++o)if(e[o]!==t[o]){n=e[o],r=t[o];break}return n<r?-1:r<n?1:0},a.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},a.concat=function(e,t){if(!i(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return a.alloc(0);var n;if(void 0===t)for(t=0,n=0;n<e.length;++n)t+=e[n].length;var r=a.allocUnsafe(t),o=0;for(n=0;n<e.length;++n){var s=e[n];if(!a.isBuffer(s))throw new TypeError('"list" argument must be an Array of Buffers');s.copy(r,o),o+=s.length}return r},a.byteLength=h,a.prototype._isBuffer=!0,a.prototype.swap16=function(){var e=this.length;if(e%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var t=0;t<e;t+=2)g(this,t,t+1);return this},a.prototype.swap32=function(){var e=this.length;if(e%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var t=0;t<e;t+=4)g(this,t,t+3),g(this,t+1,t+2);return this},a.prototype.swap64=function(){var e=this.length;if(e%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var t=0;t<e;t+=8)g(this,t,t+7),g(this,t+1,t+6),g(this,t+2,t+5),g(this,t+3,t+4);return this},a.prototype.toString=function(){var e=0|this.length;return 0===e?"":0===arguments.length?E(this,0,e):v.apply(this,arguments)},a.prototype.equals=function(e){if(!a.isBuffer(e))throw new TypeError("Argument must be a Buffer");return this===e||0===a.compare(this,e)},a.prototype.inspect=function(){var e="",n=t.h2;return this.length>0&&(e=this.toString("hex",0,n).match(/.{2}/g).join(" "),this.length>n&&(e+=" ... ")),"<Buffer "+e+">"},a.prototype.compare=function(e,t,n,r,o){if(!a.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===r&&(r=0),void 0===o&&(o=this.length),t<0||n>e.length||r<0||o>this.length)throw new RangeError("out of range index");if(r>=o&&t>=n)return 0;if(r>=o)return-1;if(t>=n)return 1;if(this===e)return 0;for(var i=(o>>>=0)-(r>>>=0),s=(n>>>=0)-(t>>>=0),l=Math.min(i,s),u=this.slice(r,o),c=e.slice(t,n),f=0;f<l;++f)if(u[f]!==c[f]){i=u[f],s=c[f];break}return i<s?-1:s<i?1:0},a.prototype.includes=function(e,t,n){return-1!==this.indexOf(e,t,n)},a.prototype.indexOf=function(e,t,n){return m(this,e,t,n,!0)},a.prototype.lastIndexOf=function(e,t,n){return m(this,e,t,n,!1)},a.prototype.write=function(e,t,n,r){if(void 0===t)r="utf8",n=this.length,t=0;else if(void 0===n&&"string"==typeof t)r=t,n=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t|=0,isFinite(n)?(n|=0,void 0===r&&(r="utf8")):(r=n,n=void 0)}var o=this.length-t;if((void 0===n||n>o)&&(n=o),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");for(var i=!1;;)switch(r){case"hex":return b(this,e,t,n);case"utf8":case"utf-8":return w(this,e,t,n);case"ascii":return _(this,e,t,n);case"latin1":case"binary":return x(this,e,t,n);case"base64":return S(this,e,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return O(this,e,t,n);default:if(i)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),i=!0}},a.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var C=4096;function P(e,t,n){var r="";n=Math.min(e.length,n);for(var o=t;o<n;++o)r+=String.fromCharCode(127&e[o]);return r}function T(e,t,n){var r="";n=Math.min(e.length,n);for(var o=t;o<n;++o)r+=String.fromCharCode(e[o]);return r}function A(e,t,n){var r=e.length;(!t||t<0)&&(t=0),(!n||n<0||n>r)&&(n=r);for(var o="",i=t;i<n;++i)o+=U(e[i]);return o}function j(e,t,n){for(var r=e.slice(t,n),o="",i=0;i<r.length;i+=2)o+=String.fromCharCode(r[i]+256*r[i+1]);return o}function R(e,t,n){if(e%1!=0||e<0)throw new RangeError("offset is not uint");if(e+t>n)throw new RangeError("Trying to access beyond buffer length")}function L(e,t,n,r,o,i){if(!a.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>o||t<i)throw new RangeError('"value" argument is out of bounds');if(n+r>e.length)throw new RangeError("Index out of range")}function I(e,t,n,r){t<0&&(t=65535+t+1);for(var o=0,i=Math.min(e.length-n,2);o<i;++o)e[n+o]=(t&255<<8*(r?o:1-o))>>>8*(r?o:1-o)}function F(e,t,n,r){t<0&&(t=4294967295+t+1);for(var o=0,i=Math.min(e.length-n,4);o<i;++o)e[n+o]=t>>>8*(r?o:3-o)&255}function N(e,t,n,r,o,i){if(n+r>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function M(e,t,n,r,i){return i||N(e,0,n,4),o.write(e,t,n,r,23,4),n+4}function D(e,t,n,r,i){return i||N(e,0,n,8),o.write(e,t,n,r,52,8),n+8}a.prototype.slice=function(e,t){var n,r=this.length;if((e=~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),(t=void 0===t?r:~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),t<e&&(t=e),a.TYPED_ARRAY_SUPPORT)(n=this.subarray(e,t)).__proto__=a.prototype;else{var o=t-e;n=new a(o,void 0);for(var i=0;i<o;++i)n[i]=this[i+e]}return n},a.prototype.readUIntLE=function(e,t,n){e|=0,t|=0,n||R(e,t,this.length);for(var r=this[e],o=1,i=0;++i<t&&(o*=256);)r+=this[e+i]*o;return r},a.prototype.readUIntBE=function(e,t,n){e|=0,t|=0,n||R(e,t,this.length);for(var r=this[e+--t],o=1;t>0&&(o*=256);)r+=this[e+--t]*o;return r},a.prototype.readUInt8=function(e,t){return t||R(e,1,this.length),this[e]},a.prototype.readUInt16LE=function(e,t){return t||R(e,2,this.length),this[e]|this[e+1]<<8},a.prototype.readUInt16BE=function(e,t){return t||R(e,2,this.length),this[e]<<8|this[e+1]},a.prototype.readUInt32LE=function(e,t){return t||R(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},a.prototype.readUInt32BE=function(e,t){return t||R(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},a.prototype.readIntLE=function(e,t,n){e|=0,t|=0,n||R(e,t,this.length);for(var r=this[e],o=1,i=0;++i<t&&(o*=256);)r+=this[e+i]*o;return r>=(o*=128)&&(r-=Math.pow(2,8*t)),r},a.prototype.readIntBE=function(e,t,n){e|=0,t|=0,n||R(e,t,this.length);for(var r=t,o=1,i=this[e+--r];r>0&&(o*=256);)i+=this[e+--r]*o;return i>=(o*=128)&&(i-=Math.pow(2,8*t)),i},a.prototype.readInt8=function(e,t){return t||R(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},a.prototype.readInt16LE=function(e,t){t||R(e,2,this.length);var n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},a.prototype.readInt16BE=function(e,t){t||R(e,2,this.length);var n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},a.prototype.readInt32LE=function(e,t){return t||R(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},a.prototype.readInt32BE=function(e,t){return t||R(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},a.prototype.readFloatLE=function(e,t){return t||R(e,4,this.length),o.read(this,e,!0,23,4)},a.prototype.readFloatBE=function(e,t){return t||R(e,4,this.length),o.read(this,e,!1,23,4)},a.prototype.readDoubleLE=function(e,t){return t||R(e,8,this.length),o.read(this,e,!0,52,8)},a.prototype.readDoubleBE=function(e,t){return t||R(e,8,this.length),o.read(this,e,!1,52,8)},a.prototype.writeUIntLE=function(e,t,n,r){(e=+e,t|=0,n|=0,r)||L(this,e,t,n,Math.pow(2,8*n)-1,0);var o=1,i=0;for(this[t]=255&e;++i<n&&(o*=256);)this[t+i]=e/o&255;return t+n},a.prototype.writeUIntBE=function(e,t,n,r){(e=+e,t|=0,n|=0,r)||L(this,e,t,n,Math.pow(2,8*n)-1,0);var o=n-1,i=1;for(this[t+o]=255&e;--o>=0&&(i*=256);)this[t+o]=e/i&255;return t+n},a.prototype.writeUInt8=function(e,t,n){return e=+e,t|=0,n||L(this,e,t,1,255,0),a.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},a.prototype.writeUInt16LE=function(e,t,n){return e=+e,t|=0,n||L(this,e,t,2,65535,0),a.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):I(this,e,t,!0),t+2},a.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||L(this,e,t,2,65535,0),a.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):I(this,e,t,!1),t+2},a.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||L(this,e,t,4,4294967295,0),a.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):F(this,e,t,!0),t+4},a.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||L(this,e,t,4,4294967295,0),a.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):F(this,e,t,!1),t+4},a.prototype.writeIntLE=function(e,t,n,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*n-1);L(this,e,t,n,o-1,-o)}var i=0,s=1,l=0;for(this[t]=255&e;++i<n&&(s*=256);)e<0&&0===l&&0!==this[t+i-1]&&(l=1),this[t+i]=(e/s>>0)-l&255;return t+n},a.prototype.writeIntBE=function(e,t,n,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*n-1);L(this,e,t,n,o-1,-o)}var i=n-1,s=1,l=0;for(this[t+i]=255&e;--i>=0&&(s*=256);)e<0&&0===l&&0!==this[t+i+1]&&(l=1),this[t+i]=(e/s>>0)-l&255;return t+n},a.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||L(this,e,t,1,127,-128),a.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},a.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||L(this,e,t,2,32767,-32768),a.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):I(this,e,t,!0),t+2},a.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||L(this,e,t,2,32767,-32768),a.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):I(this,e,t,!1),t+2},a.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||L(this,e,t,4,2147483647,-2147483648),a.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):F(this,e,t,!0),t+4},a.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||L(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),a.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):F(this,e,t,!1),t+4},a.prototype.writeFloatLE=function(e,t,n){return M(this,e,t,!0,n)},a.prototype.writeFloatBE=function(e,t,n){return M(this,e,t,!1,n)},a.prototype.writeDoubleLE=function(e,t,n){return D(this,e,t,!0,n)},a.prototype.writeDoubleBE=function(e,t,n){return D(this,e,t,!1,n)},a.prototype.copy=function(e,t,n,r){if(n||(n=0),r||0===r||(r=this.length),t>=e.length&&(t=e.length),t||(t=0),r>0&&r<n&&(r=n),r===n)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError("targetStart out of bounds");if(n<0||n>=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),e.length-t<r-n&&(r=e.length-t+n);var o,i=r-n;if(this===e&&n<t&&t<r)for(o=i-1;o>=0;--o)e[o+t]=this[o+n];else if(i<1e3||!a.TYPED_ARRAY_SUPPORT)for(o=0;o<i;++o)e[o+t]=this[o+n];else Uint8Array.prototype.set.call(e,this.subarray(n,n+i),t);return i},a.prototype.fill=function(e,t,n,r){if("string"==typeof e){if("string"==typeof t?(r=t,t=0,n=this.length):"string"==typeof n&&(r=n,n=this.length),1===e.length){var o=e.charCodeAt(0);o<256&&(e=o)}if(void 0!==r&&"string"!=typeof r)throw new TypeError("encoding must be a string");if("string"==typeof r&&!a.isEncoding(r))throw new TypeError("Unknown encoding: "+r)}else"number"==typeof e&&(e&=255);if(t<0||this.length<t||this.length<n)throw new RangeError("Out of range index");if(n<=t)return this;var i;if(t>>>=0,n=void 0===n?this.length:n>>>0,e||(e=0),"number"==typeof e)for(i=t;i<n;++i)this[i]=e;else{var s=a.isBuffer(e)?e:$(new a(e,r).toString()),l=s.length;for(i=0;i<n-t;++i)this[i+t]=s[i%l]}return this};var B=/[^+\/0-9A-Za-z-_]/g;function U(e){return e<16?"0"+e.toString(16):e.toString(16)}function $(e,t){var n;t=t||1/0;for(var r=e.length,o=null,i=[],s=0;s<r;++s){if((n=e.charCodeAt(s))>55295&&n<57344){if(!o){if(n>56319){(t-=3)>-1&&i.push(239,191,189);continue}if(s+1===r){(t-=3)>-1&&i.push(239,191,189);continue}o=n;continue}if(n<56320){(t-=3)>-1&&i.push(239,191,189),o=n;continue}n=65536+(o-55296<<10|n-56320)}else o&&(t-=3)>-1&&i.push(239,191,189);if(o=null,n<128){if((t-=1)<0)break;i.push(n)}else if(n<2048){if((t-=2)<0)break;i.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;i.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;i.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return i}function V(e){return r.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(B,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function H(e,t,n,r){for(var o=0;o<r&&!(o+n>=t.length||o>=e.length);++o)t[o+n]=e[o];return o}},645:(e,t)=>{t.read=function(e,t,n,r,o){var i,s,l=8*o-r-1,a=(1<<l)-1,u=a>>1,c=-7,f=n?o-1:0,p=n?-1:1,d=e[t+f];for(f+=p,i=d&(1<<-c)-1,d>>=-c,c+=l;c>0;i=256*i+e[t+f],f+=p,c-=8);for(s=i&(1<<-c)-1,i>>=-c,c+=r;c>0;s=256*s+e[t+f],f+=p,c-=8);if(0===i)i=1-u;else{if(i===a)return s?NaN:1/0*(d?-1:1);s+=Math.pow(2,r),i-=u}return(d?-1:1)*s*Math.pow(2,i-r)},t.write=function(e,t,n,r,o,i){var s,l,a,u=8*i-o-1,c=(1<<u)-1,f=c>>1,p=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,d=r?0:i-1,h=r?1:-1,v=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(l=isNaN(t)?1:0,s=c):(s=Math.floor(Math.log(t)/Math.LN2),t*(a=Math.pow(2,-s))<1&&(s--,a*=2),(t+=s+f>=1?p/a:p*Math.pow(2,1-f))*a>=2&&(s++,a/=2),s+f>=c?(l=0,s=c):s+f>=1?(l=(t*a-1)*Math.pow(2,o),s+=f):(l=t*Math.pow(2,f-1)*Math.pow(2,o),s=0));o>=8;e[n+d]=255&l,d+=h,l/=256,o-=8);for(s=s<<o|l,u+=o;u>0;e[n+d]=255&s,d+=h,s/=256,u-=8);e[n+d-h]|=128*v}},826:e=>{var t={}.toString;e.exports=Array.isArray||function(e){return"[object Array]"==t.call(e)}},486:function(e,t,n){var r;e=n.nmd(e),function(){var o,i="Expected a function",s="__lodash_hash_undefined__",l="__lodash_placeholder__",a=16,u=32,c=64,f=128,p=256,d=1/0,h=9007199254740991,v=NaN,g=4294967295,m=[["ary",f],["bind",1],["bindKey",2],["curry",8],["curryRight",a],["flip",512],["partial",u],["partialRight",c],["rearg",p]],y="[object Arguments]",b="[object Array]",w="[object Boolean]",_="[object Date]",x="[object Error]",S="[object Function]",O="[object GeneratorFunction]",k="[object Map]",E="[object Number]",C="[object Object]",P="[object Promise]",T="[object RegExp]",A="[object Set]",j="[object String]",R="[object Symbol]",L="[object WeakMap]",I="[object ArrayBuffer]",F="[object DataView]",N="[object Float32Array]",M="[object Float64Array]",D="[object Int8Array]",B="[object Int16Array]",U="[object Int32Array]",$="[object Uint8Array]",V="[object Uint8ClampedArray]",H="[object Uint16Array]",z="[object Uint32Array]",q=/\b__p \+= '';/g,W=/\b(__p \+=) '' \+/g,K=/(__e\(.*?\)|\b__t\)) \+\n'';/g,G=/&(?:amp|lt|gt|quot|#39);/g,Y=/[&<>"']/g,J=RegExp(G.source),Q=RegExp(Y.source),Z=/<%-([\s\S]+?)%>/g,X=/<%([\s\S]+?)%>/g,ee=/<%=([\s\S]+?)%>/g,te=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,ne=/^\w*$/,re=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,oe=/[\\^$.*+?()[\]{}|]/g,ie=RegExp(oe.source),se=/^\s+/,le=/\s/,ae=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,ue=/\{\n\/\* \[wrapped with (.+)\] \*/,ce=/,? & /,fe=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,pe=/[()=,{}\[\]\/\s]/,de=/\\(\\)?/g,he=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,ve=/\w*$/,ge=/^[-+]0x[0-9a-f]+$/i,me=/^0b[01]+$/i,ye=/^\[object .+?Constructor\]$/,be=/^0o[0-7]+$/i,we=/^(?:0|[1-9]\d*)$/,_e=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,xe=/($^)/,Se=/['\n\r\u2028\u2029\\]/g,Oe="\\ud800-\\udfff",ke="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",Ee="\\u2700-\\u27bf",Ce="a-z\\xdf-\\xf6\\xf8-\\xff",Pe="A-Z\\xc0-\\xd6\\xd8-\\xde",Te="\\ufe0e\\ufe0f",Ae="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",je="['’]",Re="["+Oe+"]",Le="["+Ae+"]",Ie="["+ke+"]",Fe="\\d+",Ne="["+Ee+"]",Me="["+Ce+"]",De="[^"+Oe+Ae+Fe+Ee+Ce+Pe+"]",Be="\\ud83c[\\udffb-\\udfff]",Ue="[^"+Oe+"]",$e="(?:\\ud83c[\\udde6-\\uddff]){2}",Ve="[\\ud800-\\udbff][\\udc00-\\udfff]",He="["+Pe+"]",ze="\\u200d",qe="(?:"+Me+"|"+De+")",We="(?:"+He+"|"+De+")",Ke="(?:['’](?:d|ll|m|re|s|t|ve))?",Ge="(?:['’](?:D|LL|M|RE|S|T|VE))?",Ye="(?:"+Ie+"|"+Be+")"+"?",Je="["+Te+"]?",Qe=Je+Ye+("(?:"+ze+"(?:"+[Ue,$e,Ve].join("|")+")"+Je+Ye+")*"),Ze="(?:"+[Ne,$e,Ve].join("|")+")"+Qe,Xe="(?:"+[Ue+Ie+"?",Ie,$e,Ve,Re].join("|")+")",et=RegExp(je,"g"),tt=RegExp(Ie,"g"),nt=RegExp(Be+"(?="+Be+")|"+Xe+Qe,"g"),rt=RegExp([He+"?"+Me+"+"+Ke+"(?="+[Le,He,"$"].join("|")+")",We+"+"+Ge+"(?="+[Le,He+qe,"$"].join("|")+")",He+"?"+qe+"+"+Ke,He+"+"+Ge,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",Fe,Ze].join("|"),"g"),ot=RegExp("["+ze+Oe+ke+Te+"]"),it=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,st=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],lt=-1,at={};at[N]=at[M]=at[D]=at[B]=at[U]=at[$]=at[V]=at[H]=at[z]=!0,at[y]=at[b]=at[I]=at[w]=at[F]=at[_]=at[x]=at[S]=at[k]=at[E]=at[C]=at[T]=at[A]=at[j]=at[L]=!1;var ut={};ut[y]=ut[b]=ut[I]=ut[F]=ut[w]=ut[_]=ut[N]=ut[M]=ut[D]=ut[B]=ut[U]=ut[k]=ut[E]=ut[C]=ut[T]=ut[A]=ut[j]=ut[R]=ut[$]=ut[V]=ut[H]=ut[z]=!0,ut[x]=ut[S]=ut[L]=!1;var ct={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},ft=parseFloat,pt=parseInt,dt="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,ht="object"==typeof self&&self&&self.Object===Object&&self,vt=dt||ht||Function("return this")(),gt=t&&!t.nodeType&&t,mt=gt&&e&&!e.nodeType&&e,yt=mt&&mt.exports===gt,bt=yt&&dt.process,wt=function(){try{var e=mt&&mt.require&&mt.require("util").types;return e||bt&&bt.binding&&bt.binding("util")}catch(e){}}(),_t=wt&&wt.isArrayBuffer,xt=wt&&wt.isDate,St=wt&&wt.isMap,Ot=wt&&wt.isRegExp,kt=wt&&wt.isSet,Et=wt&&wt.isTypedArray;function Ct(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}function Pt(e,t,n,r){for(var o=-1,i=null==e?0:e.length;++o<i;){var s=e[o];t(r,s,n(s),e)}return r}function Tt(e,t){for(var n=-1,r=null==e?0:e.length;++n<r&&!1!==t(e[n],n,e););return e}function At(e,t){for(var n=null==e?0:e.length;n--&&!1!==t(e[n],n,e););return e}function jt(e,t){for(var n=-1,r=null==e?0:e.length;++n<r;)if(!t(e[n],n,e))return!1;return!0}function Rt(e,t){for(var n=-1,r=null==e?0:e.length,o=0,i=[];++n<r;){var s=e[n];t(s,n,e)&&(i[o++]=s)}return i}function Lt(e,t){return!!(null==e?0:e.length)&&Ht(e,t,0)>-1}function It(e,t,n){for(var r=-1,o=null==e?0:e.length;++r<o;)if(n(t,e[r]))return!0;return!1}function Ft(e,t){for(var n=-1,r=null==e?0:e.length,o=Array(r);++n<r;)o[n]=t(e[n],n,e);return o}function Nt(e,t){for(var n=-1,r=t.length,o=e.length;++n<r;)e[o+n]=t[n];return e}function Mt(e,t,n,r){var o=-1,i=null==e?0:e.length;for(r&&i&&(n=e[++o]);++o<i;)n=t(n,e[o],o,e);return n}function Dt(e,t,n,r){var o=null==e?0:e.length;for(r&&o&&(n=e[--o]);o--;)n=t(n,e[o],o,e);return n}function Bt(e,t){for(var n=-1,r=null==e?0:e.length;++n<r;)if(t(e[n],n,e))return!0;return!1}var Ut=Kt("length");function $t(e,t,n){var r;return n(e,(function(e,n,o){if(t(e,n,o))return r=n,!1})),r}function Vt(e,t,n,r){for(var o=e.length,i=n+(r?1:-1);r?i--:++i<o;)if(t(e[i],i,e))return i;return-1}function Ht(e,t,n){return t==t?function(e,t,n){var r=n-1,o=e.length;for(;++r<o;)if(e[r]===t)return r;return-1}(e,t,n):Vt(e,qt,n)}function zt(e,t,n,r){for(var o=n-1,i=e.length;++o<i;)if(r(e[o],t))return o;return-1}function qt(e){return e!=e}function Wt(e,t){var n=null==e?0:e.length;return n?Jt(e,t)/n:v}function Kt(e){return function(t){return null==t?o:t[e]}}function Gt(e){return function(t){return null==e?o:e[t]}}function Yt(e,t,n,r,o){return o(e,(function(e,o,i){n=r?(r=!1,e):t(n,e,o,i)})),n}function Jt(e,t){for(var n,r=-1,i=e.length;++r<i;){var s=t(e[r]);s!==o&&(n=n===o?s:n+s)}return n}function Qt(e,t){for(var n=-1,r=Array(e);++n<e;)r[n]=t(n);return r}function Zt(e){return e?e.slice(0,gn(e)+1).replace(se,""):e}function Xt(e){return function(t){return e(t)}}function en(e,t){return Ft(t,(function(t){return e[t]}))}function tn(e,t){return e.has(t)}function nn(e,t){for(var n=-1,r=e.length;++n<r&&Ht(t,e[n],0)>-1;);return n}function rn(e,t){for(var n=e.length;n--&&Ht(t,e[n],0)>-1;);return n}var on=Gt({À:"A",Á:"A",Â:"A",Ã:"A",Ä:"A",Å:"A",à:"a",á:"a",â:"a",ã:"a",ä:"a",å:"a",Ç:"C",ç:"c",Ð:"D",ð:"d",È:"E",É:"E",Ê:"E",Ë:"E",è:"e",é:"e",ê:"e",ë:"e",Ì:"I",Í:"I",Î:"I",Ï:"I",ì:"i",í:"i",î:"i",ï:"i",Ñ:"N",ñ:"n",Ò:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"O",Ø:"O",ò:"o",ó:"o",ô:"o",õ:"o",ö:"o",ø:"o",Ù:"U",Ú:"U",Û:"U",Ü:"U",ù:"u",ú:"u",û:"u",ü:"u",Ý:"Y",ý:"y",ÿ:"y",Æ:"Ae",æ:"ae",Þ:"Th",þ:"th",ß:"ss",Ā:"A",Ă:"A",Ą:"A",ā:"a",ă:"a",ą:"a",Ć:"C",Ĉ:"C",Ċ:"C",Č:"C",ć:"c",ĉ:"c",ċ:"c",č:"c",Ď:"D",Đ:"D",ď:"d",đ:"d",Ē:"E",Ĕ:"E",Ė:"E",Ę:"E",Ě:"E",ē:"e",ĕ:"e",ė:"e",ę:"e",ě:"e",Ĝ:"G",Ğ:"G",Ġ:"G",Ģ:"G",ĝ:"g",ğ:"g",ġ:"g",ģ:"g",Ĥ:"H",Ħ:"H",ĥ:"h",ħ:"h",Ĩ:"I",Ī:"I",Ĭ:"I",Į:"I",İ:"I",ĩ:"i",ī:"i",ĭ:"i",į:"i",ı:"i",Ĵ:"J",ĵ:"j",Ķ:"K",ķ:"k",ĸ:"k",Ĺ:"L",Ļ:"L",Ľ:"L",Ŀ:"L",Ł:"L",ĺ:"l",ļ:"l",ľ:"l",ŀ:"l",ł:"l",Ń:"N",Ņ:"N",Ň:"N",Ŋ:"N",ń:"n",ņ:"n",ň:"n",ŋ:"n",Ō:"O",Ŏ:"O",Ő:"O",ō:"o",ŏ:"o",ő:"o",Ŕ:"R",Ŗ:"R",Ř:"R",ŕ:"r",ŗ:"r",ř:"r",Ś:"S",Ŝ:"S",Ş:"S",Š:"S",ś:"s",ŝ:"s",ş:"s",š:"s",Ţ:"T",Ť:"T",Ŧ:"T",ţ:"t",ť:"t",ŧ:"t",Ũ:"U",Ū:"U",Ŭ:"U",Ů:"U",Ű:"U",Ų:"U",ũ:"u",ū:"u",ŭ:"u",ů:"u",ű:"u",ų:"u",Ŵ:"W",ŵ:"w",Ŷ:"Y",ŷ:"y",Ÿ:"Y",Ź:"Z",Ż:"Z",Ž:"Z",ź:"z",ż:"z",ž:"z",Ĳ:"IJ",ĳ:"ij",Œ:"Oe",œ:"oe",ŉ:"'n",ſ:"s"}),sn=Gt({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"});function ln(e){return"\\"+ct[e]}function an(e){return ot.test(e)}function un(e){var t=-1,n=Array(e.size);return e.forEach((function(e,r){n[++t]=[r,e]})),n}function cn(e,t){return function(n){return e(t(n))}}function fn(e,t){for(var n=-1,r=e.length,o=0,i=[];++n<r;){var s=e[n];s!==t&&s!==l||(e[n]=l,i[o++]=n)}return i}function pn(e){var t=-1,n=Array(e.size);return e.forEach((function(e){n[++t]=e})),n}function dn(e){var t=-1,n=Array(e.size);return e.forEach((function(e){n[++t]=[e,e]})),n}function hn(e){return an(e)?function(e){var t=nt.lastIndex=0;for(;nt.test(e);)++t;return t}(e):Ut(e)}function vn(e){return an(e)?function(e){return e.match(nt)||[]}(e):function(e){return e.split("")}(e)}function gn(e){for(var t=e.length;t--&&le.test(e.charAt(t)););return t}var mn=Gt({"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&#39;":"'"});var yn=function e(t){var n,r=(t=null==t?vt:yn.defaults(vt.Object(),t,yn.pick(vt,st))).Array,le=t.Date,Oe=t.Error,ke=t.Function,Ee=t.Math,Ce=t.Object,Pe=t.RegExp,Te=t.String,Ae=t.TypeError,je=r.prototype,Re=ke.prototype,Le=Ce.prototype,Ie=t["__core-js_shared__"],Fe=Re.toString,Ne=Le.hasOwnProperty,Me=0,De=(n=/[^.]+$/.exec(Ie&&Ie.keys&&Ie.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"",Be=Le.toString,Ue=Fe.call(Ce),$e=vt._,Ve=Pe("^"+Fe.call(Ne).replace(oe,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),He=yt?t.Buffer:o,ze=t.Symbol,qe=t.Uint8Array,We=He?He.allocUnsafe:o,Ke=cn(Ce.getPrototypeOf,Ce),Ge=Ce.create,Ye=Le.propertyIsEnumerable,Je=je.splice,Qe=ze?ze.isConcatSpreadable:o,Ze=ze?ze.iterator:o,Xe=ze?ze.toStringTag:o,nt=function(){try{var e=di(Ce,"defineProperty");return e({},"",{}),e}catch(e){}}(),ot=t.clearTimeout!==vt.clearTimeout&&t.clearTimeout,ct=le&&le.now!==vt.Date.now&&le.now,dt=t.setTimeout!==vt.setTimeout&&t.setTimeout,ht=Ee.ceil,gt=Ee.floor,mt=Ce.getOwnPropertySymbols,bt=He?He.isBuffer:o,wt=t.isFinite,Ut=je.join,Gt=cn(Ce.keys,Ce),bn=Ee.max,wn=Ee.min,_n=le.now,xn=t.parseInt,Sn=Ee.random,On=je.reverse,kn=di(t,"DataView"),En=di(t,"Map"),Cn=di(t,"Promise"),Pn=di(t,"Set"),Tn=di(t,"WeakMap"),An=di(Ce,"create"),jn=Tn&&new Tn,Rn={},Ln=Bi(kn),In=Bi(En),Fn=Bi(Cn),Nn=Bi(Pn),Mn=Bi(Tn),Dn=ze?ze.prototype:o,Bn=Dn?Dn.valueOf:o,Un=Dn?Dn.toString:o;function $n(e){if(nl(e)&&!qs(e)&&!(e instanceof qn)){if(e instanceof zn)return e;if(Ne.call(e,"__wrapped__"))return Ui(e)}return new zn(e)}var Vn=function(){function e(){}return function(t){if(!tl(t))return{};if(Ge)return Ge(t);e.prototype=t;var n=new e;return e.prototype=o,n}}();function Hn(){}function zn(e,t){this.__wrapped__=e,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=o}function qn(e){this.__wrapped__=e,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=g,this.__views__=[]}function Wn(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function Kn(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function Gn(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function Yn(e){var t=-1,n=null==e?0:e.length;for(this.__data__=new Gn;++t<n;)this.add(e[t])}function Jn(e){var t=this.__data__=new Kn(e);this.size=t.size}function Qn(e,t){var n=qs(e),r=!n&&zs(e),o=!n&&!r&&Ys(e),i=!n&&!r&&!o&&cl(e),s=n||r||o||i,l=s?Qt(e.length,Te):[],a=l.length;for(var u in e)!t&&!Ne.call(e,u)||s&&("length"==u||o&&("offset"==u||"parent"==u)||i&&("buffer"==u||"byteLength"==u||"byteOffset"==u)||wi(u,a))||l.push(u);return l}function Zn(e){var t=e.length;return t?e[Yr(0,t-1)]:o}function Xn(e,t){return Ni(jo(e),ar(t,0,e.length))}function er(e){return Ni(jo(e))}function tr(e,t,n){(n!==o&&!$s(e[t],n)||n===o&&!(t in e))&&sr(e,t,n)}function nr(e,t,n){var r=e[t];Ne.call(e,t)&&$s(r,n)&&(n!==o||t in e)||sr(e,t,n)}function rr(e,t){for(var n=e.length;n--;)if($s(e[n][0],t))return n;return-1}function or(e,t,n,r){return dr(e,(function(e,o,i){t(r,e,n(e),i)})),r}function ir(e,t){return e&&Ro(t,Rl(t),e)}function sr(e,t,n){"__proto__"==t&&nt?nt(e,t,{configurable:!0,enumerable:!0,value:n,writable:!0}):e[t]=n}function lr(e,t){for(var n=-1,i=t.length,s=r(i),l=null==e;++n<i;)s[n]=l?o:Cl(e,t[n]);return s}function ar(e,t,n){return e==e&&(n!==o&&(e=e<=n?e:n),t!==o&&(e=e>=t?e:t)),e}function ur(e,t,n,r,i,s){var l,a=1&t,u=2&t,c=4&t;if(n&&(l=i?n(e,r,i,s):n(e)),l!==o)return l;if(!tl(e))return e;var f=qs(e);if(f){if(l=function(e){var t=e.length,n=new e.constructor(t);t&&"string"==typeof e[0]&&Ne.call(e,"index")&&(n.index=e.index,n.input=e.input);return n}(e),!a)return jo(e,l)}else{var p=gi(e),d=p==S||p==O;if(Ys(e))return ko(e,a);if(p==C||p==y||d&&!i){if(l=u||d?{}:yi(e),!a)return u?function(e,t){return Ro(e,vi(e),t)}(e,function(e,t){return e&&Ro(t,Ll(t),e)}(l,e)):function(e,t){return Ro(e,hi(e),t)}(e,ir(l,e))}else{if(!ut[p])return i?e:{};l=function(e,t,n){var r=e.constructor;switch(t){case I:return Eo(e);case w:case _:return new r(+e);case F:return function(e,t){var n=t?Eo(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.byteLength)}(e,n);case N:case M:case D:case B:case U:case $:case V:case H:case z:return Co(e,n);case k:return new r;case E:case j:return new r(e);case T:return function(e){var t=new e.constructor(e.source,ve.exec(e));return t.lastIndex=e.lastIndex,t}(e);case A:return new r;case R:return o=e,Bn?Ce(Bn.call(o)):{}}var o}(e,p,a)}}s||(s=new Jn);var h=s.get(e);if(h)return h;s.set(e,l),ll(e)?e.forEach((function(r){l.add(ur(r,t,n,r,e,s))})):rl(e)&&e.forEach((function(r,o){l.set(o,ur(r,t,n,o,e,s))}));var v=f?o:(c?u?si:ii:u?Ll:Rl)(e);return Tt(v||e,(function(r,o){v&&(r=e[o=r]),nr(l,o,ur(r,t,n,o,e,s))})),l}function cr(e,t,n){var r=n.length;if(null==e)return!r;for(e=Ce(e);r--;){var i=n[r],s=t[i],l=e[i];if(l===o&&!(i in e)||!s(l))return!1}return!0}function fr(e,t,n){if("function"!=typeof e)throw new Ae(i);return Ri((function(){e.apply(o,n)}),t)}function pr(e,t,n,r){var o=-1,i=Lt,s=!0,l=e.length,a=[],u=t.length;if(!l)return a;n&&(t=Ft(t,Xt(n))),r?(i=It,s=!1):t.length>=200&&(i=tn,s=!1,t=new Yn(t));e:for(;++o<l;){var c=e[o],f=null==n?c:n(c);if(c=r||0!==c?c:0,s&&f==f){for(var p=u;p--;)if(t[p]===f)continue e;a.push(c)}else i(t,f,r)||a.push(c)}return a}$n.templateSettings={escape:Z,evaluate:X,interpolate:ee,variable:"",imports:{_:$n}},$n.prototype=Hn.prototype,$n.prototype.constructor=$n,zn.prototype=Vn(Hn.prototype),zn.prototype.constructor=zn,qn.prototype=Vn(Hn.prototype),qn.prototype.constructor=qn,Wn.prototype.clear=function(){this.__data__=An?An(null):{},this.size=0},Wn.prototype.delete=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t},Wn.prototype.get=function(e){var t=this.__data__;if(An){var n=t[e];return n===s?o:n}return Ne.call(t,e)?t[e]:o},Wn.prototype.has=function(e){var t=this.__data__;return An?t[e]!==o:Ne.call(t,e)},Wn.prototype.set=function(e,t){var n=this.__data__;return this.size+=this.has(e)?0:1,n[e]=An&&t===o?s:t,this},Kn.prototype.clear=function(){this.__data__=[],this.size=0},Kn.prototype.delete=function(e){var t=this.__data__,n=rr(t,e);return!(n<0)&&(n==t.length-1?t.pop():Je.call(t,n,1),--this.size,!0)},Kn.prototype.get=function(e){var t=this.__data__,n=rr(t,e);return n<0?o:t[n][1]},Kn.prototype.has=function(e){return rr(this.__data__,e)>-1},Kn.prototype.set=function(e,t){var n=this.__data__,r=rr(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this},Gn.prototype.clear=function(){this.size=0,this.__data__={hash:new Wn,map:new(En||Kn),string:new Wn}},Gn.prototype.delete=function(e){var t=fi(this,e).delete(e);return this.size-=t?1:0,t},Gn.prototype.get=function(e){return fi(this,e).get(e)},Gn.prototype.has=function(e){return fi(this,e).has(e)},Gn.prototype.set=function(e,t){var n=fi(this,e),r=n.size;return n.set(e,t),this.size+=n.size==r?0:1,this},Yn.prototype.add=Yn.prototype.push=function(e){return this.__data__.set(e,s),this},Yn.prototype.has=function(e){return this.__data__.has(e)},Jn.prototype.clear=function(){this.__data__=new Kn,this.size=0},Jn.prototype.delete=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n},Jn.prototype.get=function(e){return this.__data__.get(e)},Jn.prototype.has=function(e){return this.__data__.has(e)},Jn.prototype.set=function(e,t){var n=this.__data__;if(n instanceof Kn){var r=n.__data__;if(!En||r.length<199)return r.push([e,t]),this.size=++n.size,this;n=this.__data__=new Gn(r)}return n.set(e,t),this.size=n.size,this};var dr=Fo(_r),hr=Fo(xr,!0);function vr(e,t){var n=!0;return dr(e,(function(e,r,o){return n=!!t(e,r,o)})),n}function gr(e,t,n){for(var r=-1,i=e.length;++r<i;){var s=e[r],l=t(s);if(null!=l&&(a===o?l==l&&!ul(l):n(l,a)))var a=l,u=s}return u}function mr(e,t){var n=[];return dr(e,(function(e,r,o){t(e,r,o)&&n.push(e)})),n}function yr(e,t,n,r,o){var i=-1,s=e.length;for(n||(n=bi),o||(o=[]);++i<s;){var l=e[i];t>0&&n(l)?t>1?yr(l,t-1,n,r,o):Nt(o,l):r||(o[o.length]=l)}return o}var br=No(),wr=No(!0);function _r(e,t){return e&&br(e,t,Rl)}function xr(e,t){return e&&wr(e,t,Rl)}function Sr(e,t){return Rt(t,(function(t){return Zs(e[t])}))}function Or(e,t){for(var n=0,r=(t=_o(t,e)).length;null!=e&&n<r;)e=e[Di(t[n++])];return n&&n==r?e:o}function kr(e,t,n){var r=t(e);return qs(e)?r:Nt(r,n(e))}function Er(e){return null==e?e===o?"[object Undefined]":"[object Null]":Xe&&Xe in Ce(e)?function(e){var t=Ne.call(e,Xe),n=e[Xe];try{e[Xe]=o;var r=!0}catch(e){}var i=Be.call(e);r&&(t?e[Xe]=n:delete e[Xe]);return i}(e):function(e){return Be.call(e)}(e)}function Cr(e,t){return e>t}function Pr(e,t){return null!=e&&Ne.call(e,t)}function Tr(e,t){return null!=e&&t in Ce(e)}function Ar(e,t,n){for(var i=n?It:Lt,s=e[0].length,l=e.length,a=l,u=r(l),c=1/0,f=[];a--;){var p=e[a];a&&t&&(p=Ft(p,Xt(t))),c=wn(p.length,c),u[a]=!n&&(t||s>=120&&p.length>=120)?new Yn(a&&p):o}p=e[0];var d=-1,h=u[0];e:for(;++d<s&&f.length<c;){var v=p[d],g=t?t(v):v;if(v=n||0!==v?v:0,!(h?tn(h,g):i(f,g,n))){for(a=l;--a;){var m=u[a];if(!(m?tn(m,g):i(e[a],g,n)))continue e}h&&h.push(g),f.push(v)}}return f}function jr(e,t,n){var r=null==(e=Ti(e,t=_o(t,e)))?e:e[Di(Qi(t))];return null==r?o:Ct(r,e,n)}function Rr(e){return nl(e)&&Er(e)==y}function Lr(e,t,n,r,i){return e===t||(null==e||null==t||!nl(e)&&!nl(t)?e!=e&&t!=t:function(e,t,n,r,i,s){var l=qs(e),a=qs(t),u=l?b:gi(e),c=a?b:gi(t),f=(u=u==y?C:u)==C,p=(c=c==y?C:c)==C,d=u==c;if(d&&Ys(e)){if(!Ys(t))return!1;l=!0,f=!1}if(d&&!f)return s||(s=new Jn),l||cl(e)?ri(e,t,n,r,i,s):function(e,t,n,r,o,i,s){switch(n){case F:if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case I:return!(e.byteLength!=t.byteLength||!i(new qe(e),new qe(t)));case w:case _:case E:return $s(+e,+t);case x:return e.name==t.name&&e.message==t.message;case T:case j:return e==t+"";case k:var l=un;case A:var a=1&r;if(l||(l=pn),e.size!=t.size&&!a)return!1;var u=s.get(e);if(u)return u==t;r|=2,s.set(e,t);var c=ri(l(e),l(t),r,o,i,s);return s.delete(e),c;case R:if(Bn)return Bn.call(e)==Bn.call(t)}return!1}(e,t,u,n,r,i,s);if(!(1&n)){var h=f&&Ne.call(e,"__wrapped__"),v=p&&Ne.call(t,"__wrapped__");if(h||v){var g=h?e.value():e,m=v?t.value():t;return s||(s=new Jn),i(g,m,n,r,s)}}if(!d)return!1;return s||(s=new Jn),function(e,t,n,r,i,s){var l=1&n,a=ii(e),u=a.length,c=ii(t),f=c.length;if(u!=f&&!l)return!1;var p=u;for(;p--;){var d=a[p];if(!(l?d in t:Ne.call(t,d)))return!1}var h=s.get(e),v=s.get(t);if(h&&v)return h==t&&v==e;var g=!0;s.set(e,t),s.set(t,e);var m=l;for(;++p<u;){var y=e[d=a[p]],b=t[d];if(r)var w=l?r(b,y,d,t,e,s):r(y,b,d,e,t,s);if(!(w===o?y===b||i(y,b,n,r,s):w)){g=!1;break}m||(m="constructor"==d)}if(g&&!m){var _=e.constructor,x=t.constructor;_==x||!("constructor"in e)||!("constructor"in t)||"function"==typeof _&&_ instanceof _&&"function"==typeof x&&x instanceof x||(g=!1)}return s.delete(e),s.delete(t),g}(e,t,n,r,i,s)}(e,t,n,r,Lr,i))}function Ir(e,t,n,r){var i=n.length,s=i,l=!r;if(null==e)return!s;for(e=Ce(e);i--;){var a=n[i];if(l&&a[2]?a[1]!==e[a[0]]:!(a[0]in e))return!1}for(;++i<s;){var u=(a=n[i])[0],c=e[u],f=a[1];if(l&&a[2]){if(c===o&&!(u in e))return!1}else{var p=new Jn;if(r)var d=r(c,f,u,e,t,p);if(!(d===o?Lr(f,c,3,r,p):d))return!1}}return!0}function Fr(e){return!(!tl(e)||(t=e,De&&De in t))&&(Zs(e)?Ve:ye).test(Bi(e));var t}function Nr(e){return"function"==typeof e?e:null==e?oa:"object"==typeof e?qs(e)?Vr(e[0],e[1]):$r(e):da(e)}function Mr(e){if(!ki(e))return Gt(e);var t=[];for(var n in Ce(e))Ne.call(e,n)&&"constructor"!=n&&t.push(n);return t}function Dr(e){if(!tl(e))return function(e){var t=[];if(null!=e)for(var n in Ce(e))t.push(n);return t}(e);var t=ki(e),n=[];for(var r in e)("constructor"!=r||!t&&Ne.call(e,r))&&n.push(r);return n}function Br(e,t){return e<t}function Ur(e,t){var n=-1,o=Ks(e)?r(e.length):[];return dr(e,(function(e,r,i){o[++n]=t(e,r,i)})),o}function $r(e){var t=pi(e);return 1==t.length&&t[0][2]?Ci(t[0][0],t[0][1]):function(n){return n===e||Ir(n,e,t)}}function Vr(e,t){return xi(e)&&Ei(t)?Ci(Di(e),t):function(n){var r=Cl(n,e);return r===o&&r===t?Pl(n,e):Lr(t,r,3)}}function Hr(e,t,n,r,i){e!==t&&br(t,(function(s,l){if(i||(i=new Jn),tl(s))!function(e,t,n,r,i,s,l){var a=Ai(e,n),u=Ai(t,n),c=l.get(u);if(c)return void tr(e,n,c);var f=s?s(a,u,n+"",e,t,l):o,p=f===o;if(p){var d=qs(u),h=!d&&Ys(u),v=!d&&!h&&cl(u);f=u,d||h||v?qs(a)?f=a:Gs(a)?f=jo(a):h?(p=!1,f=ko(u,!0)):v?(p=!1,f=Co(u,!0)):f=[]:il(u)||zs(u)?(f=a,zs(a)?f=yl(a):tl(a)&&!Zs(a)||(f=yi(u))):p=!1}p&&(l.set(u,f),i(f,u,r,s,l),l.delete(u));tr(e,n,f)}(e,t,l,n,Hr,r,i);else{var a=r?r(Ai(e,l),s,l+"",e,t,i):o;a===o&&(a=s),tr(e,l,a)}}),Ll)}function zr(e,t){var n=e.length;if(n)return wi(t+=t<0?n:0,n)?e[t]:o}function qr(e,t,n){t=t.length?Ft(t,(function(e){return qs(e)?function(t){return Or(t,1===e.length?e[0]:e)}:e})):[oa];var r=-1;t=Ft(t,Xt(ci()));var o=Ur(e,(function(e,n,o){var i=Ft(t,(function(t){return t(e)}));return{criteria:i,index:++r,value:e}}));return function(e,t){var n=e.length;for(e.sort(t);n--;)e[n]=e[n].value;return e}(o,(function(e,t){return function(e,t,n){var r=-1,o=e.criteria,i=t.criteria,s=o.length,l=n.length;for(;++r<s;){var a=Po(o[r],i[r]);if(a)return r>=l?a:a*("desc"==n[r]?-1:1)}return e.index-t.index}(e,t,n)}))}function Wr(e,t,n){for(var r=-1,o=t.length,i={};++r<o;){var s=t[r],l=Or(e,s);n(l,s)&&eo(i,_o(s,e),l)}return i}function Kr(e,t,n,r){var o=r?zt:Ht,i=-1,s=t.length,l=e;for(e===t&&(t=jo(t)),n&&(l=Ft(e,Xt(n)));++i<s;)for(var a=0,u=t[i],c=n?n(u):u;(a=o(l,c,a,r))>-1;)l!==e&&Je.call(l,a,1),Je.call(e,a,1);return e}function Gr(e,t){for(var n=e?t.length:0,r=n-1;n--;){var o=t[n];if(n==r||o!==i){var i=o;wi(o)?Je.call(e,o,1):po(e,o)}}return e}function Yr(e,t){return e+gt(Sn()*(t-e+1))}function Jr(e,t){var n="";if(!e||t<1||t>h)return n;do{t%2&&(n+=e),(t=gt(t/2))&&(e+=e)}while(t);return n}function Qr(e,t){return Li(Pi(e,t,oa),e+"")}function Zr(e){return Zn($l(e))}function Xr(e,t){var n=$l(e);return Ni(n,ar(t,0,n.length))}function eo(e,t,n,r){if(!tl(e))return e;for(var i=-1,s=(t=_o(t,e)).length,l=s-1,a=e;null!=a&&++i<s;){var u=Di(t[i]),c=n;if("__proto__"===u||"constructor"===u||"prototype"===u)return e;if(i!=l){var f=a[u];(c=r?r(f,u,a):o)===o&&(c=tl(f)?f:wi(t[i+1])?[]:{})}nr(a,u,c),a=a[u]}return e}var to=jn?function(e,t){return jn.set(e,t),e}:oa,no=nt?function(e,t){return nt(e,"toString",{configurable:!0,enumerable:!1,value:ta(t),writable:!0})}:oa;function ro(e){return Ni($l(e))}function oo(e,t,n){var o=-1,i=e.length;t<0&&(t=-t>i?0:i+t),(n=n>i?i:n)<0&&(n+=i),i=t>n?0:n-t>>>0,t>>>=0;for(var s=r(i);++o<i;)s[o]=e[o+t];return s}function io(e,t){var n;return dr(e,(function(e,r,o){return!(n=t(e,r,o))})),!!n}function so(e,t,n){var r=0,o=null==e?r:e.length;if("number"==typeof t&&t==t&&o<=2147483647){for(;r<o;){var i=r+o>>>1,s=e[i];null!==s&&!ul(s)&&(n?s<=t:s<t)?r=i+1:o=i}return o}return lo(e,t,oa,n)}function lo(e,t,n,r){var i=0,s=null==e?0:e.length;if(0===s)return 0;for(var l=(t=n(t))!=t,a=null===t,u=ul(t),c=t===o;i<s;){var f=gt((i+s)/2),p=n(e[f]),d=p!==o,h=null===p,v=p==p,g=ul(p);if(l)var m=r||v;else m=c?v&&(r||d):a?v&&d&&(r||!h):u?v&&d&&!h&&(r||!g):!h&&!g&&(r?p<=t:p<t);m?i=f+1:s=f}return wn(s,4294967294)}function ao(e,t){for(var n=-1,r=e.length,o=0,i=[];++n<r;){var s=e[n],l=t?t(s):s;if(!n||!$s(l,a)){var a=l;i[o++]=0===s?0:s}}return i}function uo(e){return"number"==typeof e?e:ul(e)?v:+e}function co(e){if("string"==typeof e)return e;if(qs(e))return Ft(e,co)+"";if(ul(e))return Un?Un.call(e):"";var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}function fo(e,t,n){var r=-1,o=Lt,i=e.length,s=!0,l=[],a=l;if(n)s=!1,o=It;else if(i>=200){var u=t?null:Qo(e);if(u)return pn(u);s=!1,o=tn,a=new Yn}else a=t?[]:l;e:for(;++r<i;){var c=e[r],f=t?t(c):c;if(c=n||0!==c?c:0,s&&f==f){for(var p=a.length;p--;)if(a[p]===f)continue e;t&&a.push(f),l.push(c)}else o(a,f,n)||(a!==l&&a.push(f),l.push(c))}return l}function po(e,t){return null==(e=Ti(e,t=_o(t,e)))||delete e[Di(Qi(t))]}function ho(e,t,n,r){return eo(e,t,n(Or(e,t)),r)}function vo(e,t,n,r){for(var o=e.length,i=r?o:-1;(r?i--:++i<o)&&t(e[i],i,e););return n?oo(e,r?0:i,r?i+1:o):oo(e,r?i+1:0,r?o:i)}function go(e,t){var n=e;return n instanceof qn&&(n=n.value()),Mt(t,(function(e,t){return t.func.apply(t.thisArg,Nt([e],t.args))}),n)}function mo(e,t,n){var o=e.length;if(o<2)return o?fo(e[0]):[];for(var i=-1,s=r(o);++i<o;)for(var l=e[i],a=-1;++a<o;)a!=i&&(s[i]=pr(s[i]||l,e[a],t,n));return fo(yr(s,1),t,n)}function yo(e,t,n){for(var r=-1,i=e.length,s=t.length,l={};++r<i;){var a=r<s?t[r]:o;n(l,e[r],a)}return l}function bo(e){return Gs(e)?e:[]}function wo(e){return"function"==typeof e?e:oa}function _o(e,t){return qs(e)?e:xi(e,t)?[e]:Mi(bl(e))}var xo=Qr;function So(e,t,n){var r=e.length;return n=n===o?r:n,!t&&n>=r?e:oo(e,t,n)}var Oo=ot||function(e){return vt.clearTimeout(e)};function ko(e,t){if(t)return e.slice();var n=e.length,r=We?We(n):new e.constructor(n);return e.copy(r),r}function Eo(e){var t=new e.constructor(e.byteLength);return new qe(t).set(new qe(e)),t}function Co(e,t){var n=t?Eo(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.length)}function Po(e,t){if(e!==t){var n=e!==o,r=null===e,i=e==e,s=ul(e),l=t!==o,a=null===t,u=t==t,c=ul(t);if(!a&&!c&&!s&&e>t||s&&l&&u&&!a&&!c||r&&l&&u||!n&&u||!i)return 1;if(!r&&!s&&!c&&e<t||c&&n&&i&&!r&&!s||a&&n&&i||!l&&i||!u)return-1}return 0}function To(e,t,n,o){for(var i=-1,s=e.length,l=n.length,a=-1,u=t.length,c=bn(s-l,0),f=r(u+c),p=!o;++a<u;)f[a]=t[a];for(;++i<l;)(p||i<s)&&(f[n[i]]=e[i]);for(;c--;)f[a++]=e[i++];return f}function Ao(e,t,n,o){for(var i=-1,s=e.length,l=-1,a=n.length,u=-1,c=t.length,f=bn(s-a,0),p=r(f+c),d=!o;++i<f;)p[i]=e[i];for(var h=i;++u<c;)p[h+u]=t[u];for(;++l<a;)(d||i<s)&&(p[h+n[l]]=e[i++]);return p}function jo(e,t){var n=-1,o=e.length;for(t||(t=r(o));++n<o;)t[n]=e[n];return t}function Ro(e,t,n,r){var i=!n;n||(n={});for(var s=-1,l=t.length;++s<l;){var a=t[s],u=r?r(n[a],e[a],a,n,e):o;u===o&&(u=e[a]),i?sr(n,a,u):nr(n,a,u)}return n}function Lo(e,t){return function(n,r){var o=qs(n)?Pt:or,i=t?t():{};return o(n,e,ci(r,2),i)}}function Io(e){return Qr((function(t,n){var r=-1,i=n.length,s=i>1?n[i-1]:o,l=i>2?n[2]:o;for(s=e.length>3&&"function"==typeof s?(i--,s):o,l&&_i(n[0],n[1],l)&&(s=i<3?o:s,i=1),t=Ce(t);++r<i;){var a=n[r];a&&e(t,a,r,s)}return t}))}function Fo(e,t){return function(n,r){if(null==n)return n;if(!Ks(n))return e(n,r);for(var o=n.length,i=t?o:-1,s=Ce(n);(t?i--:++i<o)&&!1!==r(s[i],i,s););return n}}function No(e){return function(t,n,r){for(var o=-1,i=Ce(t),s=r(t),l=s.length;l--;){var a=s[e?l:++o];if(!1===n(i[a],a,i))break}return t}}function Mo(e){return function(t){var n=an(t=bl(t))?vn(t):o,r=n?n[0]:t.charAt(0),i=n?So(n,1).join(""):t.slice(1);return r[e]()+i}}function Do(e){return function(t){return Mt(Zl(zl(t).replace(et,"")),e,"")}}function Bo(e){return function(){var t=arguments;switch(t.length){case 0:return new e;case 1:return new e(t[0]);case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[1],t[2]);case 4:return new e(t[0],t[1],t[2],t[3]);case 5:return new e(t[0],t[1],t[2],t[3],t[4]);case 6:return new e(t[0],t[1],t[2],t[3],t[4],t[5]);case 7:return new e(t[0],t[1],t[2],t[3],t[4],t[5],t[6])}var n=Vn(e.prototype),r=e.apply(n,t);return tl(r)?r:n}}function Uo(e){return function(t,n,r){var i=Ce(t);if(!Ks(t)){var s=ci(n,3);t=Rl(t),n=function(e){return s(i[e],e,i)}}var l=e(t,n,r);return l>-1?i[s?t[l]:l]:o}}function $o(e){return oi((function(t){var n=t.length,r=n,s=zn.prototype.thru;for(e&&t.reverse();r--;){var l=t[r];if("function"!=typeof l)throw new Ae(i);if(s&&!a&&"wrapper"==ai(l))var a=new zn([],!0)}for(r=a?r:n;++r<n;){var u=ai(l=t[r]),c="wrapper"==u?li(l):o;a=c&&Si(c[0])&&424==c[1]&&!c[4].length&&1==c[9]?a[ai(c[0])].apply(a,c[3]):1==l.length&&Si(l)?a[u]():a.thru(l)}return function(){var e=arguments,r=e[0];if(a&&1==e.length&&qs(r))return a.plant(r).value();for(var o=0,i=n?t[o].apply(this,e):r;++o<n;)i=t[o].call(this,i);return i}}))}function Vo(e,t,n,i,s,l,a,u,c,p){var d=t&f,h=1&t,v=2&t,g=24&t,m=512&t,y=v?o:Bo(e);return function f(){for(var b=arguments.length,w=r(b),_=b;_--;)w[_]=arguments[_];if(g)var x=ui(f),S=function(e,t){for(var n=e.length,r=0;n--;)e[n]===t&&++r;return r}(w,x);if(i&&(w=To(w,i,s,g)),l&&(w=Ao(w,l,a,g)),b-=S,g&&b<p){var O=fn(w,x);return Yo(e,t,Vo,f.placeholder,n,w,O,u,c,p-b)}var k=h?n:this,E=v?k[e]:e;return b=w.length,u?w=function(e,t){var n=e.length,r=wn(t.length,n),i=jo(e);for(;r--;){var s=t[r];e[r]=wi(s,n)?i[s]:o}return e}(w,u):m&&b>1&&w.reverse(),d&&c<b&&(w.length=c),this&&this!==vt&&this instanceof f&&(E=y||Bo(E)),E.apply(k,w)}}function Ho(e,t){return function(n,r){return function(e,t,n,r){return _r(e,(function(e,o,i){t(r,n(e),o,i)})),r}(n,e,t(r),{})}}function zo(e,t){return function(n,r){var i;if(n===o&&r===o)return t;if(n!==o&&(i=n),r!==o){if(i===o)return r;"string"==typeof n||"string"==typeof r?(n=co(n),r=co(r)):(n=uo(n),r=uo(r)),i=e(n,r)}return i}}function qo(e){return oi((function(t){return t=Ft(t,Xt(ci())),Qr((function(n){var r=this;return e(t,(function(e){return Ct(e,r,n)}))}))}))}function Wo(e,t){var n=(t=t===o?" ":co(t)).length;if(n<2)return n?Jr(t,e):t;var r=Jr(t,ht(e/hn(t)));return an(t)?So(vn(r),0,e).join(""):r.slice(0,e)}function Ko(e){return function(t,n,i){return i&&"number"!=typeof i&&_i(t,n,i)&&(n=i=o),t=hl(t),n===o?(n=t,t=0):n=hl(n),function(e,t,n,o){for(var i=-1,s=bn(ht((t-e)/(n||1)),0),l=r(s);s--;)l[o?s:++i]=e,e+=n;return l}(t,n,i=i===o?t<n?1:-1:hl(i),e)}}function Go(e){return function(t,n){return"string"==typeof t&&"string"==typeof n||(t=ml(t),n=ml(n)),e(t,n)}}function Yo(e,t,n,r,i,s,l,a,f,p){var d=8&t;t|=d?u:c,4&(t&=~(d?c:u))||(t&=-4);var h=[e,t,i,d?s:o,d?l:o,d?o:s,d?o:l,a,f,p],v=n.apply(o,h);return Si(e)&&ji(v,h),v.placeholder=r,Ii(v,e,t)}function Jo(e){var t=Ee[e];return function(e,n){if(e=ml(e),(n=null==n?0:wn(vl(n),292))&&wt(e)){var r=(bl(e)+"e").split("e");return+((r=(bl(t(r[0]+"e"+(+r[1]+n)))+"e").split("e"))[0]+"e"+(+r[1]-n))}return t(e)}}var Qo=Pn&&1/pn(new Pn([,-0]))[1]==d?function(e){return new Pn(e)}:ua;function Zo(e){return function(t){var n=gi(t);return n==k?un(t):n==A?dn(t):function(e,t){return Ft(t,(function(t){return[t,e[t]]}))}(t,e(t))}}function Xo(e,t,n,s,d,h,v,g){var m=2&t;if(!m&&"function"!=typeof e)throw new Ae(i);var y=s?s.length:0;if(y||(t&=-97,s=d=o),v=v===o?v:bn(vl(v),0),g=g===o?g:vl(g),y-=d?d.length:0,t&c){var b=s,w=d;s=d=o}var _=m?o:li(e),x=[e,t,n,s,d,b,w,h,v,g];if(_&&function(e,t){var n=e[1],r=t[1],o=n|r,i=o<131,s=r==f&&8==n||r==f&&n==p&&e[7].length<=t[8]||384==r&&t[7].length<=t[8]&&8==n;if(!i&&!s)return e;1&r&&(e[2]=t[2],o|=1&n?0:4);var a=t[3];if(a){var u=e[3];e[3]=u?To(u,a,t[4]):a,e[4]=u?fn(e[3],l):t[4]}(a=t[5])&&(u=e[5],e[5]=u?Ao(u,a,t[6]):a,e[6]=u?fn(e[5],l):t[6]);(a=t[7])&&(e[7]=a);r&f&&(e[8]=null==e[8]?t[8]:wn(e[8],t[8]));null==e[9]&&(e[9]=t[9]);e[0]=t[0],e[1]=o}(x,_),e=x[0],t=x[1],n=x[2],s=x[3],d=x[4],!(g=x[9]=x[9]===o?m?0:e.length:bn(x[9]-y,0))&&24&t&&(t&=-25),t&&1!=t)S=8==t||t==a?function(e,t,n){var i=Bo(e);return function s(){for(var l=arguments.length,a=r(l),u=l,c=ui(s);u--;)a[u]=arguments[u];var f=l<3&&a[0]!==c&&a[l-1]!==c?[]:fn(a,c);return(l-=f.length)<n?Yo(e,t,Vo,s.placeholder,o,a,f,o,o,n-l):Ct(this&&this!==vt&&this instanceof s?i:e,this,a)}}(e,t,g):t!=u&&33!=t||d.length?Vo.apply(o,x):function(e,t,n,o){var i=1&t,s=Bo(e);return function t(){for(var l=-1,a=arguments.length,u=-1,c=o.length,f=r(c+a),p=this&&this!==vt&&this instanceof t?s:e;++u<c;)f[u]=o[u];for(;a--;)f[u++]=arguments[++l];return Ct(p,i?n:this,f)}}(e,t,n,s);else var S=function(e,t,n){var r=1&t,o=Bo(e);return function t(){return(this&&this!==vt&&this instanceof t?o:e).apply(r?n:this,arguments)}}(e,t,n);return Ii((_?to:ji)(S,x),e,t)}function ei(e,t,n,r){return e===o||$s(e,Le[n])&&!Ne.call(r,n)?t:e}function ti(e,t,n,r,i,s){return tl(e)&&tl(t)&&(s.set(t,e),Hr(e,t,o,ti,s),s.delete(t)),e}function ni(e){return il(e)?o:e}function ri(e,t,n,r,i,s){var l=1&n,a=e.length,u=t.length;if(a!=u&&!(l&&u>a))return!1;var c=s.get(e),f=s.get(t);if(c&&f)return c==t&&f==e;var p=-1,d=!0,h=2&n?new Yn:o;for(s.set(e,t),s.set(t,e);++p<a;){var v=e[p],g=t[p];if(r)var m=l?r(g,v,p,t,e,s):r(v,g,p,e,t,s);if(m!==o){if(m)continue;d=!1;break}if(h){if(!Bt(t,(function(e,t){if(!tn(h,t)&&(v===e||i(v,e,n,r,s)))return h.push(t)}))){d=!1;break}}else if(v!==g&&!i(v,g,n,r,s)){d=!1;break}}return s.delete(e),s.delete(t),d}function oi(e){return Li(Pi(e,o,Wi),e+"")}function ii(e){return kr(e,Rl,hi)}function si(e){return kr(e,Ll,vi)}var li=jn?function(e){return jn.get(e)}:ua;function ai(e){for(var t=e.name+"",n=Rn[t],r=Ne.call(Rn,t)?n.length:0;r--;){var o=n[r],i=o.func;if(null==i||i==e)return o.name}return t}function ui(e){return(Ne.call($n,"placeholder")?$n:e).placeholder}function ci(){var e=$n.iteratee||ia;return e=e===ia?Nr:e,arguments.length?e(arguments[0],arguments[1]):e}function fi(e,t){var n,r,o=e.__data__;return("string"==(r=typeof(n=t))||"number"==r||"symbol"==r||"boolean"==r?"__proto__"!==n:null===n)?o["string"==typeof t?"string":"hash"]:o.map}function pi(e){for(var t=Rl(e),n=t.length;n--;){var r=t[n],o=e[r];t[n]=[r,o,Ei(o)]}return t}function di(e,t){var n=function(e,t){return null==e?o:e[t]}(e,t);return Fr(n)?n:o}var hi=mt?function(e){return null==e?[]:(e=Ce(e),Rt(mt(e),(function(t){return Ye.call(e,t)})))}:ga,vi=mt?function(e){for(var t=[];e;)Nt(t,hi(e)),e=Ke(e);return t}:ga,gi=Er;function mi(e,t,n){for(var r=-1,o=(t=_o(t,e)).length,i=!1;++r<o;){var s=Di(t[r]);if(!(i=null!=e&&n(e,s)))break;e=e[s]}return i||++r!=o?i:!!(o=null==e?0:e.length)&&el(o)&&wi(s,o)&&(qs(e)||zs(e))}function yi(e){return"function"!=typeof e.constructor||ki(e)?{}:Vn(Ke(e))}function bi(e){return qs(e)||zs(e)||!!(Qe&&e&&e[Qe])}function wi(e,t){var n=typeof e;return!!(t=null==t?h:t)&&("number"==n||"symbol"!=n&&we.test(e))&&e>-1&&e%1==0&&e<t}function _i(e,t,n){if(!tl(n))return!1;var r=typeof t;return!!("number"==r?Ks(n)&&wi(t,n.length):"string"==r&&t in n)&&$s(n[t],e)}function xi(e,t){if(qs(e))return!1;var n=typeof e;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=e&&!ul(e))||(ne.test(e)||!te.test(e)||null!=t&&e in Ce(t))}function Si(e){var t=ai(e),n=$n[t];if("function"!=typeof n||!(t in qn.prototype))return!1;if(e===n)return!0;var r=li(n);return!!r&&e===r[0]}(kn&&gi(new kn(new ArrayBuffer(1)))!=F||En&&gi(new En)!=k||Cn&&gi(Cn.resolve())!=P||Pn&&gi(new Pn)!=A||Tn&&gi(new Tn)!=L)&&(gi=function(e){var t=Er(e),n=t==C?e.constructor:o,r=n?Bi(n):"";if(r)switch(r){case Ln:return F;case In:return k;case Fn:return P;case Nn:return A;case Mn:return L}return t});var Oi=Ie?Zs:ma;function ki(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||Le)}function Ei(e){return e==e&&!tl(e)}function Ci(e,t){return function(n){return null!=n&&(n[e]===t&&(t!==o||e in Ce(n)))}}function Pi(e,t,n){return t=bn(t===o?e.length-1:t,0),function(){for(var o=arguments,i=-1,s=bn(o.length-t,0),l=r(s);++i<s;)l[i]=o[t+i];i=-1;for(var a=r(t+1);++i<t;)a[i]=o[i];return a[t]=n(l),Ct(e,this,a)}}function Ti(e,t){return t.length<2?e:Or(e,oo(t,0,-1))}function Ai(e,t){if(("constructor"!==t||"function"!=typeof e[t])&&"__proto__"!=t)return e[t]}var ji=Fi(to),Ri=dt||function(e,t){return vt.setTimeout(e,t)},Li=Fi(no);function Ii(e,t,n){var r=t+"";return Li(e,function(e,t){var n=t.length;if(!n)return e;var r=n-1;return t[r]=(n>1?"& ":"")+t[r],t=t.join(n>2?", ":" "),e.replace(ae,"{\n/* [wrapped with "+t+"] */\n")}(r,function(e,t){return Tt(m,(function(n){var r="_."+n[0];t&n[1]&&!Lt(e,r)&&e.push(r)})),e.sort()}(function(e){var t=e.match(ue);return t?t[1].split(ce):[]}(r),n)))}function Fi(e){var t=0,n=0;return function(){var r=_n(),i=16-(r-n);if(n=r,i>0){if(++t>=800)return arguments[0]}else t=0;return e.apply(o,arguments)}}function Ni(e,t){var n=-1,r=e.length,i=r-1;for(t=t===o?r:t;++n<t;){var s=Yr(n,i),l=e[s];e[s]=e[n],e[n]=l}return e.length=t,e}var Mi=function(e){var t=Fs(e,(function(e){return 500===n.size&&n.clear(),e})),n=t.cache;return t}((function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(""),e.replace(re,(function(e,n,r,o){t.push(r?o.replace(de,"$1"):n||e)})),t}));function Di(e){if("string"==typeof e||ul(e))return e;var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}function Bi(e){if(null!=e){try{return Fe.call(e)}catch(e){}try{return e+""}catch(e){}}return""}function Ui(e){if(e instanceof qn)return e.clone();var t=new zn(e.__wrapped__,e.__chain__);return t.__actions__=jo(e.__actions__),t.__index__=e.__index__,t.__values__=e.__values__,t}var $i=Qr((function(e,t){return Gs(e)?pr(e,yr(t,1,Gs,!0)):[]})),Vi=Qr((function(e,t){var n=Qi(t);return Gs(n)&&(n=o),Gs(e)?pr(e,yr(t,1,Gs,!0),ci(n,2)):[]})),Hi=Qr((function(e,t){var n=Qi(t);return Gs(n)&&(n=o),Gs(e)?pr(e,yr(t,1,Gs,!0),o,n):[]}));function zi(e,t,n){var r=null==e?0:e.length;if(!r)return-1;var o=null==n?0:vl(n);return o<0&&(o=bn(r+o,0)),Vt(e,ci(t,3),o)}function qi(e,t,n){var r=null==e?0:e.length;if(!r)return-1;var i=r-1;return n!==o&&(i=vl(n),i=n<0?bn(r+i,0):wn(i,r-1)),Vt(e,ci(t,3),i,!0)}function Wi(e){return(null==e?0:e.length)?yr(e,1):[]}function Ki(e){return e&&e.length?e[0]:o}var Gi=Qr((function(e){var t=Ft(e,bo);return t.length&&t[0]===e[0]?Ar(t):[]})),Yi=Qr((function(e){var t=Qi(e),n=Ft(e,bo);return t===Qi(n)?t=o:n.pop(),n.length&&n[0]===e[0]?Ar(n,ci(t,2)):[]})),Ji=Qr((function(e){var t=Qi(e),n=Ft(e,bo);return(t="function"==typeof t?t:o)&&n.pop(),n.length&&n[0]===e[0]?Ar(n,o,t):[]}));function Qi(e){var t=null==e?0:e.length;return t?e[t-1]:o}var Zi=Qr(Xi);function Xi(e,t){return e&&e.length&&t&&t.length?Kr(e,t):e}var es=oi((function(e,t){var n=null==e?0:e.length,r=lr(e,t);return Gr(e,Ft(t,(function(e){return wi(e,n)?+e:e})).sort(Po)),r}));function ts(e){return null==e?e:On.call(e)}var ns=Qr((function(e){return fo(yr(e,1,Gs,!0))})),rs=Qr((function(e){var t=Qi(e);return Gs(t)&&(t=o),fo(yr(e,1,Gs,!0),ci(t,2))})),os=Qr((function(e){var t=Qi(e);return t="function"==typeof t?t:o,fo(yr(e,1,Gs,!0),o,t)}));function is(e){if(!e||!e.length)return[];var t=0;return e=Rt(e,(function(e){if(Gs(e))return t=bn(e.length,t),!0})),Qt(t,(function(t){return Ft(e,Kt(t))}))}function ss(e,t){if(!e||!e.length)return[];var n=is(e);return null==t?n:Ft(n,(function(e){return Ct(t,o,e)}))}var ls=Qr((function(e,t){return Gs(e)?pr(e,t):[]})),as=Qr((function(e){return mo(Rt(e,Gs))})),us=Qr((function(e){var t=Qi(e);return Gs(t)&&(t=o),mo(Rt(e,Gs),ci(t,2))})),cs=Qr((function(e){var t=Qi(e);return t="function"==typeof t?t:o,mo(Rt(e,Gs),o,t)})),fs=Qr(is);var ps=Qr((function(e){var t=e.length,n=t>1?e[t-1]:o;return n="function"==typeof n?(e.pop(),n):o,ss(e,n)}));function ds(e){var t=$n(e);return t.__chain__=!0,t}function hs(e,t){return t(e)}var vs=oi((function(e){var t=e.length,n=t?e[0]:0,r=this.__wrapped__,i=function(t){return lr(t,e)};return!(t>1||this.__actions__.length)&&r instanceof qn&&wi(n)?((r=r.slice(n,+n+(t?1:0))).__actions__.push({func:hs,args:[i],thisArg:o}),new zn(r,this.__chain__).thru((function(e){return t&&!e.length&&e.push(o),e}))):this.thru(i)}));var gs=Lo((function(e,t,n){Ne.call(e,n)?++e[n]:sr(e,n,1)}));var ms=Uo(zi),ys=Uo(qi);function bs(e,t){return(qs(e)?Tt:dr)(e,ci(t,3))}function ws(e,t){return(qs(e)?At:hr)(e,ci(t,3))}var _s=Lo((function(e,t,n){Ne.call(e,n)?e[n].push(t):sr(e,n,[t])}));var xs=Qr((function(e,t,n){var o=-1,i="function"==typeof t,s=Ks(e)?r(e.length):[];return dr(e,(function(e){s[++o]=i?Ct(t,e,n):jr(e,t,n)})),s})),Ss=Lo((function(e,t,n){sr(e,n,t)}));function Os(e,t){return(qs(e)?Ft:Ur)(e,ci(t,3))}var ks=Lo((function(e,t,n){e[n?0:1].push(t)}),(function(){return[[],[]]}));var Es=Qr((function(e,t){if(null==e)return[];var n=t.length;return n>1&&_i(e,t[0],t[1])?t=[]:n>2&&_i(t[0],t[1],t[2])&&(t=[t[0]]),qr(e,yr(t,1),[])})),Cs=ct||function(){return vt.Date.now()};function Ps(e,t,n){return t=n?o:t,t=e&&null==t?e.length:t,Xo(e,f,o,o,o,o,t)}function Ts(e,t){var n;if("function"!=typeof t)throw new Ae(i);return e=vl(e),function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=o),n}}var As=Qr((function(e,t,n){var r=1;if(n.length){var o=fn(n,ui(As));r|=u}return Xo(e,r,t,n,o)})),js=Qr((function(e,t,n){var r=3;if(n.length){var o=fn(n,ui(js));r|=u}return Xo(t,r,e,n,o)}));function Rs(e,t,n){var r,s,l,a,u,c,f=0,p=!1,d=!1,h=!0;if("function"!=typeof e)throw new Ae(i);function v(t){var n=r,i=s;return r=s=o,f=t,a=e.apply(i,n)}function g(e){var n=e-c;return c===o||n>=t||n<0||d&&e-f>=l}function m(){var e=Cs();if(g(e))return y(e);u=Ri(m,function(e){var n=t-(e-c);return d?wn(n,l-(e-f)):n}(e))}function y(e){return u=o,h&&r?v(e):(r=s=o,a)}function b(){var e=Cs(),n=g(e);if(r=arguments,s=this,c=e,n){if(u===o)return function(e){return f=e,u=Ri(m,t),p?v(e):a}(c);if(d)return Oo(u),u=Ri(m,t),v(c)}return u===o&&(u=Ri(m,t)),a}return t=ml(t)||0,tl(n)&&(p=!!n.leading,l=(d="maxWait"in n)?bn(ml(n.maxWait)||0,t):l,h="trailing"in n?!!n.trailing:h),b.cancel=function(){u!==o&&Oo(u),f=0,r=c=s=u=o},b.flush=function(){return u===o?a:y(Cs())},b}var Ls=Qr((function(e,t){return fr(e,1,t)})),Is=Qr((function(e,t,n){return fr(e,ml(t)||0,n)}));function Fs(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new Ae(i);var n=function(){var r=arguments,o=t?t.apply(this,r):r[0],i=n.cache;if(i.has(o))return i.get(o);var s=e.apply(this,r);return n.cache=i.set(o,s)||i,s};return n.cache=new(Fs.Cache||Gn),n}function Ns(e){if("function"!=typeof e)throw new Ae(i);return function(){var t=arguments;switch(t.length){case 0:return!e.call(this);case 1:return!e.call(this,t[0]);case 2:return!e.call(this,t[0],t[1]);case 3:return!e.call(this,t[0],t[1],t[2])}return!e.apply(this,t)}}Fs.Cache=Gn;var Ms=xo((function(e,t){var n=(t=1==t.length&&qs(t[0])?Ft(t[0],Xt(ci())):Ft(yr(t,1),Xt(ci()))).length;return Qr((function(r){for(var o=-1,i=wn(r.length,n);++o<i;)r[o]=t[o].call(this,r[o]);return Ct(e,this,r)}))})),Ds=Qr((function(e,t){var n=fn(t,ui(Ds));return Xo(e,u,o,t,n)})),Bs=Qr((function(e,t){var n=fn(t,ui(Bs));return Xo(e,c,o,t,n)})),Us=oi((function(e,t){return Xo(e,p,o,o,o,t)}));function $s(e,t){return e===t||e!=e&&t!=t}var Vs=Go(Cr),Hs=Go((function(e,t){return e>=t})),zs=Rr(function(){return arguments}())?Rr:function(e){return nl(e)&&Ne.call(e,"callee")&&!Ye.call(e,"callee")},qs=r.isArray,Ws=_t?Xt(_t):function(e){return nl(e)&&Er(e)==I};function Ks(e){return null!=e&&el(e.length)&&!Zs(e)}function Gs(e){return nl(e)&&Ks(e)}var Ys=bt||ma,Js=xt?Xt(xt):function(e){return nl(e)&&Er(e)==_};function Qs(e){if(!nl(e))return!1;var t=Er(e);return t==x||"[object DOMException]"==t||"string"==typeof e.message&&"string"==typeof e.name&&!il(e)}function Zs(e){if(!tl(e))return!1;var t=Er(e);return t==S||t==O||"[object AsyncFunction]"==t||"[object Proxy]"==t}function Xs(e){return"number"==typeof e&&e==vl(e)}function el(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=h}function tl(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}function nl(e){return null!=e&&"object"==typeof e}var rl=St?Xt(St):function(e){return nl(e)&&gi(e)==k};function ol(e){return"number"==typeof e||nl(e)&&Er(e)==E}function il(e){if(!nl(e)||Er(e)!=C)return!1;var t=Ke(e);if(null===t)return!0;var n=Ne.call(t,"constructor")&&t.constructor;return"function"==typeof n&&n instanceof n&&Fe.call(n)==Ue}var sl=Ot?Xt(Ot):function(e){return nl(e)&&Er(e)==T};var ll=kt?Xt(kt):function(e){return nl(e)&&gi(e)==A};function al(e){return"string"==typeof e||!qs(e)&&nl(e)&&Er(e)==j}function ul(e){return"symbol"==typeof e||nl(e)&&Er(e)==R}var cl=Et?Xt(Et):function(e){return nl(e)&&el(e.length)&&!!at[Er(e)]};var fl=Go(Br),pl=Go((function(e,t){return e<=t}));function dl(e){if(!e)return[];if(Ks(e))return al(e)?vn(e):jo(e);if(Ze&&e[Ze])return function(e){for(var t,n=[];!(t=e.next()).done;)n.push(t.value);return n}(e[Ze]());var t=gi(e);return(t==k?un:t==A?pn:$l)(e)}function hl(e){return e?(e=ml(e))===d||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}function vl(e){var t=hl(e),n=t%1;return t==t?n?t-n:t:0}function gl(e){return e?ar(vl(e),0,g):0}function ml(e){if("number"==typeof e)return e;if(ul(e))return v;if(tl(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=tl(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=Zt(e);var n=me.test(e);return n||be.test(e)?pt(e.slice(2),n?2:8):ge.test(e)?v:+e}function yl(e){return Ro(e,Ll(e))}function bl(e){return null==e?"":co(e)}var wl=Io((function(e,t){if(ki(t)||Ks(t))Ro(t,Rl(t),e);else for(var n in t)Ne.call(t,n)&&nr(e,n,t[n])})),_l=Io((function(e,t){Ro(t,Ll(t),e)})),xl=Io((function(e,t,n,r){Ro(t,Ll(t),e,r)})),Sl=Io((function(e,t,n,r){Ro(t,Rl(t),e,r)})),Ol=oi(lr);var kl=Qr((function(e,t){e=Ce(e);var n=-1,r=t.length,i=r>2?t[2]:o;for(i&&_i(t[0],t[1],i)&&(r=1);++n<r;)for(var s=t[n],l=Ll(s),a=-1,u=l.length;++a<u;){var c=l[a],f=e[c];(f===o||$s(f,Le[c])&&!Ne.call(e,c))&&(e[c]=s[c])}return e})),El=Qr((function(e){return e.push(o,ti),Ct(Fl,o,e)}));function Cl(e,t,n){var r=null==e?o:Or(e,t);return r===o?n:r}function Pl(e,t){return null!=e&&mi(e,t,Tr)}var Tl=Ho((function(e,t,n){null!=t&&"function"!=typeof t.toString&&(t=Be.call(t)),e[t]=n}),ta(oa)),Al=Ho((function(e,t,n){null!=t&&"function"!=typeof t.toString&&(t=Be.call(t)),Ne.call(e,t)?e[t].push(n):e[t]=[n]}),ci),jl=Qr(jr);function Rl(e){return Ks(e)?Qn(e):Mr(e)}function Ll(e){return Ks(e)?Qn(e,!0):Dr(e)}var Il=Io((function(e,t,n){Hr(e,t,n)})),Fl=Io((function(e,t,n,r){Hr(e,t,n,r)})),Nl=oi((function(e,t){var n={};if(null==e)return n;var r=!1;t=Ft(t,(function(t){return t=_o(t,e),r||(r=t.length>1),t})),Ro(e,si(e),n),r&&(n=ur(n,7,ni));for(var o=t.length;o--;)po(n,t[o]);return n}));var Ml=oi((function(e,t){return null==e?{}:function(e,t){return Wr(e,t,(function(t,n){return Pl(e,n)}))}(e,t)}));function Dl(e,t){if(null==e)return{};var n=Ft(si(e),(function(e){return[e]}));return t=ci(t),Wr(e,n,(function(e,n){return t(e,n[0])}))}var Bl=Zo(Rl),Ul=Zo(Ll);function $l(e){return null==e?[]:en(e,Rl(e))}var Vl=Do((function(e,t,n){return t=t.toLowerCase(),e+(n?Hl(t):t)}));function Hl(e){return Ql(bl(e).toLowerCase())}function zl(e){return(e=bl(e))&&e.replace(_e,on).replace(tt,"")}var ql=Do((function(e,t,n){return e+(n?"-":"")+t.toLowerCase()})),Wl=Do((function(e,t,n){return e+(n?" ":"")+t.toLowerCase()})),Kl=Mo("toLowerCase");var Gl=Do((function(e,t,n){return e+(n?"_":"")+t.toLowerCase()}));var Yl=Do((function(e,t,n){return e+(n?" ":"")+Ql(t)}));var Jl=Do((function(e,t,n){return e+(n?" ":"")+t.toUpperCase()})),Ql=Mo("toUpperCase");function Zl(e,t,n){return e=bl(e),(t=n?o:t)===o?function(e){return it.test(e)}(e)?function(e){return e.match(rt)||[]}(e):function(e){return e.match(fe)||[]}(e):e.match(t)||[]}var Xl=Qr((function(e,t){try{return Ct(e,o,t)}catch(e){return Qs(e)?e:new Oe(e)}})),ea=oi((function(e,t){return Tt(t,(function(t){t=Di(t),sr(e,t,As(e[t],e))})),e}));function ta(e){return function(){return e}}var na=$o(),ra=$o(!0);function oa(e){return e}function ia(e){return Nr("function"==typeof e?e:ur(e,1))}var sa=Qr((function(e,t){return function(n){return jr(n,e,t)}})),la=Qr((function(e,t){return function(n){return jr(e,n,t)}}));function aa(e,t,n){var r=Rl(t),o=Sr(t,r);null!=n||tl(t)&&(o.length||!r.length)||(n=t,t=e,e=this,o=Sr(t,Rl(t)));var i=!(tl(n)&&"chain"in n&&!n.chain),s=Zs(e);return Tt(o,(function(n){var r=t[n];e[n]=r,s&&(e.prototype[n]=function(){var t=this.__chain__;if(i||t){var n=e(this.__wrapped__);return(n.__actions__=jo(this.__actions__)).push({func:r,args:arguments,thisArg:e}),n.__chain__=t,n}return r.apply(e,Nt([this.value()],arguments))})})),e}function ua(){}var ca=qo(Ft),fa=qo(jt),pa=qo(Bt);function da(e){return xi(e)?Kt(Di(e)):function(e){return function(t){return Or(t,e)}}(e)}var ha=Ko(),va=Ko(!0);function ga(){return[]}function ma(){return!1}var ya=zo((function(e,t){return e+t}),0),ba=Jo("ceil"),wa=zo((function(e,t){return e/t}),1),_a=Jo("floor");var xa,Sa=zo((function(e,t){return e*t}),1),Oa=Jo("round"),ka=zo((function(e,t){return e-t}),0);return $n.after=function(e,t){if("function"!=typeof t)throw new Ae(i);return e=vl(e),function(){if(--e<1)return t.apply(this,arguments)}},$n.ary=Ps,$n.assign=wl,$n.assignIn=_l,$n.assignInWith=xl,$n.assignWith=Sl,$n.at=Ol,$n.before=Ts,$n.bind=As,$n.bindAll=ea,$n.bindKey=js,$n.castArray=function(){if(!arguments.length)return[];var e=arguments[0];return qs(e)?e:[e]},$n.chain=ds,$n.chunk=function(e,t,n){t=(n?_i(e,t,n):t===o)?1:bn(vl(t),0);var i=null==e?0:e.length;if(!i||t<1)return[];for(var s=0,l=0,a=r(ht(i/t));s<i;)a[l++]=oo(e,s,s+=t);return a},$n.compact=function(e){for(var t=-1,n=null==e?0:e.length,r=0,o=[];++t<n;){var i=e[t];i&&(o[r++]=i)}return o},$n.concat=function(){var e=arguments.length;if(!e)return[];for(var t=r(e-1),n=arguments[0],o=e;o--;)t[o-1]=arguments[o];return Nt(qs(n)?jo(n):[n],yr(t,1))},$n.cond=function(e){var t=null==e?0:e.length,n=ci();return e=t?Ft(e,(function(e){if("function"!=typeof e[1])throw new Ae(i);return[n(e[0]),e[1]]})):[],Qr((function(n){for(var r=-1;++r<t;){var o=e[r];if(Ct(o[0],this,n))return Ct(o[1],this,n)}}))},$n.conforms=function(e){return function(e){var t=Rl(e);return function(n){return cr(n,e,t)}}(ur(e,1))},$n.constant=ta,$n.countBy=gs,$n.create=function(e,t){var n=Vn(e);return null==t?n:ir(n,t)},$n.curry=function e(t,n,r){var i=Xo(t,8,o,o,o,o,o,n=r?o:n);return i.placeholder=e.placeholder,i},$n.curryRight=function e(t,n,r){var i=Xo(t,a,o,o,o,o,o,n=r?o:n);return i.placeholder=e.placeholder,i},$n.debounce=Rs,$n.defaults=kl,$n.defaultsDeep=El,$n.defer=Ls,$n.delay=Is,$n.difference=$i,$n.differenceBy=Vi,$n.differenceWith=Hi,$n.drop=function(e,t,n){var r=null==e?0:e.length;return r?oo(e,(t=n||t===o?1:vl(t))<0?0:t,r):[]},$n.dropRight=function(e,t,n){var r=null==e?0:e.length;return r?oo(e,0,(t=r-(t=n||t===o?1:vl(t)))<0?0:t):[]},$n.dropRightWhile=function(e,t){return e&&e.length?vo(e,ci(t,3),!0,!0):[]},$n.dropWhile=function(e,t){return e&&e.length?vo(e,ci(t,3),!0):[]},$n.fill=function(e,t,n,r){var i=null==e?0:e.length;return i?(n&&"number"!=typeof n&&_i(e,t,n)&&(n=0,r=i),function(e,t,n,r){var i=e.length;for((n=vl(n))<0&&(n=-n>i?0:i+n),(r=r===o||r>i?i:vl(r))<0&&(r+=i),r=n>r?0:gl(r);n<r;)e[n++]=t;return e}(e,t,n,r)):[]},$n.filter=function(e,t){return(qs(e)?Rt:mr)(e,ci(t,3))},$n.flatMap=function(e,t){return yr(Os(e,t),1)},$n.flatMapDeep=function(e,t){return yr(Os(e,t),d)},$n.flatMapDepth=function(e,t,n){return n=n===o?1:vl(n),yr(Os(e,t),n)},$n.flatten=Wi,$n.flattenDeep=function(e){return(null==e?0:e.length)?yr(e,d):[]},$n.flattenDepth=function(e,t){return(null==e?0:e.length)?yr(e,t=t===o?1:vl(t)):[]},$n.flip=function(e){return Xo(e,512)},$n.flow=na,$n.flowRight=ra,$n.fromPairs=function(e){for(var t=-1,n=null==e?0:e.length,r={};++t<n;){var o=e[t];r[o[0]]=o[1]}return r},$n.functions=function(e){return null==e?[]:Sr(e,Rl(e))},$n.functionsIn=function(e){return null==e?[]:Sr(e,Ll(e))},$n.groupBy=_s,$n.initial=function(e){return(null==e?0:e.length)?oo(e,0,-1):[]},$n.intersection=Gi,$n.intersectionBy=Yi,$n.intersectionWith=Ji,$n.invert=Tl,$n.invertBy=Al,$n.invokeMap=xs,$n.iteratee=ia,$n.keyBy=Ss,$n.keys=Rl,$n.keysIn=Ll,$n.map=Os,$n.mapKeys=function(e,t){var n={};return t=ci(t,3),_r(e,(function(e,r,o){sr(n,t(e,r,o),e)})),n},$n.mapValues=function(e,t){var n={};return t=ci(t,3),_r(e,(function(e,r,o){sr(n,r,t(e,r,o))})),n},$n.matches=function(e){return $r(ur(e,1))},$n.matchesProperty=function(e,t){return Vr(e,ur(t,1))},$n.memoize=Fs,$n.merge=Il,$n.mergeWith=Fl,$n.method=sa,$n.methodOf=la,$n.mixin=aa,$n.negate=Ns,$n.nthArg=function(e){return e=vl(e),Qr((function(t){return zr(t,e)}))},$n.omit=Nl,$n.omitBy=function(e,t){return Dl(e,Ns(ci(t)))},$n.once=function(e){return Ts(2,e)},$n.orderBy=function(e,t,n,r){return null==e?[]:(qs(t)||(t=null==t?[]:[t]),qs(n=r?o:n)||(n=null==n?[]:[n]),qr(e,t,n))},$n.over=ca,$n.overArgs=Ms,$n.overEvery=fa,$n.overSome=pa,$n.partial=Ds,$n.partialRight=Bs,$n.partition=ks,$n.pick=Ml,$n.pickBy=Dl,$n.property=da,$n.propertyOf=function(e){return function(t){return null==e?o:Or(e,t)}},$n.pull=Zi,$n.pullAll=Xi,$n.pullAllBy=function(e,t,n){return e&&e.length&&t&&t.length?Kr(e,t,ci(n,2)):e},$n.pullAllWith=function(e,t,n){return e&&e.length&&t&&t.length?Kr(e,t,o,n):e},$n.pullAt=es,$n.range=ha,$n.rangeRight=va,$n.rearg=Us,$n.reject=function(e,t){return(qs(e)?Rt:mr)(e,Ns(ci(t,3)))},$n.remove=function(e,t){var n=[];if(!e||!e.length)return n;var r=-1,o=[],i=e.length;for(t=ci(t,3);++r<i;){var s=e[r];t(s,r,e)&&(n.push(s),o.push(r))}return Gr(e,o),n},$n.rest=function(e,t){if("function"!=typeof e)throw new Ae(i);return Qr(e,t=t===o?t:vl(t))},$n.reverse=ts,$n.sampleSize=function(e,t,n){return t=(n?_i(e,t,n):t===o)?1:vl(t),(qs(e)?Xn:Xr)(e,t)},$n.set=function(e,t,n){return null==e?e:eo(e,t,n)},$n.setWith=function(e,t,n,r){return r="function"==typeof r?r:o,null==e?e:eo(e,t,n,r)},$n.shuffle=function(e){return(qs(e)?er:ro)(e)},$n.slice=function(e,t,n){var r=null==e?0:e.length;return r?(n&&"number"!=typeof n&&_i(e,t,n)?(t=0,n=r):(t=null==t?0:vl(t),n=n===o?r:vl(n)),oo(e,t,n)):[]},$n.sortBy=Es,$n.sortedUniq=function(e){return e&&e.length?ao(e):[]},$n.sortedUniqBy=function(e,t){return e&&e.length?ao(e,ci(t,2)):[]},$n.split=function(e,t,n){return n&&"number"!=typeof n&&_i(e,t,n)&&(t=n=o),(n=n===o?g:n>>>0)?(e=bl(e))&&("string"==typeof t||null!=t&&!sl(t))&&!(t=co(t))&&an(e)?So(vn(e),0,n):e.split(t,n):[]},$n.spread=function(e,t){if("function"!=typeof e)throw new Ae(i);return t=null==t?0:bn(vl(t),0),Qr((function(n){var r=n[t],o=So(n,0,t);return r&&Nt(o,r),Ct(e,this,o)}))},$n.tail=function(e){var t=null==e?0:e.length;return t?oo(e,1,t):[]},$n.take=function(e,t,n){return e&&e.length?oo(e,0,(t=n||t===o?1:vl(t))<0?0:t):[]},$n.takeRight=function(e,t,n){var r=null==e?0:e.length;return r?oo(e,(t=r-(t=n||t===o?1:vl(t)))<0?0:t,r):[]},$n.takeRightWhile=function(e,t){return e&&e.length?vo(e,ci(t,3),!1,!0):[]},$n.takeWhile=function(e,t){return e&&e.length?vo(e,ci(t,3)):[]},$n.tap=function(e,t){return t(e),e},$n.throttle=function(e,t,n){var r=!0,o=!0;if("function"!=typeof e)throw new Ae(i);return tl(n)&&(r="leading"in n?!!n.leading:r,o="trailing"in n?!!n.trailing:o),Rs(e,t,{leading:r,maxWait:t,trailing:o})},$n.thru=hs,$n.toArray=dl,$n.toPairs=Bl,$n.toPairsIn=Ul,$n.toPath=function(e){return qs(e)?Ft(e,Di):ul(e)?[e]:jo(Mi(bl(e)))},$n.toPlainObject=yl,$n.transform=function(e,t,n){var r=qs(e),o=r||Ys(e)||cl(e);if(t=ci(t,4),null==n){var i=e&&e.constructor;n=o?r?new i:[]:tl(e)&&Zs(i)?Vn(Ke(e)):{}}return(o?Tt:_r)(e,(function(e,r,o){return t(n,e,r,o)})),n},$n.unary=function(e){return Ps(e,1)},$n.union=ns,$n.unionBy=rs,$n.unionWith=os,$n.uniq=function(e){return e&&e.length?fo(e):[]},$n.uniqBy=function(e,t){return e&&e.length?fo(e,ci(t,2)):[]},$n.uniqWith=function(e,t){return t="function"==typeof t?t:o,e&&e.length?fo(e,o,t):[]},$n.unset=function(e,t){return null==e||po(e,t)},$n.unzip=is,$n.unzipWith=ss,$n.update=function(e,t,n){return null==e?e:ho(e,t,wo(n))},$n.updateWith=function(e,t,n,r){return r="function"==typeof r?r:o,null==e?e:ho(e,t,wo(n),r)},$n.values=$l,$n.valuesIn=function(e){return null==e?[]:en(e,Ll(e))},$n.without=ls,$n.words=Zl,$n.wrap=function(e,t){return Ds(wo(t),e)},$n.xor=as,$n.xorBy=us,$n.xorWith=cs,$n.zip=fs,$n.zipObject=function(e,t){return yo(e||[],t||[],nr)},$n.zipObjectDeep=function(e,t){return yo(e||[],t||[],eo)},$n.zipWith=ps,$n.entries=Bl,$n.entriesIn=Ul,$n.extend=_l,$n.extendWith=xl,aa($n,$n),$n.add=ya,$n.attempt=Xl,$n.camelCase=Vl,$n.capitalize=Hl,$n.ceil=ba,$n.clamp=function(e,t,n){return n===o&&(n=t,t=o),n!==o&&(n=(n=ml(n))==n?n:0),t!==o&&(t=(t=ml(t))==t?t:0),ar(ml(e),t,n)},$n.clone=function(e){return ur(e,4)},$n.cloneDeep=function(e){return ur(e,5)},$n.cloneDeepWith=function(e,t){return ur(e,5,t="function"==typeof t?t:o)},$n.cloneWith=function(e,t){return ur(e,4,t="function"==typeof t?t:o)},$n.conformsTo=function(e,t){return null==t||cr(e,t,Rl(t))},$n.deburr=zl,$n.defaultTo=function(e,t){return null==e||e!=e?t:e},$n.divide=wa,$n.endsWith=function(e,t,n){e=bl(e),t=co(t);var r=e.length,i=n=n===o?r:ar(vl(n),0,r);return(n-=t.length)>=0&&e.slice(n,i)==t},$n.eq=$s,$n.escape=function(e){return(e=bl(e))&&Q.test(e)?e.replace(Y,sn):e},$n.escapeRegExp=function(e){return(e=bl(e))&&ie.test(e)?e.replace(oe,"\\$&"):e},$n.every=function(e,t,n){var r=qs(e)?jt:vr;return n&&_i(e,t,n)&&(t=o),r(e,ci(t,3))},$n.find=ms,$n.findIndex=zi,$n.findKey=function(e,t){return $t(e,ci(t,3),_r)},$n.findLast=ys,$n.findLastIndex=qi,$n.findLastKey=function(e,t){return $t(e,ci(t,3),xr)},$n.floor=_a,$n.forEach=bs,$n.forEachRight=ws,$n.forIn=function(e,t){return null==e?e:br(e,ci(t,3),Ll)},$n.forInRight=function(e,t){return null==e?e:wr(e,ci(t,3),Ll)},$n.forOwn=function(e,t){return e&&_r(e,ci(t,3))},$n.forOwnRight=function(e,t){return e&&xr(e,ci(t,3))},$n.get=Cl,$n.gt=Vs,$n.gte=Hs,$n.has=function(e,t){return null!=e&&mi(e,t,Pr)},$n.hasIn=Pl,$n.head=Ki,$n.identity=oa,$n.includes=function(e,t,n,r){e=Ks(e)?e:$l(e),n=n&&!r?vl(n):0;var o=e.length;return n<0&&(n=bn(o+n,0)),al(e)?n<=o&&e.indexOf(t,n)>-1:!!o&&Ht(e,t,n)>-1},$n.indexOf=function(e,t,n){var r=null==e?0:e.length;if(!r)return-1;var o=null==n?0:vl(n);return o<0&&(o=bn(r+o,0)),Ht(e,t,o)},$n.inRange=function(e,t,n){return t=hl(t),n===o?(n=t,t=0):n=hl(n),function(e,t,n){return e>=wn(t,n)&&e<bn(t,n)}(e=ml(e),t,n)},$n.invoke=jl,$n.isArguments=zs,$n.isArray=qs,$n.isArrayBuffer=Ws,$n.isArrayLike=Ks,$n.isArrayLikeObject=Gs,$n.isBoolean=function(e){return!0===e||!1===e||nl(e)&&Er(e)==w},$n.isBuffer=Ys,$n.isDate=Js,$n.isElement=function(e){return nl(e)&&1===e.nodeType&&!il(e)},$n.isEmpty=function(e){if(null==e)return!0;if(Ks(e)&&(qs(e)||"string"==typeof e||"function"==typeof e.splice||Ys(e)||cl(e)||zs(e)))return!e.length;var t=gi(e);if(t==k||t==A)return!e.size;if(ki(e))return!Mr(e).length;for(var n in e)if(Ne.call(e,n))return!1;return!0},$n.isEqual=function(e,t){return Lr(e,t)},$n.isEqualWith=function(e,t,n){var r=(n="function"==typeof n?n:o)?n(e,t):o;return r===o?Lr(e,t,o,n):!!r},$n.isError=Qs,$n.isFinite=function(e){return"number"==typeof e&&wt(e)},$n.isFunction=Zs,$n.isInteger=Xs,$n.isLength=el,$n.isMap=rl,$n.isMatch=function(e,t){return e===t||Ir(e,t,pi(t))},$n.isMatchWith=function(e,t,n){return n="function"==typeof n?n:o,Ir(e,t,pi(t),n)},$n.isNaN=function(e){return ol(e)&&e!=+e},$n.isNative=function(e){if(Oi(e))throw new Oe("Unsupported core-js use. Try https://npms.io/search?q=ponyfill.");return Fr(e)},$n.isNil=function(e){return null==e},$n.isNull=function(e){return null===e},$n.isNumber=ol,$n.isObject=tl,$n.isObjectLike=nl,$n.isPlainObject=il,$n.isRegExp=sl,$n.isSafeInteger=function(e){return Xs(e)&&e>=-9007199254740991&&e<=h},$n.isSet=ll,$n.isString=al,$n.isSymbol=ul,$n.isTypedArray=cl,$n.isUndefined=function(e){return e===o},$n.isWeakMap=function(e){return nl(e)&&gi(e)==L},$n.isWeakSet=function(e){return nl(e)&&"[object WeakSet]"==Er(e)},$n.join=function(e,t){return null==e?"":Ut.call(e,t)},$n.kebabCase=ql,$n.last=Qi,$n.lastIndexOf=function(e,t,n){var r=null==e?0:e.length;if(!r)return-1;var i=r;return n!==o&&(i=(i=vl(n))<0?bn(r+i,0):wn(i,r-1)),t==t?function(e,t,n){for(var r=n+1;r--;)if(e[r]===t)return r;return r}(e,t,i):Vt(e,qt,i,!0)},$n.lowerCase=Wl,$n.lowerFirst=Kl,$n.lt=fl,$n.lte=pl,$n.max=function(e){return e&&e.length?gr(e,oa,Cr):o},$n.maxBy=function(e,t){return e&&e.length?gr(e,ci(t,2),Cr):o},$n.mean=function(e){return Wt(e,oa)},$n.meanBy=function(e,t){return Wt(e,ci(t,2))},$n.min=function(e){return e&&e.length?gr(e,oa,Br):o},$n.minBy=function(e,t){return e&&e.length?gr(e,ci(t,2),Br):o},$n.stubArray=ga,$n.stubFalse=ma,$n.stubObject=function(){return{}},$n.stubString=function(){return""},$n.stubTrue=function(){return!0},$n.multiply=Sa,$n.nth=function(e,t){return e&&e.length?zr(e,vl(t)):o},$n.noConflict=function(){return vt._===this&&(vt._=$e),this},$n.noop=ua,$n.now=Cs,$n.pad=function(e,t,n){e=bl(e);var r=(t=vl(t))?hn(e):0;if(!t||r>=t)return e;var o=(t-r)/2;return Wo(gt(o),n)+e+Wo(ht(o),n)},$n.padEnd=function(e,t,n){e=bl(e);var r=(t=vl(t))?hn(e):0;return t&&r<t?e+Wo(t-r,n):e},$n.padStart=function(e,t,n){e=bl(e);var r=(t=vl(t))?hn(e):0;return t&&r<t?Wo(t-r,n)+e:e},$n.parseInt=function(e,t,n){return n||null==t?t=0:t&&(t=+t),xn(bl(e).replace(se,""),t||0)},$n.random=function(e,t,n){if(n&&"boolean"!=typeof n&&_i(e,t,n)&&(t=n=o),n===o&&("boolean"==typeof t?(n=t,t=o):"boolean"==typeof e&&(n=e,e=o)),e===o&&t===o?(e=0,t=1):(e=hl(e),t===o?(t=e,e=0):t=hl(t)),e>t){var r=e;e=t,t=r}if(n||e%1||t%1){var i=Sn();return wn(e+i*(t-e+ft("1e-"+((i+"").length-1))),t)}return Yr(e,t)},$n.reduce=function(e,t,n){var r=qs(e)?Mt:Yt,o=arguments.length<3;return r(e,ci(t,4),n,o,dr)},$n.reduceRight=function(e,t,n){var r=qs(e)?Dt:Yt,o=arguments.length<3;return r(e,ci(t,4),n,o,hr)},$n.repeat=function(e,t,n){return t=(n?_i(e,t,n):t===o)?1:vl(t),Jr(bl(e),t)},$n.replace=function(){var e=arguments,t=bl(e[0]);return e.length<3?t:t.replace(e[1],e[2])},$n.result=function(e,t,n){var r=-1,i=(t=_o(t,e)).length;for(i||(i=1,e=o);++r<i;){var s=null==e?o:e[Di(t[r])];s===o&&(r=i,s=n),e=Zs(s)?s.call(e):s}return e},$n.round=Oa,$n.runInContext=e,$n.sample=function(e){return(qs(e)?Zn:Zr)(e)},$n.size=function(e){if(null==e)return 0;if(Ks(e))return al(e)?hn(e):e.length;var t=gi(e);return t==k||t==A?e.size:Mr(e).length},$n.snakeCase=Gl,$n.some=function(e,t,n){var r=qs(e)?Bt:io;return n&&_i(e,t,n)&&(t=o),r(e,ci(t,3))},$n.sortedIndex=function(e,t){return so(e,t)},$n.sortedIndexBy=function(e,t,n){return lo(e,t,ci(n,2))},$n.sortedIndexOf=function(e,t){var n=null==e?0:e.length;if(n){var r=so(e,t);if(r<n&&$s(e[r],t))return r}return-1},$n.sortedLastIndex=function(e,t){return so(e,t,!0)},$n.sortedLastIndexBy=function(e,t,n){return lo(e,t,ci(n,2),!0)},$n.sortedLastIndexOf=function(e,t){if(null==e?0:e.length){var n=so(e,t,!0)-1;if($s(e[n],t))return n}return-1},$n.startCase=Yl,$n.startsWith=function(e,t,n){return e=bl(e),n=null==n?0:ar(vl(n),0,e.length),t=co(t),e.slice(n,n+t.length)==t},$n.subtract=ka,$n.sum=function(e){return e&&e.length?Jt(e,oa):0},$n.sumBy=function(e,t){return e&&e.length?Jt(e,ci(t,2)):0},$n.template=function(e,t,n){var r=$n.templateSettings;n&&_i(e,t,n)&&(t=o),e=bl(e),t=xl({},t,r,ei);var i,s,l=xl({},t.imports,r.imports,ei),a=Rl(l),u=en(l,a),c=0,f=t.interpolate||xe,p="__p += '",d=Pe((t.escape||xe).source+"|"+f.source+"|"+(f===ee?he:xe).source+"|"+(t.evaluate||xe).source+"|$","g"),h="//# sourceURL="+(Ne.call(t,"sourceURL")?(t.sourceURL+"").replace(/\s/g," "):"lodash.templateSources["+ ++lt+"]")+"\n";e.replace(d,(function(t,n,r,o,l,a){return r||(r=o),p+=e.slice(c,a).replace(Se,ln),n&&(i=!0,p+="' +\n__e("+n+") +\n'"),l&&(s=!0,p+="';\n"+l+";\n__p += '"),r&&(p+="' +\n((__t = ("+r+")) == null ? '' : __t) +\n'"),c=a+t.length,t})),p+="';\n";var v=Ne.call(t,"variable")&&t.variable;if(v){if(pe.test(v))throw new Oe("Invalid `variable` option passed into `_.template`")}else p="with (obj) {\n"+p+"\n}\n";p=(s?p.replace(q,""):p).replace(W,"$1").replace(K,"$1;"),p="function("+(v||"obj")+") {\n"+(v?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(i?", __e = _.escape":"")+(s?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+p+"return __p\n}";var g=Xl((function(){return ke(a,h+"return "+p).apply(o,u)}));if(g.source=p,Qs(g))throw g;return g},$n.times=function(e,t){if((e=vl(e))<1||e>h)return[];var n=g,r=wn(e,g);t=ci(t),e-=g;for(var o=Qt(r,t);++n<e;)t(n);return o},$n.toFinite=hl,$n.toInteger=vl,$n.toLength=gl,$n.toLower=function(e){return bl(e).toLowerCase()},$n.toNumber=ml,$n.toSafeInteger=function(e){return e?ar(vl(e),-9007199254740991,h):0===e?e:0},$n.toString=bl,$n.toUpper=function(e){return bl(e).toUpperCase()},$n.trim=function(e,t,n){if((e=bl(e))&&(n||t===o))return Zt(e);if(!e||!(t=co(t)))return e;var r=vn(e),i=vn(t);return So(r,nn(r,i),rn(r,i)+1).join("")},$n.trimEnd=function(e,t,n){if((e=bl(e))&&(n||t===o))return e.slice(0,gn(e)+1);if(!e||!(t=co(t)))return e;var r=vn(e);return So(r,0,rn(r,vn(t))+1).join("")},$n.trimStart=function(e,t,n){if((e=bl(e))&&(n||t===o))return e.replace(se,"");if(!e||!(t=co(t)))return e;var r=vn(e);return So(r,nn(r,vn(t))).join("")},$n.truncate=function(e,t){var n=30,r="...";if(tl(t)){var i="separator"in t?t.separator:i;n="length"in t?vl(t.length):n,r="omission"in t?co(t.omission):r}var s=(e=bl(e)).length;if(an(e)){var l=vn(e);s=l.length}if(n>=s)return e;var a=n-hn(r);if(a<1)return r;var u=l?So(l,0,a).join(""):e.slice(0,a);if(i===o)return u+r;if(l&&(a+=u.length-a),sl(i)){if(e.slice(a).search(i)){var c,f=u;for(i.global||(i=Pe(i.source,bl(ve.exec(i))+"g")),i.lastIndex=0;c=i.exec(f);)var p=c.index;u=u.slice(0,p===o?a:p)}}else if(e.indexOf(co(i),a)!=a){var d=u.lastIndexOf(i);d>-1&&(u=u.slice(0,d))}return u+r},$n.unescape=function(e){return(e=bl(e))&&J.test(e)?e.replace(G,mn):e},$n.uniqueId=function(e){var t=++Me;return bl(e)+t},$n.upperCase=Jl,$n.upperFirst=Ql,$n.each=bs,$n.eachRight=ws,$n.first=Ki,aa($n,(xa={},_r($n,(function(e,t){Ne.call($n.prototype,t)||(xa[t]=e)})),xa),{chain:!1}),$n.VERSION="4.17.21",Tt(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(e){$n[e].placeholder=$n})),Tt(["drop","take"],(function(e,t){qn.prototype[e]=function(n){n=n===o?1:bn(vl(n),0);var r=this.__filtered__&&!t?new qn(this):this.clone();return r.__filtered__?r.__takeCount__=wn(n,r.__takeCount__):r.__views__.push({size:wn(n,g),type:e+(r.__dir__<0?"Right":"")}),r},qn.prototype[e+"Right"]=function(t){return this.reverse()[e](t).reverse()}})),Tt(["filter","map","takeWhile"],(function(e,t){var n=t+1,r=1==n||3==n;qn.prototype[e]=function(e){var t=this.clone();return t.__iteratees__.push({iteratee:ci(e,3),type:n}),t.__filtered__=t.__filtered__||r,t}})),Tt(["head","last"],(function(e,t){var n="take"+(t?"Right":"");qn.prototype[e]=function(){return this[n](1).value()[0]}})),Tt(["initial","tail"],(function(e,t){var n="drop"+(t?"":"Right");qn.prototype[e]=function(){return this.__filtered__?new qn(this):this[n](1)}})),qn.prototype.compact=function(){return this.filter(oa)},qn.prototype.find=function(e){return this.filter(e).head()},qn.prototype.findLast=function(e){return this.reverse().find(e)},qn.prototype.invokeMap=Qr((function(e,t){return"function"==typeof e?new qn(this):this.map((function(n){return jr(n,e,t)}))})),qn.prototype.reject=function(e){return this.filter(Ns(ci(e)))},qn.prototype.slice=function(e,t){e=vl(e);var n=this;return n.__filtered__&&(e>0||t<0)?new qn(n):(e<0?n=n.takeRight(-e):e&&(n=n.drop(e)),t!==o&&(n=(t=vl(t))<0?n.dropRight(-t):n.take(t-e)),n)},qn.prototype.takeRightWhile=function(e){return this.reverse().takeWhile(e).reverse()},qn.prototype.toArray=function(){return this.take(g)},_r(qn.prototype,(function(e,t){var n=/^(?:filter|find|map|reject)|While$/.test(t),r=/^(?:head|last)$/.test(t),i=$n[r?"take"+("last"==t?"Right":""):t],s=r||/^find/.test(t);i&&($n.prototype[t]=function(){var t=this.__wrapped__,l=r?[1]:arguments,a=t instanceof qn,u=l[0],c=a||qs(t),f=function(e){var t=i.apply($n,Nt([e],l));return r&&p?t[0]:t};c&&n&&"function"==typeof u&&1!=u.length&&(a=c=!1);var p=this.__chain__,d=!!this.__actions__.length,h=s&&!p,v=a&&!d;if(!s&&c){t=v?t:new qn(this);var g=e.apply(t,l);return g.__actions__.push({func:hs,args:[f],thisArg:o}),new zn(g,p)}return h&&v?e.apply(this,l):(g=this.thru(f),h?r?g.value()[0]:g.value():g)})})),Tt(["pop","push","shift","sort","splice","unshift"],(function(e){var t=je[e],n=/^(?:push|sort|unshift)$/.test(e)?"tap":"thru",r=/^(?:pop|shift)$/.test(e);$n.prototype[e]=function(){var e=arguments;if(r&&!this.__chain__){var o=this.value();return t.apply(qs(o)?o:[],e)}return this[n]((function(n){return t.apply(qs(n)?n:[],e)}))}})),_r(qn.prototype,(function(e,t){var n=$n[t];if(n){var r=n.name+"";Ne.call(Rn,r)||(Rn[r]=[]),Rn[r].push({name:t,func:n})}})),Rn[Vo(o,2).name]=[{name:"wrapper",func:o}],qn.prototype.clone=function(){var e=new qn(this.__wrapped__);return e.__actions__=jo(this.__actions__),e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=jo(this.__iteratees__),e.__takeCount__=this.__takeCount__,e.__views__=jo(this.__views__),e},qn.prototype.reverse=function(){if(this.__filtered__){var e=new qn(this);e.__dir__=-1,e.__filtered__=!0}else(e=this.clone()).__dir__*=-1;return e},qn.prototype.value=function(){var e=this.__wrapped__.value(),t=this.__dir__,n=qs(e),r=t<0,o=n?e.length:0,i=function(e,t,n){var r=-1,o=n.length;for(;++r<o;){var i=n[r],s=i.size;switch(i.type){case"drop":e+=s;break;case"dropRight":t-=s;break;case"take":t=wn(t,e+s);break;case"takeRight":e=bn(e,t-s)}}return{start:e,end:t}}(0,o,this.__views__),s=i.start,l=i.end,a=l-s,u=r?l:s-1,c=this.__iteratees__,f=c.length,p=0,d=wn(a,this.__takeCount__);if(!n||!r&&o==a&&d==a)return go(e,this.__actions__);var h=[];e:for(;a--&&p<d;){for(var v=-1,g=e[u+=t];++v<f;){var m=c[v],y=m.iteratee,b=m.type,w=y(g);if(2==b)g=w;else if(!w){if(1==b)continue e;break e}}h[p++]=g}return h},$n.prototype.at=vs,$n.prototype.chain=function(){return ds(this)},$n.prototype.commit=function(){return new zn(this.value(),this.__chain__)},$n.prototype.next=function(){this.__values__===o&&(this.__values__=dl(this.value()));var e=this.__index__>=this.__values__.length;return{done:e,value:e?o:this.__values__[this.__index__++]}},$n.prototype.plant=function(e){for(var t,n=this;n instanceof Hn;){var r=Ui(n);r.__index__=0,r.__values__=o,t?i.__wrapped__=r:t=r;var i=r;n=n.__wrapped__}return i.__wrapped__=e,t},$n.prototype.reverse=function(){var e=this.__wrapped__;if(e instanceof qn){var t=e;return this.__actions__.length&&(t=new qn(this)),(t=t.reverse()).__actions__.push({func:hs,args:[ts],thisArg:o}),new zn(t,this.__chain__)}return this.thru(ts)},$n.prototype.toJSON=$n.prototype.valueOf=$n.prototype.value=function(){return go(this.__wrapped__,this.__actions__)},$n.prototype.first=$n.prototype.head,Ze&&($n.prototype[Ze]=function(){return this}),$n}();vt._=yn,(r=function(){return yn}.call(t,n,t,e))===o||(e.exports=r)}.call(this)},378:()=>{},744:(e,t)=>{"use strict";t.Z=(e,t)=>{const n=e.__vccOpts||e;for(const[e,r]of t)n[e]=r;return n}}},n={};function r(e){var o=n[e];if(void 0!==o)return o.exports;var i=n[e]={id:e,loaded:!1,exports:{}};return t[e].call(i.exports,i,i.exports,r),i.loaded=!0,i.exports}r.m=t,e=[],r.O=(t,n,o,i)=>{if(!n){var s=1/0;for(c=0;c<e.length;c++){for(var[n,o,i]=e[c],l=!0,a=0;a<n.length;a++)(!1&i||s>=i)&&Object.keys(r.O).every((e=>r.O[e](n[a])))?n.splice(a--,1):(l=!1,i<s&&(s=i));if(l){e.splice(c--,1);var u=o();void 0!==u&&(t=u)}}return t}i=i||0;for(var c=e.length;c>0&&e[c-1][2]>i;c--)e[c]=e[c-1];e[c]=[n,o,i]},r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e={260:0,143:0};r.O.j=t=>0===e[t];var t=(t,n)=>{var o,i,[s,l,a]=n,u=0;if(s.some((t=>0!==e[t]))){for(o in l)r.o(l,o)&&(r.m[o]=l[o]);if(a)var c=a(r)}for(t&&t(n);u<s.length;u++)i=s[u],r.o(e,i)&&e[i]&&e[i][0](),e[i]=0;return r.O(c)},n=self.webpackChunkopcodesio_log_viewer=self.webpackChunkopcodesio_log_viewer||[];n.forEach(t.bind(null,0)),n.push=t.bind(null,n.push.bind(n))})(),r.O(void 0,[143],(()=>r(514)));var o=r.O(void 0,[143],(()=>r(378)));o=r.O(o)})();
\ No newline at end of file
diff --git a/public/vendor/log-viewer/app.js.LICENSE.txt b/public/vendor/log-viewer/app.js.LICENSE.txt
index 1e648e3e918..2836974a771 100644
--- a/public/vendor/log-viewer/app.js.LICENSE.txt
+++ b/public/vendor/log-viewer/app.js.LICENSE.txt
@@ -5,6 +5,8 @@
  * @license  MIT
  */
 
+/*! #__NO_SIDE_EFFECTS__ */
+
 /*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
 
 /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
diff --git a/public/vendor/log-viewer/mix-manifest.json b/public/vendor/log-viewer/mix-manifest.json
index a66a90cee2b..ea8dd24fa0e 100644
--- a/public/vendor/log-viewer/mix-manifest.json
+++ b/public/vendor/log-viewer/mix-manifest.json
@@ -1,6 +1,6 @@
 {
-    "/app.js": "/app.js?id=5f574f36f456b103dffcfa21d5612785",
-    "/app.css": "/app.css?id=b701a4344131bb2c00e9f0b1ef1ab3c1",
+    "/app.js": "/app.js?id=735ecf8ed11308c93eed8ab901094929",
+    "/app.css": "/app.css?id=4d9629388ead48c1e8115f0f9d44caaf",
     "/img/log-viewer-128.png": "/img/log-viewer-128.png?id=d576c6d2e16074d3f064e60fe4f35166",
     "/img/log-viewer-32.png": "/img/log-viewer-32.png?id=f8ec67d10f996aa8baf00df3b61eea6d",
     "/img/log-viewer-64.png": "/img/log-viewer-64.png?id=8902d596fc883ca9eb8105bb683568c6"
diff --git a/resources/css/app.css b/resources/css/app.css
new file mode 100644
index 00000000000..93a48529984
--- /dev/null
+++ b/resources/css/app.css
@@ -0,0 +1,123 @@
+@import "./photoDescription.css";
+@import "./fonts.css";
+
+@tailwind base;
+/* also contains normalize */
+@tailwind components;
+@tailwind utilities;
+
+@layer base {
+	:root {
+		--primary-200: #bae6fd;
+		--primary-300: #7dd3fc;
+		--primary-400: #38bdf8;
+		--primary-500: #0ea5e9;
+		--primary-600: #0284c7;
+		--primary-700: #0369a1;
+
+		--text-main-0: #ffffff;
+		--text-main-100: #d9d9d9;
+		--text-main-200: #c0c0c0;
+		--text-main-400: #a0a0a0;
+		--text-hover: #ffffff;
+
+		--bg-50: #e0e0e0;
+		--bg-100: #c0c0c0;
+		--bg-200: #a0a0a0;
+		--bg-300: #404040;
+		--bg-400: #383838;
+		--bg-500: #313131;
+		--bg-600: #292929;
+		--bg-700: #212121;
+		--bg-800: #1a1a1a;
+		--bg-900: #121212;
+		--bg-950: #0e0e0e;
+
+		--danger: #dc2626;
+		--danger-dark: #b91c1c;
+		--danger-darker: #991b1b;
+
+		--success: #22c55e;
+
+		--create: #16a34a;
+		--create-dark: #15803d;
+
+		--warning: #fb923c;
+		--warning-dark: #ea580c;
+	}
+
+	html {
+		font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+	}
+
+	input:focus,
+	textarea:focus,
+	select:focus {
+		outline: none;
+	}
+
+	/* Remove all ugly outlines */
+	* {
+		outline: 2px solid transparent;
+		outline-offset: 2px;
+	}
+
+	[x-cloak] {
+		display: none !important;
+	}
+
+	.filter-shadow {
+		filter: drop-shadow(0 0 0.5rem black);
+	}
+
+	.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);
+	}
+
+	.markdown a {
+		text-underline-offset: 0.2rem;
+		text-decoration: underline dashed;
+	}
+
+	/* Trick to change the calendar picker color in chrome */
+	::-webkit-calendar-picker-indicator {
+		filter: invert(54%) sepia(85%) saturate(2054%) hue-rotate(166deg) brightness(93%) contrast(97%);
+	}
+
+	.drop-shadow-black {
+		--tw-drop-shadow: drop-shadow(0 0 1px rgba(0, 0, 0, 0.3)) drop-shadow(0 0 10px rgba(0, 0, 0, 0.3));
+	}
+}
diff --git a/resources/css/fonts.css b/resources/css/fonts.css
new file mode 100644
index 00000000000..8a82b2cbcae
--- /dev/null
+++ b/resources/css/fonts.css
@@ -0,0 +1,68 @@
+@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;
+}
+
+.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";
+}
diff --git a/resources/css/photoDescription.css b/resources/css/photoDescription.css
new file mode 100644
index 00000000000..8717c525f30
--- /dev/null
+++ b/resources/css/photoDescription.css
@@ -0,0 +1,36 @@
+#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/fonts/roboto-v29-300.woff2 b/resources/fonts/roboto-v29-300.woff2
new file mode 100644
index 00000000000..ccadbb0b76f
Binary files /dev/null and b/resources/fonts/roboto-v29-300.woff2 differ
diff --git a/resources/fonts/roboto-v29-400.woff2 b/resources/fonts/roboto-v29-400.woff2
new file mode 100644
index 00000000000..55affe52e58
Binary files /dev/null and b/resources/fonts/roboto-v29-400.woff2 differ
diff --git a/resources/fonts/roboto-v29-700.woff2 b/resources/fonts/roboto-v29-700.woff2
new file mode 100644
index 00000000000..31abf9f17d5
Binary files /dev/null and b/resources/fonts/roboto-v29-700.woff2 differ
diff --git a/resources/fonts/socials.eot b/resources/fonts/socials.eot
new file mode 100644
index 00000000000..87c4e318371
Binary files /dev/null and b/resources/fonts/socials.eot differ
diff --git a/resources/fonts/socials.svg b/resources/fonts/socials.svg
new file mode 100644
index 00000000000..44c3c7d648f
--- /dev/null
+++ b/resources/fonts/socials.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>Generated by IcoMoon</metadata>
+<defs>
+<font id="icomoon" horiz-adv-x="1024">
+<font-face units-per-em="1024" ascent="960" descent="-64" />
+<missing-glyph horiz-adv-x="1024" />
+<glyph unicode="&#x20;" horiz-adv-x="512" d="" />
+<glyph unicode="&#xea91;" glyph-name="facebook2" d="M928 960h-832c-52.8 0-96-43.2-96-96v-832c0-52.8 43.2-96 96-96h416v448h-128v128h128v64c0 105.8 86.2 192 192 192h128v-128h-128c-35.2 0-64-28.8-64-64v-64h192l-32-128h-160v-448h288c52.8 0 96 43.2 96 96v832c0 52.8-43.2 96-96 96z" />
+<glyph unicode="&#xea92;" glyph-name="instagram" d="M512 867.8c136.8 0 153-0.6 206.8-3 50-2.2 77-10.6 95-17.6 23.8-9.2 41-20.4 58.8-38.2 18-18 29-35 38.4-58.8 7-18 15.4-45.2 17.6-95 2.4-54 3-70.2 3-206.8s-0.6-153-3-206.8c-2.2-50-10.6-77-17.6-95-9.2-23.8-20.4-41-38.2-58.8-18-18-35-29-58.8-38.4-18-7-45.2-15.4-95-17.6-54-2.4-70.2-3-206.8-3s-153 0.6-206.8 3c-50 2.2-77 10.6-95 17.6-23.8 9.2-41 20.4-58.8 38.2-18 18-29 35-38.4 58.8-7 18-15.4 45.2-17.6 95-2.4 54-3 70.2-3 206.8s0.6 153 3 206.8c2.2 50 10.6 77 17.6 95 9.2 23.8 20.4 41 38.2 58.8 18 18 35 29 58.8 38.4 18 7 45.2 15.4 95 17.6 53.8 2.4 70 3 206.8 3zM512 960c-139 0-156.4-0.6-211-3-54.4-2.4-91.8-11.2-124.2-23.8-33.8-13.2-62.4-30.6-90.8-59.2-28.6-28.4-46-57-59.2-90.6-12.6-32.6-21.4-69.8-23.8-124.2-2.4-54.8-3-72.2-3-211.2s0.6-156.4 3-211c2.4-54.4 11.2-91.8 23.8-124.2 13.2-33.8 30.6-62.4 59.2-90.8 28.4-28.4 57-46 90.6-59 32.6-12.6 69.8-21.4 124.2-23.8 54.6-2.4 72-3 211-3s156.4 0.6 211 3c54.4 2.4 91.8 11.2 124.2 23.8 33.6 13 62.2 30.6 90.6 59s46 57 59 90.6c12.6 32.6 21.4 69.8 23.8 124.2 2.4 54.6 3 72 3 211s-0.6 156.4-3 211c-2.4 54.4-11.2 91.8-23.8 124.2-12.6 34-30 62.6-58.6 91-28.4 28.4-57 46-90.6 59-32.6 12.6-69.8 21.4-124.2 23.8-54.8 2.6-72.2 3.2-211.2 3.2v0zM512 711c-145.2 0-263-117.8-263-263s117.8-263 263-263 263 117.8 263 263c0 145.2-117.8 263-263 263zM512 277.4c-94.2 0-170.6 76.4-170.6 170.6s76.4 170.6 170.6 170.6c94.2 0 170.6-76.4 170.6-170.6s-76.4-170.6-170.6-170.6zM846.8 721.4c0-33.91-27.49-61.4-61.4-61.4s-61.4 27.49-61.4 61.4c0 33.91 27.49 61.4 61.4 61.4s61.4-27.49 61.4-61.4z" />
+<glyph unicode="&#xea96;" glyph-name="twitter" d="M1024 733.6c-37.6-16.8-78.2-28-120.6-33 43.4 26 76.6 67.2 92.4 116.2-40.6-24-85.6-41.6-133.4-51-38.4 40.8-93 66.2-153.4 66.2-116 0-210-94-210-210 0-16.4 1.8-32.4 5.4-47.8-174.6 8.8-329.4 92.4-433 219.6-18-31-28.4-67.2-28.4-105.6 0-72.8 37-137.2 93.4-174.8-34.4 1-66.8 10.6-95.2 26.2 0-0.8 0-1.8 0-2.6 0-101.8 72.4-186.8 168.6-206-17.6-4.8-36.2-7.4-55.4-7.4-13.6 0-26.6 1.4-39.6 3.8 26.8-83.4 104.4-144.2 196.2-146-72-56.4-162.4-90-261-90-17 0-33.6 1-50.2 3 93.2-59.8 203.6-94.4 322.2-94.4 386.4 0 597.8 320.2 597.8 597.8 0 9.2-0.2 18.2-0.6 27.2 41 29.4 76.6 66.4 104.8 108.6z" />
+<glyph unicode="&#xea9d;" glyph-name="youtube" d="M1013.8 652.8c0 0-10 70.6-40.8 101.6-39 40.8-82.6 41-102.6 43.4-143.2 10.4-358.2 10.4-358.2 10.4h-0.4c0 0-215 0-358.2-10.4-20-2.4-63.6-2.6-102.6-43.4-30.8-31-40.6-101.6-40.6-101.6s-10.2-82.8-10.2-165.8v-77.6c0-82.8 10.2-165.8 10.2-165.8s10-70.6 40.6-101.6c39-40.8 90.2-39.4 113-43.8 82-7.8 348.2-10.2 348.2-10.2s215.2 0.4 358.4 10.6c20 2.4 63.6 2.6 102.6 43.4 30.8 31 40.8 101.6 40.8 101.6s10.2 82.8 10.2 165.8v77.6c-0.2 82.8-10.4 165.8-10.4 165.8zM406.2 315.2v287.8l276.6-144.4-276.6-143.4z" />
+<glyph unicode="&#xeaa4;" glyph-name="flickr2" d="M800 544c-70.58 0-128-57.42-128-128s57.42-128 128-128c70.58 0 128 57.42 128 128s-57.42 128-128 128zM800 640v0c123.71 0 224-100.288 224-224 0-123.71-100.29-224-224-224s-224 100.29-224 224c0 123.712 100.29 224 224 224zM0 416c0 123.712 100.288 224 224 224s224-100.288 224-224c0-123.712-100.288-224-224-224s-224 100.288-224 224z" />
+</font></defs></svg>
\ No newline at end of file
diff --git a/resources/fonts/socials.ttf b/resources/fonts/socials.ttf
new file mode 100644
index 00000000000..f5ca33af889
Binary files /dev/null and b/resources/fonts/socials.ttf differ
diff --git a/resources/fonts/socials.woff b/resources/fonts/socials.woff
new file mode 100644
index 00000000000..ce4da62fbc8
Binary files /dev/null and b/resources/fonts/socials.woff differ
diff --git a/resources/img/noise.png b/resources/img/noise.png
new file mode 100644
index 00000000000..26d43172a1f
Binary files /dev/null and b/resources/img/noise.png differ
diff --git a/resources/js/app.ts b/resources/js/app.ts
new file mode 100644
index 00000000000..a861ddcf394
--- /dev/null
+++ b/resources/js/app.ts
@@ -0,0 +1,20 @@
+import "lazysizes";
+
+import { webauthn } from "./data/webauthn";
+import { views } from "./data/views";
+import { panels } from "./data/panel";
+import { qrBuilder } from "./data/qrcode/qrBuilder";
+
+// suggested in the Alpine docs:
+// make Alpine on window available for better DX
+window.Alpine = Alpine;
+
+document.addEventListener("alpine:init", () => {
+	[...webauthn, ...views, ...panels].forEach(Alpine.plugin);
+	Alpine.plugin(qrBuilder);
+
+	Alpine.store("photo", undefined);
+	Alpine.store("photos", []);
+	Alpine.store("photoIDs", []);
+	Alpine.store("albumIDs", []);
+});
diff --git a/resources/js/data/panel/index.ts b/resources/js/data/panel/index.ts
new file mode 100644
index 00000000000..3a4951b0f72
--- /dev/null
+++ b/resources/js/data/panel/index.ts
@@ -0,0 +1,14 @@
+import { searchPanel } from "./searchPanel";
+import { photoListingPanel } from "./photoListingPanel";
+import { photoFormPanel } from "./photoFormPanel";
+import { photoSidebarPanel } from "./photoSidebarPanel";
+
+export const panels = {
+	photoFormPanel,
+	searchPanel,
+	photoListingPanel,
+	photoSidebarPanel,
+	[Symbol.iterator]: function* () {
+		yield* Object.values(this);
+	},
+};
diff --git a/resources/js/data/panel/photoFormPanel.ts b/resources/js/data/panel/photoFormPanel.ts
new file mode 100644
index 00000000000..d896b319721
--- /dev/null
+++ b/resources/js/data/panel/photoFormPanel.ts
@@ -0,0 +1,68 @@
+import type { Alpine, AlpineComponent } from "alpinejs";
+import { Photo } from "@/lycheeOrg/backend";
+import { PhotoView } from "../views/photoView";
+
+export type PhotoFormPanel = AlpineComponent<{
+	photo: Photo; // Object Proxy link
+	photoID: string;
+	title: string;
+	description: string;
+	tagsWithComma: string;
+	uploadDate: string;
+	uploadTz: string;
+	license: string;
+	photoView: PhotoView;
+
+	updatePhoto: () => Promise<void>;
+	refreshForm: (photo: Photo) => void;
+}>;
+
+/**
+ * This components updates the select property of albumView with the photos contains.
+ * Otherwise we hare hitting race conditions between the rendering, class binding and the presence of properties in the component.
+ */
+export const photoFormPanel = (Alpine: Alpine) =>
+	Alpine.data(
+		"photoFormPanel",
+		// @ts-expect-error
+		(): PhotoFormPanel => ({
+			init() {
+				this.photo = Alpine.store("photo") as Photo;
+				this.refreshForm(this.photo);
+			},
+
+			refreshForm(data: Photo) {
+				this.photoID = data.id;
+				this.title = data.title;
+				this.description = data.description ?? "";
+				this.tagsWithComma = data.tags.join(", ");
+				this.uploadDate = (data.created_at ?? "").slice(0, 16);
+				this.uploadTz = (data.created_at ?? "").slice(17);
+				this.license = data.license;
+			},
+
+			async updatePhoto(): Promise<void> {
+				const formData = {
+					photoID: this.photoID,
+					title: this.title,
+					description: this.description,
+					tagsWithComma: this.tagsWithComma,
+					uploadDate: this.uploadDate,
+					uploadTz: this.uploadTz,
+					license: this.license,
+				};
+
+				// @ts-expect-error
+				const data = await this.$wire.updatePhoto(formData);
+				if (data !== null) {
+					this.photo.license = data.license;
+					this.photo.description = data.description;
+					this.photo.created_at = data.created_at;
+					this.photo.tags = data.tags;
+
+					// refresh data
+					this.refreshForm(data);
+				}
+			},
+		}),
+	);
diff --git a/resources/js/data/panel/photoListingPanel.ts b/resources/js/data/panel/photoListingPanel.ts
new file mode 100644
index 00000000000..b54a8411c11
--- /dev/null
+++ b/resources/js/data/panel/photoListingPanel.ts
@@ -0,0 +1,26 @@
+import type { Alpine, AlpineComponent } from "alpinejs";
+import Selection from "@/lycheeOrg/actions/selection";
+import { Photo } from "@/lycheeOrg/backend";
+
+export type PhotoListingPanel = AlpineComponent<{
+	select: Selection;
+	photos: Photo[];
+}>;
+
+/**
+ * This components updates the select property of albumView with the photos contains.
+ * Otherwise we hare hitting race conditions between the rendering, class binding and the presence of properties in the component.
+ */
+export const photoListingPanel = (Alpine: Alpine) =>
+	Alpine.data(
+		"photoListingPanel",
+		// @ts-expect-error
+		(photos: Photo[], select: Selection): PhotoListingPanel => ({
+			photos: photos,
+			select: select,
+
+			init() {
+				select.updatePhotos(photos);
+			},
+		}),
+	);
diff --git a/resources/js/data/panel/photoSidebarPanel.ts b/resources/js/data/panel/photoSidebarPanel.ts
new file mode 100644
index 00000000000..930e693f382
--- /dev/null
+++ b/resources/js/data/panel/photoSidebarPanel.ts
@@ -0,0 +1,41 @@
+import type { Alpine, AlpineComponent } from "alpinejs";
+import { Photo, PreComputed, PreFormatted } from "@/lycheeOrg/backend";
+import SidebarMap from "@/lycheeOrg/actions/sidebarMap";
+
+export type PhotoSidebarPanel = AlpineComponent<{
+	photo: Photo;
+	preformatted: PreFormatted | null;
+	precomputed: PreComputed | null;
+	map: SidebarMap | null;
+
+	refreshSidebar: (photo: Photo) => void;
+	displayMap: () => void;
+}>;
+
+/**
+ * This components updates the select property of albumView with the photos contains.
+ * Otherwise we hare hitting race conditions between the rendering, class binding and the presence of properties in the component.
+ */
+export const photoSidebarPanel = (Alpine: Alpine) =>
+	Alpine.data(
+		"photoSidebarPanel",
+		// @ts-expect-error
+		(): PhotoSidebarPanel => ({
+			init() {
+				this.refreshSidebar(this.$store.photo as Photo);
+			},
+
+			refreshSidebar(photo: Photo) {
+				this.photo = photo;
+				this.precomputed = photo.precomputed;
+				this.preformatted = photo.preformatted;
+			},
+
+			displayMap(): void {
+				if (this.precomputed?.has_location) {
+					this.map = new SidebarMap();
+					this.map.displayOnMap(this.photo.latitude as number, this.photo.longitude as number, this.photo.img_direction);
+				}
+			},
+		}),
+	);
diff --git a/resources/js/data/panel/searchPanel.ts b/resources/js/data/panel/searchPanel.ts
new file mode 100644
index 00000000000..c28b9fbbb3f
--- /dev/null
+++ b/resources/js/data/panel/searchPanel.ts
@@ -0,0 +1,41 @@
+import type { Alpine, AlpineComponent } from "alpinejs";
+import Selection from "@/lycheeOrg/actions/selection";
+
+export type SearchPanel = AlpineComponent<{
+	searchQuery: string;
+	hideMessage: boolean;
+	minLength: number;
+	select: Selection;
+	setMessageHidden: () => void;
+	search: (newValue: string) => void;
+}>;
+
+export const searchPanel = (Alpine: Alpine) =>
+	Alpine.data(
+		"searchPanel",
+		// @ts-expect-error
+		(searchQuery: string, minLength: number, select: Selection): SearchPanel => ({
+			searchQuery: searchQuery,
+			hideMessage: false,
+			minLength: minLength,
+			select: select,
+
+			init() {
+				this.$refs.search.focus();
+				this.setMessageHidden();
+				this.$watch("searchQuery", (newValue) => {
+					this.setMessageHidden();
+					this.search(newValue);
+				});
+			},
+
+			setMessageHidden() {
+				this.hideMessage = this.searchQuery.length < minLength && this.searchQuery.length > 0;
+			},
+
+			search(newValue) {
+				// @ts-expect-error
+				this.$wire.set("searchQuery", newValue);
+			},
+		}),
+	);
diff --git a/resources/js/data/qrcode/qrBuilder.ts b/resources/js/data/qrcode/qrBuilder.ts
new file mode 100644
index 00000000000..864ac66afc2
--- /dev/null
+++ b/resources/js/data/qrcode/qrBuilder.ts
@@ -0,0 +1,23 @@
+import QRCode from "qrcode";
+import type { Alpine } from "alpinejs";
+
+export const qrBuilder = (Alpine: Alpine) =>
+	Alpine.data("qrBuilder", () => ({
+		qrCodeOpen: false,
+
+		setQrCode(url: string): void {
+			QRCode.toCanvas(
+				document.getElementById("canvas"),
+				url,
+				{
+					errorCorrectionLevel: "H",
+					// fill: '#000000',
+					// background: '#FFFFFF',
+					// size: 300,
+				},
+				function (err: Error | null | undefined) {
+					if (err) throw err;
+				},
+			);
+		},
+	}));
diff --git a/resources/js/data/views/albumView.ts b/resources/js/data/views/albumView.ts
new file mode 100644
index 00000000000..148aef6b5e9
--- /dev/null
+++ b/resources/js/data/views/albumView.ts
@@ -0,0 +1,334 @@
+import Selection from "@/lycheeOrg/actions/selection";
+import AlbumActions from "@/lycheeOrg/actions/albumActions";
+import type { Alpine } from "alpinejs";
+import type { AlbumRightsDTO, Layouts, OverlayTypes, Photo } from "@/lycheeOrg/backend";
+import { AlbumView } from "./types";
+import Keybindings from "@/lycheeOrg/actions/keybindings";
+import AlbumFlags from "@/lycheeOrg/flags/albumFlags";
+import PhotoFlagsView from "@/lycheeOrg/flags/photoFlags";
+import PhotoLayout from "@/lycheeOrg/layouts/PhotoLayout";
+
+export const albumView = (Alpine: Alpine) =>
+	Alpine.data(
+		"albumView",
+		// @ts-expect-error
+		(
+			base_url: string,
+			nsfwAlbumsVisible: boolean,
+			isFullscreen: boolean,
+			isPhotoDetailsOpen: boolean,
+			rights: AlbumRightsDTO,
+			parent_id: string | null = null,
+			albumIDs: string[] = [],
+			photos: Photo[] = [],
+			selectedPhoto: string = "",
+			overlayType: OverlayTypes = "none",
+			layouts: Layouts = {
+				photos_layout: "square",
+				photo_layout_grid_column_width: 250,
+				photo_layout_justified_row_height: 320,
+				photo_layout_masonry_column_width: 300,
+				photo_layout_square_column_width: 200,
+				photo_layout_gap: 12,
+			},
+			isSearch: boolean = false,
+		): AlbumView => ({
+			base_url: base_url,
+			isSearch: isSearch,
+			select: new Selection(albumIDs, photos, rights.can_edit),
+			actions: new AlbumActions(),
+			keybinds: new Keybindings(),
+			albumFlags: new AlbumFlags(nsfwAlbumsVisible),
+			photoFlags: new PhotoFlagsView(isPhotoDetailsOpen, overlayType),
+			rights: rights,
+			loginModalOpen: false,
+			parent_id: parent_id,
+			isFullscreen: isFullscreen,
+			photoLayout: new PhotoLayout(layouts),
+			photo_id: null,
+
+			init() {
+				console.log("init albumView!");
+				if (selectedPhoto !== "" && selectedPhoto !== null) {
+					this.$store.photo = Selection.getPhoto(selectedPhoto);
+					if (this.$store.photo === undefined) {
+						console.log(selectedPhoto + " not found!");
+						return;
+					}
+					// Just make sure that the photo actually exists.
+					this.photo_id = (this.$store.photo as Photo).id;
+				}
+
+				this.photoLayout.activateLayout();
+
+				// TODO: See if we really need this $watch.
+				this.$watch("photoLayout.type", (value, oldValue) => {
+					if (value !== oldValue) {
+						this.photoLayout.activateLayout();
+					}
+				});
+			},
+
+			toggleFullScreen() {
+				this.isFullscreen = !this.isFullscreen;
+
+				// @ts-expect-error
+				this.$wire.silentUpdate();
+			},
+
+			toggleNSFW() {
+				this.albumFlags.areNsfwVisible = !this.albumFlags.areNsfwVisible;
+				// @ts-expect-error
+				this.$wire.silentUpdate();
+			},
+
+			toggleDetails() {
+				this.albumFlags.isDetailsOpen = !this.albumFlags.isDetailsOpen;
+			},
+
+			handleContextPhoto(event: MouseEvent) {
+				this.actions.handleContextPhoto(event, this);
+			},
+
+			handleClickPhoto(event: MouseEvent) {
+				this.actions.handleClickPhoto(event, this);
+			},
+
+			handleContextAlbum(event: MouseEvent) {
+				this.actions.handleContextAlbum(event, this);
+			},
+
+			handlePopState(event: PopStateEvent) {
+				const photoId = event.state.photoId;
+				const photo = Selection.getPhoto(photoId);
+				if (photo === undefined) {
+					this.photo_id = null;
+					return;
+				}
+				this.photo_id = photo.id;
+			},
+
+			handleKeydown(event: KeyboardEvent) {
+				const skipped = ["TEXTAREA", "INPUT", "SELECT"];
+
+				if (document.activeElement !== null && skipped.includes(document.activeElement.nodeName)) {
+					console.log("skipped: " + document.activeElement.nodeName);
+					return;
+				}
+
+				// [h] hide
+				// [f] fullscreen
+				// [l] login
+				// [k] keybinds
+				// [esc] back
+				if (this.keybinds.handleGlobalKeydown(event, this)) {
+					return;
+				}
+
+				// [ ->] next
+				// [ <-] previous
+				// [i] info
+				// [o] overlay
+				// [e] edit
+				// [m] move
+				// [ctrl + del] delete
+				// [s] Star
+				// [ctrl + ->] rotate CW
+				// [ctrl + <-] rotate CCW
+				if (this.photo_id !== null && this.keybinds.handlePhotoKeyDown(event, this)) {
+					return;
+				}
+
+				// ctrl + a
+				if (this.select.handleKeydown(event)) {
+					return;
+				}
+
+				// [n] new
+				// [u] upload
+				// [m] move (if selection is active)
+				// [r] rename (if selection is active)
+				// [d] description
+				// [i] info
+				// [m] move (without select)
+				// [r] rename (without select)
+				this.keybinds.handleAlbumKeydown(event, this);
+			},
+
+			moveAlbums() {
+				const params = ["forms.album.move", "", { parentID: this.parent_id, albumIDs: this.select.selectedAlbums }];
+				Livewire.dispatch("openModal", params);
+			},
+
+			mergeAlbums() {
+				const params = ["forms.album.merge", "", { parentID: this.parent_id, albumIDs: this.select.selectedAlbums }];
+				Livewire.dispatch("openModal", params);
+			},
+
+			renameAlbums() {
+				const params = ["forms.album.rename", "", { parentID: this.parent_id, albumIDs: this.select.selectedAlbums }];
+				Livewire.dispatch("openModal", params);
+			},
+
+			deleteAlbums() {
+				const params = ["forms.album.delete", "", { parentID: this.parent_id, albumIDs: this.select.selectedAlbums }];
+				Livewire.dispatch("openModal", params);
+			},
+
+			donwloadAlbums() {
+				window.open("api/Album::getArchive?albumIDs=" + this.select.selectedAlbums.join(","));
+			},
+
+			copyPhotosTo() {
+				const params = ["forms.photo.copy-to", "", { albumID: this.parent_id, photoIDs: this.select.selectedPhotos }];
+				Livewire.dispatch("openModal", params);
+			},
+
+			movePhotos() {
+				const params = ["forms.photo.move", "", { albumID: this.parent_id, photoIDs: this.select.selectedPhotos }];
+				Livewire.dispatch("openModal", params);
+			},
+
+			renamePhotos() {
+				const params = ["forms.photo.rename", "", { albumID: this.parent_id, photoIDs: this.select.selectedPhotos }];
+				Livewire.dispatch("openModal", params);
+			},
+
+			deletePhotos() {
+				const params = ["forms.photo.delete", "", { albumID: this.parent_id, photoIDs: this.select.selectedPhotos }];
+				Livewire.dispatch("openModal", params);
+			},
+
+			tagPhotos() {
+				const params = ["forms.photo.tag", "", { photoIDs: this.select.selectedPhotos }];
+				Livewire.dispatch("openModal", params);
+			},
+
+			starPhotos() {
+				// @ts-ignore
+				this.$wire.setStar(this.select.selectedPhotos);
+				this.select.selectedPhotos.forEach((photo_id) => {
+					(Selection.getPhoto(photo_id) as Photo).is_starred = true;
+				});
+			},
+
+			unstarPhotos() {
+				// @ts-ignore
+				this.$wire.unsetStar(this.select.selectedPhotos);
+				this.select.selectedPhotos.forEach((photo_id) => {
+					(Selection.getPhoto(photo_id) as Photo).is_starred = false;
+				});
+			},
+
+			setCover() {
+				// @ts-ignore
+				this.$wire.setCover(this.select.selectedPhotos[0]);
+			},
+
+			donwloadPhotos() {
+				window.open("api/Photo::getArchive?kind=ORIGINAL&photoIDs=" + this.select.selectedPhotos.join(","));
+			},
+
+			rotateOverlay() {
+				if (this.$store.photo === undefined) {
+					console.log("undefined");
+					return;
+				}
+				this.photoFlags.rotateOverlay();
+			},
+
+			goTo(photoId: string | null): void {
+				this.albumFlags.isDetailsOpen = false;
+				const elder_id = this.parent_id ?? (this.$store.photo as Photo | null)?.album_id;
+
+				if (photoId === null) {
+					this.$store.photo = undefined;
+					this.photo_id = null;
+					this.history({}, this.base_url + "/" + elder_id);
+					return;
+				}
+
+				this.$store.photo = Selection.getPhoto(photoId);
+				if (this.$store.photo === undefined) {
+					console.log(photoId + " not found!");
+					return;
+				}
+				console.log(this.$store.photo);
+				this.photo_id = photoId;
+				this.history({ photoId: photoId }, this.base_url + "/" + elder_id + "/" + photoId);
+				this.$dispatch("photo-updated");
+			},
+
+			history(obj: object, url: string) {
+				if (this.isSearch !== true) {
+					history.pushState(obj, "", url);
+				}
+			},
+
+			previous(): void {
+				const previousId = (this.$store.photo as Photo | null)?.previous_photo_id ?? null;
+				this.goTo(previousId);
+			},
+
+			next(): void {
+				const nextId = (this.$store.photo as Photo | null)?.next_photo_id ?? null;
+				this.goTo(nextId);
+			},
+
+			async toggleStar(): Promise<void> {
+				if (this.$store.photo === undefined) {
+					return;
+				}
+
+				// @ts-expect-error
+				const success = await this.$wire.toggleStar([this.photo.id]);
+				if (success) {
+					(this.$store.photo as Photo).is_starred = !(this.$store.photo as Photo).is_starred;
+				}
+			},
+
+			movePhoto(): void {
+				if (this.$store.photo === undefined) {
+					return;
+				}
+				const params = ["forms.photo.move", "", { photoIDs: [(this.$store.photo as Photo).id], albumID: this.parent_id }];
+				Livewire.dispatch("openModal", params);
+			},
+
+			deletePhoto(): void {
+				if (this.$store.photo === undefined) {
+					return;
+				}
+
+				const params = ["forms.photo.delete", "", { photoIDs: [(this.$store.photo as Photo).id], albumID: this.parent_id }];
+				Livewire.dispatch("openModal", params);
+			},
+
+			downloadPhoto(): void {
+				if (this.$store.photo === undefined) {
+					return;
+				}
+
+				const params = ["forms.photo.download", "", { photoIDs: [(this.$store.photo as Photo).id], albumID: this.parent_id }];
+				Livewire.dispatch("openModal", params);
+			},
+
+			rotatePhotoCCW(): void {
+				if (this.$store.photo === undefined) {
+					return;
+				}
+
+				// @ts-expect-error
+				this.$wire.rotate_ccw((this.$store.photo as Photo).id);
+			},
+
+			rotatePhotoCW(): void {
+				if (this.$store.photo === undefined) {
+					return;
+				}
+
+				// @ts-expect-error
+				this.$wire.rotate_cw((this.$store.photo as Photo).id);
+			},
+		}),
+	);
diff --git a/resources/js/data/views/index.ts b/resources/js/data/views/index.ts
new file mode 100644
index 00000000000..92acce414a2
--- /dev/null
+++ b/resources/js/data/views/index.ts
@@ -0,0 +1,14 @@
+import { albumView } from "./albumView";
+import { mapView } from "./mapView";
+import { uploadView } from "./uploadView";
+import { photoView } from "./photoView";
+
+export const views = {
+	albumView,
+	photoView,
+	mapView,
+	uploadView,
+	[Symbol.iterator]: function* () {
+		yield* Object.values(this);
+	},
+};
diff --git a/resources/js/data/views/map.types.d.ts b/resources/js/data/views/map.types.d.ts
new file mode 100644
index 00000000000..701fd24a23b
--- /dev/null
+++ b/resources/js/data/views/map.types.d.ts
@@ -0,0 +1,38 @@
+import { AlpineComponent } from "alpinejs";
+import { Album, PositionData, TagAlbum } from "../../lycheeOrg/backend";
+import { LatLngBounds } from "leaflet";
+
+export interface MapProvider {
+	layer: string;
+	attribution: string;
+}
+
+export interface MapPhotoEntry {
+	lat?: number | null;
+	lng?: number | null;
+	thumbnail?: string | null;
+	thumbnail2x?: string | null;
+	url: string;
+	url2x: string | null;
+	name: string;
+	taken_at: string | null;
+	albumID: string | null;
+	photoID: string;
+}
+
+export type Map = AlpineComponent<{
+	map: null | L.Map;
+	layer: string;
+	attribution: string;
+	camera_date: string;
+	photoLayer: null;
+	trackLayer: null;
+	data: Album | TagAlbum | PositionData;
+	bounds: LatLngBounds | null | number[][];
+	albumID: string | null;
+	map_provider: string | null;
+	mapInit: (albumID?: string | null) => void;
+	open: (albumID?: string | null) => void;
+	addContentsToMap: () => void;
+	updateZoom: () => void;
+}>;
diff --git a/resources/js/data/views/mapView.ts b/resources/js/data/views/mapView.ts
new file mode 100644
index 00000000000..29b88e6a166
--- /dev/null
+++ b/resources/js/data/views/mapView.ts
@@ -0,0 +1,197 @@
+// @ts-nocheck
+import L from "leaflet";
+import "leaflet-rotatedmarker/leaflet.rotatedMarker.js";
+import "leaflet.markercluster/dist/leaflet.markercluster.js";
+import "@lychee-org/leaflet.photo/Leaflet.Photo.js";
+import "leaflet/dist/leaflet.css";
+import "@lychee-org/leaflet.photo/Leaflet.Photo.css";
+import { Alpine } from "alpinejs";
+import { Album, Photo, PositionData, TagAlbum } from "@/lycheeOrg/backend";
+import { MapPhotoEntry, Map } from "./map.types";
+
+export const mapView = (Alpine: Alpine) =>
+	Alpine.data(
+		"mapView",
+		// @ts-expect-error
+		(layer_val: string, attribution_val: string, camera_date_val: string, data_val: Album | TagAlbum | PositionData): Map => ({
+			map: null,
+			layer: layer_val,
+			attribution: attribution_val,
+			camera_date: camera_date_val,
+			photoLayer: null,
+			trackLayer: null,
+			data: data_val,
+			bounds: null,
+			albumID: null,
+			map_provider: null,
+
+			mapInit(albumID: string | null = null) {
+				// Leaflet searches for icon in same directory as js file -> paths need
+				// to be overwritten
+				// @ts-ignore
+				delete L.Icon.Default.prototype._getIconUrl;
+				L.Icon.Default.mergeOptions({
+					iconRetinaUrl: "img/marker-icon-2x.png",
+					iconUrl: "img/marker-icon.png",
+					shadowUrl: "img/marker-shadow.png",
+				});
+
+				// Set initial view to (0,0)
+				this.map = L.map("lychee_map_container").setView([0.0, 0.0], 2);
+
+				L.tileLayer(this.layer, { attribution: this.attribution }).addTo(this.map);
+
+				this.open();
+
+				this.addContentsToMap();
+			},
+
+			open(albumID: string | null = null) {
+				// Define how the photos on the map should look like
+				// @ts-ignore
+				this.photoLayer = L.photo.cluster().on("click", function (e) {
+					const photo: MapPhotoEntry = {
+						photoID: e.layer.photo.photoID,
+						albumID: e.layer.photo.albumID,
+						name: e.layer.photo.name,
+						url: e.layer.photo.url,
+						url2x: e.layer.photo.url2x,
+						taken_at: e.layer.photo.taken_at,
+					};
+					let template = "";
+
+					// Retina version if available
+					if (photo.url2x !== "") {
+						template = template.concat(
+							'<img class=" w-full h-auto" src="{url}" srcset="{url} 1x, {url2x} 2x" data-album-id="{albumID}" data-id="{photoID}"/>',
+							'<div class=" pointer-events-none absolute w-full bottom-0 m-0 bg-gradient-to-t from-[#00000066]" style="width:401px; bottom: 13px;">',
+							'<h1 class=" min-h-[19px] mt-3 mb-1 ml-3 text-text-main-0 text-base font-bold overflow-hidden whitespace-nowrap text-ellipsis">{name}</h1>',
+							'<p class="block mt-0 mr-0 mb-2 ml-3 text-2xs text-text-main-200">',
+							'<span class="inline-block mx-3" title="' + this.camera_date + '">',
+							'<svg class="inline-block h-4 w-4 fill-neutral-400"><use xlink:href="#camera-slr" /></svg>',
+							"</span>",
+							"{taken_at}</p>",
+							"</div>",
+						);
+					} else {
+						template = template.concat(
+							'<img class=" w-full h-auto" src="{url}" data-album-id="{albumID}" data-id="{photoID}"/>',
+							'<div class=" pointer-events-none absolute w-full bottom-0 m-0 bg-gradient-to-t from-[#00000066]" style="width:401px; bottom: 13px;">',
+							'<h1 class=" min-h-[19px] mt-3 mb-1 ml-3 text-text-main-0 text-base font-bold overflow-hidden whitespace-nowrap text-ellipsis">{name}</h1>',
+							'<p class="block mt-0 mr-0 mb-2 ml-3 text-2xs text-text-main-200">',
+							'<span class="inline-block mx-3" title="' + this.camera_date + '">',
+							'<svg class="inline-block h-4 w-4 fill-neutral-400"><use xlink:href="#camera-slr" /></svg>',
+							"</span>",
+							"{taken_at}</p>",
+							"</div>",
+						);
+					}
+
+					e.layer
+						.bindPopup(L.Util.template(template, photo), {
+							minWidth: 400,
+						})
+						.openPopup();
+				});
+			},
+
+			/**
+			 * Adds photos to the map.
+			 */
+			addContentsToMap() {
+				// check if empty
+				if (!this.data.photos) return;
+				if (this.photoLayer === null) return;
+
+				let photos: MapPhotoEntry[] = [];
+				let min_lat: number | null = null;
+				let min_lng: number | null = null;
+				let max_lat: number | null = null;
+				let max_lng: number | null = null;
+
+				this.data.photos.forEach(function (element: Photo) {
+					if (element.latitude || element.longitude) {
+						console.log(element);
+						photos.push({
+							lat: element.latitude,
+							lng: element.longitude,
+							thumbnail: element.size_variants.thumb?.url ?? "img/placeholder.png",
+							thumbnail2x: element.size_variants.thumb2x?.url,
+							url: element.size_variants.small?.url ?? element.url,
+							url2x: element.size_variants.small2x?.url ?? "",
+							name: element.title,
+							taken_at: element.preformatted.taken_at,
+							albumID: element.album_id,
+							photoID: element.id,
+						});
+
+						// Update min/max lat/lng
+						if (element.latitude !== null && (min_lat === null || min_lat > element.latitude)) {
+							min_lat = element.latitude;
+						}
+						if (element.longitude !== null && (min_lng === null || min_lng > element.longitude)) {
+							min_lng = element.longitude;
+						}
+						if (element.latitude !== null && (max_lat === null || max_lat < element.latitude)) {
+							max_lat = element.latitude;
+						}
+						if (element.longitude !== null && (max_lng === null || max_lng < element.longitude)) {
+							max_lng = element.longitude;
+						}
+					}
+				});
+
+				// Add Photos to map
+				this.photoLayer.add(photos).addTo(this.map);
+
+				if (max_lat === null || min_lat === null || max_lng === null || min_lng === null) {
+					return;
+				}
+
+				if (photos.length > 0) {
+					// update map bounds
+					const dist_lat = max_lat - min_lat;
+					const dist_lng = max_lng - min_lng;
+					this.bounds = [
+						[min_lat - 0.1 * dist_lat, min_lng - 0.1 * dist_lng],
+						[max_lat + 0.1 * dist_lat, max_lng + 0.1 * dist_lng],
+					];
+				}
+
+				// add track
+				if (this.data.track_url) {
+					this.trackLayer = new L.GPX(this.data.track_url, {
+						async: true,
+						marker_options: {
+							startIconUrl: null,
+							endIconUrl: null,
+							shadowUrl: null,
+						},
+					})
+						.on("error", function (e) {
+							Livewire.dispatch("notify", { msg: "Error loading GPX file:" + e.err, type: "error" });
+						})
+						.on("loaded", function (e) {
+							if (photos.length === 0) {
+								// no photos, update map bound to center track
+								this.bounds = e.target.getBounds();
+								this.updateZoom();
+							}
+						});
+					this.trackLayer.addTo(this.map);
+				}
+
+				// Update Zoom and Position
+				this.updateZoom();
+			},
+
+			// Adjusts zoom and position of map to show all images
+			updateZoom() {
+				if (this.bounds) {
+					this.map.fitBounds(this.bounds);
+				} else {
+					this.map.fitWorld();
+				}
+			},
+		}),
+	);
diff --git a/resources/js/data/views/photoView.ts b/resources/js/data/views/photoView.ts
new file mode 100644
index 00000000000..ff7146d8e0d
--- /dev/null
+++ b/resources/js/data/views/photoView.ts
@@ -0,0 +1,141 @@
+import type { Alpine, AlpineComponent } from "alpinejs";
+import Selection from "@/lycheeOrg/actions/selection";
+import { Photo } from "@/lycheeOrg/backend";
+import PhotoFlagsView from "@/lycheeOrg/flags/photoFlags";
+
+export type PhotoView = AlpineComponent<{
+	photoFlags: PhotoFlagsView;
+	photo: Photo;
+	// photo_id: string;
+	parent_id: string;
+
+	style: string;
+	srcSetMedium: string;
+	mode: number;
+
+	refreshPhotoView: (photo: Photo) => void;
+
+	previousStyle: () => string;
+	nextStyle: () => string;
+	displayMap(): void;
+
+	imageViewMode: () => number;
+	getSrcSetMedium: () => string;
+	getStyle: () => string;
+}>;
+
+export const photoView = (Alpine: Alpine) =>
+	Alpine.data(
+		"photoView",
+		// @ts-expect-error
+		(
+			// photo_id: string,
+			photoFlags: PhotoFlagsView,
+			parent_id: string,
+			// @ts-expect-error
+		): PhotoView => ({
+			// photo_id: photo_id,
+			photoFlags: photoFlags,
+			parent_id: parent_id,
+			srcSetMedium: "",
+			style: "",
+			mode: 0,
+
+			init() {
+				// @ts-expect-errror
+				console.log("init photoView!");
+
+				const photo = Alpine.store("photo") as Photo | undefined;
+				if (photo === undefined) {
+					throw new Error("not found!");
+				}
+				this.photo = photo;
+				console.log(photo);
+				console.log("wtf");
+				this.refreshPhotoView(photo);
+			},
+
+			refreshPhotoView(photo: Photo) {
+				console.log("refresh!");
+				console.log(photo);
+				this.photo = photo;
+				// cascade
+				this.srcSetMedium = this.getSrcSetMedium();
+				this.style = this.getStyle();
+				this.mode = this.imageViewMode();
+			},
+
+			previousStyle(): string {
+				const previousId = this.photo.previous_photo_id;
+				if (previousId === null || previousId === undefined) {
+					return "";
+				}
+				const previousPhoto = Selection.getPhoto(previousId);
+				if (previousPhoto === undefined) {
+					return "";
+				}
+				return (
+					"background-image: linear-gradient(rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0.4)), url('" + previousPhoto.size_variants.thumb?.url + "')"
+				);
+			},
+
+			nextStyle(): string {
+				const nextId = this.photo.next_photo_id;
+				if (nextId === null || nextId === undefined) {
+					return "";
+				}
+				const nextPhoto = Selection.getPhoto(nextId);
+				if (nextPhoto === undefined) {
+					return "";
+				}
+				return "background-image: linear-gradient(rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0.4)), url('" + nextPhoto.size_variants.thumb?.url + "')";
+			},
+
+			imageViewMode(): number {
+				if (this.photo.precomputed.is_video) {
+					return 0;
+				}
+				if (this.photo.precomputed.is_raw) {
+					return 1;
+				}
+
+				if (!this.photo.precomputed.is_livephoto) {
+					if (this.photo.size_variants.medium !== null) {
+						return 2;
+					}
+					return 3;
+				}
+				if (this.photo.size_variants.medium !== null) {
+					return 4;
+				}
+				return 5;
+			},
+
+			getSrcSetMedium(): string {
+				if (this.photo.size_variants.medium2x === null || this.photo.size_variants.medium === null) {
+					return "";
+				}
+
+				return (
+					this.photo.size_variants.medium.url +
+					" " +
+					this.photo.size_variants.medium.width +
+					"w, " +
+					this.photo.size_variants.medium2x.url +
+					" " +
+					this.photo.size_variants.medium2x.width +
+					"w"
+				);
+			},
+
+			getStyle(): string {
+				if (!this.photo.precomputed.is_livephoto) {
+					return "background-image: url(" + this.photo.size_variants.small?.url + ")";
+				}
+				if (this.photo.size_variants.medium !== null) {
+					return "width: " + this.photo.size_variants.medium.width + "px; height: " + this.photo.size_variants.medium.height + "px";
+				}
+				return "width: " + this.photo.size_variants.original.width + "px; height: " + this.photo.size_variants.original.height + "px";
+			},
+		}),
+	);
diff --git a/resources/js/data/views/types.d.ts b/resources/js/data/views/types.d.ts
new file mode 100644
index 00000000000..a1a42d32924
--- /dev/null
+++ b/resources/js/data/views/types.d.ts
@@ -0,0 +1,162 @@
+import { AlbumRightsDTO, Photo } from "@/lycheeOrg/backend";
+import { AlpineComponent } from "alpinejs";
+import type Selection from "@/lycheeOrg/actions/selection";
+import type AlbumActions from "@/lycheeOrg/actions/albumActions";
+import type Keybindings from "@/lycheeOrg/actions/keybindings";
+import AlbumFlagsView from "../../lycheeOrg/flags/albumFlags";
+import PhotoFlagsView from "../../lycheeOrg/flags/photoFlags";
+import PhotoLayout from "@/lycheeOrg/layouts/PhotoLayout";
+
+export interface PhotoArray {
+	[key: string]: Photo;
+}
+
+export type AlbumView = AlpineComponent<{
+	// Base URL for the history.
+	base_url: string;
+
+	// Wether we are in search or gallery mode
+	isSearch: boolean;
+
+	// selection Object: contains list of current photos & albums
+	select: Selection;
+
+	// set of actions
+	actions: AlbumActions;
+
+	// global keybindings
+	keybinds: Keybindings;
+
+	// Set of flags in the Album view
+	albumFlags: AlbumFlagsView;
+
+	// set of flags in the Photo view
+	photoFlags: PhotoFlagsView;
+
+	// Whether Login is open
+	// TODO: double check me
+	loginModalOpen: boolean;
+
+	// Parent id: current album id or null
+	parent_id: string | null;
+	// Current rights applied to this album view
+	rights: AlbumRightsDTO;
+
+	// Photo id: current photo id or null
+	photo_id: string | null;
+
+	// Flag whether we are in full screen mode
+	isFullscreen: boolean;
+
+	// Photo layout information in album (justified, masonry etc.)
+	photoLayout: PhotoLayout;
+
+	toggleFullScreen: () => void;
+	toggleNSFW: () => void;
+	toggleDetails: () => void;
+
+	handlePopState: (event: PopStateEvent) => void;
+	handleContextPhoto: (event: MouseEvent) => void;
+	handleClickPhoto: (event: MouseEvent) => void;
+	handleContextAlbum: (event: MouseEvent) => void;
+	handleKeydown: (event: KeyboardEvent) => void;
+
+	goTo(photoId: string | null): void;
+	history(obj: object, url: string): void;
+
+	// Album actions (right click)
+	moveAlbums: () => void;
+	mergeAlbums: () => void;
+	renameAlbums: () => void;
+	deleteAlbums: () => void;
+	donwloadAlbums: () => void;
+
+	// Photo actions (right click)
+	copyPhotosTo: () => void;
+	movePhotos: () => void;
+	renamePhotos: () => void;
+	deletePhotos: () => void;
+	tagPhotos: () => void;
+	starPhotos: () => void;
+	unstarPhotos: () => void;
+	setCover: () => void;
+	donwloadPhotos: () => void;
+
+	// Photo View
+	rotateOverlay: () => void;
+	previous: () => void;
+	next: () => void;
+	toggleStar: () => void;
+	movePhoto: () => void;
+	deletePhoto: () => void;
+	downloadPhoto: () => void;
+	rotatePhotoCCW: () => void;
+	rotatePhotoCW: () => void;
+}>;
+
+export type UploadEvent = Event & { detail: { progress: number } };
+
+export type Livewire = {
+	dispatch: (event: string) => void;
+	close: () => void;
+	upload: (filename: string, file: File, succes: (filename: string) => void, error: () => void, progress: (event: UploadEvent) => void) => void;
+	set: (property: string, value: any) => void;
+};
+
+export type UploadView = AlpineComponent<{
+	isDropping: boolean;
+	chunkSize: number;
+	hasErrorOccurred: boolean;
+	upload_processing_limit: number;
+	chnkStarts: any;
+	fileList: any;
+
+	/**
+	 * 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.
+	 */
+	outstandingResponsesCount: number;
+	/**
+	 * The latest (aka highest) index of a file which is being or has
+	 * been uploaded to the server.
+	 */
+	latestFileIdx: number;
+	/**
+	 * 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}.
+	 */
+	isUploadRunning: boolean;
+
+	/**
+	 * 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: Livewire, alpine: UploadView) => void;
+	process: (fileIdx: number, wire: Livewire, alpine: UploadView) => void;
+	complete: (wire: Livewire, alpine: UploadView) => void;
+	/**
+	 * 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: number, wire: Livewire, alpine: UploadView) => void;
+	start: (wire: Livewire, alpine: UploadView) => void;
+}>;
diff --git a/resources/js/data/views/uploadView.ts b/resources/js/data/views/uploadView.ts
new file mode 100644
index 00000000000..841dda8d1a6
--- /dev/null
+++ b/resources/js/data/views/uploadView.ts
@@ -0,0 +1,101 @@
+import { Alpine } from "alpinejs";
+import { UploadView, Livewire, UploadEvent } from "./types";
+
+export const uploadView = (Alpine: Alpine) =>
+	Alpine.data(
+		"upload",
+		// @ts-expect-error
+		(chunkSize_val: number, parallelism_val: number = 3): UploadView => ({
+			isDropping: false,
+			chunkSize: chunkSize_val,
+			hasErrorOccurred: false,
+			upload_processing_limit: parallelism_val,
+			chnkStarts: [],
+			fileList: [],
+			outstandingResponsesCount: 0,
+			latestFileIdx: 0,
+			isUploadRunning: false,
+
+			finish(wire: Livewire, alpine: UploadView): void {
+				if (!alpine.hasErrorOccurred) {
+					console.log("Success!");
+					wire.dispatch("reloadPage");
+					wire.close();
+				} else {
+					console.log("Well something went wrong...");
+					wire.dispatch("reloadPage");
+					// Error
+				}
+			},
+
+			process(fileIdx: number, wire: Livewire, alpine: UploadView): void {
+				alpine.outstandingResponsesCount++;
+				this.livewireUploadChunk(fileIdx, wire, alpine);
+			},
+
+			complete(wire: Livewire, alpine: UploadView): void {
+				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`.
+			 */
+			livewireUploadChunk(fileIdx: number, wire: Livewire, alpine: UploadView): void {
+				// 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: UploadEvent) => {
+						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);
+							}
+						}
+					},
+				);
+			},
+
+			// @ts-expect-error
+			start(wire: Livewire, alpine: UploadView = this): void {
+				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/data/webauthn/index.ts b/resources/js/data/webauthn/index.ts
new file mode 100644
index 00000000000..44ea96e6d3a
--- /dev/null
+++ b/resources/js/data/webauthn/index.ts
@@ -0,0 +1,10 @@
+import { loginWebAuthn } from "./loginWebAuthn";
+import { registerWebAuthn } from "./registerWebAuthn";
+
+export const webauthn = {
+	loginWebAuthn,
+	registerWebAuthn,
+	[Symbol.iterator]: function* () {
+		yield* Object.values(this);
+	},
+};
diff --git a/resources/js/data/webauthn/loginWebAuthn.ts b/resources/js/data/webauthn/loginWebAuthn.ts
new file mode 100644
index 00000000000..2ced5cc7c9c
--- /dev/null
+++ b/resources/js/data/webauthn/loginWebAuthn.ts
@@ -0,0 +1,52 @@
+import WebAuthn from "@/vendor/webauthn/webauthn.js";
+import type { Alpine, AlpineComponent } from "alpinejs";
+
+interface LoginParam {
+	username?: string;
+	user_id?: number;
+}
+
+type LoginWebAuthn = AlpineComponent<{
+	webAuthnOpen: boolean;
+	success_msg: string;
+	error_msg: string;
+	username: string | null;
+	userId: number | null;
+	isWebAuthnUnavailable: () => boolean;
+	login: () => void;
+}>;
+
+export const loginWebAuthn = (Alpine: Alpine) =>
+	Alpine.data(
+		"loginWebAuthn",
+		// @ts-expect-error
+		(success_msg_val: string = "U2F_AUTHENTIFICATION_SUCCESS", error_msg_val: string = "ERROR_TEXT"): LoginWebAuthn => ({
+			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.
+				const alpine = this;
+				const params: LoginParam = {};
+				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(() => alpine.$dispatch("notify", [{ type: "error", msg: this.error_msg }]));
+			},
+		}),
+	);
diff --git a/resources/js/data/webauthn/registerWebAuthn.ts b/resources/js/data/webauthn/registerWebAuthn.ts
new file mode 100644
index 00000000000..29298727802
--- /dev/null
+++ b/resources/js/data/webauthn/registerWebAuthn.ts
@@ -0,0 +1,47 @@
+import WebAuthn from "@/vendor/webauthn/webauthn.js";
+import type { Alpine, AlpineComponent } from "alpinejs";
+
+type RegisterWebAuthn = AlpineComponent<{
+	success_msg: string;
+	error_msg: string;
+	isWebAuthnUnavailable: () => boolean;
+	register: () => void;
+}>;
+
+export const registerWebAuthn = (Alpine: Alpine) =>
+	Alpine.data(
+		"registerWebAuthn",
+		// @ts-expect-error
+		(success_msg_val: string = "U2F_REGISTRATION_SUCCESS", error_msg_val: string = "ERROR_TEXT"): RegisterWebAuthn => ({
+			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/global.d.ts b/resources/js/global.d.ts
new file mode 100644
index 00000000000..e777d9525c4
--- /dev/null
+++ b/resources/js/global.d.ts
@@ -0,0 +1,10 @@
+import { Alpine as AlpineType } from "alpinejs";
+
+export type Livewire = {
+	dispatch: (event: string, params?: any[]) => void;
+};
+
+declare global {
+	var Alpine: AlpineType;
+	var Livewire: Livewire;
+}
diff --git a/resources/js/lycheeOrg/actions/albumActions.ts b/resources/js/lycheeOrg/actions/albumActions.ts
new file mode 100644
index 00000000000..a9bef0709db
--- /dev/null
+++ b/resources/js/lycheeOrg/actions/albumActions.ts
@@ -0,0 +1,66 @@
+import { AlbumView } from "@/data/views/types";
+
+export default class AlbumActions {
+	handleContextPhoto(event: MouseEvent, view: AlbumView) {
+		if (!view.rights.can_edit) {
+			return;
+		}
+
+		if (event.currentTarget === null) {
+			return;
+		}
+
+		view.select.selectedAlbums = [];
+		// @ts-ignore
+		const photoId = event.currentTarget.dataset.id;
+		const index = view.select.selectedPhotos.indexOf(photoId);
+		if (index > -1 && view.select.selectedPhotos.length > 1) {
+			// found and more than one element
+			// @ts-ignore
+			view.$wire.openPhotosDropdown(event.clientX, event.clientY, view.select.selectedPhotos);
+		} else {
+			// @ts-ignore
+			view.$wire.openPhotoDropdown(event.clientX, event.clientY, event.currentTarget.dataset.id);
+		}
+	}
+
+	handleClickPhoto(event: MouseEvent, view: AlbumView) {
+		if (event.currentTarget === null) {
+			return;
+		}
+
+		if (!event.ctrlKey && !event.shiftKey) {
+			console.log("open:");
+			// @ts-expect-error
+			const photoId = event.currentTarget.dataset.id;
+			console.log(photoId);
+			view.goTo(photoId);
+			return;
+		}
+
+		view.select.handleClickPhoto(event);
+	}
+
+	handleContextAlbum(event: MouseEvent, view: AlbumView) {
+		if (!view.rights.can_edit) {
+			return;
+		}
+
+		if (event.currentTarget === null) {
+			return;
+		}
+
+		view.select.selectedPhotos = [];
+		// @ts-ignore
+		const albumId = event.currentTarget.dataset.id;
+		const index = view.select.selectedAlbums.indexOf(albumId);
+		if (index > -1 && view.select.selectedAlbums.length > 1) {
+			// found and more than one element
+			// @ts-ignore
+			view.$wire.openAlbumsDropdown(event.clientX, event.clientY, view.select.selectedAlbums);
+		} else {
+			// @ts-ignore
+			view.$wire.openAlbumDropdown(event.clientX, event.clientY, event.currentTarget.dataset.id);
+		}
+	}
+}
diff --git a/resources/js/lycheeOrg/actions/keybindings.ts b/resources/js/lycheeOrg/actions/keybindings.ts
new file mode 100644
index 00000000000..ad65fe4a72c
--- /dev/null
+++ b/resources/js/lycheeOrg/actions/keybindings.ts
@@ -0,0 +1,237 @@
+import type { AlbumView } from "@/data/views/types";
+
+export default class Keybindings {
+	handleGlobalKeydown(event: KeyboardEvent, view: AlbumView): boolean {
+		const skipped = ["TEXTAREA", "INPUT", "SELECT"];
+
+		if (document.activeElement !== null && skipped.includes(document.activeElement.nodeName)) {
+			console.log("skipped: " + document.activeElement.nodeName);
+			return false;
+		}
+
+		if (event.key === "h" && !view.albumFlags.isDetailsOpen) {
+			event.preventDefault();
+			console.log("toggle hidden albums:", view.albumFlags.areNsfwVisible);
+			view.toggleNSFW();
+			return true;
+		}
+
+		if (event.key === "f" && !view.albumFlags.isDetailsOpen) {
+			event.preventDefault();
+			view.toggleFullScreen();
+			return true;
+		}
+
+		if (event.key === "l") {
+			view.loginModalOpen = true;
+			console.log("open login");
+			return true;
+		}
+
+		if (event.key === "/" && event.ctrlKey === true) {
+			event.preventDefault();
+			// @ts-expect-error
+			Alpine.navigate("/livewire/search");
+		}
+
+		if (event.key === "Escape") {
+			if (view.photoFlags.isEditOpen) {
+				event.preventDefault();
+				view.photoFlags.isEditOpen = false;
+			} else if (Alpine.store("photo") !== undefined) {
+				event.preventDefault();
+				view.goTo(null);
+			} else if (view.albumFlags.isDetailsOpen) {
+				event.preventDefault();
+				view.albumFlags.isDetailsOpen = false;
+			} else if (view.parent_id !== null) {
+				event.preventDefault();
+				const url = document.getElementById("backButton")?.getAttribute("href");
+				// @ts-expect-error
+				Alpine.navigate(url);
+			} else if (view.isSearch) {
+				event.preventDefault();
+				const url = document.getElementById("backButton")?.getAttribute("href");
+				// @ts-expect-error
+				Alpine.navigate(url);
+			}
+			return true;
+		}
+
+		return false;
+	}
+
+	handleAlbumKeydown(event: KeyboardEvent, view: AlbumView) {
+		const skipped = ["TEXTAREA", "INPUT", "SELECT"];
+
+		if (document.activeElement !== null && skipped.includes(document.activeElement.nodeName)) {
+			console.log("skipped: " + document.activeElement.nodeName);
+			return false;
+		}
+
+		if (!view.rights.can_edit) {
+			console.log("can't edit.");
+			return false;
+		}
+
+		// n
+		if (event.key === "n" && !view.albumFlags.isDetailsOpen) {
+			event.preventDefault();
+			const params = ["forms.album.create", "", { parentID: view.parent_id }];
+			// @ts-ignore
+			view.$wire.$dispatch("openModal", params);
+			return true;
+		}
+
+		// u
+		if (event.key === "u" && !view.albumFlags.isDetailsOpen) {
+			event.preventDefault();
+			const params = ["forms.add.upload", "", { parentID: view.parent_id }];
+			// @ts-ignore
+			view.$wire.$dispatch("openModal", params);
+			return true;
+		}
+
+		// m on selected albums
+		if (event.key === "m" && view.select.selectedAlbums.length > 0) {
+			event.preventDefault();
+			view.moveAlbums();
+			return true;
+		}
+		// m on selected photos
+		if (event.key === "m" && view.select.selectedPhotos.length > 0) {
+			event.preventDefault();
+			view.movePhotos();
+			return true;
+		}
+
+		// r on selected albums
+		if (event.key === "r" && view.select.selectedAlbums.length > 0) {
+			event.preventDefault();
+			view.renameAlbums();
+			return true;
+		}
+		// r on selected photos
+		if (event.key === "r" && view.select.selectedPhotos.length > 0) {
+			event.preventDefault();
+			view.renamePhotos();
+			return true;
+		}
+
+		// Following this point only if we are not in root.
+		if (view.parent_id === null) {
+			console.log("root");
+			return true;
+		}
+
+		// d
+		if (event.key === "d" && !view.albumFlags.isDetailsOpen) {
+			event.preventDefault();
+			view.albumFlags.isDetailsOpen = true;
+			view.albumFlags.activeTab = 0;
+			return true;
+		}
+
+		// i
+		if (event.key === "i") {
+			event.preventDefault();
+			view.albumFlags.isDetailsOpen = !view.albumFlags.isDetailsOpen;
+			return true;
+		}
+
+		// m
+		if (event.key === "m" && !view.albumFlags.isDetailsOpen) {
+			event.preventDefault();
+			view.albumFlags.isDetailsOpen = true;
+			view.albumFlags.activeTab = 2;
+			return true;
+		}
+
+		// r
+		if (event.key === "r" && !view.albumFlags.isDetailsOpen) {
+			event.preventDefault();
+			view.albumFlags.isDetailsOpen = true;
+			view.albumFlags.activeTab = 0;
+			return true;
+		}
+
+		return false;
+	}
+
+	handlePhotoKeyDown(event: KeyboardEvent, view: AlbumView): boolean {
+		if (Alpine.store("photo") === undefined) {
+			return false;
+		}
+
+		// left arrow (without ctrKey !!)
+		if (event.key === "ArrowLeft" && !event.ctrlKey) {
+			view.previous();
+			return true;
+		}
+
+		// right arrow (without ctrKey !!)
+		if (event.key === "ArrowRight" && !event.ctrlKey) {
+			view.next();
+			return true;
+		}
+
+		// i
+		if (event.key === "i") {
+			console.log("toggle details photo");
+			event.preventDefault();
+			view.photoFlags.isEditOpen = false;
+			view.photoFlags.isDetailsOpen = !view.photoFlags.isDetailsOpen;
+			return true;
+		}
+
+		// o
+		if (event.key === "o") {
+			view.rotateOverlay();
+			return true;
+		}
+
+		if (!view.rights.can_edit) {
+			console.log("can't edit.");
+			return false;
+		}
+
+		// del or backspace
+		if (event.ctrlKey && (event.key === "Delete" || event.key === "Backspace")) {
+			view.deletePhoto();
+			return true;
+		}
+
+		// e
+		if (event.key === "e") {
+			view.photoFlags.isDetailsOpen = false;
+			view.photoFlags.isEditOpen = !view.photoFlags.isEditOpen;
+			return true;
+		}
+
+		// m
+		if (event.key === "m") {
+			view.movePhoto();
+			return true;
+		}
+
+		// s
+		if (event.key === "s") {
+			view.toggleStar();
+			return true;
+		}
+
+		// ctrl + left arrow
+		if (event.key === "ArrowLeft" && event.ctrlKey) {
+			view.rotatePhotoCCW();
+			return true;
+		}
+
+		// ctrl + right arrow
+		if (event.key === "ArrowRight" && event.ctrlKey) {
+			view.rotatePhotoCW();
+			return true;
+		}
+
+		return false;
+	}
+}
diff --git a/resources/js/lycheeOrg/actions/selection.ts b/resources/js/lycheeOrg/actions/selection.ts
new file mode 100644
index 00000000000..5019bfd8c5b
--- /dev/null
+++ b/resources/js/lycheeOrg/actions/selection.ts
@@ -0,0 +1,242 @@
+import type { Photo } from "@/lycheeOrg/backend";
+
+export interface PhotoIDArray {
+	[key: string]: number;
+}
+export default class Selection {
+	selectedAlbums: string[];
+	selectedPhotos: string[];
+	private canEdit: boolean;
+
+	constructor(albumIDs: string[], photos: Photo[], canEdit: boolean = false) {
+		Alpine.store("photos", photos);
+		Alpine.store("albumIDs", albumIDs);
+		this.selectedPhotos = [];
+		this.selectedAlbums = [];
+		this.canEdit = canEdit;
+		let photoIDs: string[] = [];
+		photos.forEach((elem: Photo, idx) => (photoIDs[idx] = elem.id));
+		Alpine.store("photoIDs", photoIDs);
+	}
+
+	updatePhotos(photos: Photo[]) {
+		Alpine.store("photos", photos);
+		this.selectedPhotos = [];
+		let photoIDs: string[] = [];
+		photos.forEach((elem: Photo, idx) => (photoIDs[idx] = elem.id));
+		Alpine.store("photoIDs", photoIDs);
+	}
+
+	static getPhoto(photoId: string | null): Photo | undefined {
+		if (photoId === null) {
+			return undefined;
+		}
+		return (Alpine.store("photos") as Photo[]).find(({ id }) => id === photoId);
+	}
+
+	handleClickPhoto(event: MouseEvent): boolean {
+		if (!this.canEdit) {
+			return false;
+		}
+
+		if (event.currentTarget === null) {
+			return false;
+		}
+
+		if (event.ctrlKey) {
+			event.preventDefault();
+			this.selectedAlbums = [];
+			// @ts-ignore
+			const photoId: string = event.currentTarget.dataset.id;
+			const index: number = this.selectedPhotos.indexOf(photoId);
+			if (index > -1) {
+				// found
+				this.selectedPhotos = this.selectedPhotos.filter((e) => e !== photoId);
+			} else {
+				// not found
+				this.selectedPhotos.push(photoId);
+			}
+		}
+
+		if (event.shiftKey) {
+			event.preventDefault();
+			this.selectedAlbums = [];
+			// @ts-ignore
+			const photoId = event.currentTarget.dataset.id;
+			const lastInsertedAlbumId = this.selectedPhotos[this.selectedPhotos.length - 1];
+			this.addPhotoRange(lastInsertedAlbumId, photoId);
+		}
+
+		console.log("result:");
+		console.log(this.selectedPhotos);
+
+		return true;
+	}
+
+	handleClickAlbum(event: MouseEvent): boolean {
+		if (!this.canEdit) {
+			return false;
+		}
+
+		if (event.currentTarget === null) {
+			return false;
+		}
+
+		if (event.ctrlKey) {
+			event.preventDefault();
+			this.selectedPhotos = [];
+			// @ts-ignore
+			const albumId: string = event.currentTarget.dataset.id;
+			const index: number = this.selectedAlbums.indexOf(albumId);
+			if (index > -1) {
+				// found
+				this.selectedAlbums = this.selectedAlbums.filter((e) => e !== albumId);
+			} else {
+				// not found
+				this.selectedAlbums.push(albumId);
+			}
+		}
+
+		if (event.shiftKey) {
+			event.preventDefault();
+			this.selectedPhotos = [];
+			// @ts-ignore
+			const albumId: string = event.currentTarget.dataset.id;
+			const lastInsertedAlbumId: string = this.selectedAlbums[this.selectedAlbums.length - 1];
+			this.addAlbumRange(lastInsertedAlbumId, albumId);
+		}
+
+		console.log("result:");
+		console.log(this.selectedAlbums);
+
+		return true;
+	}
+
+	handleKeydown(event: KeyboardEvent): boolean {
+		const skipped = ["TEXTAREA", "INPUT", "SELECT"];
+
+		if (document.activeElement !== null && skipped.includes(document.activeElement.nodeName)) {
+			console.log("skipped: " + document.activeElement.nodeName);
+			return false;
+		}
+
+		if (!this.canEdit) {
+			console.log("can't edit.");
+			return false;
+		}
+
+		// ctrl + a
+		if (event.key === "a" && event.ctrlKey) {
+			event.preventDefault();
+			if (this.selectedAlbums.length === (Alpine.store("albumIDs") as string[]).length && (Alpine.store("albumIDs") as string[]).length > 1) {
+				// Flip => select photos instead
+				return this.selectAllPhotos();
+			}
+			if (this.selectedPhotos.length === (Alpine.store("photoIDs") as string[]).length && (Alpine.store("photoIDs") as string[]).length > 1) {
+				// Flip => select albums instead
+				return this.selectAllAlbums();
+			}
+			if (this.selectedAlbums.length > 1) {
+				// Select all albums (if one is already selected)
+				return this.selectAllAlbums();
+			}
+			if (this.selectedPhotos.length > 1) {
+				// Select all photos (if one is already selected)
+				return this.selectAllPhotos();
+			}
+			if ((Alpine.store("albumIDs") as string[]).length > 1) {
+				// Select all albums (if one exists and nothing is selected)
+				return this.selectAllAlbums();
+			}
+			// Select all photos by default
+			return this.selectAllPhotos();
+		}
+
+		return false;
+	}
+
+	private selectAllPhotos(): true {
+		console.log("select all photos");
+		this.selectedPhotos = [...(Alpine.store("photoIDs") as string[])];
+		this.selectedAlbums = [];
+		return true;
+	}
+
+	private selectAllAlbums(): true {
+		console.log("select all albums");
+		this.selectedAlbums = [...(Alpine.store("albumIDs") as string[])];
+		this.selectedPhotos = [];
+		return true;
+	}
+
+	private addAlbumRange(lastInsertedAlbumId: string, albumId: string): void {
+		if (lastInsertedAlbumId === undefined) {
+			console.log("previous not found");
+			return;
+		}
+		if (lastInsertedAlbumId === albumId) {
+			console.log("same elem");
+			return;
+		}
+
+		let toAppend: string[];
+		const index = (Alpine.store("albumIDs") as string[]).indexOf(albumId);
+		console.log(index);
+		const indexLastInserted = (Alpine.store("albumIDs") as string[]).indexOf(lastInsertedAlbumId);
+		console.log(indexLastInserted);
+		if (index < indexLastInserted) {
+			toAppend = (Alpine.store("albumIDs") as string[]).slice(index + 1, indexLastInserted);
+		} else {
+			toAppend = (Alpine.store("albumIDs") as string[]).slice(indexLastInserted + 1, index);
+		}
+		// Push albumId at the end.
+		toAppend.push(albumId);
+		console.log("to append:");
+		console.log(toAppend);
+
+		this.selectedAlbums = this.selectedAlbums.reduce((acc: string[], elem: string) => (toAppend.includes(elem) ? acc : [...acc, elem]), []);
+		console.log("before:");
+		console.log(this.selectedAlbums);
+		this.selectedAlbums.push(...toAppend);
+	}
+
+	private addPhotoRange(lastInsertedPhotoId: string, photoId: string): void {
+		if (lastInsertedPhotoId === undefined) {
+			console.log("previous not found");
+			return;
+		}
+		if (lastInsertedPhotoId === photoId) {
+			console.log("same elem");
+			return;
+		}
+
+		let toAppend: string[];
+		const index = (Alpine.store("photoIDs") as string[]).indexOf(photoId);
+		console.log(index);
+		const indexLastInserted = (Alpine.store("photoIDs") as string[]).indexOf(lastInsertedPhotoId);
+		console.log(indexLastInserted);
+		if (index < indexLastInserted) {
+			toAppend = (Alpine.store("photoIDs") as string[]).slice(index + 1, indexLastInserted);
+		} else {
+			toAppend = (Alpine.store("photoIDs") as string[]).slice(indexLastInserted + 1, index);
+		}
+		// Push photoId at the end.
+		toAppend.push(photoId);
+		console.log("to append:");
+		console.log(toAppend);
+
+		this.selectedPhotos = this.selectedPhotos.reduce((acc: string[], elem: string) => (toAppend.includes(elem) ? acc : [...acc, elem]), []);
+		console.log("before:");
+		console.log(this.selectedPhotos);
+		this.selectedPhotos.push(...toAppend);
+	}
+
+	areSelectedPhotosAllStarred(): boolean {
+		let allStarred = true;
+		this.selectedPhotos.forEach((v) => {
+			allStarred = allStarred && (Selection.getPhoto(v) as Photo).is_starred;
+		});
+
+		return allStarred;
+	}
+}
diff --git a/resources/js/lycheeOrg/actions/sidebarMap.ts b/resources/js/lycheeOrg/actions/sidebarMap.ts
new file mode 100644
index 00000000000..49a399534a6
--- /dev/null
+++ b/resources/js/lycheeOrg/actions/sidebarMap.ts
@@ -0,0 +1,64 @@
+import L from "leaflet";
+import "leaflet-rotatedmarker/leaflet.rotatedMarker.js";
+import "leaflet.markercluster/dist/leaflet.markercluster.js";
+import "@lychee-org/leaflet.photo/Leaflet.Photo.js";
+import "leaflet/dist/leaflet.css";
+import "@lychee-org/leaflet.photo/Leaflet.Photo.css";
+
+export default class SidebarMap {
+	layer: string;
+	attribution: string;
+	url_asset: string;
+
+	constructor() {
+		this.layer = "";
+		this.attribution = "";
+		this.url_asset = "";
+	}
+
+	displayOnMap(latitude: number, longitude: number, img_direction: number | null) {
+		const mapData = document.getElementById("leaflet_map_single_photo");
+		this.layer = mapData?.dataset.layer ?? "";
+		this.url_asset = mapData?.dataset.asset ?? "";
+		this.attribution = mapData?.dataset.provider ?? "";
+
+		// Leaflet searches for icon in same directory as js file -> paths needs
+		// to be overwritten
+		// @ts-expect-error
+		delete L.Icon.Default.prototype._getIconUrl;
+		L.Icon.Default.mergeOptions({
+			iconRetinaUrl: this.url_asset + "img/marker-icon-2x.png",
+			iconUrl: this.url_asset + "img/marker-icon.png",
+			shadowUrl: this.url_asset + "img/marker-shadow.png",
+		});
+
+		// kill the map if it exists
+		const container = L.DomUtil.get("leaflet_map_single_photo");
+		if (container !== null) {
+			// @ts-expect-error
+			container._leaflet_id = null;
+		}
+
+		const myMap = L.map("leaflet_map_single_photo").setView([latitude, longitude], 13);
+
+		L.tileLayer(this.layer, { attribution: this.attribution }).addTo(myMap);
+
+		if (img_direction === null) {
+			// Add Marker to map, direction is not set
+			L.marker([latitude, longitude]).addTo(myMap);
+		} else {
+			// Add Marker, direction has been set
+			const viewDirectionIcon = L.icon({
+				iconUrl: this.url_asset + "img/view-angle-icon.png",
+				iconRetinaUrl: this.url_asset + "img/view-angle-icon-2x.png",
+				iconSize: [100, 58], // size of the icon
+				iconAnchor: [50, 49], // point of the icon which will correspond to marker's location
+			});
+			const marker = L.marker([latitude, longitude], { icon: viewDirectionIcon }).addTo(myMap);
+
+			marker.setRotationAngle(img_direction);
+
+			myMap.invalidateSize();
+		}
+	}
+}
diff --git a/resources/js/lycheeOrg/backend.d.ts b/resources/js/lycheeOrg/backend.d.ts
new file mode 100644
index 00000000000..948b9962c8c
--- /dev/null
+++ b/resources/js/lycheeOrg/backend.d.ts
@@ -0,0 +1,457 @@
+export type LycheeException = {
+	message: string;
+	exception: string;
+	file?: string;
+	line?: number;
+	trace?: string[];
+	previous_exception?: LycheeException | null;
+};
+
+export type Version = {
+	major: number;
+	minor: number;
+	patch: number;
+};
+
+export type OverlayTypes = "none" | "exif" | "date" | "description";
+
+export type PhotoLayoutType = "square" | "justified" | "unjustified" | "masonry" | "grid";
+
+export type Layouts = {
+	photos_layout: PhotoLayoutType;
+	photo_layout_justified_row_height: number;
+	photo_layout_masonry_column_width: number;
+	photo_layout_grid_column_width: number;
+	photo_layout_square_column_width: number;
+	photo_layout_gap: number;
+};
+
+export type Photo = {
+	id: string;
+	title: string;
+	description: string | null;
+	tags: string[];
+	is_public: boolean;
+	type: string | null;
+	iso: string | null;
+	aperture: string | null;
+	make: string | null;
+	model: string | null;
+	lens: string | null;
+	shutter: string | null;
+	focal: string | null;
+	latitude: number | null;
+	longitude: number | null;
+	altitude: number | null;
+	img_direction: number | null;
+	location: string | null;
+	taken_at: string | null;
+	taken_at_orig_tz: string | null;
+	is_starred: boolean;
+	live_photo_url: string | null;
+	album_id: string | null;
+	checksum: string;
+	license: string;
+	created_at: string;
+	updated_at: string;
+	live_photo_content_id: string | null;
+	live_photo_checksum: string | null;
+	size_variants: SizeVariants;
+	next_photo_id?: string | null;
+	previous_photo_id?: string | null;
+	rights: PhotoRightsDTO;
+	preformatted: PreFormatted;
+	precomputed: PreComputed;
+};
+
+export type SizeVariants = {
+	original: SizeVariant;
+	medium2x: SizeVariant | null;
+	medium: SizeVariant | null;
+	small2x: SizeVariant | null;
+	small: SizeVariant | null;
+	thumb2x: SizeVariant | null;
+	thumb: SizeVariant | null;
+};
+
+export type SizeVariant = {
+	type: number;
+	url: string;
+	width: number;
+	height: number;
+	filesize: number;
+};
+
+export type PreFormatted = {
+	created_at: string;
+	taken_at: string;
+	date_overlay: OverlayTypes;
+
+	shutter: string;
+	aperture: string;
+	iso: string;
+
+	duration: string;
+	fps: string;
+
+	filesize: string;
+	resolution: string;
+	latitude: string;
+	longitude: string;
+	altitude: string;
+
+	license: string;
+	description: string;
+};
+
+export type PreComputed = {
+	is_video: boolean;
+	is_raw: boolean;
+	is_livephoto: boolean;
+	is_camera_date: boolean;
+	has_exif: boolean;
+	has_location: boolean;
+};
+
+export type SortingCriterion = {
+	column: string;
+	order: string;
+};
+
+export type Album = {
+	id: string;
+	parent_id: string;
+	created_at: string;
+	updated_at: string;
+	title: string;
+	description: string | null;
+	license: string;
+	photos: Photo[];
+	albums?: Album[];
+	cover_id: string | null;
+	thumb: Thumb | null;
+	owner_name?: string;
+	is_nsfw: boolean;
+	rights: AlbumRightsDTO;
+	policy: AlbumProtectionPolicy;
+	num_albums: boolean;
+	num_photos: boolean;
+	min_taken_at: string | null;
+	max_taken_at: string | null;
+	sorting: SortingCriterion | null;
+};
+
+export type TagAlbum = {
+	id: string;
+	created_at: string;
+	updated_at: string;
+	title: string;
+	description: string | null;
+	show_tags: string[];
+	photos: Photo[];
+	thumb: Thumb | null;
+	owner_name?: string;
+	is_nsfw: boolean;
+	rights: AlbumRightsDTO;
+	policy: AlbumProtectionPolicy;
+	min_taken_at: string | null;
+	max_taken_at: string | null;
+	sorting: SortingCriterion | null;
+	is_tag_album: boolean;
+};
+
+export type SmartAlbum = {
+	id: string;
+	title: string;
+	photos?: Photo[];
+	thumb: Thumb | null;
+	rights: AlbumRightsDTO;
+	policy: AlbumProtectionPolicy;
+};
+
+export type Thumb = {
+	id: string;
+	type: string;
+	thumb: string;
+	thumb2x: string | null;
+};
+
+export type SharingInfo = {
+	shared: { id: number; album_id: string; user_id: number; username: string; title: string }[];
+	albums: { id: string; title: string }[];
+	users: { id: number; username: string }[];
+};
+
+export type SearchResult = {
+	albums: Album[];
+	tag_albums: TagAlbum[];
+	photos: Photo[];
+	checksum: string;
+};
+
+export type Albums = {
+	smart_albums: SmartAlbums;
+	tag_albums: TagAlbum[];
+	albums: Album[];
+	shared_albums: Album[];
+};
+
+export type SmartAlbums = {
+	unsorted: SmartAlbum | null;
+	starred: SmartAlbum | null;
+	public: SmartAlbum | null; // TO BE KILLED
+	recent: SmartAlbum | null;
+	on_this_day: SmartAlbum | null;
+};
+
+/**
+ * The IDs of the built-in, smart albums.
+ */
+export enum SmartAlbumID {
+	UNSORTED = "unsorted",
+	STARRED = "starred",
+	PUBLIC = "public",
+	RECENT = "recent",
+	ON_THIS_DAY = "on_this_day",
+}
+
+export type User = {
+	id: number;
+	username: string;
+	email: string;
+	has_token: boolean;
+};
+
+export type UserWithCapabilitiesDTO = {
+	id: number;
+	username: string;
+	may_administrate: boolean;
+	may_upload: boolean;
+	may_edit_own_settings: boolean;
+};
+
+export type WebAuthnCredential = {
+	id: string;
+};
+
+export type PositionData = {
+	id: string | null;
+	title: string | null;
+	photos: Photo[];
+	track_url: string | null;
+};
+
+export type ConfigSetting = {
+	id: number;
+	key: string;
+	value: string | null;
+	cat: string;
+	type_range: string;
+	confidentiality: number;
+	description: string;
+};
+
+export type LogEntry = {
+	id: number;
+	created_at: string;
+	updated_at: string;
+	type: string;
+	function: string;
+	line: number;
+	text: string;
+};
+
+export type DiagnosticInfo = {
+	errors: string[];
+	infos: string[];
+	configs: string[];
+	update: number;
+};
+
+export type FrameSettings = {
+	refresh: number;
+};
+
+export type LocaleArray = {
+	[key: string]: string;
+};
+
+export type InitializationData = {
+	user: User | null;
+	rights: GlobalRightsDTO;
+	update_json: boolean;
+	update_available: boolean;
+	locale: LocaleArray;
+	config: ConfigurationData;
+};
+
+export type Feed = {
+	url: string;
+	mimetype: string;
+	title: string;
+};
+
+export type ConfigurationData = {
+	album_decoration: string;
+	album_decoration_orientation: string;
+	album_subtitle_type: string;
+	allow_username_change: string;
+	check_for_updates: string;
+	default_license?: string;
+	delete_imported?: string;
+	grants_download: string;
+	dropbox_key?: string;
+	editor_enabled: string;
+	rss_enable: string;
+	rss_feeds: Feed[];
+	grants_full_photo_access: string;
+	image_overlay_type: OverlayTypes;
+	landing_page_enable: string;
+	lang: string;
+	lang_available: string[];
+	layout: PhotoLayoutType;
+	location?: string;
+	location_decoding: string;
+	location_show: string;
+	location_show_public: string;
+	map_display: string;
+	map_display_direction: string;
+	map_display_public: string;
+	map_include_subalbums: string;
+	map_provider: string;
+	new_photos_notification: string;
+	nsfw_blur: string;
+	nsfw_visible: string;
+	nsfw_warning: string;
+	nsfw_warning_admin: string;
+	nsfw_banner_override: string;
+	public_photos_hidden: string;
+	public_search: string;
+	share_button_visible: string;
+	skip_duplicates?: string;
+	sorting_albums: SortingCriterion;
+	sorting_photos: SortingCriterion;
+	swipe_tolerance_x: string;
+	swipe_tolerance_y: string;
+	upload_processing_limit: string;
+	version: Version | null;
+	smart_album_visibilty: SmartAlbumVisibility;
+};
+
+/**
+ * The JSON object for incremental reports sent by the
+ * back-end within a streamed response.
+ */
+export type ImportReport = {
+	type: string;
+};
+
+/**
+ * The JSON object for cumulative progress reports sent by the
+ * back-end within a streamed response.
+ */
+export type ImportProgressReport = {
+	type: string;
+	path: string;
+	progress: number;
+};
+
+/**
+ * The JSON object for events sent by the back-end within a streamed response.
+ */
+export type ImportEventReport = {
+	type: string;
+	subtype: string;
+	severity: number;
+	path: string | null;
+	message: string;
+};
+
+/**
+ * The JSON object for Policy on Albums
+ */
+export type AlbumProtectionPolicy = {
+	is_nsfw: boolean;
+	is_public: boolean;
+	is_link_required: boolean;
+	is_password_required: boolean;
+	grants_full_photo_access: boolean;
+	grants_download: boolean;
+};
+
+/**
+ * The JSON object for Rights on users management
+ */
+export type UserManagementRightsDTO = {
+	can_create: boolean;
+	can_list: boolean;
+	can_edit: boolean;
+	can_delete: boolean;
+};
+
+/**
+ * The JSON object for Rights on a User
+ */
+export type UserRightsDTO = {
+	can_edit: boolean;
+	can_use_2fa: boolean;
+};
+
+/**
+ * The JSON object for Rights on Settings
+ */
+export type SettingsRightsDTO = {
+	can_edit: boolean;
+	can_see_logs: boolean;
+	can_clear_logs: boolean;
+	can_see_diagnostics: boolean;
+	can_update: boolean;
+};
+
+/**
+ * The JSON object for Rights on Settings
+ */
+export type RootAlbumRightsDTO = {
+	can_edit: boolean;
+	can_upload: boolean;
+	can_download: boolean;
+	can_import_from_server: boolean;
+};
+
+/**
+ * The JSON object for Rights on Photos
+ */
+export type PhotoRightsDTO = {
+	can_edit: boolean;
+	can_download: boolean;
+	can_access_full_photo: boolean;
+};
+
+/**
+ * The JSON object for Rights on Album
+ */
+export type AlbumRightsDTO = {
+	can_edit: boolean;
+	can_share_with_users: boolean;
+	can_download: boolean;
+	can_upload: boolean;
+};
+
+/**
+ * The JSON object for Rights on Global Application
+ */
+export type GlobalRightsDTO = {
+	root_album: RootAlbumRightsDTO;
+	settings: SettingsRightsDTO;
+	user_management: UserManagementRightsDTO;
+	user: UserRightsDTO;
+};
+
+/**
+ * The JSON object containing the visibility of smart albums
+ */
+export type SmartAlbumVisibility = {
+	recent: boolean;
+	starred: boolean;
+	on_this_day: boolean;
+};
diff --git a/resources/js/lycheeOrg/flags/albumFlags.ts b/resources/js/lycheeOrg/flags/albumFlags.ts
new file mode 100644
index 00000000000..3f7fba9f1fc
--- /dev/null
+++ b/resources/js/lycheeOrg/flags/albumFlags.ts
@@ -0,0 +1,13 @@
+export default class AlbumFlags {
+	isDetailsOpen: boolean;
+	activeTab: number;
+	isSharingLinksOpen: boolean;
+	areNsfwVisible: boolean;
+
+	constructor(areNsfwVisible: boolean) {
+		this.isDetailsOpen = false;
+		this.activeTab = 0;
+		this.isSharingLinksOpen = false;
+		this.areNsfwVisible = areNsfwVisible;
+	}
+}
diff --git a/resources/js/lycheeOrg/flags/photoFlags.ts b/resources/js/lycheeOrg/flags/photoFlags.ts
new file mode 100644
index 00000000000..a2ca3dc5d2e
--- /dev/null
+++ b/resources/js/lycheeOrg/flags/photoFlags.ts
@@ -0,0 +1,36 @@
+import { OverlayTypes, Photo } from "@/lycheeOrg/backend";
+
+export default class PhotoFlags {
+	isDownloadOpen: boolean;
+	isDetailsOpen: boolean;
+	isEditOpen: boolean;
+	overlayType: OverlayTypes;
+
+	constructor(isDetailsOpen: boolean, overlayType: OverlayTypes = "none") {
+		this.isDownloadOpen = false;
+		this.isDetailsOpen = isDetailsOpen;
+		this.overlayType = overlayType;
+		this.isEditOpen = false;
+	}
+
+	rotateOverlay() {
+		const photo = Alpine.store("photo") as Photo;
+		switch (this.overlayType) {
+			case "exif":
+				this.overlayType = "date";
+				break;
+			case "date":
+				if (photo.description !== "") {
+					this.overlayType = "description";
+				} else {
+					this.overlayType = "none";
+				}
+				break;
+			case "description":
+				this.overlayType = "none";
+				break;
+			default:
+				this.overlayType = "exif";
+		}
+	}
+}
diff --git a/resources/js/lycheeOrg/layouts/PhotoLayout.ts b/resources/js/lycheeOrg/layouts/PhotoLayout.ts
new file mode 100644
index 00000000000..fdcefefa92c
--- /dev/null
+++ b/resources/js/lycheeOrg/layouts/PhotoLayout.ts
@@ -0,0 +1,48 @@
+import { Layouts, PhotoLayoutType } from "../backend";
+import { useGrid } from "./useGrid";
+import { useJustify } from "./useJustify";
+import { useMasonry } from "./useMasonry";
+import { useSquare } from "./useSquare";
+
+export default class PhotoLayout {
+	type: PhotoLayoutType;
+	justifiedHeight: number;
+	masonryWidth: number;
+	gridWidth: number;
+	gap: number;
+	squareWidth: number;
+
+	constructor(layout: Layouts) {
+		this.type = layout.photos_layout;
+		this.justifiedHeight = layout.photo_layout_justified_row_height;
+		this.masonryWidth = layout.photo_layout_masonry_column_width;
+		this.gridWidth = layout.photo_layout_grid_column_width;
+		this.squareWidth = layout.photo_layout_square_column_width;
+		this.gap = layout.photo_layout_gap;
+
+		window.addEventListener("resize", () => this.activateLayout());
+	}
+
+	activateLayout() {
+		const photoListing = document.getElementById("photoListing");
+		if (photoListing === null) {
+			return; // Nothing to do
+		}
+
+		if (this.type === "square") {
+			useSquare(photoListing, this.squareWidth, this.gap);
+		}
+
+		if (this.type === "grid") {
+			useGrid(photoListing, this.gridWidth, this.gap);
+		}
+
+		if (this.type === "justified" || this.type === "unjustified") {
+			useJustify(photoListing, this.justifiedHeight);
+		}
+
+		if (this.type === "masonry") {
+			useMasonry(photoListing, this.masonryWidth, this.gap);
+		}
+	}
+}
diff --git a/resources/js/lycheeOrg/layouts/types.d.ts b/resources/js/lycheeOrg/layouts/types.d.ts
new file mode 100644
index 00000000000..c1b00d2cd0c
--- /dev/null
+++ b/resources/js/lycheeOrg/layouts/types.d.ts
@@ -0,0 +1,9 @@
+export interface ChildNodeWithDataStyle extends ChildNode {
+	dataset: { width: number; height: number };
+	style: { top: string; width: string; height: string; left: string };
+}
+
+export interface Column {
+	height: number;
+	left: number;
+}
diff --git a/resources/js/lycheeOrg/layouts/useGrid.ts b/resources/js/lycheeOrg/layouts/useGrid.ts
new file mode 100644
index 00000000000..958be8c964e
--- /dev/null
+++ b/resources/js/lycheeOrg/layouts/useGrid.ts
@@ -0,0 +1,61 @@
+import { Column } from "./types";
+
+export function useGrid(el: HTMLElement, target_width: number, grid_gap: number = 12) {
+	// @ts-expect-error
+	const gridItems: ChildNodeWithDataStyle[] = [...el.childNodes].filter((gridItem) => gridItem.nodeType === 1);
+
+	const max_width = parseInt(getComputedStyle(el).width);
+	const usable_width = max_width;
+	const perChunk = Math.floor((usable_width + grid_gap) / target_width);
+	const remaining_space = usable_width - perChunk * target_width - (perChunk - 1) * grid_gap;
+	const spread = Math.ceil(remaining_space / perChunk);
+	const grid_width = target_width + spread;
+	// console.log(usable_width, perChunk, remaining_space, spread, grid_width);
+
+	// Compute ratio of each item.
+	const ratio = gridItems.map(function (_photo) {
+		const height = _photo.dataset.height;
+		const width = _photo.dataset.width;
+		return height > 0 ? width / height : 1;
+	});
+
+	let columns: Column[] = Array.from({ length: perChunk }, (_, idx) => {
+		return { height: 0, left: (grid_gap + grid_width) * idx };
+	});
+
+	let idx = 0;
+	gridItems.forEach(function (e, i) {
+		if (idx % perChunk === 0) {
+			const newTop = Math.max(...columns.map((column) => column.height));
+			columns.forEach((column) => (column.height = newTop));
+		}
+
+		let column = columns[idx];
+		const height = Math.floor(grid_width / ratio[i]);
+		e.style.top = column.height + "px";
+		e.style.width = grid_width + "px";
+		e.style.height = height + "px";
+		e.style.left = column.left + "px";
+		column.height = column.height + height + grid_gap;
+
+		// update
+		columns[idx] = column;
+		idx = (idx + 1) % perChunk;
+	});
+
+	const height = getMaxHeight(columns);
+	el.style.height = height + "px";
+}
+
+function getMaxHeight(columns: Column[]) {
+	let highest = NaN;
+	columns.forEach((col) => {
+		if (isNaN(highest)) {
+			highest = col.height;
+		} else if (col.height > highest) {
+			highest = col.height;
+		}
+	});
+
+	return highest;
+}
diff --git a/resources/js/lycheeOrg/layouts/useJustify.ts b/resources/js/lycheeOrg/layouts/useJustify.ts
new file mode 100644
index 00000000000..ad8fe93cb59
--- /dev/null
+++ b/resources/js/lycheeOrg/layouts/useJustify.ts
@@ -0,0 +1,41 @@
+import { ChildNodeWithDataStyle } from "./types";
+import createJustifiedLayout from "justified-layout";
+
+export function useJustify(el: HTMLElement, photoDefaultHeight: number = 320) {
+	const view = document.getElementById("lychee_view_content");
+	if (view === null) {
+		return;
+	}
+
+	const multiplier = view.scrollHeight > view.clientHeight ? 0 : 1;
+	const containerWidth = parseInt(getComputedStyle(el).width) - multiplier * 20;
+
+	// @ts-expect-error
+	const justifiedItems: ChildNodeWithDataStyle[] = [...el.childNodes].filter((gridItem) => gridItem.nodeType === 1);
+
+	const ratio: number[] = justifiedItems.map(function (_photo) {
+		const height = _photo.dataset.height;
+		const width = _photo.dataset.width;
+		return height > 0 ? width / height : 1;
+	});
+	const layoutGeometry = createJustifiedLayout(ratio, {
+		containerWidth: containerWidth,
+		containerPadding: 0,
+		targetRowHeight: photoDefaultHeight,
+	});
+	el.style.height = layoutGeometry.containerHeight + "px";
+	justifiedItems.forEach((e, i) => {
+		if (!layoutGeometry.boxes[i]) {
+			// Race condition in search.find -- window content
+			// and `photos` can get out of sync as search
+			// query is being modified.
+			console.log("race!");
+			return false;
+		}
+
+		e.style.top = layoutGeometry.boxes[i].top + "px";
+		e.style.width = layoutGeometry.boxes[i].width + "px";
+		e.style.height = layoutGeometry.boxes[i].height + "px";
+		e.style.left = layoutGeometry.boxes[i].left + "px";
+	});
+}
diff --git a/resources/js/lycheeOrg/layouts/useMasonry.ts b/resources/js/lycheeOrg/layouts/useMasonry.ts
new file mode 100644
index 00000000000..8d685f30dfd
--- /dev/null
+++ b/resources/js/lycheeOrg/layouts/useMasonry.ts
@@ -0,0 +1,71 @@
+import { Column } from "./types";
+
+export function useMasonry(el: HTMLElement, target_width: number, grid_gap: number = 12) {
+	// @ts-expect-error
+	const gridItems: ChildNodeWithDataStyle[] = [...el.childNodes].filter((gridItem) => gridItem.nodeType === 1);
+
+	const max_width = parseInt(getComputedStyle(el).width);
+	const usable_width = max_width;
+	const perChunk = Math.floor((usable_width + grid_gap) / target_width);
+	const remaining_space = usable_width - perChunk * target_width - (perChunk - 1) * grid_gap;
+	const spread = Math.ceil(remaining_space / perChunk);
+	const grid_width = target_width + spread;
+	// console.log(usable_width, perChunk, remaining_space, spread, grid_width);
+
+	// Compute ratio of each item.
+	const ratio = gridItems.map(function (_photo) {
+		const height = _photo.dataset.height;
+		const width = _photo.dataset.width;
+		return height > 0 ? width / height : 1;
+	});
+
+	let columns = Array.from({ length: perChunk }, (_, idx) => {
+		return { height: 0, left: (grid_gap + grid_width) * idx };
+	});
+
+	let idx = 0;
+	gridItems.forEach(function (e, i) {
+		idx = findSmallestIdx(columns);
+		let column = columns[idx];
+		const height = grid_width / ratio[i];
+		e.style.top = column.height + "px";
+		e.style.width = grid_width + "px";
+		e.style.height = height + "px";
+		e.style.left = column.left + "px";
+		column.height = column.height + height + grid_gap;
+
+		// update
+		columns[idx] = column;
+	});
+
+	const height = getMaxHeight(columns);
+	el.style.height = height + "px";
+}
+
+function findSmallestIdx(columns: Column[]) {
+	let idx = 0;
+	let smallest = NaN;
+	columns.forEach((col, i) => {
+		if (isNaN(smallest)) {
+			smallest = col.height;
+			idx = i;
+		} else if (col.height < smallest) {
+			smallest = col.height;
+			idx = i;
+		}
+	});
+	return idx;
+}
+
+function getMaxHeight(columns: Column[]) {
+	let highest = NaN;
+	columns.forEach((col) => {
+		if (isNaN(highest)) {
+			highest = col.height;
+		} else if (col.height > highest) {
+			highest = col.height;
+		}
+	});
+
+	return highest;
+}
diff --git a/resources/js/lycheeOrg/layouts/useSquare.ts b/resources/js/lycheeOrg/layouts/useSquare.ts
new file mode 100644
index 00000000000..dc778e0d132
--- /dev/null
+++ b/resources/js/lycheeOrg/layouts/useSquare.ts
@@ -0,0 +1,52 @@
+import { Column } from "./types";
+
+export function useSquare(el: HTMLElement, target_width_height: number, grid_gap: number = 12) {
+	// @ts-expect-error
+	const gridItems: ChildNodeWithDataStyle[] = [...el.childNodes].filter((gridItem) => gridItem.nodeType === 1);
+
+	const max_width = parseInt(getComputedStyle(el).width);
+	const usable_width = max_width;
+	const perChunk = Math.floor((usable_width + grid_gap) / target_width_height);
+	const remaining_space = usable_width - perChunk * target_width_height - (perChunk - 1) * grid_gap;
+	const spread = Math.ceil(remaining_space / perChunk);
+	const grid_width = target_width_height + spread;
+
+	let columns: Column[] = Array.from({ length: perChunk }, (_, idx) => {
+		return { height: 0, left: (grid_gap + grid_width) * idx };
+	});
+
+	let idx = 0;
+	gridItems.forEach(function (e, i) {
+		if (idx % perChunk === 0) {
+			const newTop = Math.max(...columns.map((column) => column.height));
+			columns.forEach((column) => (column.height = newTop));
+		}
+
+		let column = columns[idx];
+		e.style.top = column.height + "px";
+		e.style.width = grid_width + "px";
+		e.style.height = grid_width + "px";
+		e.style.left = column.left + "px";
+		column.height = column.height + grid_width + grid_gap;
+
+		// update
+		columns[idx] = column;
+		idx = (idx + 1) % perChunk;
+	});
+
+	const height = getMaxHeight(columns);
+	el.style.height = height + "px";
+}
+
+function getMaxHeight(columns: Column[]) {
+	let highest = NaN;
+	columns.forEach((col) => {
+		if (isNaN(highest)) {
+			highest = col.height;
+		} else if (col.height > highest) {
+			highest = col.height;
+		}
+	});
+
+	return highest;
+}
diff --git a/resources/js/vendor/webauthn/webauthn.ts b/resources/js/vendor/webauthn/webauthn.ts
new file mode 100644
index 00000000000..38c84577bdf
--- /dev/null
+++ b/resources/js/vendor/webauthn/webauthn.ts
@@ -0,0 +1,338 @@
+/**
+ * MIT License
+ *
+ * Copyright (c) Italo Israel Baeza Cabrera
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+type ResponseWithBody = Response & { body: string };
+
+export default class WebAuthn {
+	/**
+	 * Routes for WebAuthn assertion (login) and attestation (register).
+	 */
+	#routes: {
+		registerOptions: string;
+		register: string;
+		loginOptions: string;
+		login: string;
+	} = {
+		registerOptions: "webauthn/register/options",
+		register: "webauthn/register",
+		loginOptions: "webauthn/login/options",
+		login: "webauthn/login",
+	};
+
+	/**
+	 * Headers to use in ALL requests done.
+	 */
+	#headers: {
+		Accept: string;
+		"Content-Type": string;
+		"X-Requested-With": string;
+		"X-XSRF-TOKEN"?: string;
+		"X-CSRF-TOKEN"?: string;
+	} = {
+		Accept: "application/json",
+		"Content-Type": "application/json",
+		"X-Requested-With": "XMLHttpRequest",
+	};
+
+	/**
+	 * If set to true, the credentials option will be set to 'include' on all fetch calls,
+	 * or else it will use the default 'same-origin'. Use this if the backend is not the
+	 * same origin as the client or the XSRF protection will break without the session.
+	 */
+	#includeCredentials: boolean = false;
+
+	/**
+	 * Create a new WebAuthn instance.
+	 */
+	constructor(
+		routes: {
+			registerOptions?: string;
+			register?: string;
+			loginOptions?: string;
+			login?: string;
+		} = {},
+		headers: {} = {},
+		includeCredentials: boolean = false,
+		xcsrfToken: string | null = null,
+	) {
+		Object.assign(this.#routes, routes);
+		Object.assign(this.#headers, headers);
+
+		this.#includeCredentials = includeCredentials;
+
+		let xsrfToken;
+		let csrfToken;
+
+		if (xcsrfToken === null) {
+			// If the developer didn't issue an XSRF token, we will find it ourselves.
+			xsrfToken = WebAuthn.#XsrfToken;
+			csrfToken = WebAuthn.#firstInputWithCsrfToken;
+		} else {
+			// Check if it is a CSRF or XSRF token
+			if (xcsrfToken.length === 40) {
+				csrfToken = xcsrfToken;
+			} else if (xcsrfToken.length === 224) {
+				xsrfToken = xcsrfToken;
+			} else {
+				throw new TypeError("CSRF token or XSRF token provided does not match requirements. Must be 40 or 224 characters.");
+			}
+		}
+
+		if (xsrfToken !== null) {
+			this.#headers["X-XSRF-TOKEN"] ??= xsrfToken;
+		} else if (csrfToken !== null) {
+			this.#headers["X-CSRF-TOKEN"] ??= csrfToken;
+		} else {
+			// We didn't find it, and since is required, we will bail out.
+			throw new TypeError(
+				'Ensure a CSRF/XSRF token is manually set, or provided in a cookie "XSRF-TOKEN" or or there is meta tag named "csrf-token".',
+			);
+		}
+	}
+
+	/**
+	 * Returns the CSRF token if it exists as a form input tag.
+	 * @throws TypeError
+	 */
+	static get #firstInputWithCsrfToken(): string | null {
+		// First, try finding an CSRF Token in the head.
+		let token: HTMLInputElement | HTMLMetaElement | undefined;
+		token = Array.from(document.head.getElementsByTagName("meta")).find((element) => element.name === "csrf-token");
+
+		if (token) {
+			return token.content;
+		}
+
+		// Then, try to find a hidden input containing the CSRF token.
+		token = Array.from(document.getElementsByTagName("input")).find((input) => input.name === "_token" && input.type === "hidden");
+
+		if (token) {
+			return token.value;
+		}
+
+		return null;
+	}
+
+	/**
+	 * Returns the value of the XSRF token if it exists in a cookie.
+	 *
+	 * Inspired by https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie#example_2_get_a_sample_cookie_named_test2
+	 */
+	static get #XsrfToken(): string | null {
+		const cookie = document.cookie.split(";").find((row) => /^\s*(X-)?[XC]SRF-TOKEN\s*=/.test(row));
+		// We must remove all '%3D' from the end of the string.
+		// Background:
+		// The actual binary value of the CSFR value is encoded in Base64.
+		// If the length of original, binary value is not a multiple of 3 bytes,
+		// the encoding gets padded with `=` on the right; i.e. there might be
+		// zero, one or two `=` at the end of the encoded value.
+		// If the value is sent from the server to the client as part of a cookie,
+		// the `=` character is URL-encoded as `%3D`, because `=` is already used
+		// to separate a cookie key from its value.
+		// When we send back the value to the server as part of an AJAX request,
+		// Laravel expects an unpadded value.
+		// Hence, we must remove the `%3D`.
+		return cookie ? cookie.split("=")[1].trim().replace("/%3D/g", "") : null;
+	}
+
+	/**
+	 * Returns a fetch promise to resolve later.
+	 */
+	#fetch(data: object, route: string, headers: {} = {}): Promise<Response> {
+		const url = new URL(route, window.location.origin).href;
+
+		return fetch(url, {
+			method: "POST",
+			credentials: this.#includeCredentials ? "include" : "same-origin",
+			redirect: "error",
+			headers: { ...this.#headers, ...headers },
+			body: JSON.stringify(data),
+		});
+	}
+
+	/**
+	 * Decodes a BASE64 URL string into a normal string.
+	 */
+	static #base64UrlDecode(input: string): string {
+		input = input.replace(/-/g, "+").replace(/_/g, "/");
+
+		const pad = input.length % 4;
+
+		if (pad) {
+			if (pad === 1) {
+				throw new Error("InvalidLengthError: Input base64url string is the wrong length to determine padding");
+			}
+
+			input += new Array(5 - pad).join("=");
+		}
+
+		return atob(input);
+	}
+
+	/**
+	 * Transform a string into Uint8Array instance.
+	 */
+	static #uint8Array(input: string, useAtob: boolean = false): Uint8Array {
+		return Uint8Array.from(useAtob ? atob(input) : WebAuthn.#base64UrlDecode(input), (c) => c.charCodeAt(0));
+	}
+
+	/**
+	 * Encodes an array of bytes to a BASE64 URL string
+	 */
+	static #arrayToBase64String(arrayBuffer: ArrayBuffer | Uint8Array): string {
+		return btoa(String.fromCharCode(...new Uint8Array(arrayBuffer)));
+	}
+
+	/**
+	 * Parses the Public Key Options received from the Server for the browser.
+	 */
+	#parseIncomingServerOptions(publicKey: any): object {
+		console.debug(publicKey);
+
+		publicKey.challenge = WebAuthn.#uint8Array(publicKey.challenge);
+
+		if ("user" in publicKey) {
+			publicKey.user = {
+				...publicKey.user,
+				id: WebAuthn.#uint8Array(publicKey.user.id),
+			};
+		}
+
+		["excludeCredentials", "allowCredentials"]
+			.filter((key) => key in publicKey)
+			.forEach((key) => {
+				// @ts-ignore
+				publicKey[key] = publicKey[key].map((data) => {
+					return { ...data, id: WebAuthn.#uint8Array(data.id) };
+				});
+			});
+
+		console.log(publicKey);
+
+		return publicKey;
+	}
+
+	/**
+	 * Parses the outgoing credentials from the browser to the server.
+	 */
+	#parseOutgoingCredentials(credentials: Credential | PublicKeyCredential): {
+		response: {};
+		rawId: string;
+		id: string;
+		type: string;
+	} {
+		let parseCredentials = {
+			id: credentials.id,
+			type: credentials.type,
+			// @ts-ignore
+			rawId: WebAuthn.#arrayToBase64String(credentials.rawId),
+			response: {},
+		};
+
+		["clientDataJSON", "attestationObject", "authenticatorData", "signature", "userHandle"]
+			// @ts-ignore
+			.filter((key) => key in credentials.response)
+			// @ts-ignore
+			.forEach((key) => (parseCredentials.response[key] = WebAuthn.#arrayToBase64String(credentials.response[key])));
+
+		return parseCredentials;
+	}
+
+	/**
+	 * Handles the response from the Server.
+	 *
+	 * Throws the entire response if is not OK (HTTP 2XX).
+	 * @throws Response
+	 */
+	static #handleResponse(response: Response): Promise<JSON | ReadableStream> {
+		if (!response.ok) {
+			throw response;
+		}
+
+		// Here we will do a small trick. Since most of the responses from the server
+		// are JSON, we will automatically parse the JSON body from the response. If
+		// it's not JSON, we will push the body verbatim and let the dev handle it.
+		return new Promise((resolve) => {
+			response
+				.json()
+				.then((json: JSON) => resolve(json))
+				.catch(() => resolve((response as ResponseWithBody).body));
+		});
+	}
+
+	/**
+	 * Register the user credentials from the browser/device.
+	 *
+	 * You can add request input if you are planning to register a user with WebAuthn from scratch.
+	 */
+	async register(request: {} = {}, response: {} = {}): Promise<JSON | ReadableStream> {
+		const optionsResponse = await this.#fetch(request, this.#routes.registerOptions);
+		const json = await optionsResponse.json();
+		const publicKey = this.#parseIncomingServerOptions(json);
+		// @ts-ignore
+		const credentials = await navigator.credentials.create({ publicKey });
+		// @ts-ignore
+		const publicKeyCredential = this.#parseOutgoingCredentials(credentials);
+
+		Object.assign(publicKeyCredential, response);
+		Object.assign(publicKeyCredential, request);
+
+		return await this.#fetch(publicKeyCredential, this.#routes.register).then(WebAuthn.#handleResponse);
+	}
+
+	/**
+	 * Log in a user with his credentials.
+	 *
+	 * If no credentials are given, the app may return a blank assertion for userless login.
+	 */
+	async login(request: {} = {}, response: {} = {}): Promise<JSON | ReadableStream> {
+		const optionsResponse = await this.#fetch(request, this.#routes.loginOptions);
+		const json = await optionsResponse.json();
+		const publicKey = this.#parseIncomingServerOptions(json);
+		// @ts-ignore
+		const credentials = await navigator.credentials.get({ publicKey });
+		// @ts-ignore
+		const publicKeyCredential = this.#parseOutgoingCredentials(credentials);
+
+		Object.assign(publicKeyCredential, response);
+
+		console.log(publicKeyCredential);
+
+		return await this.#fetch(publicKeyCredential, this.#routes.login, response).then(WebAuthn.#handleResponse);
+	}
+
+	/**
+	 * Checks if the browser supports WebAuthn.
+	 */
+	static supportsWebAuthn(): boolean {
+		return typeof PublicKeyCredential != "undefined";
+	}
+
+	/**
+	 * Checks if the browser doesn't support WebAuthn.
+	 */
+	static doesntSupportWebAuthn(): boolean {
+		return !this.supportsWebAuthn();
+	}
+}
diff --git a/resources/views/components/context-menu/item.blade.php b/resources/views/components/context-menu/item.blade.php
new file mode 100644
index 00000000000..df8ec529652
--- /dev/null
+++ b/resources/views/components/context-menu/item.blade.php
@@ -0,0 +1,8 @@
+@props(['icon', 'class' => '', 'icon_class'=> ''])
+<div {{ $attributes }} class="my-1 pr-6 pl-10 pb-1 text-text-main-200 transition-all ease-in-out duration-300 cursor-pointer
+hover:scale-105 hover:bg-gradient-to-b hover:from-primary-500 hover:to-primary-600 hover:text-text-hover
+{{ $class }}">
+	<span class="inline-block w-full text-sm leading-3" data-num="2">
+		<x-icons.iconic icon="{{ $icon }}" class="w-3 h-3 -ml-5 mr-2 fill-white {{ $icon_class }}" />{{ $slot }}
+	</span>
+</div>
\ No newline at end of file
diff --git a/resources/views/components/context-menu/separator.blade.php b/resources/views/components/context-menu/separator.blade.php
new file mode 100644
index 00000000000..cb17f3100ad
--- /dev/null
+++ b/resources/views/components/context-menu/separator.blade.php
@@ -0,0 +1,1 @@
+<div class="h-0.5 my-1 border-b border-b-white/[.06] bg-black/20"></div>
\ No newline at end of file
diff --git a/resources/views/components/footer-landing.blade.php b/resources/views/components/footer-landing.blade.php
new file mode 100644
index 00000000000..42146750f2c
--- /dev/null
+++ b/resources/views/components/footer-landing.blade.php
@@ -0,0 +1,25 @@
+<div id="footer" class="absolute bg-black z-10 left-0 right-0 bottom-0 text-center py-1 px-0 overflow-clip">
+	<div id="home_socials" class="fixed bottom-8 left-0 right-0 text-center z-10 opacity-0 translate-y-[300px] animate-ladningAnimateUp">
+		@if($facebook !== '')
+		<a href="{{ $facebook }}" class="inline-block hover:scale-150 hover:text-text-main-400 transition-all ease-in-out duration-300 text-text-main-0 socials text-2xl my-4 mx-5 socialicons" id="facebook" target="_blank" rel="noopener"></a>
+		@endif
+		@if($flickr !== '')
+		<a href="{{ $flickr }}" class="inline-block hover:scale-150 hover:text-text-main-400 transition-all ease-in-out duration-300 text-text-main-0 socials text-2xl my-4 mx-5 socialicons" id="flickr" target="_blank" rel="noopener"></a>
+		@endif
+		@if($twitter !== '')
+		<a href="{{ $twitter }}" class="inline-block hover:scale-150 hover:text-text-main-400 transition-all ease-in-out duration-300 text-text-main-0 socials text-2xl my-4 mx-5 socialicons" id="twitter" target="_blank" rel="noopener"></a>
+		@endif
+		@if($instagram !== '')
+		<a href="{{ $instagram }}" class="inline-block hover:scale-150 hover:text-text-main-400 transition-all ease-in-out duration-300 text-text-main-0 socials text-2xl my-4 mx-5 socialicons" id="instagram" target="_blank" rel="noopener"></a>
+		@endif
+		@if($youtube !== '')
+		<a href="{{ $youtube }}" class="inline-block hover:scale-150 hover:text-text-main-400 transition-all ease-in-out duration-300 text-text-main-0 socials text-2xl my-4 mx-5 socialicons" id="youtube" target="_blank" rel="noopener"></a>
+		@endif
+	</div>
+	@isset($copyright)
+		<p class="home_copyright uppercase text-text-main-0 text-3xs font-normal translate-y-[300px] animate-ladningAnimateUp">{{ $copyright }}</p>
+	@endisset
+	@isset($personal_text)
+		<p class="personal_text text-text-main-0 text-3xs font-normal translate-y-[300px] animate-ladningAnimateUp">{{ $personal_text }}</p>
+	@endisset
+</div>
diff --git a/resources/views/components/footer.blade.php b/resources/views/components/footer.blade.php
new file mode 100644
index 00000000000..101253ee333
--- /dev/null
+++ b/resources/views/components/footer.blade.php
@@ -0,0 +1,40 @@
+<div id="footer" class="w-full h-full flex flex-col justify-end flex-wrap
+	align-bottom self-end text-center py-5 px-0 text-3xs">
+	<!--
+	Footer
+	Vertically shares space with the content.
+	The height of the footer is always the natural height
+	of its child elements
+	-->
+	@if($show_socials)
+	<div id="home_socials" class="w-full" style="display: none;">
+		@if($facebook !== '')
+		<a href="{{ $facebook }}" class="socialicons" id="facebook" target="_blank" rel="noopener"></a>
+		@endif
+		@if($flickr !== '')
+		<a href="{{ $flickr }}" class="socialicons" id="flickr" target="_blank" rel="noopener"></a>
+		@endif
+		@if($twitter !== '')
+		<a href="{{ $twitter }}" class="socialicons" id="twitter" target="_blank" rel="noopener"></a>
+		@endif
+		@if($instagram !== '')
+		<a href="{{ $instagram }}" class="socialicons" id="instagram" target="_blank" rel="noopener"></a>
+		@endif
+		@if($youtube !== '')
+		<a href="{{ $youtube }}" class="socialicons" id="youtube" target="_blank" rel="noopener"></a>
+		@endif
+	</div>
+	@endif
+	@isset($copyright)
+		<p class="home_copyright w-full uppercase text-text-main-400 leading-6 font-normal">{{ $copyright }}</p>
+	@endisset
+	@isset($personal_text)
+		<p class="personal_text w-full text-text-main-400 leading-6 font-normal">{{ $personal_text }}</p>
+	@endisset
+	@isset($hosted_by)
+	<p class="hosted_by w-full uppercase text-text-main-400 leading-6 font-normal">
+		<a rel="noopener noreferrer" target="_blank" href="https://LycheeOrg.github.io" tabindex="-1"
+		class="underline">{{ $hosted_by }}</a>
+	</p>
+	@endisset
+</div>
diff --git a/resources/views/components/forms/buttons/action.blade.php b/resources/views/components/forms/buttons/action.blade.php
new file mode 100644
index 00000000000..99127da8000
--- /dev/null
+++ b/resources/views/components/forms/buttons/action.blade.php
@@ -0,0 +1,7 @@
+@props(['class' => 'w-full'])
+<a class="basicModal__button pt-3 pb-4 flex-shrink 
+    cursor-pointer inline-block font-bold text-center transition-colors ease-in-out select-none
+    text-primary-500 hover:bg-primary-500 hover:text-text-hover {{ $class }}"
+    {{ $attributes }}
+    wire:loading.attr="disabled">{{ $slot }}
+</a>
diff --git a/resources/views/components/forms/buttons/cancel.blade.php b/resources/views/components/forms/buttons/cancel.blade.php
new file mode 100644
index 00000000000..cb116bbf5ad
--- /dev/null
+++ b/resources/views/components/forms/buttons/cancel.blade.php
@@ -0,0 +1,7 @@
+@props(['class' => 'w-full'])
+<a class="basicModal__button pt-3 pb-4 flex-shrink-2
+    cursor-pointer inline-block font-bold text-center transition-colors ease-in-out select-none
+    hover:text-danger-700 {{ $class }}"
+    {{ $attributes }}>
+    {{ $slot }}
+</a>
diff --git a/resources/views/components/forms/buttons/create.blade.php b/resources/views/components/forms/buttons/create.blade.php
new file mode 100644
index 00000000000..535ad960d75
--- /dev/null
+++ b/resources/views/components/forms/buttons/create.blade.php
@@ -0,0 +1,7 @@
+@props(['class' => 'w-full'])
+<a class="basicModal__button pt-3 pb-4 flex-shrink 
+    cursor-pointer inline-block font-bold text-center transition-colors ease-in-out select-none
+    text-create-600 hover:text-text-hover hover:bg-create-700 {{ $class }}"
+    {{ $attributes }}
+    wire:loading.attr="disabled">{{ $slot }}
+</a>
diff --git a/resources/views/components/forms/buttons/danger.blade.php b/resources/views/components/forms/buttons/danger.blade.php
new file mode 100644
index 00000000000..b8278e9f167
--- /dev/null
+++ b/resources/views/components/forms/buttons/danger.blade.php
@@ -0,0 +1,7 @@
+@props(['class' => 'w-full'])
+<a class="basicModal__button pt-3 pb-4 flex-shrink
+    cursor-pointer inline-block font-bold text-center transition-colors ease-in-out select-none
+    text-danger-800 hover:text-text-hover hover:bg-danger-800 {{ $class }}"
+    {{ $attributes }}>
+    {{ $slot }}
+</a>
diff --git a/resources/views/components/forms/defaulttickbox.blade.php b/resources/views/components/forms/defaulttickbox.blade.php
new file mode 100644
index 00000000000..0dc08b602d9
--- /dev/null
+++ b/resources/views/components/forms/defaulttickbox.blade.php
@@ -0,0 +1,7 @@
+@props(['class' => 'absolute w-4 h-4 top-1 left-0 ', 'disabled' => false])
+<input class="appearance-none text-primary-500 border-none rounded box-shadow bg-bg-500
+checked:before:content-['\✔']
+before:absolute before:text-center before:text-base/4 before:w-auto before:h-auto
+before:top-0 before:left-0 before:right-0 before:bottom-0
+{{ $class }}" type='checkbox' {{ $attributes }}
+@disabled($disabled) />
diff --git a/resources/views/components/forms/dropdown.blade.php b/resources/views/components/forms/dropdown.blade.php
new file mode 100644
index 00000000000..49e9488111d
--- /dev/null
+++ b/resources/views/components/forms/dropdown.blade.php
@@ -0,0 +1,12 @@
+@props(['options', 'class' => 'mx-1'])
+<span class="relative w-max my-[1px] text-text-main-0 rounded overflow-hidden bg-black/30 inline-block text-2xs align-middle
+after:content-['≡'] after:absolute after:text-primary-400 after:right-2 after:top-0 after:font-bold after:text-lg after:-mt-1
+after:pointer-events-none {{ $class }}">
+    <select class="m-0 py-1 w-[120%] text-text-main-0 bg-transparent text-2xs px-2" {{ $attributes }}>
+    @foreach($options as $key => $option)
+        <option class="text-neutral-800"
+            @if (is_string($key)) value="{{ $key }}" @endif>{{ $option }}
+        </option>
+    @endforeach
+    </select>
+</span>
diff --git a/resources/views/components/forms/error-message.blade.php b/resources/views/components/forms/error-message.blade.php
new file mode 100644
index 00000000000..57791975179
--- /dev/null
+++ b/resources/views/components/forms/error-message.blade.php
@@ -0,0 +1,4 @@
+@props(['field', 'class' => ''])
+@error($field)
+<span class=" text-danger-600 font-bold {{ $class }}">{{ $message }}</span>
+@enderror
diff --git a/resources/views/components/forms/inputs/date.blade.php b/resources/views/components/forms/inputs/date.blade.php
new file mode 100644
index 00000000000..6a58092a0d2
--- /dev/null
+++ b/resources/views/components/forms/inputs/date.blade.php
@@ -0,0 +1,6 @@
+@props(['class' => '', 'has_error' => false])
+<input {{ $attributes }} class="pt-1 pb-0 px-0.5 h-7 border-b border-b-solid border-b-bg-600
+placeholder:text-text-main-400
+hover:border-b-primary-400 focus:border-b-primary-400
+@if($has_error) bg-danger-700/10 text-danger-400 @else text-text-main-0 bg-transparent @endif
+{{ $class }}" type="datetime-local" pattern="[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}" />
\ No newline at end of file
diff --git a/resources/views/components/forms/inputs/important.blade.php b/resources/views/components/forms/inputs/important.blade.php
new file mode 100644
index 00000000000..60a531af161
--- /dev/null
+++ b/resources/views/components/forms/inputs/important.blade.php
@@ -0,0 +1,7 @@
+@props(['class' => '', 'has_error' => false])
+<input class="w-full pt-1 pb-0 px-0.5 h-7 border-b border-b-solid border-b-bg-800
+placeholder:text-text-main-400
+hover:border-b-danger-700 focus:border-b-danger-700
+@if($has_error) bg-danger-700/10 text-danger-600 @else text-text-main-0 bg-transparent @endif
+{{ $class }}"
+{{ $attributes }} type="text" />
\ No newline at end of file
diff --git a/resources/views/components/forms/inputs/password.blade.php b/resources/views/components/forms/inputs/password.blade.php
new file mode 100644
index 00000000000..b0ada00f947
--- /dev/null
+++ b/resources/views/components/forms/inputs/password.blade.php
@@ -0,0 +1,15 @@
+@props(['class' => '', 'has_error' => false])
+<div x-data="{ show: true }" class="relative">
+<input class="w-full pt-1 pb-0 px-0.5 h-7 border-b border-b-solid border-b-bg-500
+placeholder:text-text-main-400
+hover:border-b-danger-700 focus:border-b-danger-700
+@if($has_error) bg-danger-700/10 text-danger-600 @else text-text-main-0 bg-transparent @endif
+{{ $class }}"
+{{ $attributes }} 
+x-bind:type="show ? 'password' : 'text'"
+x-ref="pw" />
+	<div class="absolute top-1/2 right-2 cursor-pointer" style="transform: translateY(-50%);">
+		<x-icons.iconic class="w-4 h-4 text-text-main-400 hidden" fill="none" x-on:click="show = !show" ::class="{'hidden': !show, 'block':show }" icon="password-eye" />
+		<x-icons.iconic class="w-4 h-4 text-text-main-400 hidden" fill="none" x-on:click="show = !show" ::class="{'block': !show, 'hidden':show }" icon="password-eye-closed" />
+  </div>
+</div>
\ No newline at end of file
diff --git a/resources/views/components/forms/inputs/text.blade.php b/resources/views/components/forms/inputs/text.blade.php
new file mode 100644
index 00000000000..bd600b57b44
--- /dev/null
+++ b/resources/views/components/forms/inputs/text.blade.php
@@ -0,0 +1,7 @@
+@props(['class' => 'w-full', 'has_error' => false])
+<input class="pt-1 pb-0 px-0.5 h-7 border-b border-b-solid border-b-bg-500
+placeholder:text-text-main-200
+hover:border-b-primary-400 focus:border-b-primary-400
+@if($has_error) bg-danger-700/10 text-danger-600 @else text-text-main-0 bg-transparent @endif
+{{ $class }}"
+ {{ $attributes }} type="text" />
\ No newline at end of file
diff --git a/resources/views/components/forms/textarea.blade.php b/resources/views/components/forms/textarea.blade.php
new file mode 100644
index 00000000000..0df1c48ff74
--- /dev/null
+++ b/resources/views/components/forms/textarea.blade.php
@@ -0,0 +1,3 @@
+@props(['class' => ''])
+<textarea {{ $attributes }} class="p-2 h-28 bg-transparent text-text-main-0 border border-solid border-bg-400 resize-y w-full
+hover:border-primary-400 focus:border-primary-400 focus-visible:outline-none {{ $class }}">{{ $slot }}</textarea>
diff --git a/resources/views/components/forms/tickbox.blade.php b/resources/views/components/forms/tickbox.blade.php
new file mode 100644
index 00000000000..60cf9b7f786
--- /dev/null
+++ b/resources/views/components/forms/tickbox.blade.php
@@ -0,0 +1,9 @@
+@props(['title', 'class' => '', 'disabled' => false])
+<span class="inline-block {{ $class }}" title="{{ $title }}">
+    <label>
+        <input {{ $attributes }} type="checkbox" class="absolute m-0 opacity-0" @disabled($disabled)>
+        <span class="checkbox inline-block w-4 h-4 mt-1.5 mx-2 bg-black/50 rounded-sm">
+            <x-icons.iconic class=" fill-primary-500 opacity-0 p-0.5 w-full h-full scale-0 mb-2" icon="check" />
+        </span>
+    </label>
+</span>
diff --git a/resources/views/components/forms/toggle.blade.php b/resources/views/components/forms/toggle.blade.php
new file mode 100644
index 00000000000..a7fa0006a70
--- /dev/null
+++ b/resources/views/components/forms/toggle.blade.php
@@ -0,0 +1,6 @@
+<label class="switch relative inline-block w-[42px] h-[22px] -bottom-0.5 leading-6">
+    <input class="opacity-0 w-0 h-0" {{ $attributes }} type="checkbox">
+    {{-- slider ensure that we have a toggle --}}
+    <span class="slider absolute block cursor-pointer top-0 left-0 right-0 bottom-0 border border-solid border-black/20 bg-black/30 rounded-3xl
+    before:absolute before:content-[''] before:bg-primary-500 before:w-[14px] before:h-[14px] before:left-[3px] before:bottom-[3px] before:rounded-3xl"></span>
+</label>
diff --git a/resources/views/components/gallery/album/details.blade.php b/resources/views/components/gallery/album/details.blade.php
new file mode 100644
index 00000000000..04fdf7d6078
--- /dev/null
+++ b/resources/views/components/gallery/album/details.blade.php
@@ -0,0 +1,42 @@
+<div class="w-full px-7 my-4 flex flex-row-reverse" {{ $attributes }} x-transition.opacity >
+    <div class="order-1 flex flex-col w-full">
+        @if($this->AlbumFormatted->url === null )
+            <h1 class="font-bold text-2xl text-text-main-0">{{ $this->title }}</h1>
+        @endif
+        @if($this->AlbumFormatted->created_at !== null)
+        <span class="block text-neutral-200 text-sm">
+            {{ __('lychee.ALBUM_CREATED') }} {{ $this->AlbumFormatted->created_at }}
+        </span>
+        @endif
+        @if($this->num_albums > 0)
+            <span class="block text-neutral-200 text-sm">
+                {{ $this->num_albums }} {{ __('lychee.ALBUM_SUBALBUMS') }}
+            </span>
+        @endif
+        @if($this->num_photos > 0)
+            <span class="block text-neutral-200 text-sm">
+                {{ $this->num_photos }} {{ __('lychee.ALBUM_IMAGES') }}
+                @if($this->AlbumFormatted->license !== '')
+                <span class="text-text-main-400 text-sm">
+                    &mdash; {{ $this->AlbumFormatted->license }}
+                </span>
+                @endif
+            </span>
+        @endif
+    </div>
+    @if($this->rights->can_download)
+    <a class="flex-shrink-0 px-3 cursor-pointer"
+        title="{{ __('lychee.DOWNLOAD_ALBUM') }}"
+        href="{{ route('download', ['albumIDs' => $this->albumId]) }}" >
+        <x-icons.iconic class="my-0 w-4 h-4 mr-0 ml-0" icon="cloud-download" />
+    </a>
+    @endif
+    <a class="flex-shrink-0 px-3 cursor-pointer" title={{ __('lychee.SHARE_ALBUM') }} x-on:click="albumFlags.isSharingLinksOpen = true">
+        <x-icons.iconic class="my-0 w-4 h-4 mr-0 ml-0" icon="share-ion" />
+    </a>
+</div>
+@if($this->AlbumFormatted->description !== null)
+<div class="w-full px-7 my-4 text-justify text-neutral-200 markdown" {{ $attributes }} >
+    @markdown{{ $this->AlbumFormatted->description }}@endmarkdown
+</div>
+@endif
\ No newline at end of file
diff --git a/resources/views/components/gallery/album/hero.blade.php b/resources/views/components/gallery/album/hero.blade.php
new file mode 100644
index 00000000000..75234444557
--- /dev/null
+++ b/resources/views/components/gallery/album/hero.blade.php
@@ -0,0 +1,15 @@
+@if ($this->AlbumFormatted->url !== null)
+<div class="w-full h-1/2 text-neutral-200 relative" {{ $attributes }} >
+    <img class="absolute block top-0 left-0 w-full h-full object-cover object-center z-0" src="{{ URL::asset($this->AlbumFormatted->url) }}">
+    <div class="h-full pl-7 pt-7 relative text-shadow-sm w-full bg-gradient-to-b from-black/20 via-80%">
+        <h1 class="font-bold text-4xl text-text-main-0">{{ $this->title }}</h1>
+        @if($this->AlbumFormatted->min_taken_at !== null)
+        <span class="text-neutral-200 text-sm">{{ $this->AlbumFormatted->min_taken_at }}
+            @if($this->AlbumFormatted->max_taken_at !== $this->AlbumFormatted->min_taken_at)
+                - {{ $this->AlbumFormatted->max_taken_at }}
+            @endif
+        </span>
+        @endif
+    </div>
+</div>
+@endif
\ No newline at end of file
diff --git a/resources/views/components/gallery/album/login-dialog.blade.php b/resources/views/components/gallery/album/login-dialog.blade.php
new file mode 100644
index 00000000000..c2add5d9c47
--- /dev/null
+++ b/resources/views/components/gallery/album/login-dialog.blade.php
@@ -0,0 +1,10 @@
+<div class="basicModalContainer transition-opacity duration-1000 ease-in animate-fadeIn
+	bg-black/80 z-50 fixed flex items-center justify-center w-full h-full top-0 left-0 box-border opacity-100"
+    data-closable="true" x-data="{ loginModalOpen: true }">
+    <div class="basicModal transition-opacity ease-in duration-1000
+			opacity-100 bg-gradient-to-b from-bg-300 to-bg-400
+			relative w-[500px] text-sm rounded-md text-text-main-400 animate-moveUp"
+        role="dialog">
+        <livewire:modals.login />
+    </div>
+</div>
diff --git a/resources/views/components/gallery/album/menu/danger.blade.php b/resources/views/components/gallery/album/menu/danger.blade.php
new file mode 100644
index 00000000000..bdebd598e80
--- /dev/null
+++ b/resources/views/components/gallery/album/menu/danger.blade.php
@@ -0,0 +1,8 @@
+@props(['class' => 'w-full','tab'])
+<li class="px-2 pt-3 pb-4 cursor-pointer font-bold text-center transition-colors ease-in-out select-none
+    xl:border-l-2 max-xl:border-b-2 border-solid border-red-800
+    hover:bg-red-800 hover:text-text-main-0 {{ $class }}"
+    x-bind:class="! albumFlags.activeTab === {{ $tab }} ? 'text-text-main-0 bg-red-800' : 'text-red-800'"
+    {{ $attributes }} x-on:click="albumFlags.activeTab = {{ $tab }}">
+    {{ $slot }}
+</li>
diff --git a/resources/views/components/gallery/album/menu/item.blade.php b/resources/views/components/gallery/album/menu/item.blade.php
new file mode 100644
index 00000000000..a1aec4ad47c
--- /dev/null
+++ b/resources/views/components/gallery/album/menu/item.blade.php
@@ -0,0 +1,10 @@
+@props(['class' => 'w-full', 'tab'])
+<li class="px-2 pt-3 pb-4 cursor-pointer font-bold text-center transition-colors ease-in-out select-none
+    xl:border-l-2 max-xl:border-b-2 border-solid
+    border-primary-500 text-primary-500 
+    hover:border-primary-200 hover:text-primary-200
+    {{ $class }}"
+    x-bind:class="! albumFlags.activeTab === {{ $tab }} ? 'bg-primary-200/10' : ''"
+    {{ $attributes }} x-on:click="albumFlags.activeTab = {{ $tab }}">
+    {{ $slot }}
+</li>
diff --git a/resources/views/components/gallery/album/menu/menu.blade.php b/resources/views/components/gallery/album/menu/menu.blade.php
new file mode 100644
index 00000000000..ab6f1abb952
--- /dev/null
+++ b/resources/views/components/gallery/album/menu/menu.blade.php
@@ -0,0 +1,38 @@
+@props(['album', 'userCount' => 0])
+<div class="w-full flex justify-center flex-wrap flex-row-reverse" x-cloak x-show="albumFlags.isDetailsOpen" x-collapse.duration.300ms >
+    <ul class="
+        sm:mt-7 sm:px-7 mb-4
+        text-neutral-200 text-sm w-full xl:w-1/6 xl:px-9
+        max-xl:w-full max-xl:flex max-xl:justify-center
+        ">
+        <x-gallery.album.menu.item tab='0' >{{ __('lychee.ABOUT_ALBUM') }}</x-gallery.album.menu.item>
+        @if ($userCount > 1 && ($album instanceof \App\Models\Album))
+        <x-gallery.album.menu.item tab='1' >{{ __('lychee.SHARE_ALBUM') }}</x-gallery.album.menu.item>
+        @endif
+        @if($album instanceof \App\Models\Album)
+        <x-gallery.album.menu.item tab='2' >{{ __('lychee.MOVE_ALBUM') }}</x-gallery.album.menu.item>
+        @endif
+        <x-gallery.album.menu.danger tab='3' >{{ "DANGER ZONE" }}</x-gallery.album.menu.danger>
+    </ul>
+    <div class="w-full xl:w-5/6 flex justify-center flex-wrap mb-4 sm:mt-7 pl-7" x-cloak x-show="albumFlags.activeTab === 0">
+        <livewire:forms.album.properties :album="$album" />
+        <livewire:forms.album.visibility :album="$album" />
+    </div>
+    @if ($userCount > 1 && ($album instanceof \App\Models\Album))
+    <div class="w-full xl:w-5/6 flex justify-center flex-wrap mb-4 sm:mt-7 pl-7" x-cloak x-show="albumFlags.activeTab === 1">
+        <livewire:forms.album.share-with :album="$album" />
+    </div>
+    @endif
+    @if($album instanceof \App\Models\Album)
+    <div class="w-full xl:w-5/6 flex justify-center flex-wrap mb-4 sm:mt-7 pl-7" x-cloak x-show="albumFlags.activeTab === 2">
+        <livewire:forms.album.move-panel :album="$album" />
+    </div>
+    @endif
+    <div class="w-full xl:w-5/6 flex justify-center flex-wrap mb-4 sm:mt-7 pl-7" x-cloak x-show="albumFlags.activeTab === 3">
+            {{-- We only display this menu if there are more than 1 user, it does not make sense otherwise --}}
+            @if ($userCount > 1)
+            <livewire:forms.album.transfer :album="$album"  lazy />
+            @endif
+            <livewire:forms.album.delete-panel :album="$album" />
+    </div>
+</div>
diff --git a/resources/views/components/gallery/album/sharing-links.blade.php b/resources/views/components/gallery/album/sharing-links.blade.php
new file mode 100644
index 00000000000..07bd313b11d
--- /dev/null
+++ b/resources/views/components/gallery/album/sharing-links.blade.php
@@ -0,0 +1,35 @@
+<div class="basicModalContainer transition-opacity duration-1000 ease-in animate-fadeIn
+    bg-black/80 fixed flex items-center justify-center w-full h-full top-0 left-0 box-border opacity-100"
+    data-closable="true"
+    x-cloak
+	{{ $attributes }} >
+    <div class="basicModal transition-opacity ease-in duration-1000
+        opacity-100 bg-gradient-to-b from-bg-300 to-bg-400
+        relative w-[500px] text-sm rounded-md text-text-main-400 animate-moveUp"
+        role="dialog" x-on:click.away="sharingLinksOpen = false"
+        x-data="qrBuilder()"
+        >
+        <div class="flex flex-wrap p-9 gap-5 justify-center align-top text-text-main-0/80"
+            x-show="!qrCodeOpen"
+            >
+                <x-icons.iconic class="w-10 h-10 ionicons cursor-pointer" icon="twitter" x-on:click="window.open('{{ $twitter_link }}')" />
+                <x-icons.iconic class="w-10 h-10 ionicons cursor-pointer" icon="facebook" x-on:click="window.open('{{ $facebook_link }}')" />
+                <x-icons.iconic class="w-10 h-10 cursor-pointer" icon="envelope-closed" x-on:click="window.open('{{ $mailTo_link }}')" />
+				<a class="cursor-pointer" x-on:click="
+                navigator.clipboard.writeText('{{ $url }}').then(() => $dispatch('notify', [{type:'success', msg:'{{ __("lychee.URL_COPIED_TO_CLIPBOARD") }}'}]));
+                " >
+    				<x-icons.iconic class="w-10 h-10" icon="link-intact" />
+                </a>
+				<x-icons.iconic class="w-10 h-10" icon="grid-two-up" x-on:click="qrCodeOpen = true; setQrCode('{{ $rawUrl }}');" />
+		</div>
+        <div class="flex flex-wrap p-9 gap-5 justify-center align-top text-text-main-0/80" x-show="qrCodeOpen">
+            <canvas id="canvas"></canvas>
+        </div>
+        <div class="basicModal__buttons">
+            <x-forms.buttons.cancel
+                x-on:click="qrCodeOpen = false; albumFlags.isSharingLinksOpen = false"
+                class="border-t border-t-black/20 w-full hover:bg-white/[.02]">
+                {{ __('lychee.CLOSE') }}</x-forms.buttons.cancel>
+        </div>
+    </div>
+</div>
diff --git a/resources/views/components/gallery/album/thumbs/album-thumb.blade.php b/resources/views/components/gallery/album/thumbs/album-thumb.blade.php
new file mode 100644
index 00000000000..384a04577de
--- /dev/null
+++ b/resources/views/components/gallery/album/thumbs/album-thumb.blade.php
@@ -0,0 +1,16 @@
+<span
+    class="thumbimg absolute w-full
+	bg-neutral-800
+	shadow-md shadow-black/25
+	border-solid border border-neutral-400
+	ease-out transition-transform
+	{{ $class }}
+	">
+    <img alt='{{ __('lychee.PHOTO_THUMBNAIL') }}'
+		class='w-full h-full m-0 p-0 border-0 lazyload'
+	{!! $src !!}
+	{!! $dataSrc !!}
+	{!! $dataSrcSet !!}
+    data-overlay='false'
+    draggable='false' />
+</span>
diff --git a/resources/views/components/gallery/album/thumbs/album.blade.php b/resources/views/components/gallery/album/thumbs/album.blade.php
new file mode 100644
index 00000000000..df7b6d5a54c
--- /dev/null
+++ b/resources/views/components/gallery/album/thumbs/album.blade.php
@@ -0,0 +1,97 @@
+<a wire:navigate href="{{ route('livewire-gallery-album', ['albumId' => $id]) }}"
+	@class([
+	"album-thumb block relative aspect-square
+	w-[calc(33vw-9px-4px)] ml-1 mt-1
+	sm:w-[calc(25vw-9px-10px)] sm:ml-2 sm:mt-2
+	md:w-[calc(20vw-9px-18px)] md:ml-4 md:mt-4
+	lg:w-[calc(16vw-9px-15px)] lg:ml-5 lg:mt-5
+	xl:w-[calc(14vw-9px-22px)] xl:ml-6 xl:mt-6
+	2xl:w-52 2xl:ml-7 2xl:mt-7
+	animate-zoomIn
+	group",
+	"blurred" => $is_nsfw_blurred
+	])
+	{{-- if it is NOT nsfw => display Otherwise check nsfwAlbumsVisible alpine value --}}
+	{{-- This would be better if livewire did not add comments around @if --}}
+	x-show="{{ !$is_nsfw ? 'true' : 'false' }} || albumFlags.areNsfwVisible"
+	data-id='{{ $id }}'
+	x-on:contextmenu.prevent="handleContextAlbum($event, $wire)"
+	x-on:click='select.handleClickAlbum($event, $wire)'
+	x-bind:class="select.selectedAlbums.includes('{{ $id }}') ? 'outline outline-1 outline-primary-500' : ''"
+	>
+	<x-gallery.album.thumbs.album-thumb class="group-hover:border-primary-500 group-hover:-rotate-2 group-hover:-translate-x-3 group-hover:translate-y-2"
+		type="{{ $thumb?->type ?? '' }}" thumb="{{ $thumb?->thumbUrl ?? '' }}" thumb2x="{{ $thumb?->thumb2xUrl ?? '' }}" />
+	<x-gallery.album.thumbs.album-thumb class="group-hover:border-primary-500 group-hover:rotate-6 group-hover:translate-x-3  group-hover:-translate-y-2"
+		type="{{ $thumb?->type ?? '' }}" thumb="{{ $thumb?->thumbUrl ?? '' }}" thumb2x="{{ $thumb?->thumb2xUrl ?? '' }}" />
+	<x-gallery.album.thumbs.album-thumb class="group-hover:border-primary-500"
+		type="{{ $thumb?->type ?? '' }}" thumb="{{ $thumb?->thumbUrl ?? '' }}" thumb2x="{{ $thumb?->thumb2xUrl ?? '' }}" />
+	<div class='overlay absolute mb-[1px] mx-[1px] p-0 border-0 w-[calc(100%-2px)] bottom-0 bg-gradient-to-t from-[#00000099] text-shadow-sm'>
+		<h1 class="w-full pt-3 pb-1 pr-1 pl-4 text-sm text-text-main-0 font-bold text-ellipsis whitespace-nowrap overflow-x-hidden" title='{{ $title }}'>{{ $title }}</h1>
+		<span class="block mt-0 mr-0 mb-3 ml-4 text-2xs text-neutral-300">
+			@switch($subType)
+				@case('description')
+					{{ Str::limit($description, 100) }}
+					@break
+				@case('takedate')
+					@isset($max_taken_at)
+					<x-icons.iconic icon="camera" class=" fill-neutral-200 w-3 h-3" /> {{ $max_taken_at === $min_taken_at ? $min_taken_at : $max_taken_at . ' - ' . $min_taken_at }}
+					@break
+					@endisset
+				@case('creation')
+					{{ $created_at }}
+					@break
+				@default
+					{{ $max_taken_at === $min_taken_at ? $min_taken_at : $max_taken_at . ' - ' . $min_taken_at }}					
+			@endswitch
+		</span>
+	</div>
+	@if(Str::contains($thumb?->type, 'video'))
+	<span class="w-full h-full absolute hover:opacity-70 transition-opacity duration-300">
+		<img class="h-full w-full" alt="play"  src="{{ URL::asset("img/play-icon.png") }}" />
+	</span>
+	@endif
+	@auth
+	<div class='badges absolute mt-[-1px] ml-1 top-0 left-0'>
+		@if ($is_nsfw)
+			<x-gallery.badge class='badge--nsfw bg-[#ff82ee]' icon='warning' />
+		@endif
+		@switch($id)
+			@case(App\SmartAlbums\StarredAlbum::ID)
+			<x-gallery.badge class='badge--star bg-yellow-500' icon='star' />
+			@break
+			@case(App\SmartAlbums\PublicAlbum::ID)
+			<x-gallery.badge class='badge--public bg-green-600' icon='eye' />
+			@break
+			@case(App\SmartAlbums\UnsortedAlbum::ID)
+			<x-gallery.badge class='badge--unsorted bg-red-700' icon='list' />
+			@break
+			@case(App\SmartAlbums\RecentAlbum::ID)
+			<x-gallery.badge class='badge--recent bg-blue-700' icon='clock' />
+			@break
+			@case(App\SmartAlbums\OnThisDayAlbum::ID)
+			<x-gallery.badge class='badge--onthisday bg-green-600' icon='calendar' />
+			@break
+			@default
+		@endswitch
+		@if ($is_public)
+			<x-gallery.badge class='badge--ispublic {{ $is_link_required ? "bg-orange-400" : "bg-green-600"}}' icon='eye' />
+		@endif
+		@if ($is_password_required)
+			<x-gallery.badge class='badge--locked bg-orange-400' icon='lock-locked' />
+		@endif
+		@if ($is_tag_album == "1")
+			<x-gallery.badge class='badge--tag bg-green-600' icon='tag' />
+		@endif
+		@if ($is_cover_id)
+			<x-gallery.badge class='badge--cover bg-yellow-500' icon='folder-cover' />
+		@endif
+	</div>
+	@endauth
+	@if ($has_subalbum)
+	<div class='album_counters absolute right-2 top-1.5 flex flex-row gap-1 justify-end text-right font-bold font-sans drop-shadow-md'>
+		<div class="layers relative py-1 px-1">
+			<x-icons.iconic icon="layers" class=" fill-white w-3 h-3" />
+		</div>
+	</div>
+	@endif
+</a>
\ No newline at end of file
diff --git a/resources/views/components/gallery/album/thumbs/photo.blade.php b/resources/views/components/gallery/album/thumbs/photo.blade.php
new file mode 100644
index 00000000000..2525ea218b8
--- /dev/null
+++ b/resources/views/components/gallery/album/thumbs/photo.blade.php
@@ -0,0 +1,47 @@
+<a 
+{{-- wire:navigate href="{{ route('livewire-gallery-photo',['albumId'=>$album_id, 'photoId' => $photo_id]) }}" --}}
+	class='photo group shadow-md shadow-black/25 animate-zoomIn transition-all ease-in duration-200 block absolute'
+	data-album-id='{{ $album_id }}'
+	data-width='{{ $_w }}'
+	data-height='{{ $_h }}'
+	data-id='{{ $photo_id }}'
+	x-on:contextmenu.prevent='handleContextPhoto($event, $wire)'
+	x-on:click='handleClickPhoto($event, $wire)'
+	x-bind:class="select.selectedPhotos.includes('{{ $photo_id }}') ? 'outline outline-1 outline-primary-500' : ''"
+	>
+	<span class="thumbimg w-full h-full border-none {{ $is_video ? 'video' : '' }} {{ $is_livephoto ? 'livephoto' : '' }}">
+		<img
+			alt='Photo thumbnail'
+			class="h-full w-full border-none object-cover object-center {{ $is_lazyload ? 'lazyload' : ''}}"
+			{!! $src !!}
+			{!! $srcset !!}
+			{!! $srcset2x !!}
+			data-overlay='false'
+			draggable='false'
+		/>
+	</span>
+	<div class='overlay w-full absolute bottom-0 m-0 opacity-0 bg-gradient-to-t from-[#00000066] group-hover:opacity-100 transition-opacity ease-out
+	text-shadow-sm'>
+		<h1 class=" min-h-[19px] mt-3 mb-1 ml-3 text-text-main-0 text-base font-bold overflow-hidden whitespace-nowrap text-ellipsis">{{ $title }}</h1>
+		<span class="block mt-0 mr-0 mb-2 ml-3 text-2xs text-neutral-300">
+			@if($taken_at !== "")
+				<span title='Camera Date'><x-icons.iconic icon='camera-slr' class="w-2 h-2 m-0 mr-1 fill-neutral-300" /></span>{{ $taken_at }}
+			@else
+				{{ $created_at }}
+			@endif
+		</span>
+	</div>
+	@if($is_video)
+	<div class="w-full top-0 h-full absolute hover:opacity-70 transition-opacity duration-300">
+		<img class="absolute top-1/2 -translate-y-1/2 aspect-square w-fit h-fit" alt="play"  src="{{ URL::asset("img/play-icon.png") }}" />
+	</div>
+	@endif
+	@auth
+		<div class='badges absolute mt-[-1px] ml-1 top-0 left-0'>
+			<x-gallery.badge x-show='$store.photos[{{ $idx }}].is_starred' class='badge--star bg-yellow-500' icon='star'/>
+			@if ($is_cover_id)
+				<x-gallery.badge class='badge--cover bg-yellow-500' icon='folder-cover' />
+			@endif
+		</div>
+	@endauth
+</a>
\ No newline at end of file
diff --git a/resources/views/components/gallery/badge.blade.php b/resources/views/components/gallery/badge.blade.php
new file mode 100644
index 00000000000..7f257ff9f66
--- /dev/null
+++ b/resources/views/components/gallery/badge.blade.php
@@ -0,0 +1,8 @@
+@props(['class', 'icon'])
+<span
+    class='badge inline-block ml-1 px-2 pt-2 pb-1 border-solid border-white border border-t-0 rounded-md rounded-t-none text-text-main-0 text-center {{ $class }}'
+    {{ $attributes }} >
+    <svg class='iconic inline w-4 h-4 fill-white'>
+        <use xlink:href='#{{ $icon }}' />
+    </svg>
+</span>
diff --git a/resources/views/components/gallery/divider.blade.php b/resources/views/components/gallery/divider.blade.php
new file mode 100644
index 00000000000..0b1ba1e9efd
--- /dev/null
+++ b/resources/views/components/gallery/divider.blade.php
@@ -0,0 +1,4 @@
+@props(['title'])
+<div class='divider first:mt-0 mt-4 pt-2 w-full first:border-none border-t border-t-bg-800'>
+    <h1 class="ml-7 font-bold text-sm text-text-main-400">{{ $title }}</h1>
+</div>
diff --git a/resources/views/components/gallery/photo/button.blade.php b/resources/views/components/gallery/photo/button.blade.php
new file mode 100644
index 00000000000..a7c8c80dd1b
--- /dev/null
+++ b/resources/views/components/gallery/photo/button.blade.php
@@ -0,0 +1,4 @@
+@props(['class', 'icon'])
+<a class="inline-block px-3 py-2.5 cursor-pointer {{ $class }} transition-all duration-300 ease-in h-full" {{ $attributes }}>
+<x-icons.iconic icon="{{ $icon }}" fill='' class="my-0 w-4 h-4 mr-0 ml-0" />
+</a>
diff --git a/resources/views/components/gallery/photo/downloads.blade.php b/resources/views/components/gallery/photo/downloads.blade.php
new file mode 100644
index 00000000000..575b7e5a024
--- /dev/null
+++ b/resources/views/components/gallery/photo/downloads.blade.php
@@ -0,0 +1,20 @@
+<div class="flex flex-wrap gap-0.5 justify-center align-top text-text-main-0/80 p-9">
+    @foreach ($size_variants as $size_variant)
+        <a class="border border-solid
+        border-black/20 cursor-pointer block w-full rounded-md my-1.5 p-3
+            font-bold text-center
+            duration-500
+            bg-bg-400/0
+            text-sm
+            transition-all
+            ease-in-out select-none
+            text-primary-500 hover:bg-primary-500 hover:text-text-main-0
+            fill-primary-500 hover:fill-white"
+            href="{{ route('photo_download',['photoIDs' => $photoId, 'kind' => $size_variant['type']->name]) }}"
+            >
+            <x-icons.iconic icon="cloud-download" fill='' class="my-0 w-3 h-3 mr-1" />
+            {{ $size_variant['type']->localization() }} ({{ $size_variant['width'] }}x{{ $size_variant['height'] }},
+            {{ $size_variant['filesize'] }})
+        </a>
+    @endforeach
+</div>
\ No newline at end of file
diff --git a/resources/views/components/gallery/photo/line.blade.php b/resources/views/components/gallery/photo/line.blade.php
new file mode 100644
index 00000000000..b39fc76f89f
--- /dev/null
+++ b/resources/views/components/gallery/photo/line.blade.php
@@ -0,0 +1,7 @@
+@props(['if', 'locale', 'value'])
+<template x-if="{{ $if }}">
+	<span class="py-0.5 pl-3 text-sm">{{ $locale }}</span>
+</template>
+<template x-if="{{ $if }}">
+	<span class="py-0.5 pl-0 text-sm" x-text="{{ $value }}"></span>
+</template>
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..9e3667b16ce
--- /dev/null
+++ b/resources/views/components/gallery/photo/next-previous.blade.php
@@ -0,0 +1,19 @@
+@props(['is_next'])
+<div @class([
+    'absolute w-1/5 h-full top-0 group',
+    'right-0' => $is_next,
+    'left-0' => !$is_next,
+])
+x-cloak >
+    <a 
+    {{-- href="{{ route('livewire-gallery-photo', ['albumId' => $albumId, 'photoId' => $photo->id]) }}"  --}}
+        id="{{ $is_next ? 'nextButton' : 'previousButton'}}"
+        {{ $attributes }}
+        @class([
+			'absolute top-1/2 border border-solid border-neutral-200 -mt-5 py-2 px-3 transition-all opacity-0 group-hover:opacity-100 bg-cover',
+			'-right-px group-hover:translate-x-0 translate-x-full' => $is_next,
+			'-left-px group-hover:translate-x-0 -translate-x-full' => !$is_next,
+		])>
+        <x-icons.iconic icon="caret-{{ $is_next ? 'right' : 'left' }}" class="my-0 h-6 w-5 mr-0 ml-0" />
+    </a>
+</div>
diff --git a/resources/views/components/gallery/photo/overlay.blade.php b/resources/views/components/gallery/photo/overlay.blade.php
new file mode 100644
index 00000000000..ed0b042f9bd
--- /dev/null
+++ b/resources/views/components/gallery/photo/overlay.blade.php
@@ -0,0 +1,20 @@
+<div id="image_overlay" class="absolute bottom-7 left-7 text-text-main-0 text-shadow text-white"
+    x-show="photoFlags.overlayType !== 'none'" x-cloak>
+    <h1 class=" text-3xl" x-text="photo.title" ></h1>
+    <p class="mt-1 text-xl" x-show="photoFlags.overlayType === 'description'" x-text="photo.description" />
+    <p class="mt-1 text-xl" x-show="photoFlags.overlayType === 'date'">
+        <span x-show="photo.precomputed.is_camera_date">
+            <x-icons.iconic class="w-4 h-4 fill-white m-0 mr-1 -mt-1" icon='camera-slr' /></span>
+        <span x-text="photo.preformatted.date_overlay"></span>
+    </p>
+    <p class="mt-1 text-xl" x-show="photoFlags.overlayType === 'exif' && photo.precomputed.is_video">
+        <span x-text="photo.preformatted.duration"></span> at <span x-text="photo.preformatted.fps"></span> fps
+    </p>
+    <p class="mt-1 text-xl"
+        x-show="photoFlags.overlayType === 'exif' && !photo.precomputed.is_video && photo.preformatted.shutter !== ''">
+        <span x-text="photo.preformatted.shutter"></span> at &fnof; / <span
+            x-text="photo.preformatted.aperture"></span>, <span x-text="photo.preformatted.iso"></span>
+        <br>
+        <span x-text="photo.focal"></span> <span x-text="photo.preformatted.lens"></span>
+    </p>
+</div>
\ No newline at end of file
diff --git a/resources/views/components/gallery/photo/properties.blade.php b/resources/views/components/gallery/photo/properties.blade.php
new file mode 100644
index 00000000000..27cfd626f80
--- /dev/null
+++ b/resources/views/components/gallery/photo/properties.blade.php
@@ -0,0 +1,45 @@
+<div id="lychee_sidebar"
+    x-data="photoFormPanel()"
+    x-on:photo-updated.window="refreshForm($store.photo)"
+    class="border-t border-solid border-primary-500 text-neutral-200 w-full">
+    <form class="w-full flex justify-center">
+        <div
+            class="w-1/2 flex justify-center flex-wrap
+            text-neutral-200 text-sm
+            p-9 sm:p-4 xl:px-9 max-sm:w-full sm:min-w-[32rem] flex-shrink-0">
+            <div class="mb-4 mt-14 w-full">
+                <p class="font-bold">{{ __('lychee.PHOTO_SET_TITLE') }}</p>
+                <p class="text-text-main-400">{{ __('lychee.PHOTO_NEW_TITLE') }}</p>
+                <x-forms.inputs.text x-model="title"
+                 />
+            </div>
+            <div class="my-4 w-full">
+                <p class="font-bold">{{ __('lychee.PHOTO_SET_DESCRIPTION') }}</p>
+                <p class="text-text-main-400">{{ __('lychee.PHOTO_NEW_DESCRIPTION') }}</p>
+                <x-forms.textarea class="w-full h-52" x-model="description"
+                ></x-forms.textarea>
+            </div>
+            <div class="my-4 w-full">
+                <p class="font-bold">{{ __('lychee.PHOTO_SET_TAGS')}}</p>
+                <p class="text-text-main-400">{{ __('lychee.PHOTO_NEW_TAGS') }}</p>
+                <x-forms.inputs.text x-model="tagsWithComma"
+                 />
+            </div>
+            <div class="my-4 w-full">
+                <p class="font-bold">{{ __('lychee.PHOTO_SET_CREATED_AT') }}</p>
+                <p class="text-text-main-400">{{ __('lychee.PHOTO_NEW_CREATED_AT') }}</p>
+                <x-forms.inputs.date x-model="uploadDate"
+                 />
+            </div>
+            <div class="my-4 w-full">
+                <p><span class="font-bold">{{ __('lychee.SET_LICENSE') }}</span>
+                <x-forms.dropdown class="mx-2" :options="$this->licenses" id="licenses_dialog_select"
+                    x-model="license"
+                    />
+                </p>
+            </div>
+            <x-forms.buttons.action class="rounded w-full" x-on:click="updatePhoto"
+                >{{ __('lychee.SAVE') }}</x-forms.buttons.action>
+        </div>
+    </form>
+</div>
diff --git a/resources/views/components/gallery/photo/sidebar.blade.php b/resources/views/components/gallery/photo/sidebar.blade.php
new file mode 100644
index 00000000000..6da0f75a8d2
--- /dev/null
+++ b/resources/views/components/gallery/photo/sidebar.blade.php
@@ -0,0 +1,119 @@
+<div id="lychee_sidebar"
+    x-data="photoSidebarPanel()"
+    x-on:photo-updated.window="refreshSidebar($store.photo)"
+    class="border-t border-solid border-primary-500 text-text-main-0 w-[360px] h-full bg-bg-800">
+    <div class="grid grid-cols-[auto minmax(0, 1fr)] mt-8">
+        <h1 class="col-span-2 text-center text-lg font-bold my-4">
+            {{ __('lychee.ALBUM_ABOUT') }}
+        </h1>
+        <h2 class="col-span-2 text-text-main-400 font-bold px-3 pt-4 pb-3">
+            {{ __('lychee.PHOTO_BASICS') }}
+        </h2>
+        <x-gallery.photo.line if="true"
+        :locale="__('lychee.PHOTO_TITLE')" value="photo.title" />
+        <x-gallery.photo.line if="true"
+        :locale="__('lychee.PHOTO_UPLOADED')" value="preformatted.created_at" />
+        <template x-if="preformatted.description">
+            <span class="col-span-2 py-0.5 pl-3 text-sm">{{ __('lychee.PHOTO_DESCRIPTION') }}</span>
+        </template>
+        <template x-if="preformatted.description">
+            <div class="pb-0.5 pt-4 pl-8 col-span-2 text-sm" id="photoDescription"
+                x-html="preformatted.description">
+            </div>
+        </template>
+        <template x-if="precomputed.is_video">
+            <h2 class="col-span-2 text-text-main-400 font-bold px-3 pt-4 pb-3">{{ __('lychee.PHOTO_VIDEO') }}</h2>
+        </template>
+        <template x-if="! precomputed.is_video">
+            <h2 class="col-span-2 text-text-main-400 font-bold px-3 pt-4 pb-3">{{ __('lychee.PHOTO_IMAGE') }}</h2>
+        </template>
+        <x-gallery.photo.line if="true"
+            :locale="__('lychee.PHOTO_SIZE')" value="preformatted.filesize" />
+        <x-gallery.photo.line if="photo.type"
+            :locale="__('lychee.PHOTO_FORMAT')" value="photo.type" />
+        <x-gallery.photo.line if="preformatted.resolution"
+            :locale="__('lychee.PHOTO_RESOLUTION')"
+            value="preformatted.resolution" />
+        <x-gallery.photo.line if="photo.duration && precomputed.is_video"
+           
+            :locale="__('lychee.PHOTO_DURATION')" value="photo.duration" />
+        <x-gallery.photo.line if="photo.fps && precomputed.is_video"
+           
+            :locale="__('lychee.PHOTO_FPS')" value="photo.fps" />
+        <template x-if="photo.tags.length > 0">
+            <h2 class="col-span-2 text-text-main-400 font-bold px-3 pt-4 pb-3">
+                {{ __('lychee.PHOTO_TAGS') }}
+            </h2>
+        </template>
+        <template x-if="photo.tags.length > 0">
+            <p class="py-0.5 pl-3 col-span-2 text-sm">
+                <template x-for="tag in photo.tags">
+                    <a class="text-xs cursor-pointer rounded-full py-1.5 px-2.5 mr-1.5 mb-2.5 bg-black/50"
+                        x-text="tag"></a>
+                </template>
+            </p>
+        </template>
+        <template x-if="precomputed.has_exif">
+            <h2 class="col-span-2 text-text-main-400 font-bold px-3 pt-4 pb-3">
+                {{ __('lychee.PHOTO_CAMERA') }}
+            </h2>
+        </template>
+        <x-gallery.photo.line if="preformatted.taken_at"
+            :locale="__('lychee.PHOTO_CAPTURED')"
+            value="preformatted.taken_at" />
+        <x-gallery.photo.line if="photo.make"
+            :locale="__('lychee.PHOTO_MAKE')"
+            value="photo.make" />
+        <x-gallery.photo.line if="photo.model"
+            :locale="__('lychee.PHOTO_TYPE')"
+            value="photo.model" />
+        <x-gallery.photo.line if="photo.lens"
+            :locale="__('lychee.PHOTO_LENS')" value="photo.lens" />
+        <x-gallery.photo.line if="photo.shutter"
+            :locale="__('lychee.PHOTO_SHUTTER')"
+            value="photo.shutter" />
+        <x-gallery.photo.line if="photo.aperture"
+            :locale="__('lychee.PHOTO_APERTURE')"
+            value="'ƒ / ' + photo.aperture.toString()" />
+        <x-gallery.photo.line if="photo.focal"
+            :locale="__('lychee.PHOTO_FOCAL')"
+            value="photo.focal" />
+        <x-gallery.photo.line if="photo.iso"
+            :locale="sprintf(__('lychee.PHOTO_ISO'), '')" value="photo.iso" />
+        <template x-if="precomputed.has_location">
+            <h2 class="col-span-2 text-text-main-400 font-bold px-3 pt-4 pb-3">
+                {{ __('lychee.PHOTO_LOCATION') }}
+            </h2>
+        </template>
+        <div
+            data-layer='{{ $this->map_provider->getLayer() }}'
+            data-provider='{{ $this->map_provider->getAtributionHtml() }}'
+            data-asset='{{ URL::asset('/') }}'
+            id="leaflet_map_single_photo" class="col-span-2 h-48 bg-red-500 my-0.5 mx-3"
+            x-init="$nextTick(() => displayMap())"
+            x-show="precomputed.has_location"></div>
+        <x-gallery.photo.line if="precomputed.has_location && preformatted.latitude"
+            :locale="__('lychee.PHOTO_LATITUDE')"
+            value="preformatted.latitude" />
+        <x-gallery.photo.line if="precomputed.has_location && preformatted.longitude"
+            :locale="__('lychee.PHOTO_LONGITUDE')"
+            value="preformatted.longitude" />
+        <x-gallery.photo.line if="precomputed.has_location && preformatted.altitude"
+            :locale="__('lychee.PHOTO_ALTITUDE')"
+            value="preformatted.altitude" />
+        <x-gallery.photo.line if="precomputed.has_location && photo.location"
+            :locale="__('lychee.PHOTO_LOCATION')"
+            value="photo.location" />
+        <x-gallery.photo.line if="precomputed.has_location && photo.location !== null"
+            :locale="__('lychee.PHOTO_IMGDIRECTION')"
+            value="photo.img_direction" />
+        <template x-if="preformatted.license">
+            <h2 class="col-span-2 text-text-main-400 font-bold px-3 pt-4 pb-3">
+                {{ __('lychee.PHOTO_REUSE') }}
+            </h2>
+        </template>
+        <x-gallery.photo.line if="preformatted.license"
+            :locale="__('lychee.PHOTO_LICENSE')"
+            value="preformatted.license" />
+    </div>
+</div>
diff --git a/resources/views/components/gallery/view/photo-listing.blade.php b/resources/views/components/gallery/view/photo-listing.blade.php
new file mode 100644
index 00000000000..357b7884bf9
--- /dev/null
+++ b/resources/views/components/gallery/view/photo-listing.blade.php
@@ -0,0 +1,25 @@
+@if ($this->num_photos > 0)
+    <div class="relative w-full h-0 -translate-y-5 text-right pr-7">
+        <a class="flex-shrink-0 px-1 cursor-pointer group" x-on:click="photoLayout.type = 'square'" title="{{ __('lychee.LAYOUT_SQUARES') }}">
+            <x-icons.iconic class="my-0 w-5 h-5 mr-0 ml-0 transition-all duration-300 group-hover:scale-150 group-hover:stroke-white"
+                fill="" icon="squares" x-bind:class="photoLayout.type === 'square' ? 'stroke-primary-400' : 'stroke-neutral-400'" />
+        </a>
+        <a class="flex-shrink-0 px-1 cursor-pointer group" x-on:click="photoLayout.type = 'justified'" title="{{ __('lychee.LAYOUT_JUSTIFIED') }}">
+            <x-icons.iconic class="my-0 w-5 h-5 mr-0 ml-0 transition-all duration-300 group-hover:scale-150 group-hover:fill-white"
+                fill="" icon="justified" x-bind:class="photoLayout.type === 'justified' ? 'fill-primary-400' : 'fill-neutral-400'" />
+        </a>
+        <a class="flex-shrink-0 px-1 cursor-pointer group" x-on:click="photoLayout.type = 'masonry'" title="{{ __('lychee.LAYOUT_MASONRY') }}">
+            <x-icons.iconic class="my-0 w-5 h-5 mr-0 ml-0 transition-all duration-300 group-hover:scale-150 group-hover:stroke-white"
+                fill="" icon="masonry" x-bind:class="photoLayout.type === 'masonry' ? 'stroke-primary-400' : 'stroke-neutral-400'" />
+        </a>
+        <a class="flex-shrink-0 px-1 cursor-pointer group" x-on:click="photoLayout.type = 'grid'" title="{{ __('lychee.LAYOUT_GRID') }}">
+            <x-icons.iconic class="my-0 w-5 h-5 mr-0 ml-0 transition-all duration-300 group-hover:scale-150 group-hover:stroke-white"
+                fill="" icon="grid" x-bind:class="photoLayout.type === 'grid' ? 'stroke-primary-400' : 'stroke-neutral-400'" />
+        </a>
+    </div>
+@endif
+<div id="photoListing" class="relative w-full m-7" x-data="photoListingPanel(@js($this->photosResource), select)" >
+    @foreach ($this->photos as $idx => $photo)
+        <x-gallery.album.thumbs.photo :data="$photo" albumId="{{ $this->albumId }}" :idx="$idx" />
+    @endforeach
+</div>
diff --git a/resources/views/components/gallery/view/photo.blade.php b/resources/views/components/gallery/view/photo.blade.php
new file mode 100644
index 00000000000..fd02cc62f70
--- /dev/null
+++ b/resources/views/components/gallery/view/photo.blade.php
@@ -0,0 +1,128 @@
+<template x-if="$store.photo !== undefined">
+	<div x-data="photoView(photoFlags, parent_id)"
+		x-on:photo-updated.window="refreshPhotoView($store.photo)"
+		class="absolute top-0 left-0 w-full flex h-full overflow-hidden bg-black"
+		x-show="$store.photo !== undefined"
+		x-cloak>
+		<header id="lychee_toolbar_container"
+			class="absolute top-0 left-0
+				px-2 w-full flex-none z-10
+				bg-gradient-to-b from-bg-900"
+				x-bind:class="isFullscreen ? 'opacity-0 hover:opacity-100' : 'opacity-100 h-14'"
+				>
+			<div class="flex w-full items-center box-border">
+				<x-header.back x-on:click="goTo(null)" x-bind:class="!photoFlags.isEditOpen ? '' : 'hidden'" />
+				<x-header.back x-on:click="photoFlags.isEditOpen = false" x-bind:class="!photoFlags.isEditOpen ? 'hidden' : ''" />
+				<x-header.title />
+				@can($this->rights->can_download)
+					<x-header.button x-on:click="downloadPhoto()"
+						icon="cloud-download" fill="" class="fill-neutral-400"
+						/>
+				@endif
+				@if($this->rights->can_edit)
+					<x-header.button x-on:click="photoFlags.isEditOpen = ! photoFlags.isEditOpen" icon="pencil"
+						fill=""
+						x-bind:class="photoFlags.isEditOpen ? 'fill-primary-500' : 'fill-neutral-400'" />
+				@endif
+				<x-header.button x-on:click="photoFlags.isDetailsOpen = ! photoFlags.isDetailsOpen"
+					icon="info" fill="" class=""
+					x-bind:class="photoFlags.isDetailsOpen ? 'fill-primary-500' : 'fill-neutral-400'" />
+
+			</div>
+		</header>
+		<div class="w-0 flex-auto relative">
+			<div id="imageview"
+				class="absolute top-0 left-0 w-full h-full bg-black flex items-center justify-center overflow-hidden"
+				x-on:click="rotateOverlay()">
+				<template x-if="mode === 0">
+					{{-- This is a video file: put html5 player --}}
+					<video width="auto" height="auto" id='image' controls class='absolute m-auto w-auto h-auto'
+						x-bind:class="isFullscreen ? 'max-w-full max-h-full' : 'max-wh-full-56'" autobuffer
+						{{ $this->photoFlags->can_autoplay ? 'autoplay' : '' }}>
+						<source x-bind:src='photo.size_variants.original.url' />
+						Your browser does not support the video tag.
+					</video>
+				</template>
+				<template x-if="mode === 1">
+					{{-- This is a raw file: put a place holder --}}
+					<img id='image' alt='placeholder'
+						class='absolute m-auto w-auto h-auto animate-zoomIn bg-contain bg-center bg-no-repeat'
+						src='{{ URL::asset('img/placeholder.png') }}' />
+				</template>
+				<template x-if="mode === 2">
+					{{-- This is a normal image: medium or original --}}
+					<img id='image' alt='medium'
+						class='absolute m-auto w-auto h-auto animate-zoomIn bg-contain bg-center bg-no-repeat'
+						x-bind:src="photo.size_variants.medium.url"
+						x-bind:class="isFullscreen ? 'max-w-full max-h-full' : 'max-wh-full-56'"
+						x-bind:srcset="srcSetMedium" />
+				</template>
+				<template x-if="mode === 3">
+					<img id='image' alt='big'
+						class='absolute m-auto w-auto h-auto animate-zoomIn bg-contain bg-center bg-no-repeat'
+						x-bind:class="isFullscreen ? 'max-w-full max-h-full' : 'max-wh-full-56'"
+						x-bind:style="style"
+						x-bind:src='photo.size_variants.original?.url' />
+				</template>
+				<template x-if="mode === 4">
+					{{-- This is a livephoto : medium --}}
+					<div id='livephoto' data-live-photo data-proactively-loads-video='true'
+						x-bind:data-photo-src="photo.size_variants.medium?.url"
+						x-bind:data-video-src="photo.livePhotoUrl" class='absolute m-auto w-auto h-auto'
+						x-bind:class="isFullscreen ? 'max-w-full max-h-full' : 'max-wh-full-56'"
+						x-bind:style="style">
+					</div>
+				</template>
+				<template x-if="mode === 5">
+					{{-- This is a livephoto : full --}}
+					<div id='livephoto' data-live-photo data-proactively-loads-video='true'
+						x-bind:data-photo-src="photo.size_variants.original?.url"
+						x-bind:data-video-src="photo.livePhotoUrl"
+						class='absolute m-auto w-auto h-auto'
+						x-bind:class="isFullscreen ? 'max-w-full max-h-full' : 'max-wh-full-56'"
+						x-bind:style="style">
+					</div>
+				</template>
+				<x-gallery.photo.overlay />
+			</div>
+			<template x-if="photo.previous_photo_id !== null">
+				<x-gallery.photo.next-previous :is_next="false" x-bind:style="previousStyle()" x-on:click="previous()" />
+			</template>
+			<template x-if="photo.next_photo_id !== null">
+				<x-gallery.photo.next-previous :is_next="true" x-bind:style="nextStyle()" x-on:click="next()" />
+			</template>
+			<template x-if="photo.rights.can_edit">
+			<div x-cloak
+				class="absolute top-0 h-1/4 w-3/4 xl:w-1/2 left-1/2 -translate-x-1/2 opacity-10 group hover:opacity-100 transition-opacity duration-500 ease-in-out 
+					z-20"
+					x-show="!photoFlags.isEditOpen">
+				<span class="absolute left-1/2 -translate-x-1/2 p-1 min-w-[25%] filter-shadow text-center">
+					<x-gallery.photo.button icon="star" class=''
+						x-bind:class="photo.is_starred ? 'fill-yellow-500 hover:fill-yellow-100' : 'fill-white hover:fill-yellow-500'"
+						x-on:click="toggleStar()" />
+					@if ($this->photoFlags->can_rotate)
+						<x-gallery.photo.button icon="counterclockwise" class="fill-white hover:fill-primary-500"
+							x-on:click="rotatePhotoCCW()" />
+						<x-gallery.photo.button icon="clockwise" class="fill-white hover:fill-primary-500"
+							x-on:click="rotatePhotoCW()" />
+					@endif
+					<x-gallery.photo.button icon="transfer" class="fill-white hover:fill-primary-500"
+						x-on:click="movePhoto()" />
+					<x-gallery.photo.button icon="trash" class="fill-white hover:fill-red-600"
+						x-on:click="deletePhoto()" />
+				</span>
+			</div>
+			</template>
+		</div>
+		<template x-if="photo.rights.can_edit">
+			<div class="h-full relative overflow-clip w-0 bg-bg-800 transition-all"
+				:class="photoFlags.isEditOpen ? 'w-full' : 'w-0 translate-x-full'">
+				<x-gallery.photo.properties />
+			</div>
+		</template>
+		<aside id="lychee_sidebar_container" class="h-full relative overflow-clip transition-all"
+			:class="photoFlags.isDetailsOpen ? 'w-[360px]' : 'w-0 translate-x-full'">
+			<x-gallery.photo.sidebar />
+		</aside>
+	</div>
+</template>
\ No newline at end of file
diff --git a/resources/views/components/header/actions-menus.blade.php b/resources/views/components/header/actions-menus.blade.php
new file mode 100644
index 00000000000..19889d121c8
--- /dev/null
+++ b/resources/views/components/header/actions-menus.blade.php
@@ -0,0 +1,34 @@
+<div class='flex-shrink-0 flex justify-end' >
+@if($this->flags->is_map_accessible)
+<x-header.button href="{{ route('livewire-map', ['albumId' => $this->albumId]) }}" wire:navigate icon="globe" />
+@endif
+@if($this->flags->is_mod_frame_enabled)
+<x-header.button href="{{ route('livewire-frame', ['albumId' => $this->albumId]) }}" wire:navigate icon="monitor" />
+@endif
+{{-- No selection --}}
+@can(App\Policies\AlbumPolicy::CAN_UPLOAD, [App\Contracts\Models\AbstractAlbum::class, $this->album ?? null])
+<x-header.button x-show='select.selectedPhotos.length === 0 && select.selectedAlbums.length === 0 ' wire:click='openContextMenu' icon='plus' />
+@endcan
+@if($this->rights->can_edit)
+{{-- Albums selection --}}
+<x-header.button x-cloak x-show='select.selectedAlbums.length > 0' fill='fill-primary-400 hover:fill-primary-200' x-on:click='renameAlbums' icon='pencil' />
+<x-header.button x-cloak x-show='select.selectedAlbums.length > 0' fill='fill-primary-400 hover:fill-primary-200' x-on:click='moveAlbums' icon='transfer' />
+<x-header.button x-cloak x-show='select.selectedAlbums.length > 0' fill='fill-primary-400 hover:fill-primary-200' x-on:click='mergeAlbums' icon='collapse-left' />
+<x-header.button x-cloak x-show='select.selectedAlbums.length > 0' fill='fill-danger-800 hover:fill-danger-600' x-on:click='deleteAlbums' icon='trash' />
+<x-header.button x-cloak x-show='select.selectedAlbums.length > 0' fill='fill-primary-400 hover:fill-primary-200' x-on:click='downloadAlbums' icon='cloud-download' />
+{{-- Photo selection --}}
+<x-header.button x-cloak x-show='select.selectedPhotos.length > 0 && select.areSelectedPhotosAllStarred()'
+	x-on:click='unstarPhotos' icon='star' fill="fill-yellow-400 hover:fill-yellow-200"/>{{-- star --}}
+<x-header.button x-cloak x-show='select.selectedPhotos.length > 0 && !select.areSelectedPhotosAllStarred()'
+	x-on:click='starPhotos' icon='star' fill='fill-yellow-200 hover:fill-yellow-400'/>{{-- star --}}
+<x-header.button x-cloak x-show='select.selectedPhotos.length > 0' fill='fill-primary-400 hover:fill-primary-200' x-on:click='tagPhotos' icon='tag'/>{{-- tag --}}
+@if($this->albumId !== null)
+<x-header.button x-cloak x-show='select.selectedPhotos.length === 1' fill='fill-primary-400 hover:fill-primary-200' x-on:click='setCover' icon='folder-cover'/>{{-- setAsCover --}}
+@endif
+<x-header.button x-cloak x-show='select.selectedPhotos.length > 0' fill='fill-primary-400 hover:fill-primary-200' x-on:click='renamePhotos' icon='pencil'/>{{-- rename --}}
+<x-header.button x-cloak x-show='select.selectedPhotos.length > 0' fill='fill-primary-400 hover:fill-primary-200' x-on:click='copyPhotosTo' icon='layers'/>{{-- copyTo --}}
+<x-header.button x-cloak x-show='select.selectedPhotos.length > 0' fill='fill-primary-400 hover:fill-primary-200' x-on:click='movePhotos' icon='transfer'/>{{-- move --}}
+<x-header.button x-cloak x-show='select.selectedPhotos.length > 0' fill='fill-danger-800 hover:fill-danger-600' x-on:click='deletePhotos' icon='trash'/>{{-- delete --}}
+<x-header.button x-cloak x-show='select.selectedPhotos.length > 0' fill='fill-primary-400 hover:fill-primary-200' x-on:click='downloadPhotos' icon='cloud-download'/>{{-- download --}}
+@endif
+</div>
\ No newline at end of file
diff --git a/resources/views/components/header/back.blade.php b/resources/views/components/header/back.blade.php
new file mode 100644
index 00000000000..1d13c04206f
--- /dev/null
+++ b/resources/views/components/header/back.blade.php
@@ -0,0 +1,3 @@
+<a class="flex-grow flex-shrink-0 px-3 py-4 cursor-pointer" {{ $attributes }} id="backButton" >
+    <x-icons.iconic icon="chevron-left" fill='fill-neutral-400' class="my-0 w-4 h-4 mr-0 ml-0" />
+</a>
\ No newline at end of file
diff --git a/resources/views/components/header/bar.blade.php b/resources/views/components/header/bar.blade.php
new file mode 100644
index 00000000000..848eab7e178
--- /dev/null
+++ b/resources/views/components/header/bar.blade.php
@@ -0,0 +1,7 @@
+@props(['class' => 'h-14'])
+<header id="lychee_toolbar_container"
+    class="px-2 w-full flex-none bg-gradient-to-b from-bg-700 to-bg-800 border-b border-b-solid border-b-neutral-900 {{ $class }}" {{ $attributes }}>
+    <div class="flex w-full justify-between items-center box-border">
+        {{ $slot }}
+    </div>
+</header>
diff --git a/resources/views/components/header/button.blade.php b/resources/views/components/header/button.blade.php
new file mode 100644
index 00000000000..f2090298350
--- /dev/null
+++ b/resources/views/components/header/button.blade.php
@@ -0,0 +1,4 @@
+@props(['class' => '', 'fill' => 'fill-neutral-400', 'icon'])
+<a class="flex-shrink-0 px-3 py-4 cursor-pointer {{ $class }}" {{ $attributes }}>
+    <x-icons.iconic icon="{{ $icon }}" fill='{{ $fill }}' class="my-0 w-4 h-4 mr-0 ml-0" />
+</a>
diff --git a/resources/views/components/header/title.blade.php b/resources/views/components/header/title.blade.php
new file mode 100644
index 00000000000..6f768bbb9df
--- /dev/null
+++ b/resources/views/components/header/title.blade.php
@@ -0,0 +1,5 @@
+<a class="absolute left-1/2 top-0 -translate-x-1/2 h-14 pointer-events-none
+flex justify-center items-center overflow-hidden
+w-full text-text-main-0 font-bold text-sm whitespace-nowrap text-ellipsis">
+    {{ $slot }}
+</a>
diff --git a/resources/views/components/help/cell.blade.php b/resources/views/components/help/cell.blade.php
new file mode 100644
index 00000000000..4e701e4e537
--- /dev/null
+++ b/resources/views/components/help/cell.blade.php
@@ -0,0 +1,2 @@
+@props(['class' => ''])
+<span class="p-1 border-t border-t-black/40 {{ $class }}">{{ $slot }}</span>
\ No newline at end of file
diff --git a/resources/views/components/help/head.blade.php b/resources/views/components/help/head.blade.php
new file mode 100644
index 00000000000..8f7698197fc
--- /dev/null
+++ b/resources/views/components/help/head.blade.php
@@ -0,0 +1,1 @@
+<span class="col-span-2 font-bold p-2 bg-white/5">{{ $slot }}</span>
\ No newline at end of file
diff --git a/resources/views/components/help/kbd.blade.php b/resources/views/components/help/kbd.blade.php
new file mode 100644
index 00000000000..e0e8344730a
--- /dev/null
+++ b/resources/views/components/help/kbd.blade.php
@@ -0,0 +1,1 @@
+<kbd class="py-0.5 px-1 rounded border border-black/30 text-xs shadow-black/5 bg-bg-300 shadow-sm font-mono">{{ $slot }}</kbd>
\ No newline at end of file
diff --git a/resources/views/components/help/table.blade.php b/resources/views/components/help/table.blade.php
new file mode 100644
index 00000000000..3c7818e738d
--- /dev/null
+++ b/resources/views/components/help/table.blade.php
@@ -0,0 +1,3 @@
+<div class="grid grid-cols-[auto minmax(0, 1fr)] m-2 grow border border-black/40 rounded-md self-start">
+{{ $slot }}
+</div>
\ No newline at end of file
diff --git a/resources/views/components/icons/iconic.blade.php b/resources/views/components/icons/iconic.blade.php
new file mode 100644
index 00000000000..250ffa6aa46
--- /dev/null
+++ b/resources/views/components/icons/iconic.blade.php
@@ -0,0 +1,2 @@
+@props(['class' => '', 'fill' => 'fill-neutral-400', 'icon'])
+<svg class='inline-block {{ $fill }} {{ $class }}' {{ $attributes }}><use xlink:href='#{{ $icon }}' /></svg>
\ No newline at end of file
diff --git a/resources/views/components/layouts/app.blade.php b/resources/views/components/layouts/app.blade.php
new file mode 100644
index 00000000000..292bbd70e15
--- /dev/null
+++ b/resources/views/components/layouts/app.blade.php
@@ -0,0 +1,29 @@
+<!DOCTYPE HTML>
+<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
+	<head>
+		<meta charset="UTF-8">
+        <x-meta />
+		{{-- @include('components.meta.index') --}}
+
+		{{-- <script async defer src="{{ URL::asset(Helpers::cacheBusting('js/app.js')) }}"></script> --}}
+		{{-- <script async defer src="{{ URL::asset(Helpers::cacheBusting('js/webauthn.js')) }}"></script> --}}
+		{{-- <link type="text/css" rel="stylesheet" href="{{ URL::asset(Helpers::cacheBusting('css/filepond.css')) }}" /> --}}
+		{{-- <link type="text/css" rel="stylesheet" href="{{ URL::asset(Helpers::cacheBusting('dist/frontend.css')) }}"> --}}
+		{{-- <link type="text/css" rel="stylesheet" href="{{ URL::asset(Helpers::cacheBusting('dist/user.css')) }}"> --}}
+
+		{{-- @livewireStyles(['nonce' => csp_nonce('script')]) --}}
+		{{-- @livewireScripts(['nonce' => csp_nonce('script')]) --}}
+		@vite(['resources/css/app.css','resources/js/app.ts'])
+    </head>
+	<body class="antialiased bg-bg-700 w-full flex flex-row gap-0 relative">
+		@include('includes.svg')
+		<x-notifications />
+        @persist('left-menu')
+		<livewire:menus.left-menu>
+        @endpersist('left-menu')
+        {{ $slot }}
+		<livewire:base.context-menu />
+		<livewire:base.modal />
+		<x-shortcuts />
+    </body>
+</html>
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..d6133766d71
--- /dev/null
+++ b/resources/views/components/leftbar/leftbar-item.blade.php
@@ -0,0 +1,11 @@
+@props(['icon'])
+<li class="px-4">
+    <a
+        {{ $attributes }}
+        class="p-2 py-1 cursor-pointer rounded-lg text-text-main-400 hover:text-text-main-100 whitespace-nowrap ">
+		<x-icons.iconic icon="{{ $icon }}" class="w-3 h-3" />
+        <span class="ml-3 whitespace-nowrap text-base">
+            {{ $slot }}
+        </span>
+    </a>
+</li>
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 @@
+<link type="text/css" rel="stylesheet" href="{{ URL::asset('dist/user.css') }}">
+<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1.0, maximum-scale=4.0, user-scalable=yes">
+<meta name="apple-mobile-web-app-status-bar-style" content="black">
+<meta name="apple-mobile-web-app-capable" content="yes">
+<meta name="generator" content="Lychee v4">
+<!--General Meta Data -->
+<title>{{ $pageTitle }}</title>
+<meta name="description" content="{{ $pageDescription }}">
+<meta name="author" content="{{ $siteOwner }}">
+<meta name="publisher" content="{{ $siteOwner }}">
+<!-- Twitter Meta Data -->
+<meta name="twitter:title" content="{{ $pageTitle }}">
+<meta name="twitter:description" content="{{ $pageDescription }}">
+<meta name="twitter:image" content="{{ $imageUrl }}">
+<!-- OpenGraph Meta Data (e.g. used by Facebook) -->
+<meta property="og:title" content="{{ $pageTitle }}">
+<meta property="og:description" content="{{ $pageDescription }}">
+<meta property="og:image" content="{{ $imageUrl }}">
+<meta property="og:url" content="{{ $pageUrl }}">
+
+<link rel="shortcut icon" href="{{ URL::asset('favicon.ico') }}">
+<link rel="apple-touch-icon" href="{{ URL::asset('img/apple-touch-icon-ipad.png') }}" sizes="120x120">
+<link rel="apple-touch-icon" href="{{ URL::asset('img/apple-touch-icon-iphone.png') }}" sizes="152x152">
+<link rel="apple-touch-icon" href="{{ URL::asset('img/apple-touch-icon-iphone-plus.png') }}" sizes="180x180">
\ 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..87b9d5eb033
--- /dev/null
+++ b/resources/views/components/notifications.blade.php
@@ -0,0 +1,71 @@
+<div
+    x-data="{
+        messages: [],
+        remove(mid) {
+            $dispatch('close-me', {id: mid})
+
+            let m = this.messages.filter((m) => { return m.id == mid })
+            if (m.length) {
+                setTimeout(() => {this.messages.splice(this.messages.indexOf(m[0]), 1)}, 2000)
+            }
+        },
+    }"
+    @notify.window="
+        let m = $event.detail;
+        m.forEach(me => {
+        let mid = Date.now();
+        messages.push({id: mid, msg: me.msg, type: me.type});
+        setTimeout(() => { remove(mid) }, 2500);
+        });"
+    class="z-50 fixed inset-0 flex flex-col items-end justify-center px-4 py-6 pointer-events-none sm:p-6 sm:justify-start space-y-4"
+>
+    <template x-for="(message, messageIndex) in messages" :key="messageIndex" hidden>
+        <div
+            x-data="{ id: message.id, show: false }"
+            x-init="$nextTick(() => { show = true })"
+            x-show="show"
+            @close-me.window="if ($event.detail.id == id) {show=false}"
+            x-transition:enter="transform ease-out duration-300 transition"
+            x-transition:enter-start="translate-y-2 opacity-0 sm:translate-y-0 sm:translate-x-2"
+            x-transition:enter-end="translate-y-0 opacity-100 sm:translate-x-0"
+            x-transition:leave="transition ease-in duration-100"
+            x-transition:leave-start="opacity-100"
+            x-transition:leave-end="opacity-0"
+            class="max-w-sm w-full text-text-main-0 bg-bg-400 shadow-lg rounded-lg pointer-events-auto"
+        >
+            <div class="rounded-lg shadow-lg overflow-hidden">
+                <div class="p-4">
+                    <div class="flex items-start">
+                        <div class="flex-shrink-0">
+                            <svg x-show="message.type === 'success'" class="w-6 h-6 text-create-600" fill="none" viewBox="0 0 24 24" stroke="currentColor">
+                                <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" />
+                            </svg>
+
+                            <svg x-show="message.type === 'error'" class="w-6 h-6 text-danger-600" fill="none" viewBox="0 0 24 24" stroke="currentColor">
+                                <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z" />
+                            </svg>
+
+                            <svg x-show="message.type === 'info'" class="w-6 h-6 text-primary-400" fill="none" viewBox="0 0 24 24" stroke="currentColor">
+                                <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
+                            </svg>
+
+                            <svg x-show="message.type === 'warning'" class="w-6 h-6 text-warning-600" fill="none" viewBox="0 0 24 24" stroke="currentColor">
+                                <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.618 5.984A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016zM12 9v2m0 4h.01" />
+                            </svg>
+                        </div>
+                        <div class="ml-3 w-0 flex-1 pt-0.5">
+                            <p x-text="message.msg" class="text-sm leading-5 font-medium text-text-main-0"></p>
+                        </div>
+                        <div class="ml-4 flex-shrink-0 flex">
+                            <button @click="remove(message.id)" class="inline-flex text-text-main-400 focus:outline-none focus:text-text-main-400 transition ease-in-out duration-150">
+                                <svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor">
+                                    <path fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clip-rule="evenodd"></path>
+                                </svg>
+                            </button>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </template>
+</div>
\ 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..a9f5353f83e
--- /dev/null
+++ b/resources/views/components/shortcuts.blade.php
@@ -0,0 +1,116 @@
+<div class="basicModalContainer transition-opacity duration-1000 ease-in animate-fadeIn
+    bg-black/80 z-50 fixed flex items-center justify-center w-full h-full top-0 left-0 box-border opacity-100"
+    data-closable="true"
+    x-data="{ shortCutsOpen: false }"
+    @keydown.window="if (event.key === '?' && event.shiftKey) { shortCutsOpen = true }"
+    @keydown.escape.window="shortCutsOpen = false"
+    x-cloak
+    x-show="shortCutsOpen">
+    <div class="basicModal transition-opacity ease-in duration-1000
+        opacity-100 bg-gradient-to-b from-bg-300 to-bg-400
+        relative w-[500px] md:w-[700px] lg:w-[800px] xl:w-[1200px] text-sm rounded-md text-text-main-400 animate-moveUp overflow-hidden"
+        role="dialog" x-on:click.away="shortCutsOpen = !shortCutsOpen">
+        <h1 class="text-center text-text-main-0 text-xl font-bold w-full border-b border-b-black/20 p-3">Keyboard shortcuts</h1>
+        <div class="flex flex-wrap gap-0.5 justify-center align-top text-text-main-100 max-h-[80vh] overflow-y-auto">
+            <x-help.table>
+                <x-help.head>Site-wide Shortcuts</x-help.head>
+                <x-help.cell>Back/Cancel</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>Esc</x-help.kbd></x-help.cell>
+                <x-help.cell>Confirm</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>Enter</x-help.kbd></x-help.cell>
+                <x-help.cell>Show this modal</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>Shift</x-help.kbd> <x-help.kbd>?</x-help.kbd></x-help.cell>
+                <x-help.cell>Login</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>l</x-help.kbd></x-help.cell>
+                <x-help.cell>Login with U2F</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>k</x-help.kbd></x-help.cell>
+            </x-help.table>
+
+            <x-help.table>
+                <x-help.head>Albums Shortcuts</x-help.head>
+                <x-help.cell>New album</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>n</x-help.kbd></x-help.cell>
+                <x-help.cell>Upload photos</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>u</x-help.kbd></x-help.cell>
+                <x-help.cell>Search</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>/</x-help.kbd></x-help.cell>
+                <x-help.cell>Toggle Sensitive albums</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>h</x-help.kbd></x-help.cell>
+                <x-help.cell>Select all albums</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>ctrl</x-help.kbd> <x-help.kbd>a</x-help.kbd></x-help.cell>
+            </x-help.table>
+
+            <x-help.table>
+                <x-help.head>Album Shortcuts</x-help.head>
+                <x-help.cell>New album</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>n</x-help.kbd></x-help.cell>
+                <x-help.cell>Upload photos</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>u</x-help.kbd></x-help.cell>
+                <x-help.cell>Rename album</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>r</x-help.kbd></x-help.cell>
+                <x-help.cell>Set description</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>d</x-help.kbd></x-help.cell>
+                <x-help.cell>Toggle full screen</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>f</x-help.kbd></x-help.cell>
+                <x-help.cell>Toggle panel</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>i</x-help.kbd></x-help.cell>
+                <x-help.cell>Search</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>/</x-help.kbd></x-help.cell>
+                <x-help.cell>Toggle Sensitive albums</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>H</x-help.kbd></x-help.cell>
+                <x-help.cell>Delete album</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>ctrl</x-help.kbd> <x-help.kbd>dell</x-help.kbd></x-help.cell>
+                <x-help.cell>Select all albums or photos</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>ctrl</x-help.kbd> <x-help.kbd>a</x-help.kbd></x-help.cell>
+            </x-help.table>
+
+            <x-help.table>
+                <x-help.head>Photo Shortcuts</x-help.head>
+                <x-help.cell>Previous photo</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>&leftarrow;</x-help.kbd></x-help.cell>
+                <x-help.cell>Next photo</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>&rightarrow;</x-help.kbd></x-help.cell>
+                {{-- <!-- Still unsure about those -->
+                <x-help.cell class="text-right"><x-help.kbd>r</x-help.kbd></x-help.cell>
+                <x-help.cell>Rename album</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>d</x-help.kbd></x-help.cell>
+                <x-help.cell>Set description</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>t</x-help.kbd></x-help.cell>
+                <x-help.cell>Set tags</x-help.cell>
+                --}}
+                {{-- <!-- For later -->
+                <x-help.cell class="text-right"><x-help.kbd>1</x-help.kbd></x-help.cell>
+                <x-help.cell>Rate 1 star</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>2</x-help.kbd></x-help.cell>
+                <x-help.cell>Rate 2 star</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>3</x-help.kbd></x-help.cell>
+                <x-help.cell>Rate 3 star</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>4</x-help.kbd></x-help.cell>
+                <x-help.cell>Rate 4 star</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>5</x-help.kbd></x-help.cell>
+                <x-help.cell>Rate 5 star</x-help.cell>
+                --}}
+                <x-help.cell>Star photo</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>s</x-help.kbd></x-help.cell>
+                <x-help.cell>Cycle overlay mode</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>o</x-help.kbd></x-help.cell>
+                <x-help.cell>Show information</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>i</x-help.kbd></x-help.cell>
+                <x-help.cell>Toggle full screen</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>f</x-help.kbd></x-help.cell>
+                <x-help.cell>Rotate counter clock wise</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>ctrl</x-help.kbd> <x-help.kbd>&leftarrow;</x-help.kbd></x-help.cell>
+                <x-help.cell>Rotate clockwise</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>ctrl</x-help.kbd> <x-help.kbd>&rightarrow;</x-help.kbd></x-help.cell>
+                <x-help.cell>Delete the photo</x-help.cell>
+                <x-help.cell class="text-right"><x-help.kbd>delete</x-help.kbd> or <x-help.kbd>BckSpace</x-help.kbd></x-help.cell>
+            </x-help.table>
+        </div>
+        <div class="basicModal__buttons">
+            <x-forms.buttons.cancel
+                x-on:click="shortCutsOpen = false"
+                class="border-t border-t-black/20 w-full hover:bg-white/[.02]">
+                {{ __('lychee.CLOSE') }}</x-forms.buttons.cancel>
+        </div>
+    </div>
+</div>
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 @@
+<span class="update-status">
+	 – <a target="_blank" rel="noopener" {{ $attributes }} data-tabindex="-1">{{ __('lychee.UPDATE_AVAILABLE') }}</a>
+</span>
diff --git a/resources/views/components/webauthn/login.blade.php b/resources/views/components/webauthn/login.blade.php
new file mode 100644
index 00000000000..5b66e514c7b
--- /dev/null
+++ b/resources/views/components/webauthn/login.blade.php
@@ -0,0 +1,30 @@
+<div class="basicModalContainer transition-opacity duration-1000 ease-in animate-fadeIn
+    bg-black/80 z-5 fixed flex items-center justify-center w-full h-full top-0 left-0 box-border opacity-100"
+    data-closable="true"
+    x-data="loginWebAuthn('{{ __("lychee.U2F_AUTHENTIFICATION_SUCCESS") }}', '{{ __("lychee.ERROR_TEXT") }}')"
+    @keydown.window="if (event.key === 'k') { webAuthnOpen = true }"
+    @keydown.escape.window="webAuthnOpen = false"
+    x-cloak
+    x-show="webAuthnOpen">
+    <div class="basicModal transition-opacity ease-in duration-1000
+        opacity-100 bg-gradient-to-b from-bg-300 to-bg-400
+        relative w-[500px] text-sm rounded-md text-text-main-400 animate-moveUp"
+        role="dialog" x-on:click.away="webAuthnOpen = !webAuthnOpen">
+        <div class="w-full text-text-main-0/80 text-lg font-bold" x-show="isWebAuthnUnavailable()">
+			<h1 class="p-3 text-center w-full">{{ __('lychee.U2F_NOT_SECURE') }}</h1>
+        </div>
+		<div class="flex flex-wrap gap-0.5 p-9 justify-center align-top text-text-main-0/80" x-show="!isWebAuthnUnavailable()">
+            <div class="mb-4 mx-0">
+				<x-forms.inputs.text class="w-full" autocomplete="on"
+					autofocus
+					placeholder="{{ __('lychee.USERNAME') }}"
+					autocapitalize="off"
+                    x-model="username" />
+			</div>
+        </div>
+        <div class="flex w-full box-border">
+            <x-forms.buttons.cancel x-on:click="webAuthnOpen = false" class="border-t border-t-black/20 w-full hover:bg-white/[.02]"> {{ __('lychee.CLOSE') }}</x-forms.buttons.cancel>
+            <x-forms.buttons.action class="border-t border-t-bg-800 rounded-br-md w-full" x-on:click='login()'>{{ __('lychee.U2F') }}</x-forms.buttons.action>
+        </div>
+    </div>
+</div>
diff --git a/resources/views/includes/svg.blade.php b/resources/views/includes/svg.blade.php
index 5a39e4aee90..de35bcea1d1 100644
--- a/resources/views/includes/svg.blade.php
+++ b/resources/views/includes/svg.blade.php
@@ -1,13 +1,247 @@
 <!-- inject:svg -->
-<svg class="svgsprite" version="1.1" xmlns="http://www.w3.org/2000/svg"><defs><symbol id="account-login" viewBox="0 0 8 8"><path d="M3 0v1h4v5h-4v1h5v-7h-5zm1 2v1h-4v1h4v1l2-1.5-2-1.5z"/></symbol><symbol id="account-logout" viewBox="0 0 8 8"><path d="M3 0v1h4v5h-4v1h5v-7h-5zm-1 2l-2 1.5 2 1.5v-1h4v-1h-4v-1z"/></symbol><symbol id="action-redo" viewBox="0 0 8 8"><path d="M3.5 0c-1.93 0-3.5 1.57-3.5 3.5 0-1.38 1.12-2.5 2.5-2.5s2.5 1.12 2.5 2.5v.5h-1l2 2 2-2h-1v-.5c0-1.93-1.57-3.5-3.5-3.5z" transform="translate(0 1)"/></symbol><symbol id="action-undo" viewBox="0 0 8 8"><path d="M4.5 0c-1.93 0-3.5 1.57-3.5 3.5v.5h-1l2 2 2-2h-1v-.5c0-1.38 1.12-2.5 2.5-2.5s2.5 1.12 2.5 2.5c0-1.93-1.57-3.5-3.5-3.5z" transform="translate(0 1)"/></symbol><symbol id="align-center" viewBox="0 0 8 8"><path d="M0 0v1h8v-1h-8zm1 2v1h6v-1h-6zm-1 2v1h8v-1h-8zm1 2v1h6v-1h-6z"/></symbol><symbol id="align-left" viewBox="0 0 8 8"><path d="M0 0v1h8v-1h-8zm0 2v1h6v-1h-6zm0 2v1h8v-1h-8zm0 2v1h6v-1h-6z"/></symbol><symbol id="align-right" viewBox="0 0 8 8"><path d="M0 0v1h8v-1h-8zm2 2v1h6v-1h-6zm-2 2v1h8v-1h-8zm2 2v1h6v-1h-6z"/></symbol><symbol id="aperture" viewBox="0 0 8 8"><path d="M4 0c-.69 0-1.336.19-1.906.5l3.219 2.344.719-2.25c-.59-.36-1.281-.594-2.031-.594zm-2.75 1.125c-.76.73-1.25 1.735-1.25 2.875 0 .25.022.489.063.719l3.094-2.219-1.906-1.375zm5.625.125l-1.219 3.75h2.219c.08-.32.125-.65.125-1 0-1.07-.435-2.03-1.125-2.75zm-4.719 3.188l-1.75 1.281c.55 1.13 1.595 1.989 2.875 2.219l-1.125-3.5zm1.563 1.563l.625 1.969c1.33-.11 2.454-.879 3.094-1.969h-3.719z"/></symbol><symbol id="arrow-bottom" viewBox="0 0 8 8"><path d="M2 0v5h-2l2.531 3 2.469-3h-2v-5h-1z" transform="translate(1)"/></symbol><symbol id="arrow-circle-bottom" viewBox="0 0 8 8"><path d="M4 0c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm-1 1h2v3h2l-3 3-3-3h2v-3z"/></symbol><symbol id="arrow-circle-left" viewBox="0 0 8 8"><path d="M4 0c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 1v2h3v2h-3v2l-3-3 3-3z"/></symbol><symbol id="arrow-circle-right" viewBox="0 0 8 8"><path d="M4 0c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 1l3 3-3 3v-2h-3v-2h3v-2z"/></symbol><symbol id="arrow-circle-top" viewBox="0 0 8 8"><path d="M4 0c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 1l3 3h-2v3h-2v-3h-2l3-3z"/></symbol><symbol id="arrow-left" viewBox="0 0 8 8"><path d="M3 0l-3 2.531 3 2.469v-2h5v-1h-5v-2z" transform="translate(0 1)"/></symbol><symbol id="arrow-right" viewBox="0 0 8 8"><path d="M5 0v2h-5v1h5v2l3-2.531-3-2.469z" transform="translate(0 1)"/></symbol><symbol id="arrow-thick-bottom" viewBox="0 0 8 8"><path d="M2 0v5h-2l3.031 3 2.969-3h-2v-5h-2z" transform="translate(1)"/></symbol><symbol id="arrow-thick-left" viewBox="0 0 8 8"><path d="M3 0l-3 3.031 3 2.969v-2h5v-2h-5v-2z" transform="translate(0 1)"/></symbol><symbol id="arrow-thick-right" viewBox="0 0 8 8"><path d="M5 0v2h-5v2h5v2l3-3.031-3-2.969z" transform="translate(0 1)"/></symbol><symbol id="arrow-thick-top" viewBox="0 0 8 8"><path d="M2.969 0l-2.969 3h2v5h2v-5h2l-3.031-3z" transform="translate(1)"/></symbol><symbol id="arrow-top" viewBox="0 0 8 8"><path d="M2.469 0l-2.469 3h2v5h1v-5h2l-2.531-3z" transform="translate(1)"/></symbol><symbol id="audio-spectrum" viewBox="0 0 8 8"><path d="M4 0v8h1v-8h-1zm-2 1v6h1v-6h-1zm4 1v4h1v-4h-1zm-6 1v2h1v-2h-1z"/></symbol><symbol id="audio" viewBox="0 0 8 8"><path d="M1.188 0c-.734.722-1.188 1.748-1.188 2.844 0 1.095.454 2.09 1.188 2.813l.688-.719c-.546-.538-.875-1.269-.875-2.094s.329-1.587.875-2.125l-.688-.719zm5.625 0l-.688.719c.552.552.875 1.289.875 2.125 0 .836-.327 1.554-.875 2.094l.688.719c.732-.72 1.188-1.708 1.188-2.813 0-1.104-.459-2.115-1.188-2.844zm-4.219 1.406c-.362.362-.594.889-.594 1.438 0 .548.232 1.045.594 1.406l.688-.719c-.178-.178-.281-.416-.281-.688 0-.272.103-.54.281-.719l-.688-.719zm2.813 0l-.688.719c.183.183.281.434.281.719s-.099.505-.281.688l.688.719c.357-.357.594-.851.594-1.406 0-.555-.236-1.08-.594-1.438z" transform="translate(0 1)"/></symbol><symbol id="badge" viewBox="0 0 8 8"><path d="M2 0c-1.105 0-2 .895-2 2s.895 2 2 2 2-.895 2-2-.895-2-2-2zm-1 4.813v3.188l1-1 1 1v-3.188c-.31.11-.65.188-1 .188s-.69-.077-1-.188z" transform="translate(2)"/></symbol><symbol id="ban" viewBox="0 0 8 8"><path d="M4 0c-2.203 0-4 1.797-4 4 0 2.203 1.797 4 4 4 2.203 0 4-1.797 4-4 0-2.203-1.797-4-4-4zm0 1c.655 0 1.258.209 1.75.563l-4.188 4.188c-.353-.492-.563-1.095-.563-1.75 0-1.663 1.337-3 3-3zm2.438 1.25c.353.492.563 1.095.563 1.75 0 1.663-1.337 3-3 3-.655 0-1.258-.209-1.75-.563l4.188-4.188z"/></symbol><symbol id="bar-chart" viewBox="0 0 8 8"><path d="M0 0v7h8v-1h-7v-6h-1zm5 0v5h2v-5h-2zm-3 2v3h2v-3h-2z"/></symbol><symbol id="basket" viewBox="0 0 8 8"><path d="M3.969 0c-.127.011-.259.083-.344.188l-2.344 2.813h-1.281v1h1v3.656c0 .18.164.344.344.344h5.313c.18 0 .344-.164.344-.344v-3.656h1v-1h-1.281c-.274-.329-2.387-2.866-2.406-2.875-.105-.09-.216-.136-.344-.125zm.031 1.281l1.438 1.719h-2.875l1.438-1.719zm-1.5 3.719c.28 0 .5.22.5.5v1c0 .28-.22.5-.5.5s-.5-.22-.5-.5v-1c0-.28.22-.5.5-.5zm3 0c.28 0 .5.22.5.5v1c0 .28-.22.5-.5.5s-.5-.22-.5-.5v-1c0-.28.22-.5.5-.5z"/></symbol><symbol id="battery-empty" viewBox="0 0 8 8"><path d="M.094 0c-.06 0-.094.034-.094.094v5.813c0 .06.034.094.094.094h6.813c.06 0 .094-.034.094-.094v-1.906h1v-2h-1v-1.906c0-.06-.034-.094-.094-.094h-6.813zm.906 1h5v4h-5v-4z" transform="translate(0 1)"/></symbol><symbol id="battery-full" viewBox="0 0 8 8"><path d="M.094 0c-.06 0-.094.034-.094.094v5.813c0 .06.034.094.094.094h6.813c.06 0 .094-.034.094-.094v-1.906h1v-2h-1v-1.906c0-.06-.034-.094-.094-.094h-6.813z" transform="translate(0 1)"/></symbol><symbol id="beaker" viewBox="0 0 8 8"><path d="M1.344 0a.502.502 0 0 0 .156 1h.5v1.406c-.088.172-1.194 2.313-1.656 3.094-.153.268-.344.612-.344 1.063 0 .383.139.764.406 1.031.26.26.643.406 1.031.406h5.125c.383 0 .764-.139 1.031-.406.26-.26.406-.643.406-1.031 0-.452-.194-.801-.344-1.063-.463-.78-1.568-2.922-1.656-3.094v-1.406h.5a.5.5 0 1 0 0-1h-5a.5.5 0 0 0-.094 0 .502.502 0 0 0-.063 0zm1.656 1h2v1.625l.063.094s.652 1.233 1.219 2.281h-4.563c.567-1.049 1.219-2.281 1.219-2.281l.063-.094v-1.625z"/></symbol><symbol id="bell" viewBox="0 0 8 8"><path d="M4 0c-1.1 0-2 .9-2 2 0 1.04-.524 1.976-1.344 2.656-.42.34-.656.824-.656 1.344h8c0-.52-.236-1.004-.656-1.344-.82-.68-1.344-1.616-1.344-2.656 0-1.1-.9-2-2-2zm-1 7c0 .55.45 1 1 1s1-.45 1-1h-2z"/></symbol><symbol id="bluetooth" viewBox="0 0 8 8"><path d="M1.5 0v2.5l-.75-.75-.75.75 1.5 1.5-1.5 1.5.75.75.75-.75v2.5h.5l3.5-2.5-2.25-1.531 2.25-1.469-3.5-2.5h-.5zm1 1.5l1.5 1-1.5 1v-2zm0 3l1.5 1-1.5 1v-2z" transform="translate(1)"/></symbol><symbol id="bold" viewBox="0 0 8 8"><path d="M0 0v1c.55 0 1 .45 1 1v4c0 .55-.45 1-1 1v1h5.5c1.38 0 2.5-1.12 2.5-2.5 0-1-.588-1.85-1.438-2.25.27-.34.438-.78.438-1.25 0-1.1-.9-2-2-2h-5zm3 1h1c.55 0 1 .45 1 1s-.45 1-1 1h-1v-2zm0 3h1.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-1.5v-3z"/></symbol><symbol id="bolt" viewBox="0 0 8 8"><path d="M3 0l-3 5h2v3l3-5h-2v-3z" transform="translate(1)"/></symbol><symbol id="book" viewBox="0 0 8 8"><path d="M1 0c-.07 0-.127.001-.188.031-.39.08-.701.391-.781.781-.03.06-.031.118-.031.188v5.5c0 .83.67 1.5 1.5 1.5h5.5v-1h-5.5c-.28 0-.5-.22-.5-.5s.22-.5.5-.5h5.5v-5.5c0-.28-.22-.5-.5-.5h-.5v3l-1-1-1 1v-3h-3z"/></symbol><symbol id="bookmark" viewBox="0 0 8 8"><path d="M0 0v8l2-2 2 2v-8h-4z" transform="translate(2)"/></symbol><symbol id="box" viewBox="0 0 8 8"><path d="M0 0v1h8v-1h-8zm0 2v5.906c0 .06.034.094.094.094h7.813c.06 0 .094-.034.094-.094v-5.906h-2.969v1.031h-2.031v-1.031h-3z"/></symbol><symbol id="briefcase" viewBox="0 0 8 8"><path d="M3 0c-.554 0-1 .458-1 1v1h-1.906c-.06 0-.094.034-.094.094v2.406c0 .28.22.5.5.5h7c.28 0 .5-.22.5-.5v-2.406c0-.06-.034-.094-.094-.094h-1.906v-1c0-.542-.446-1-1-1h-2zm0 1h2v1h-2v-1zm-3 4.906v2c0 .06.034.094.094.094h7.813c.06 0 .094-.034.094-.094v-2c-.16.05-.32.094-.5.094h-7c-.18 0-.34-.044-.5-.094z"/></symbol><symbol id="british-pound" viewBox="0 0 8 8"><path d="M3 0c-.619 0-1.159.262-1.5.688-.341.426-.5.986-.5 1.563 0 .692.165 1.245.25 1.75h-1.25v1h1.219c-.112.448-.37.964-1.063 1.656l-.156.125v1.219h6v-1h-4.906c.641-.729.982-1.397 1.125-2h1.781v-1h-1.719c-.078-.683-.281-1.242-.281-1.75 0-.394.115-.731.281-.938.166-.207.368-.313.719-.313.394 0 .609.109.75.25.141.141.25.356.25.75h1c0-.576-.165-1.102-.531-1.469-.366-.366-.893-.531-1.469-.531z" transform="translate(1)"/></symbol><symbol id="browser" viewBox="0 0 8 8"><path d="M.344 0a.5.5 0 0 0-.344.5v7a.5.5 0 0 0 .5.5h7a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.5-.5h-7a.5.5 0 0 0-.094 0 .5.5 0 0 0-.063 0zm1.156 1c.28 0 .5.22.5.5s-.22.5-.5.5-.5-.22-.5-.5.22-.5.5-.5zm2 0h3c.28 0 .5.22.5.5s-.22.5-.5.5h-3c-.28 0-.5-.22-.5-.5s.22-.5.5-.5zm-2.5 2h6v4h-6v-4z"/></symbol><symbol id="brush" viewBox="0 0 8 8"><path d="M7.438.031c-.029-.001-.037.016-.063.031l-3.75 2.656c-.04.03-.095.106-.125.156l-.125.25c.719.229 1.271.781 1.5 1.5l.25-.125c.05-.02.126-.075.156-.125l2.656-3.75c.03-.04.04-.116 0-.156l-.406-.406c-.02-.02-.065-.03-.094-.031zm-4.781 3.969c-.73 0-1.313.614-1.313 1.344 0 .99-.544 1.821-1.344 2.281.4.23.864.375 1.344.375 1.48 0 2.656-1.176 2.656-2.656 0-.73-.604-1.344-1.344-1.344z"/></symbol><symbol id="bug" viewBox="0 0 8 8"><path d="M3.5 0c-1.19 0-1.978 1.69-1.188 2.5-.09.07-.196.137-.281.219l-1.313-.656a.5.5 0 0 0-.344-.063.5.5 0 0 0-.094.938l1.156.563c-.09.156-.186.328-.25.5h-.688a.5.5 0 0 0-.094 0 .502.502 0 1 0 .094 1h.5c0 .227.023.445.063.656l-.781.406a.5.5 0 1 0 .438.875l.656-.344c.245.46.59.844 1 1.094.35-.19.625-.439.625-.719v-1.438a.5.5 0 0 0 0-.094v-.813a.5.5 0 0 0 0-.219c.045-.231.254-.406.5-.406.28 0 .5.22.5.5v.875a.5.5 0 0 0 0 .094v.063a.5.5 0 0 0 0 .094v1.344c0 .27.275.497.625.688.41-.245.755-.604 1-1.063l.656.344a.5.5 0 1 0 .438-.875l-.781-.406c.04-.211.063-.429.063-.656h.5a.5.5 0 1 0 0-1h-.688c-.064-.172-.16-.344-.25-.5l1.156-.563a.5.5 0 0 0-.313-.938.5.5 0 0 0-.125.063l-1.313.656c-.086-.082-.191-.149-.281-.219.78-.83.003-2.5-1.188-2.5z"/></symbol><symbol id="bullhorn" viewBox="0 0 8 8"><path d="M6.094 0c-.03 0-.06.022-.094.031v5.969c.033.007.065 0 .094 0h.813c.06 0 .094-.034.094-.094v-5.813c0-.06-.034-.094-.094-.094h-.813zm-1.094.5l-2.906 1.469c-.05.02-.127.031-.188.031h-1.813c-.06 0-.094.034-.094.094v1.813c0 .06.034.094.094.094h.906l1.031 2.719c.11.25.406.36.656.25.25-.11.36-.406.25-.656l-.719-1.781c.033-.136.136-.25.281-.25v-.031l2.5 1.25v-5z"/></symbol><symbol id="calculator" viewBox="0 0 8 8"><path d="M.094 0c-.06 0-.094.034-.094.094v7.813c0 .06.034.094.094.094h6.813c.06 0 .094-.034.094-.094v-7.813c0-.06-.034-.094-.094-.094h-6.813zm.906 1h5v2h-5v-2zm0 3h1v1h-1v-1zm2 0h1v1h-1v-1zm2 0h1v3h-1v-3zm-4 2h1v1h-1v-1zm2 0h1v1h-1v-1z"/></symbol><symbol id="calendar" viewBox="0 0 8 8"><path d="M0 0v2h7v-2h-7zm0 3v4.906c0 .06.034.094.094.094h6.813c.06 0 .094-.034.094-.094v-4.906h-7zm1 1h1v1h-1v-1zm2 0h1v1h-1v-1zm2 0h1v1h-1v-1zm-4 2h1v1h-1v-1zm2 0h1v1h-1v-1z"/></symbol><symbol id="camera-slr" viewBox="0 0 8 8"><path d="M4.094 0c-.06 0-.105.044-.125.094l-.938 1.813c-.02.05-.065.094-.125.094h-1.406c-.83 0-1.5.67-1.5 1.5v4.406c0 .06.034.094.094.094h7.813c.06 0 .094-.034.094-.094v-5.813c0-.06-.034-.094-.094-.094h-.813c-.06 0-.105-.044-.125-.094l-.938-1.813c-.02-.05-.065-.094-.125-.094h-1.813zm-2.594 3c.28 0 .5.22.5.5s-.22.5-.5.5-.5-.22-.5-.5.22-.5.5-.5zm3.5 0c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm0 1c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1z"/></symbol><symbol id="caret-bottom" viewBox="0 0 8 8"><path d="M0 0l4 4 4-4h-8z" transform="translate(0 2)"/></symbol><symbol id="caret-left" viewBox="0 0 8 8"><path d="M4 0l-4 4 4 4v-8z" transform="translate(2)"/></symbol><symbol id="caret-right" viewBox="0 0 8 8"><path d="M0 0v8l4-4-4-4z" transform="translate(2)"/></symbol><symbol id="caret-top" viewBox="0 0 8 8"><path d="M4 0l-4 4h8l-4-4z" transform="translate(0 2)"/></symbol><symbol id="cart" viewBox="0 0 8 8"><path d="M.344 0a.502.502 0 0 0 .156 1h1.5l.094.25.406 1.25.406 1.25c.04.13.204.25.344.25h3.5c.14 0 .304-.12.344-.25l.813-2.531c.04-.12-.016-.219-.156-.219h-4.438l-.375-.719a.5.5 0 0 0-.438-.281h-2a.5.5 0 0 0-.094 0 .502.502 0 0 0-.063 0zm3.156 5c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5zm3 0c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5z" transform="translate(0 1)"/></symbol><symbol id="chat" viewBox="0 0 8 8"><path d="M0 0v5l1-1h1v-3h3v-1h-5zm3 2v4h4l1 1v-5h-5z"/></symbol><symbol id="check" viewBox="0 0 8 8"><path d="M6.406 0l-.719.688-2.781 2.781-.781-.781-.719-.688-1.406 1.406.688.719 1.5 1.5.719.688.719-.688 3.5-3.5.688-.719-1.406-1.406z" transform="translate(0 1)"/></symbol><symbol id="chevron-bottom" viewBox="0 0 8 8"><path d="M1.5 0l-1.5 1.5 4 4 4-4-1.5-1.5-2.5 2.5-2.5-2.5z" transform="translate(0 1)"/></symbol><symbol id="chevron-left" viewBox="0 0 8 8"><path d="M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z" transform="translate(1)"/></symbol><symbol id="chevron-right" viewBox="0 0 8 8"><path d="M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z" transform="translate(1)"/></symbol><symbol id="chevron-top" viewBox="0 0 8 8"><path d="M4 0l-4 4 1.5 1.5 2.5-2.5 2.5 2.5 1.5-1.5-4-4z" transform="translate(0 1)"/></symbol><symbol id="circle-check" viewBox="0 0 8 8"><path d="M4 0c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm2 1.781l.719.719-3.219 3.219-1.719-1.719.719-.719 1 1 2.5-2.5z"/></symbol><symbol id="circle-x" viewBox="0 0 8 8"><path d="M4 0c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm-1.5 1.781l1.5 1.5 1.5-1.5.719.719-1.5 1.5 1.5 1.5-.719.719-1.5-1.5-1.5 1.5-.719-.719 1.5-1.5-1.5-1.5.719-.719z"/></symbol><symbol id="clipboard" viewBox="0 0 8 8"><path d="M3.5 0c-.28 0-.5.22-.5.5v.5h-.75c-.14 0-.25.11-.25.25v.75h3v-.75c0-.14-.11-.25-.25-.25h-.75v-.5c0-.28-.22-.5-.5-.5zm-3.25 1c-.14 0-.25.11-.25.25v6.5c0 .14.11.25.25.25h6.5c.14 0 .25-.11.25-.25v-6.5c0-.14-.11-.25-.25-.25h-.75v2h-5v-2h-.75z"/></symbol><symbol id="clock" viewBox="0 0 8 8"><path d="M4 0c-2.203 0-4 1.797-4 4 0 2.203 1.797 4 4 4 2.203 0 4-1.797 4-4 0-2.203-1.797-4-4-4zm0 1c1.663 0 3 1.337 3 3s-1.337 3-3 3-3-1.337-3-3 1.337-3 3-3zm-.5 1v2.219l.156.125.5.5.344.375.719-.719-.375-.344-.344-.344v-1.813h-1z"/></symbol><symbol id="cloud-download" viewBox="0 0 8 8"><path d="M4.5 0c-1.21 0-2.27.86-2.5 2-1.1 0-2 .9-2 2 0 .37.111.7.281 1h2.719v-.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5v.5h1.906c.05-.16.094-.32.094-.5 0-.65-.42-1.29-1-1.5v-.5c0-1.38-1.12-2.5-2.5-2.5zm-.156 4a.5.5 0 0 0-.344.5v1.5h-1.5l2 2 2-2h-1.5v-1.5a.5.5 0 0 0-.594-.5.5.5 0 0 0-.063 0z"/></symbol><symbol id="cloud-upload" viewBox="0 0 8 8"><path d="M4.5 0c-1.21 0-2.27.86-2.5 2-1.1 0-2 .9-2 2 0 .37.111.7.281 1h2.219l2-2 2 2h1.406c.05-.16.094-.32.094-.5 0-.65-.42-1.29-1-1.5v-.5c0-1.38-1.12-2.5-2.5-2.5zm0 4.5l-2.5 2.5h2v.5a.5.5 0 1 0 1 0v-.5h2l-2.5-2.5z"/></symbol><symbol id="cloud" viewBox="0 0 8 8"><path d="M4.5 0c-1.21 0-2.27.86-2.5 2-1.1 0-2 .9-2 2s.9 2 2 2h4.5c.83 0 1.5-.67 1.5-1.5 0-.65-.42-1.29-1-1.5v-.5c0-1.38-1.12-2.5-2.5-2.5z" transform="translate(0 1)"/></symbol><symbol id="cloudy" viewBox="0 0 8 8"><path d="M2.5 0c-1.38 0-2.5 1.12-2.5 2.5 0 .39.09.743.25 1.063.3-.21.63-.379 1-.469.55-1.25 1.82-2.084 3.25-2.094-.46-.6-1.18-1-2-1zm2 2c-1.21 0-2.27.86-2.5 2-1.1 0-2 .9-2 2s.9 2 2 2h4.5c.83 0 1.5-.67 1.5-1.5 0-.65-.42-1.29-1-1.5v-.5c0-1.38-1.12-2.5-2.5-2.5z"/></symbol><symbol id="code" viewBox="0 0 8 8"><path d="M5 0l-3 6h1l3-6h-1zm-4 1l-1 2 1 2h1l-1-2 1-2h-1zm5 0l1 2-1 2h1l1-2-1-2h-1z" transform="translate(0 1)"/></symbol><symbol id="cog" viewBox="0 0 8 8"><path d="M3.5 0l-.5 1.188c-.1.04-.191.085-.281.125l-1.188-.5-.719.719.5 1.188c-.05.1-.095.181-.125.281l-1.188.5v1l1.188.5c.03.1.075.213.125.313l-.5 1.156.719.719 1.188-.5c.1.05.181.085.281.125l.5 1.188h1l.5-1.188c.1-.03.191-.085.281-.125l1.188.5.719-.719-.5-1.188c.04-.09.085-.181.125-.281l1.188-.5v-1l-1.188-.5c-.03-.09-.075-.191-.125-.281l.469-1.188-.688-.719-1.188.5c-.09-.04-.181-.095-.281-.125l-.5-1.188h-1zm.5 2.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5-1.5-.67-1.5-1.5.67-1.5 1.5-1.5z"/></symbol><symbol id="collapse-down" viewBox="0 0 8 8"><path d="M0 0v2h8v-2h-8zm2 3l2 2 2-2h-4zm-2 4v1h8v-1h-8z"/></symbol><symbol id="collapse-left" viewBox="0 0 8 8"><path d="M0 0v8h1v-8h-1zm6 0v8h2v-8h-2zm-1 2l-2 2 2 2v-4z"/></symbol><symbol id="collapse-right" viewBox="0 0 8 8"><path d="M0 0v8h2v-8h-2zm7 0v8h1v-8h-1zm-4 2v4l2-2-2-2z"/></symbol><symbol id="collapse-up" viewBox="0 0 8 8"><path d="M0 0v1h8v-1h-8zm4 3l-2 2h4l-2-2zm-4 3v2h8v-2h-8z"/></symbol><symbol id="command" viewBox="0 0 8 8"><path d="M1.5 0c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5h.5v1h-.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5v-.5h1v.5c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5-.67-1.5-1.5-1.5h-.5v-1h.5c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5v.5h-1v-.5c0-.83-.67-1.5-1.5-1.5zm0 1c.28 0 .5.22.5.5v.5h-.5c-.28 0-.5-.22-.5-.5s.22-.5.5-.5zm4 0c.28 0 .5.22.5.5s-.22.5-.5.5h-.5v-.5c0-.28.22-.5.5-.5zm-2.5 2h1v1h-1v-1zm-1.5 2h.5v.5c0 .28-.22.5-.5.5s-.5-.22-.5-.5.22-.5.5-.5zm3.5 0h.5c.28 0 .5.22.5.5s-.22.5-.5.5-.5-.22-.5-.5v-.5z"/></symbol><symbol id="comment-square" viewBox="0 0 8 8"><path d="M.094 0c-.06 0-.094.034-.094.094v5.813c0 .06.034.094.094.094h5.906l2 2v-7.906c0-.06-.034-.094-.094-.094h-7.813z"/></symbol><symbol id="compass" viewBox="0 0 8 8"><path d="M4 0c-2.203 0-4 1.797-4 4 0 2.203 1.797 4 4 4 2.203 0 4-1.797 4-4 0-2.203-1.797-4-4-4zm0 1c1.663 0 3 1.337 3 3s-1.337 3-3 3-3-1.337-3-3 1.337-3 3-3zm2 1l-3 1-1 3 3-1 1-3zm-2 1.5c.28 0 .5.22.5.5s-.22.5-.5.5-.5-.22-.5-.5.22-.5.5-.5z"/></symbol><symbol id="contrast" viewBox="0 0 8 8"><path d="M4 0c-2.203 0-4 1.797-4 4 0 2.203 1.797 4 4 4 2.203 0 4-1.797 4-4 0-2.203-1.797-4-4-4zm0 1c1.663 0 3 1.337 3 3s-1.337 3-3 3v-6z"/></symbol><symbol id="copywriting" viewBox="0 0 8 8"><path d="M0 0v1h8v-1h-8zm0 2v1h5v-1h-5zm0 3v1h8v-1h-8zm0 2v1h6v-1h-6zm7.5 0c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5z"/></symbol><symbol id="credit-card" viewBox="0 0 8 8"><path d="M.25 0c-.14 0-.25.11-.25.25v.75h8v-.75c0-.14-.11-.25-.25-.25h-7.5zm-.25 2v3.75c0 .14.11.25.25.25h7.5c.14 0 .25-.11.25-.25v-3.75h-8zm1 2h1v1h-1v-1zm2 0h1v1h-1v-1z" transform="translate(0 1)"/></symbol><symbol id="crop" viewBox="0 0 8 8"><path d="M1 0v1h-1v1h1v5h5v1h1v-1h1v-1h-1v-4.5l1-1-.5-.5-1 1h-4.5v-1h-1zm1 2h3.5l-3.5 3.5v-3.5zm4 .5v3.5h-3.5l3.5-3.5z"/></symbol><symbol id="dashboard" viewBox="0 0 8 8"><path d="M4 0c-2.203 0-4 1.797-4 4 0 2.203 1.797 4 4 4 2.203 0 4-1.797 4-4 0-2.203-1.797-4-4-4zm0 1c1.663 0 3 1.337 3 3s-1.337 3-3 3-3-1.337-3-3 1.337-3 3-3zm0 1c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5zm-1.656 1a.5.5 0 0 0-.188.844l.906.906c-.023.085-.063.158-.063.25 0 .552.448 1 1 1s1-.448 1-1-.448-1-1-1c-.092 0-.165.039-.25.063l-.906-.906a.5.5 0 0 0-.438-.156.5.5 0 0 0-.063 0zm3.156 0c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5z"/></symbol><symbol id="data-transfer-download" viewBox="0 0 8 8"><path d="M3 0v3h-2l3 3 3-3h-2v-3h-2zm-3 7v1h8v-1h-8z"/></symbol><symbol id="data-transfer-upload" viewBox="0 0 8 8"><path d="M0 0v1h8v-1h-8zm4 2l-3 3h2v3h2v-3h2l-3-3z"/></symbol><symbol id="delete" viewBox="0 0 8 8"><path d="M2 0l-2 3 2 3h6v-6h-6zm1.5.781l1.5 1.5 1.5-1.5.719.719-1.5 1.5 1.5 1.5-.719.719-1.5-1.5-1.5 1.5-.719-.719 1.5-1.5-1.5-1.5.719-.719z" transform="translate(0 1)"/></symbol><symbol id="dial" viewBox="0 0 8 8"><path d="M4 0c-2.201 0-4 1.799-4 4h1c0-1.659 1.341-3 3-3s3 1.341 3 3h1c0-2.201-1.799-4-4-4zm-.594 2.094c-.82.25-1.406 1.006-1.406 1.906 0 1.1.9 2 2 2s2-.9 2-2c0-.9-.586-1.656-1.406-1.906l-.594.875-.594-.875z" transform="translate(0 1)"/></symbol><symbol id="document" viewBox="0 0 8 8"><path d="M0 0v8h7v-4h-4v-4h-3zm4 0v3h3l-3-3zm-3 2h1v1h-1v-1zm0 2h1v1h-1v-1zm0 2h4v1h-4v-1z"/></symbol><symbol id="dollar" viewBox="0 0 8 8"><path d="M2 0v1h-.75c-.686 0-1.25.564-1.25 1.25v.5c0 .678.437 1.242 1.094 1.406l2.563.656c.143.036.344.296.344.438v.5c0 .134-.116.25-.25.25h-2.5c-.116 0-.212-.037-.25-.063v-.938h-1v1c0 .342.203.627.438.781.234.155.518.219.813.219h.75v1h1v-1h.75c.686 0 1.25-.564 1.25-1.25v-.5c0-.678-.437-1.242-1.094-1.406l-2.563-.656c-.143-.036-.344-.296-.344-.438v-.5c0-.134.116-.25.25-.25h2.5c.116 0 .212.037.25.063v.938h1v-1c0-.342-.203-.627-.438-.781-.234-.155-.518-.219-.813-.219h-.75v-1h-1z" transform="translate(1)"/></symbol><symbol id="double-quote-sans-left" viewBox="0 0 8 8"><path d="M0 0v6l3-3v-3h-3zm5 0v6l3-3v-3h-3z" transform="translate(0 1)"/></symbol><symbol id="double-quote-sans-right" viewBox="0 0 8 8"><path d="M3 0l-3 3v3h3v-6zm5 0l-3 3v3h3v-6z" transform="translate(0 1)"/></symbol><symbol id="double-quote-serif-left" viewBox="0 0 8 8"><path d="M3 0c-1.651 0-3 1.349-3 3v3h3v-3h-2c0-1.109.891-2 2-2v-1zm5 0c-1.651 0-3 1.349-3 3v3h3v-3h-2c0-1.109.891-2 2-2v-1z" transform="translate(0 1)"/></symbol><symbol id="double-quote-serif-right" viewBox="0 0 8 8"><path d="M0 0v3h2c0 1.109-.891 2-2 2v1c1.651 0 3-1.349 3-3v-3h-3zm5 0v3h2c0 1.109-.891 2-2 2v1c1.651 0 3-1.349 3-3v-3h-3z" transform="translate(0 1)"/></symbol><symbol id="droplet" viewBox="0 0 8 8"><path d="M3 0l-.344.344c-.11.11-2.656 2.685-2.656 4.875 0 1.65 1.35 3 3 3s3-1.35 3-3c0-2.19-2.546-4.765-2.656-4.875l-.344-.344zm-1.5 4.719c.28 0 .5.22.5.5 0 .55.45 1 1 1 .28 0 .5.22.5.5s-.22.5-.5.5c-1.1 0-2-.9-2-2 0-.28.22-.5.5-.5z" transform="translate(1)"/></symbol><symbol id="eject" viewBox="0 0 8 8"><path d="M4 0l-4 5h8l-4-5zm-4 6v2h8v-2h-8z"/></symbol><symbol id="elevator" viewBox="0 0 8 8"><path d="M3 0l-3 3h6l-3-3zm-3 5l3 3 3-3h-6z" transform="translate(1)"/></symbol><symbol id="ellipses" viewBox="0 0 8 8"><path d="M0 0v2h2v-2h-2zm3 0v2h2v-2h-2zm3 0v2h2v-2h-2z" transform="translate(0 3)"/></symbol><symbol id="envelope-closed" viewBox="0 0 8 8"><path d="M0 0v1l4 2 4-2v-1h-8zm0 2v4h8v-4l-4 2-4-2z" transform="translate(0 1)"/></symbol><symbol id="envelope-open" viewBox="0 0 8 8"><path d="M4 0l-4 2v6h8v-6l-4-2zm0 1.125l3 1.5v1.875l-3 1.5-3-1.5v-1.875l3-1.5zm-2 1.875v1l2 1 2-1v-1h-4z"/></symbol><symbol id="euro" viewBox="0 0 8 8"><path d="M6 0c-1.858 0-3.398 1.278-3.844 3h-1.906l-.25 1h2c0 .345.073.68.156 1h-1.969l-.188 1h2.563c.696 1.185 1.969 2 3.438 2 .734 0 1.407-.215 2-.563v-1.219c-.531.479-1.225.781-2 .781-.888 0-1.671-.392-2.219-1h2.219l.156-1h-2.969c-.113-.317-.188-.643-.188-1h3.344l.156-1h-3.313c.414-1.16 1.507-2 2.813-2 .655 0 1.258.209 1.75.563l.156-1.063c-.57-.313-1.213-.5-1.906-.5z" transform="translate(-1)"/></symbol><symbol id="excerpt" viewBox="0 0 8 8"><path d="M0 0v1h7v-1h-7zm0 2v1h5v-1h-5zm0 2v1h8v-1h-8zm0 2v1h1v-1h-1zm2 0v1h1v-1h-1zm2 0v1h1v-1h-1z"/></symbol><symbol id="expand-down" viewBox="0 0 8 8"><path d="M0 0v1h8v-1h-8zm2 2l2 2 2-2h-4zm-2 4v2h8v-2h-8z"/></symbol><symbol id="expand-left" viewBox="0 0 8 8"><path d="M0 0v8h1v-8h-1zm6 0v8h2v-8h-2zm-4 2v4l2-2-2-2z"/></symbol><symbol id="expand-right" viewBox="0 0 8 8"><path d="M0 0v8h2v-8h-2zm7 0v8h1v-8h-1zm-1 2l-2 2 2 2v-4z"/></symbol><symbol id="expand-up" viewBox="0 0 8 8"><path d="M0 0v2h8v-2h-8zm4 4l-2 2h4l-2-2zm-4 3v1h8v-1h-8z"/></symbol><symbol id="external-link" viewBox="0 0 8 8"><path d="M0 0v8h8v-2h-1v1h-6v-6h1v-1h-2zm4 0l1.5 1.5-2.5 2.5 1 1 2.5-2.5 1.5 1.5v-4h-4z"/></symbol><symbol id="eye" viewBox="0 0 8 8"><path d="M4.031 0c-2.53 0-4.031 3-4.031 3s1.501 3 4.031 3c2.47 0 3.969-3 3.969-3s-1.499-3-3.969-3zm-.031 1c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm0 1c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1c0-.1-.032-.191-.063-.281-.08.16-.237.281-.438.281-.28 0-.5-.22-.5-.5 0-.2.121-.357.281-.438-.09-.03-.181-.063-.281-.063z" transform="translate(0 1)"/></symbol><symbol id="eyedropper" viewBox="0 0 8 8"><path d="M3.313 0a.5.5 0 0 0-.188.844l.625.625-3.594 3.656-.156.156v2.719h2.719l.125-.156 3.656-3.656.625.656a.5.5 0 1 0 .719-.688l-.938-.938.656-.656c.59-.58.59-1.545 0-2.125-.56-.57-1.555-.57-2.125 0l-.656.656-.938-.938a.5.5 0 0 0-.469-.156.5.5 0 0 0-.063 0zm1.156 2.188l1.313 1.313-3.156 3.156-1.281-1.313 3.125-3.156z"/></symbol><symbol id="file" viewBox="0 0 8 8"><path d="M0 0v8h7v-4h-4v-4h-3zm4 0v3h3l-3-3z"/></symbol><symbol id="fire" viewBox="0 0 8 8"><path d="M2 0c1 2-2 3-2 5s2 3 2 3c-.98-1.98 2-3 2-5s-2-3-2-3zm3 3c1 2-2 3-2 5h3c.4 0 1-.5 1-2 0-2-2-3-2-3z"/></symbol><symbol id="flag" viewBox="0 0 8 8"><path d="M0 0v8h1v-8h-1zm2 0v4h2v1h4l-2-1.969 2-2.031h-3v-1h-3z"/></symbol><symbol id="flash" viewBox="0 0 8 8"><path d="M1.5 0l-1.5 3h2l-.656 2h-1.344l1 3 3-3h-1.5l1.5-3h-2l1-2h-1.5z" transform="translate(2)"/></symbol><symbol id="folder" viewBox="0 0 8 8"><path d="M0 0v2h8v-1h-5v-1h-3zm0 3v4.5c0 .28.22.5.5.5h7c.28 0 .5-.22.5-.5v-4.5h-8z"/></symbol><symbol id="fork" viewBox="0 0 8 8"><path d="M1.5 0c-.828 0-1.5.672-1.5 1.5 0 .656.414 1.202 1 1.406v2.188c-.586.204-1 .75-1 1.406 0 .828.672 1.5 1.5 1.5s1.5-.672 1.5-1.5c0-.595-.341-1.101-.844-1.344.09-.09.205-.156.344-.156h2c.823 0 1.5-.677 1.5-1.5v-.594c.586-.204 1-.75 1-1.406 0-.828-.672-1.5-1.5-1.5s-1.5.672-1.5 1.5c0 .656.414 1.202 1 1.406v.594c0 .277-.223.5-.5.5h-2c-.171 0-.346.04-.5.094v-1.188c.586-.204 1-.75 1-1.406 0-.828-.672-1.5-1.5-1.5z"/></symbol><symbol id="fullscreen-enter" viewBox="0 0 8 8"><path d="M0 0v4l1.5-1.5 1.5 1.5 1-1-1.5-1.5 1.5-1.5h-4zm5 4l-1 1 1.5 1.5-1.5 1.5h4v-4l-1.5 1.5-1.5-1.5z"/></symbol><symbol id="fullscreen-exit" viewBox="0 0 8 8"><path d="M1 0l-1 1 1.5 1.5-1.5 1.5h4v-4l-1.5 1.5-1.5-1.5zm3 4v4l1.5-1.5 1.5 1.5 1-1-1.5-1.5 1.5-1.5h-4z"/></symbol><symbol id="globe" viewBox="0 0 8 8"><path d="M4 0c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 1c.333 0 .637.086.938.188-.214.197-.45.383-.406.563.04.18.688.13.688.5 0 .27-.425.346-.125.656.35.35-.636.978-.656 1.438-.03.83.841.969 1.531.969.424 0 .503.195.469.438-.546.758-1.438 1.25-2.438 1.25-.378 0-.729-.09-1.063-.219.224-.442-.313-1.344-.781-1.625-.226-.226-.689-.114-.969-.219-.092-.271-.178-.545-.188-.844.031-.05.081-.094.156-.094.19 0 .454.374.594.344.18-.04-.742-1.313-.313-1.563.2-.12.609.394.469-.156-.12-.51.366-.276.656-.406.26-.11.455-.414.125-.594-.057-.031-.133-.104-.219-.188.45-.27.972-.438 1.531-.438zm2.313 1.094c.184.222.323.481.438.75-.043.065-.083.114-.188.219-.29.27-.327-.212-.438-.313-.13-.11-.638.025-.688-.125-.077-.181.499-.418.875-.531z"/></symbol><symbol id="graph" viewBox="0 0 8 8"><path d="M7.031 0l-3.031 3-1-1-3 3.031 1 1 2-2.031 1 1 4-4-.969-1zm-7.031 7v1h8v-1h-8z"/></symbol><symbol id="grid-four-up" viewBox="0 0 8 8"><path d="M0 0v1h1v-1h-1zm2 0v1h1v-1h-1zm2 0v1h1v-1h-1zm2 0v1h1v-1h-1zm-6 2v1h1v-1h-1zm2 0v1h1v-1h-1zm2 0v1h1v-1h-1zm2 0v1h1v-1h-1zm-6 2v1h1v-1h-1zm2 0v1h1v-1h-1zm2 0v1h1v-1h-1zm2 0v1h1v-1h-1zm-6 2v1h1v-1h-1zm2 0v1h1v-1h-1zm2 0v1h1v-1h-1zm2 0v1h1v-1h-1z"/></symbol><symbol id="grid-three-up" viewBox="0 0 8 8"><path d="M0 0v2h2v-2h-2zm3 0v2h2v-2h-2zm3 0v2h2v-2h-2zm-6 3v2h2v-2h-2zm3 0v2h2v-2h-2zm3 0v2h2v-2h-2zm-6 3v2h2v-2h-2zm3 0v2h2v-2h-2zm3 0v2h2v-2h-2z"/></symbol><symbol id="grid-two-up" viewBox="0 0 8 8"><path d="M0 0v3h3v-3h-3zm5 0v3h3v-3h-3zm-5 5v3h3v-3h-3zm5 0v3h3v-3h-3z"/></symbol><symbol id="hard-drive" viewBox="0 0 8 8"><path d="M.188 0c-.11 0-.188.077-.188.188v3.313c0 .28.22.5.5.5h6c.28 0 .5-.22.5-.5v-3.313c0-.11-.077-.188-.188-.188h-6.625zm-.188 4.906v2.906c0 .11.077.188.188.188h6.625c.11 0 .188-.077.188-.188v-2.906c-.16.05-.32.094-.5.094h-6c-.18 0-.34-.044-.5-.094zm5.5 1.094c.28 0 .5.22.5.5s-.22.5-.5.5-.5-.22-.5-.5.22-.5.5-.5z"/></symbol><symbol id="header" viewBox="0 0 8 8"><path d="M0 0v1h.5c.28 0 .5.22.5.5v4c0 .28-.22.5-.5.5h-.5v1h3v-1h-.5c-.28 0-.5-.22-.5-.5v-1.5h3v1.5c0 .28-.22.5-.5.5h-.5v1h3v-1h-.5c-.28 0-.5-.22-.5-.5v-4c0-.28.22-.5.5-.5h.5v-1h-3v1h.5c.28 0 .5.22.5.5v1.5h-3v-1.5c0-.28.22-.5.5-.5h.5v-1h-3z"/></symbol><symbol id="headphones" viewBox="0 0 8 8"><path d="M4 0c-1.651 0-3 1.349-3 3v1h-.5a.5.5 0 0 0-.5.5v2a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-3.5c0-1.109.891-2 2-2s2 .891 2 2v3.5a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 0-.5-.5h-.5v-1c0-1.651-1.349-3-3-3z"/></symbol><symbol id="heart" viewBox="0 0 8 8"><path d="M2 0c-.55 0-1.046.224-1.406.594-.37.36-.594.856-.594 1.406 0 .55.224 1.046.594 1.406l3.406 3.438 3.406-3.438c.37-.37.594-.856.594-1.406 0-.55-.224-1.046-.594-1.406-.36-.37-.856-.594-1.406-.594-.55 0-1.046.224-1.406.594-.37.36-.594.856-.594 1.406 0-.55-.224-1.046-.594-1.406-.36-.37-.856-.594-1.406-.594z" transform="translate(0 1)"/></symbol><symbol id="home" viewBox="0 0 8 8"><path d="M4 0l-4 3h1v4h2v-2h2v2h2v-4.031l1 .031-4-3z"/></symbol><symbol id="image" viewBox="0 0 8 8"><path d="M0 0v8h8v-8h-8zm1 1h6v3l-1-1-1 1 2 2v1h-1l-4-4-1 1v-3z"/></symbol><symbol id="inbox" viewBox="0 0 8 8"><path d="M.188 0c-.11 0-.188.077-.188.188v7.625c0 .11.077.188.188.188h7.625c.11 0 .188-.077.188-.188v-7.625c0-.11-.077-.188-.188-.188h-7.625zm.813 2h6v3h-1l-1 1h-2l-1-1h-1v-3z"/></symbol><symbol id="infinity" viewBox="0 0 8 8"><path d="M2 0c-1.31 0-2 1.01-2 2s.69 2 2 2c.79 0 1.42-.559 2-1.219.58.66 1.19 1.219 2 1.219 1.31 0 2-1.01 2-2s-.69-2-2-2c-.81 0-1.42.559-2 1.219-.57-.66-1.21-1.219-2-1.219zm0 1c.42 0 .884.47 1.344 1-.46.53-.924 1-1.344 1-.74 0-1-.54-1-1 0-.46.26-1 1-1zm4 0c.74 0 1 .54 1 1 0 .46-.26 1-1 1-.43 0-.894-.47-1.344-1 .45-.53.914-1 1.344-1z" transform="translate(0 2)"/></symbol><symbol id="info" viewBox="0 0 8 8"><path d="M3 0c-.552 0-1 .448-1 1s.448 1 1 1 1-.448 1-1-.448-1-1-1zm-1.5 2.5c-.83 0-1.5.67-1.5 1.5h1c0-.28.22-.5.5-.5s.5.22.5.5-1 1.64-1 2.5c0 .86.67 1.5 1.5 1.5s1.5-.67 1.5-1.5h-1c0 .28-.22.5-.5.5s-.5-.22-.5-.5c0-.36 1-1.84 1-2.5 0-.81-.67-1.5-1.5-1.5z" transform="translate(2)"/></symbol><symbol id="italic" viewBox="0 0 8 8"><path d="M2 0v1h1.625l-.063.125-2 5-.344.875h-1.219v1h5v-1h-1.625l.063-.125 2-5 .344-.875h1.219v-1h-5z"/></symbol><symbol id="justify-center" viewBox="0 0 8 8"><path d="M0 0v1h8v-1h-8zm0 2v1h8v-1h-8zm0 2v1h8v-1h-8zm1 2v1h6v-1h-6z"/></symbol><symbol id="justify-left" viewBox="0 0 8 8"><path d="M0 0v1h8v-1h-8zm0 2v1h8v-1h-8zm0 2v1h8v-1h-8zm0 2v1h6v-1h-6z"/></symbol><symbol id="justify-right" viewBox="0 0 8 8"><path d="M0 0v1h8v-1h-8zm0 2v1h8v-1h-8zm0 2v1h8v-1h-8zm2 2v1h6v-1h-6z"/></symbol><symbol id="key" viewBox="0 0 8 8"><path d="M5.5 0c-1.38 0-2.5 1.12-2.5 2.5 0 .16.033.297.063.438l-3.063 3.063v2h3v-2h2v-1l.063-.063c.14.03.277.063.438.063 1.38 0 2.5-1.12 2.5-2.5s-1.12-2.5-2.5-2.5zm.5 1c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1z"/></symbol><symbol id="laptop" viewBox="0 0 8 8"><path d="M1.344 0a.5.5 0 0 0-.344.5v3.5h-1v1.5c0 .28.22.5.5.5h7c.28 0 .5-.22.5-.5v-1.5h-1v-3.5a.5.5 0 0 0-.5-.5h-5a.5.5 0 0 0-.094 0 .5.5 0 0 0-.063 0zm.656 1h4v3h-1v1h-2v-1h-1v-3z" transform="translate(0 1)"/></symbol><symbol id="layers" viewBox="0 0 8 8"><path d="M0 0v4h4v-4h-4zm5 2v3h-3v1h4v-4h-1zm2 2v3h-3v1h4v-4h-1z"/></symbol><symbol id="lightbulb" viewBox="0 0 8 8"><path d="M3.406 0a.5.5 0 0 0-.125.063l-3 1.5a.5.5 0 1 0 .438.875l3-1.5a.5.5 0 0 0-.313-.938zm1 1.5a.5.5 0 0 0-.125.063l-4 2a.5.5 0 1 0 .438.875l4-2a.5.5 0 0 0-.313-.938zm0 2a.5.5 0 0 0-.125.063l-3 1.5a.5.5 0 0 0 .219.938h2a.502.502 0 0 0 .156-1l1.063-.563a.5.5 0 0 0-.313-.938zm-2.563 3.5a.502.502 0 0 0 .156 1h1a.5.5 0 1 0 0-1h-1a.5.5 0 0 0-.094 0 .502.502 0 0 0-.063 0z" transform="translate(1)"/></symbol><symbol id="link-broken" viewBox="0 0 8 8"><path d="M2 0v1h-1v1h2v-2h-1zm3.875.031c-.184.01-.354.03-.531.094-.27.095-.531.25-.75.469l-.438.438a.5.5 0 1 0 .688.688l.438-.438c.101-.101.245-.173.375-.219.352-.126.78-.064 1.063.219.395.389.4 1.037 0 1.438l-1.5 1.5a.5.5 0 1 0 .688.688l1.5-1.5c.78-.78.785-2.041 0-2.813-.279-.279-.606-.452-.969-.531-.181-.039-.379-.041-.563-.031zm-3.594 2.906a.5.5 0 0 0-.188.156l-1.5 1.5c-.78.78-.785 2.041 0 2.813.557.557 1.355.722 2.063.469.27-.095.531-.25.75-.469l.438-.438a.5.5 0 1 0-.688-.688l-.438.438c-.101.101-.245.173-.375.219-.352.126-.78.064-1.063-.219-.395-.389-.4-1.037 0-1.438l1.5-1.5a.5.5 0 0 0-.438-.844.5.5 0 0 0-.063 0zm2.719 3.063v2h1v-1h1v-1h-2z"/></symbol><symbol id="link-intact" viewBox="0 0 8 8"><path d="M5.875.031c-.184.01-.354.03-.531.094-.27.095-.531.25-.75.469a.5.5 0 1 0 .688.688c.101-.101.245-.173.375-.219.352-.126.78-.064 1.063.219.395.389.4 1.037 0 1.438l-1.5 1.5c-.434.434-.799.483-1.063.469-.264-.015-.406-.125-.406-.125a.504.504 0 1 0-.5.875s.34.222.844.25c.504.028 1.197-.165 1.813-.781l1.5-1.5c.78-.78.785-2.041 0-2.813-.279-.279-.606-.452-.969-.531-.181-.039-.379-.041-.563-.031zm-2 2.313c-.501-.019-1.186.155-1.781.75l-1.5 1.5c-.78.78-.785 2.041 0 2.813.557.557 1.355.722 2.063.469.27-.095.531-.25.75-.469a.5.5 0 1 0-.688-.688c-.101.101-.245.173-.375.219-.352.126-.78.064-1.063-.219-.395-.389-.4-1.037 0-1.438l1.5-1.5c.405-.405.752-.448 1.031-.438.279.011.469.094.469.094a.5.5 0 1 0 .438-.875s-.343-.199-.844-.219z"/></symbol><symbol id="list-rich" viewBox="0 0 8 8"><path d="M0 0v3h3v-3h-3zm4 0v1h4v-1h-4zm0 2v1h3v-1h-3zm-4 2v3h3v-3h-3zm4 0v1h4v-1h-4zm0 2v1h3v-1h-3z"/></symbol><symbol id="list" viewBox="0 0 8 8"><path d="M.5 0c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5zm1.5 0v1h6v-1h-6zm-1.5 2c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5zm1.5 0v1h6v-1h-6zm-1.5 2c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5zm1.5 0v1h6v-1h-6zm-1.5 2c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5zm1.5 0v1h6v-1h-6z"/></symbol><symbol id="location" viewBox="0 0 8 8"><path d="M8 0l-8 4 3 1 1 3 4-8z"/></symbol><symbol id="lock-locked" viewBox="0 0 8 8"><path d="M3 0c-1.099 0-2 .901-2 2v1h-1v4h6v-4h-1v-1c0-1.099-.901-2-2-2zm0 1c.561 0 1 .439 1 1v1h-2v-1c0-.561.439-1 1-1z" transform="translate(1)"/></symbol><symbol id="lock-unlocked" viewBox="0 0 8 8"><path d="M3 0c-1.099 0-2 .901-2 2h1c0-.561.439-1 1-1 .561 0 1 .439 1 1v2h-4v4h6v-4h-1v-2c0-1.099-.901-2-2-2z" transform="translate(1)"/></symbol><symbol id="loop-circular" viewBox="0 0 8 8"><path d="M4 0c-1.651 0-3 1.349-3 3h-1l1.5 2 1.5-2h-1c0-1.109.891-2 2-2v-1zm2.5 1l-1.5 2h1c0 1.109-.891 2-2 2v1c1.651 0 3-1.349 3-3h1l-1.5-2z" transform="translate(0 1)"/></symbol><symbol id="loop-square" viewBox="0 0 8 8"><path d="M1 0v2h1v-1h4v2h-1l1.5 2.5 1.5-2.5h-1v-3h-6zm.5 2.5l-1.5 2.5h1v3h6v-2h-1v1h-4v-2h1l-1.5-2.5z"/></symbol><symbol id="loop" viewBox="0 0 8 8"><path d="M6 0v1h-5c-.554 0-1 .446-1 1v1h1v-1h5v1l2-1.5-2-1.5zm-4 4l-2 1.5 2 1.5v-1h5c.542 0 1-.458 1-1v-1h-1v1h-5v-1z"/></symbol><symbol id="magnifying-glass" viewBox="0 0 8 8"><path d="M3.5 0c-1.927 0-3.5 1.573-3.5 3.5s1.573 3.5 3.5 3.5c.592 0 1.166-.145 1.656-.406a1 1 0 0 0 .125.125l1 1a1.016 1.016 0 1 0 1.438-1.438l-1-1a1 1 0 0 0-.156-.125c.266-.493.438-1.059.438-1.656 0-1.927-1.573-3.5-3.5-3.5zm0 1c1.387 0 2.5 1.113 2.5 2.5 0 .661-.241 1.273-.656 1.719-.01.011-.021.021-.031.031a1 1 0 0 0-.125.125c-.442.397-1.043.625-1.688.625-1.387 0-2.5-1.113-2.5-2.5s1.113-2.5 2.5-2.5z"/></symbol><symbol id="map-marker" viewBox="0 0 8 8"><path d="M3 0c-1.66 0-3 1.34-3 3 0 2 3 5 3 5s3-3 3-5c0-1.66-1.34-3-3-3zm0 1c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2z" transform="translate(1)"/></symbol><symbol id="map" viewBox="0 0 8 8"><path d="M0 0v8h8v-2.375a.5.5 0 0 0 0-.219v-5.406h-8zm1 1h6v4h-1.5a.5.5 0 0 0-.094 0 .502.502 0 1 0 .094 1h1.5v1h-6v-6zm2.5 1c-.83 0-1.5.67-1.5 1.5 0 1 1.5 2.5 1.5 2.5s1.5-1.5 1.5-2.5c0-.83-.67-1.5-1.5-1.5zm0 1c.28 0 .5.22.5.5s-.22.5-.5.5-.5-.22-.5-.5.22-.5.5-.5z"/></symbol><symbol id="media-pause" viewBox="0 0 8 8"><path d="M0 0v6h2v-6h-2zm4 0v6h2v-6h-2z" transform="translate(1 1)"/></symbol><symbol id="media-play" viewBox="0 0 8 8"><path d="M0 0v6l6-3-6-3z" transform="translate(1 1)"/></symbol><symbol id="media-record" viewBox="0 0 8 8"><path d="M3 0c-1.657 0-3 1.343-3 3s1.343 3 3 3 3-1.343 3-3-1.343-3-3-3z" transform="translate(1 1)"/></symbol><symbol id="media-skip-backward" viewBox="0 0 8 8"><path d="M4 0l-4 3 4 3v-6zm0 3l4 3v-6l-4 3z" transform="translate(0 1)"/></symbol><symbol id="media-skip-forward" viewBox="0 0 8 8"><path d="M0 0v6l4-3-4-3zm4 3v3l4-3-4-3v3z" transform="translate(0 1)"/></symbol><symbol id="media-step-backward" viewBox="0 0 8 8"><path d="M0 0v6h2v-6h-2zm2 3l5 3v-6l-5 3z" transform="translate(0 1)"/></symbol><symbol id="media-step-forward" viewBox="0 0 8 8"><path d="M0 0v6l5-3-5-3zm5 3v3h2v-6h-2v3z" transform="translate(0 1)"/></symbol><symbol id="media-stop" viewBox="0 0 8 8"><path d="M0 0v6h6v-6h-6z" transform="translate(1 1)"/></symbol><symbol id="medical-cross" viewBox="0 0 8 8"><path d="M2 0v2h-2v4h2v2h4v-2h2v-4h-2v-2h-4z"/></symbol><symbol id="menu" viewBox="0 0 8 8"><path d="M0 0v1h8v-1h-8zm0 2.969v1h8v-1h-8zm0 3v1h8v-1h-8z" transform="translate(0 1)"/></symbol><symbol id="microphone" viewBox="0 0 8 8"><path d="M2.906-.031a1 1 0 0 0-.125.031 1 1 0 0 0-.781 1v2a1 1 0 1 0 2 0v-2a1 1 0 0 0-1.094-1.031zm-2.563 2.031a.5.5 0 0 0-.344.5v.5c0 1.476 1.091 2.693 2.5 2.938v1.063h-.5c-.55 0-1 .45-1 1h4c0-.55-.45-1-1-1h-.5v-1.063c1.409-.244 2.5-1.461 2.5-2.938v-.5a.5.5 0 1 0-1 0v.5c0 1.109-.891 2-2 2s-2-.891-2-2v-.5a.5.5 0 0 0-.594-.5.5.5 0 0 0-.063 0z" transform="translate(1)"/></symbol><symbol id="minus" viewBox="0 0 8 8"><path d="M0 0v2h8v-2h-8z" transform="translate(0 3)"/></symbol><symbol id="monitor" viewBox="0 0 8 8"><path d="M.344 0a.5.5 0 0 0-.344.5v5a.5.5 0 0 0 .5.5h2.5v1h-1c-.55 0-1 .45-1 1h6c0-.55-.45-1-1-1h-1v-1h2.5a.5.5 0 0 0 .5-.5v-5a.5.5 0 0 0-.5-.5h-7a.5.5 0 0 0-.094 0 .5.5 0 0 0-.063 0zm.656 1h6v4h-6v-4z"/></symbol><symbol id="moon" viewBox="0 0 8 8"><path d="M2.719 0c-1.58.53-2.719 2.021-2.719 3.781 0 2.21 1.79 4 4 4 1.76 0 3.251-1.17 3.781-2.75-.4.14-.831.25-1.281.25-2.21 0-4-1.79-4-4 0-.44.079-.881.219-1.281z"/></symbol><symbol id="move" viewBox="0 0 8 8"><path d="M3.5 0l-1.5 1.5h1v1.5h-1.5v-1l-1.5 1.5 1.5 1.5v-1h1.5v1.5h-1l1.5 1.5 1.5-1.5h-1v-1.5h1.5v1l1.5-1.5-1.5-1.5v1h-1.5v-1.5h1l-1.5-1.5z"/></symbol><symbol id="musical-note" viewBox="0 0 8 8"><path d="M8 0c-5 0-6 1-6 1v4.094c-.154-.054-.327-.094-.5-.094-.828 0-1.5.672-1.5 1.5s.672 1.5 1.5 1.5 1.5-.672 1.5-1.5v-3.969c.732-.226 1.99-.438 4-.5v2.063c-.154-.054-.327-.094-.5-.094-.828 0-1.5.672-1.5 1.5s.672 1.5 1.5 1.5 1.5-.672 1.5-1.5v-5.5z"/></symbol><symbol id="paperclip" viewBox="0 0 8 8"><path d="M5 0c-.514 0-1.021.201-1.406.594l-2.781 2.719c-1.07 1.07-1.07 2.805 0 3.875 1.07 1.07 2.805 1.07 3.875 0l1.25-1.25-.688-.688-.906.875-.344.375c-.69.69-1.81.69-2.5 0-.682-.682-.668-1.778 0-2.469l2.781-2.719v-.031c.389-.395 1.037-.4 1.438 0 .388.381.378 1.006 0 1.406l-2.5 2.469c-.095.095-.28.095-.375 0-.095-.095-.095-.28 0-.375l.375-.344.594-.625-.688-.688-.875.875-.094.094c-.485.485-.485 1.265 0 1.75.485.485 1.265.485 1.75 0l2.5-2.438c.78-.78.785-2.041 0-2.813-.39-.39-.893-.594-1.406-.594z"/></symbol><symbol id="pencil" viewBox="0 0 8 8"><path d="M6 0l-1 1 2 2 1-1-2-2zm-2 2l-4 4v2h2l4-4-2-2z"/></symbol><symbol id="people" viewBox="0 0 8 8"><path d="M5.5 0c-.51 0-.949.355-1.219.875.45.54.719 1.275.719 2.125 0 .29-.034.574-.094.844.18.11.374.156.594.156.83 0 1.5-.9 1.5-2s-.67-2-1.5-2zm-3 1c-.828 0-1.5.895-1.5 2s.672 2 1.5 2 1.5-.895 1.5-2-.672-2-1.5-2zm4.75 3.156c-.43.51-1.018.824-1.688.844.27.38.438.844.438 1.344v.656h2v-1.656c0-.52-.31-.968-.75-1.188zm-6.5 1c-.44.22-.75.668-.75 1.188v1.656h5v-1.656c0-.52-.31-.968-.75-1.188-.44.53-1.06.844-1.75.844s-1.31-.314-1.75-.844z"/></symbol><symbol id="person" viewBox="0 0 8 8"><path d="M4 0c-1.105 0-2 1.119-2 2.5s.895 2.5 2 2.5 2-1.119 2-2.5-.895-2.5-2-2.5zm-2.094 5c-1.07.04-1.906.92-1.906 2v1h8v-1c0-1.08-.836-1.96-1.906-2-.54.61-1.284 1-2.094 1-.81 0-1.554-.39-2.094-1z"/></symbol><symbol id="phone" viewBox="0 0 8 8"><path d="M.188 0c-.11 0-.188.077-.188.188v7.625c0 .11.077.188.188.188h4.625c.11 0 .188-.077.188-.188v-7.625c0-.11-.077-.188-.188-.188h-4.625zm.813 1h3v5h-3v-5zm1.5 5.5c.28 0 .5.22.5.5s-.22.5-.5.5-.5-.22-.5-.5.22-.5.5-.5z" transform="translate(1)"/></symbol><symbol id="pie-chart" viewBox="0 0 8 8"><path d="M3.5 0c-.97 0-1.839.391-2.469 1.031l2.969 2.969v-3.969c-.16-.03-.33-.031-.5-.031zm1.5 1.063v3.406l-2.719 2.719c.6.5 1.369.813 2.219.813 1.93 0 3.5-1.57 3.5-3.5 0-1.76-1.31-3.197-3-3.438zm-4.094 1.313c-.55.54-.906 1.285-.906 2.125 0 .95.435 1.804 1.125 2.344l2.156-2.125-2.375-2.344z"/></symbol><symbol id="pin" viewBox="0 0 8 8"><path d="M1.344 0a.502.502 0 0 0 .156 1h.5v2h-1c-.55 0-1 .45-1 1h3v3l.438 1 .563-1v-3h3c0-.55-.45-1-1-1h-1v-2h.5a.5.5 0 1 0 0-1h-4a.5.5 0 0 0-.094 0 .502.502 0 0 0-.063 0z"/></symbol><symbol id="play-circle" viewBox="0 0 8 8"><path d="M4 0c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm-1 2l3 2-3 2v-4z"/></symbol><symbol id="plus" viewBox="0 0 8 8"><path d="M3 0v3h-3v2h3v3h2v-3h3v-2h-3v-3h-2z"/></symbol><symbol id="power-standby" viewBox="0 0 8 8"><path d="M3 0v4h1v-4h-1zm-1.281 1.438l-.375.313c-.803.64-1.344 1.634-1.344 2.75 0 1.929 1.571 3.5 3.5 3.5s3.5-1.571 3.5-3.5c0-1.116-.529-2.11-1.344-2.75l-.375-.313-.625.781.375.313c.585.46.969 1.165.969 1.969 0 1.391-1.109 2.5-2.5 2.5s-2.5-1.109-2.5-2.5c0-.804.361-1.509.938-1.969l.406-.313-.625-.781z"/></symbol><symbol id="print" viewBox="0 0 8 8"><path d="M2 0v2h4v-2h-4zm-1.906 3c-.06 0-.094.034-.094.094v2.813c0 .06.034.094.094.094h.906v-2h6v2h.906c.06 0 .094-.034.094-.094v-2.813c0-.06-.034-.094-.094-.094h-7.813zm1.906 2v3h4v-3h-4z"/></symbol><symbol id="project" viewBox="0 0 8 8"><path d="M0 0v7h1v-7h-1zm7 0v7h1v-7h-1zm-5 1v1h2v-1h-2zm1 2v1h2v-1h-2zm1 2v1h2v-1h-2z"/></symbol><symbol id="pulse" viewBox="0 0 8 8"><path d="M3.25 0l-.469 1.531-.781 2.563-.031-.063-.094-.344h-1.875v1h1.156l.375 1.156.469 1.469.469-1.469.781-2.5.781 2.5.406 1.313.531-1.281.594-1.469.125.281h2.313v-1h-1.688l-.375-.719-.5-1-.406 1.031-.469 1.188-.844-2.656-.469-1.531z"/></symbol><symbol id="puzzle-piece" viewBox="0 0 8 8"><path d="M3 0c-.28 0-.539.101-.719.281-.18.18-.281.439-.281.719 0 .28.181.479.281.719.03.06.063.161.063.281h-2.344v6h2.344c0-.12-.011-.221-.031-.281-.11-.24-.313-.439-.313-.719 0-.28.101-.539.281-.719.18-.18.439-.281.719-.281.28 0 .539.101.719.281.18.18.281.439.281.719 0 .28-.181.479-.281.719-.03.06-.063.161-.063.281h2.344v-2.344c.12 0 .221.011.281.031.24.11.439.313.719.313.28 0 .539-.101.719-.281.18-.18.281-.439.281-.719 0-.28-.101-.539-.281-.719-.18-.18-.439-.281-.719-.281-.28 0-.479.181-.719.281-.06.03-.161.063-.281.063v-2.344h-2.344c0-.12.011-.221.031-.281.11-.24.313-.439.313-.719 0-.28-.101-.539-.281-.719-.18-.18-.439-.281-.719-.281z"/></symbol><symbol id="question-mark" viewBox="0 0 8 8"><path d="M2.469 0c-.854 0-1.48.256-1.875.656s-.54.901-.594 1.281l1 .125c.036-.26.125-.497.313-.688.188-.19.491-.375 1.156-.375.664 0 1.019.163 1.219.344.199.181.281.405.281.656 0 .833-.313 1.063-.813 1.5-.5.438-1.188 1.083-1.188 2.25v.25h1v-.25c0-.833.344-1.063.844-1.5.5-.438 1.156-1.083 1.156-2.25 0-.479-.168-1.02-.594-1.406-.426-.387-1.071-.594-1.906-.594zm-.5 7v1h1v-1h-1z" transform="translate(2)"/></symbol><symbol id="rain" viewBox="0 0 8 8"><path d="M4.5 0c-1.21 0-2.27.86-2.5 2-1.1 0-2 .9-2 2 0 .52.201 1.015.531 1.375.26-.22.599-.375.969-.375.2 0 .393.055.563.125.17-.64.748-1.125 1.438-1.125s1.268.485 1.438 1.125c.17-.07.362-.125.563-.125.63 0 1.155.388 1.375.938.64-.17 1.125-.747 1.125-1.438 0-.65-.42-1.29-1-1.5v-.5c0-1.38-1.12-2.5-2.5-2.5zm-1.156 5a.5.5 0 0 0-.344.5v2a.5.5 0 1 0 1 0v-2a.5.5 0 0 0-.594-.5.5.5 0 0 0-.063 0zm-2 1a.5.5 0 0 0-.344.5v1a.5.5 0 1 0 1 0v-1a.5.5 0 0 0-.594-.5.5.5 0 0 0-.063 0zm4 0a.5.5 0 0 0-.344.5v1a.5.5 0 1 0 1 0v-1a.5.5 0 0 0-.594-.5.5.5 0 0 0-.063 0z"/></symbol><symbol id="random" viewBox="0 0 8 8"><path d="M6 0v1h-.5c-.354 0-.6.116-.813.375l-1.406 1.75-1.5-1.75v-.031c-.212-.236-.427-.344-.781-.344h-1v1h1c-.037 0 .008-.011.031 0v.031l1.625 1.906-1.625 2.031c.016-.02.019.022 0 .031-.019.009-.068 0-.031 0h-1v1h1c.354 0 .6-.116.813-.375l1.531-1.906 1.625 1.906v.031c.212.236.427.344.781.344h.25v1l2-1.5-2-1.5v1h-.25c.037 0-.008.011-.031 0v-.031l-1.75-2.063 1.5-1.875v-.031c.019-.009.068 0 .031 0h.5v1l2-1.5-2-1.5z"/></symbol><symbol id="reload" viewBox="0 0 8 8"><path d="M4 0c-2.201 0-4 1.799-4 4s1.799 4 4 4c1.104 0 2.092-.456 2.813-1.188l-.688-.688c-.54.548-1.289.875-2.125.875-1.659 0-3-1.341-3-3s1.341-3 3-3c.834 0 1.545.354 2.094.906l-1.094 1.094h3v-3l-1.188 1.188c-.731-.72-1.719-1.188-2.813-1.188z"/></symbol><symbol id="resize-both" viewBox="0 0 8 8"><path d="M4 0l1.656 1.656-4 4-1.656-1.656v4h4l-1.656-1.656 4-4 1.656 1.656v-4h-4z"/></symbol><symbol id="resize-height" viewBox="0 0 8 8"><path d="M2.5 0l-2.5 3h2v2h-2l2.5 3 2.5-3h-2v-2h2l-2.5-3z" transform="translate(1)"/></symbol><symbol id="resize-width" viewBox="0 0 8 8"><path d="M3 0l-3 2.5 3 2.5v-2h2v2l3-2.5-3-2.5v2h-2v-2z" transform="translate(0 1)"/></symbol><symbol id="rss-alt" viewBox="0 0 8 8"><path d="M0 0v2c3.331 0 6 2.669 6 6h2c0-4.409-3.591-8-8-8zm0 3v2c1.67 0 3 1.33 3 3h2c0-2.75-2.25-5-5-5zm0 3v2h2c0-1.11-.89-2-2-2z"/></symbol><symbol id="rss" viewBox="0 0 8 8"><path d="M1 0v1c3.32 0 6 2.68 6 6h1c0-3.86-3.14-7-7-7zm0 2v1c2.221 0 4 1.779 4 4h1c0-2.759-2.241-5-5-5zm0 2v1c1.109 0 2 .891 2 2h1c0-1.651-1.349-3-3-3zm0 2c-.552 0-1 .448-1 1s.448 1 1 1 1-.448 1-1-.448-1-1-1z"/></symbol><symbol id="script" viewBox="0 0 8 8"><path d="M3 0c-.55 0-1 .45-1 1v5.5c0 .28-.22.5-.5.5s-.5-.22-.5-.5v-1.5h-1v2c0 .55.45 1 1 1h5c.55 0 1-.45 1-1v-3h-4v-2.5c0-.28.22-.5.5-.5s.5.22.5.5v1.5h4v-2c0-.55-.45-1-1-1h-4z"/></symbol><symbol id="share-boxed" viewBox="0 0 8 8"><path d="M.75 0c-.402 0-.75.348-.75.75v5.5c0 .402.348.75.75.75h4.5c.402 0 .75-.348.75-.75v-1.25h-1v1h-4v-5h2v-1h-2.25zm5.25 0v1c-2.05 0-3.704 1.544-3.938 3.531.213-.875.999-1.531 1.938-1.531h2v1l2-2-2-2z"/></symbol><symbol id="share" viewBox="0 0 8 8"><path d="M5 0v2c-4 0-5 2.05-5 5 .52-1.98 2-3 4-3h1v2l3-3.156-3-2.844z"/></symbol><symbol id="shield" viewBox="0 0 8 8"><path d="M4 0l-.188.094-3.5 1.469-.313.125v.313c0 1.657.666 3.122 1.469 4.188.401.533.828.969 1.25 1.281.422.313.826.531 1.281.531.455 0 .86-.219 1.281-.531.422-.313.849-.749 1.25-1.281.803-1.065 1.469-2.53 1.469-4.188v-.313l-.313-.125-3.5-1.469-.188-.094zm0 1.094v5.906c-.045 0-.328-.069-.656-.313s-.714-.631-1.063-1.094c-.642-.851-1.137-2.025-1.219-3.281l2.938-1.219z"/></symbol><symbol id="signal" viewBox="0 0 8 8"><path d="M6 0v8h1v-8h-1zm-2 1v7h1v-7h-1zm-2 2v5h1v-5h-1zm-2 2v3h1v-3h-1z"/></symbol><symbol id="signpost" viewBox="0 0 8 8"><path d="M3 0v1h-2l-1 1 1 1h2v5h1v-4h2l1-1-1-1h-2v-2h-1z"/></symbol><symbol id="sort-ascending" viewBox="0 0 8 8"><path d="M2 0v6h-2l2.5 2 2.5-2h-2v-6h-1zm2 0v1h2v-1h-2zm0 2v1h3v-1h-3zm0 2v1h4v-1h-4z"/></symbol><symbol id="sort-descending" viewBox="0 0 8 8"><path d="M2 0v6h-2l2.5 2 2.5-2h-2v-6h-1zm2 0v1h4v-1h-4zm0 2v1h3v-1h-3zm0 2v1h2v-1h-2z"/></symbol><symbol id="spreadsheet" viewBox="0 0 8 8"><path d="M.75 0c-.402 0-.75.348-.75.75v5.5c0 .402.348.75.75.75h6.5c.402 0 .75-.348.75-.75v-5.5c0-.402-.348-.75-.75-.75h-6.5zm.25 1h1v1h-1v-1zm2 0h4v1h-4v-1zm-2 2h1v1h-1v-1zm2 0h4v1h-4v-1zm-2 2h1v1h-1v-1zm2 0h4v1h-4v-1z"/></symbol><symbol id="star" viewBox="0 0 8 8"><path d="M4 0l-1 3h-3l2.5 2-1 3 2.5-2 2.5 2-1-3 2.5-2h-3l-1-3z"/></symbol><symbol id="sun" viewBox="0 0 8 8"><path d="M4 0c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5zm-2.5 1c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5zm5 0c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5zm-2.5 1c-1.105 0-2 .895-2 2s.895 2 2 2 2-.895 2-2-.895-2-2-2zm-3.5 1.5c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5zm7 0c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5zm-6 2.5c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5zm5 0c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5zm-2.5 1c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5z"/></symbol><symbol id="tablet" viewBox="0 0 8 8"><path d="M.344 0c-.18 0-.344.164-.344.344v7.313c0 .18.164.344.344.344h6.313c.18 0 .344-.164.344-.344v-7.313c0-.18-.164-.344-.344-.344h-6.313zm.656 1h5v5h-5v-5zm2.5 5.5c.28 0 .5.22.5.5s-.22.5-.5.5-.5-.22-.5-.5.22-.5.5-.5z"/></symbol><symbol id="tag" viewBox="0 0 8 8"><path d="M0 0v3l5 5 3-3-5-5h-3zm2 1c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1z"/></symbol><symbol id="tags" viewBox="0 0 8 8"><path d="M0 0v2l3 3 1.5-1.5.5-.5-2-2-1-1h-2zm3.406 0l3 3-1.188 1.219.781.781 2-2-3-3h-1.594zm-1.906 1c.28 0 .5.22.5.5s-.22.5-.5.5-.5-.22-.5-.5.22-.5.5-.5z" transform="translate(0 1)"/></symbol><symbol id="target" viewBox="0 0 8 8"><path d="M4 0c-2.203 0-4 1.797-4 4 0 2.203 1.797 4 4 4 2.203 0 4-1.797 4-4 0-2.203-1.797-4-4-4zm0 1c1.663 0 3 1.337 3 3s-1.337 3-3 3-3-1.337-3-3 1.337-3 3-3zm0 1c-1.099 0-2 .901-2 2s.901 2 2 2 2-.901 2-2-.901-2-2-2zm0 1c.558 0 1 .442 1 1s-.442 1-1 1-1-.442-1-1 .442-1 1-1z"/></symbol><symbol id="task" viewBox="0 0 8 8"><path d="M0 0v7h7v-3.594l-1 1v1.594h-5v-5h3.594l1-1h-5.594zm7 0l-3 3-1-1-1 1 2 2 4-4-1-1z"/></symbol><symbol id="terminal" viewBox="0 0 8 8"><path d="M.094 0c-.06 0-.094.034-.094.094v7.813c0 .06.034.094.094.094h7.813c.06 0 .094-.034.094-.094v-7.813c0-.06-.034-.094-.094-.094h-7.813zm1.406.781l1.719 1.719-1.719 1.719-.719-.719 1-1-1-1 .719-.719zm2.5 2.219h3v1h-3v-1z"/></symbol><symbol id="text" viewBox="0 0 8 8"><path d="M0 0v2h.5c0-.55.45-1 1-1h1.5v5.5c0 .28-.22.5-.5.5h-.5v1h4v-1h-.5c-.28 0-.5-.22-.5-.5v-5.5h1.5c.55 0 1 .45 1 1h.5v-2h-8z"/></symbol><symbol id="thumb-down" viewBox="0 0 8 8"><path d="M0 0v4h1v-4h-1zm2 0v4.001c.28 0 .529.101.719.281.18.19 1.151 2.115 1.281 2.375.13.26.386.393.656.313.26-.08.393-.355.313-.625-.08-.26-.469-1.594-.469-1.844s.22-.5.5-.5h1.5c.28 0 .5-.22.5-.5s-1.031-3.188-1.031-3.188c-.08-.18-.259-.313-.469-.313h-3.5z"/></symbol><symbol id="thumb-up" viewBox="0 0 8 8"><path d="M4.438 0c-.19.021-.34.149-.438.344-.13.26-1.101 2.185-1.281 2.375-.19.18-.439.281-.719.281v4.001h3.5c.21 0 .389-.133.469-.313 0 0 1.031-2.908 1.031-3.188 0-.28-.22-.5-.5-.5h-1.5c-.28 0-.5-.25-.5-.5s.389-1.574.469-1.844c.08-.27-.053-.545-.313-.625-.067-.02-.155-.038-.219-.031zm-4.438 3v4h1v-4h-1z"/></symbol><symbol id="timer" viewBox="0 0 8 8"><path d="M2 0v1h1v.031c-1.697.241-3 1.707-3 3.469 0 1.929 1.571 3.5 3.5 3.5s3.5-1.571 3.5-3.5c0-.45-.086-.874-.219-1.25l-.938.344c.107.304.156.596.156.906 0 1.391-1.109 2.5-2.5 2.5s-2.5-1.109-2.5-2.5 1.109-2.5 2.5-2.5c.298 0 .585.051.875.156l.344-.938c-.221-.081-.471-.119-.719-.156v-.063h1v-1h-3zm5 1.125s-3.675 2.8-3.875 3c-.2.2-.2.519 0 .719.2.2.519.2.719 0 .2-.19 3.156-3.719 3.156-3.719z"/></symbol><symbol id="transfer" viewBox="0 0 8 8"><path d="M6 0v1h-6v1h6v1l2-1.5-2-1.5zm-4 4l-2 1.5 2 1.5v-1h6v-1h-6v-1z"/></symbol><symbol id="trash" viewBox="0 0 8 8"><path d="M3 0c-.55 0-1 .45-1 1h-1c-.55 0-1 .45-1 1h7c0-.55-.45-1-1-1h-1c0-.55-.45-1-1-1h-1zm-2 3v4.813c0 .11.077.188.188.188h4.625c.11 0 .188-.077.188-.188v-4.813h-1v3.5c0 .28-.22.5-.5.5s-.5-.22-.5-.5v-3.5h-1v3.5c0 .28-.22.5-.5.5s-.5-.22-.5-.5v-3.5h-1z"/></symbol><symbol id="underline" viewBox="0 0 8 8"><path d="M1 0v4c0 1.1 1.12 2 2.5 2h.5c1.1 0 2-.9 2-2v-4h-1v4c0 .55-.45 1-1 1s-1-.45-1-1v-4h-2zm-1 7v1h7v-1h-7z"/></symbol><symbol id="vertical-align-bottom" viewBox="0 0 8 8"><path d="M.094 0c-.06 0-.094.034-.094.094v4.813c0 .06.034.094.094.094h1.813c.06 0 .094-.034.094-.094v-4.813c0-.06-.034-.094-.094-.094h-1.813zm6 0c-.06 0-.094.034-.094.094v4.813c0 .06.034.094.094.094h1.813c.06 0 .094-.034.094-.094v-4.813c0-.06-.034-.094-.094-.094h-1.813zm-3 2c-.06 0-.094.034-.094.094v2.813c0 .06.034.094.094.094h1.813c.06 0 .094-.034.094-.094v-2.813c0-.06-.034-.094-.094-.094h-1.813zm-3.094 4v1h8v-1h-8z"/></symbol><symbol id="vertical-align-center" viewBox="0 0 8 8"><path d="M.094 0c-.06 0-.094.034-.094.094v1.906h2v-1.906c0-.06-.034-.094-.094-.094h-1.813zm6 0c-.06 0-.094.034-.094.094v1.906h2v-1.906c0-.06-.034-.094-.094-.094h-1.813zm-3 1c-.06 0-.094.034-.094.094v.906h2v-.906c0-.06-.034-.094-.094-.094h-1.813zm-3.094 2v1h8v-1h-8zm0 2v1.906c0 .06.034.094.094.094h1.813c.06 0 .094-.034.094-.094v-1.906h-2zm3 0v.906c0 .06.034.094.094.094h1.813c.06 0 .094-.034.094-.094v-.906h-2zm3 0v1.906c0 .06.034.094.094.094h1.813c.06 0 .094-.034.094-.094v-1.906h-2z"/></symbol><symbol id="vertical-align-top" viewBox="0 0 8 8"><path d="M0 0v1h8v-1h-8zm.094 2c-.06 0-.094.034-.094.094v4.813c0 .06.034.094.094.094h1.813c.06 0 .094-.034.094-.094v-4.813c0-.06-.034-.094-.094-.094h-1.813zm3 0c-.06 0-.094.034-.094.094v2.813c0 .06.034.094.094.094h1.813c.06 0 .094-.034.094-.094v-2.813c0-.06-.034-.094-.094-.094h-1.813zm3 0c-.06 0-.094.034-.094.094v4.813c0 .06.034.094.094.094h1.813c.06 0 .094-.034.094-.094v-4.813c0-.06-.034-.094-.094-.094h-1.813z"/></symbol><symbol id="video" viewBox="0 0 8 8"><path d="M.5 0c-.28 0-.5.22-.5.5v4c0 .28.22.5.5.5h5c.28 0 .5-.22.5-.5v-1.5l1 1h1v-3h-1l-1 1v-1.5c0-.28-.22-.5-.5-.5h-5z" transform="translate(0 1)"/></symbol><symbol id="volume-high" viewBox="0 0 8 8"><path d="M3.344 0l-1.344 2h-2v4h2l1.344 2h.656v-8h-.656zm1.656 1v1c.152 0 .313.026.469.063h.031c.86.215 1.5.995 1.5 1.938 0 .942-.64 1.722-1.5 1.938-.166.041-.338.063-.5.063v1c.258 0 .516-.035.75-.094 1.3-.325 2.25-1.508 2.25-2.906 0-1.398-.95-2.581-2.25-2.906-.234-.059-.492-.094-.75-.094zm0 2v2c.04 0 .134-.002.25-.031.433-.118.75-.507.75-.969 0-.446-.325-.819-.75-.938v-.031c-.005-.001-.025.002-.031 0-.043-.011-.111-.031-.219-.031z"/></symbol><symbol id="volume-low" viewBox="0 0 8 8"><path d="M3.344 0l-1.344 2h-2v4h2l1.344 2h.656v-8h-.656zm1.656 3v2c.04 0 .134-.002.25-.031.433-.118.75-.507.75-.969 0-.446-.325-.819-.75-.938v-.031c-.005-.001-.025.002-.031 0-.043-.011-.111-.031-.219-.031z" transform="translate(1)"/></symbol><symbol id="volume-off" viewBox="0 0 8 8"><path d="M3.344 0l-1.344 2h-2v4h2l1.344 2h.656v-8h-.656z" transform="translate(2)"/></symbol><symbol id="warning" viewBox="0 0 8 8"><path d="M3.094 0c-.06 0-.105.044-.125.094l-2.938 6.813c-.02.05-.031.128-.031.188v.813c0 .06.034.094.094.094h6.813c.06 0 .094-.034.094-.094v-.813c0-.06-.011-.128-.031-.188l-2.938-6.813c-.02-.05-.065-.094-.125-.094h-.813zm-.094 3h1v2h-1v-2zm0 3h1v1h-1v-1z"/></symbol><symbol id="wifi" viewBox="0 0 8 8"><path d="M3.75 0c-1.374 0-2.66.372-3.75 1.063l.531.875c.93-.59 2.033-.938 3.219-.938 1.2 0 2.323.31 3.25.906l.531-.813c-1.093-.703-2.401-1.094-3.781-1.094zm.031 3c-.795 0-1.531.227-2.156.625l.531.844c.475-.302 1.02-.469 1.625-.469.593 0 1.13.177 1.594.469l.531-.844c-.616-.388-1.338-.625-2.125-.625zm-.031 3c-.552 0-1 .448-1 1s.448 1 1 1 1-.448 1-1-.448-1-1-1z"/></symbol><symbol id="wrench" viewBox="0 0 8 8"><path d="M5.5 0c-1.38 0-2.5 1.12-2.5 2.5 0 .32.078.626.188.906l-2.906 2.875c-.39.39-.39 1.016 0 1.406.2.2.459.313.719.313.26 0 .519-.091.719-.281l2.875-2.875c.28.1.586.156.906.156 1.38 0 2.5-1.12 2.5-2.5 0-.16-.032-.297-.063-.438l-.938.938h-2v-2l.938-.938c-.14-.03-.277-.062-.438-.063zm-4.5 6.5c.28 0 .5.22.5.5s-.22.5-.5.5-.5-.22-.5-.5.22-.5.5-.5z"/></symbol><symbol id="x" viewBox="0 0 8 8"><path d="M1.406 0l-1.406 1.406.688.719 1.781 1.781-1.781 1.781-.688.719 1.406 1.406.719-.688 1.781-1.781 1.781 1.781.719.688 1.406-1.406-.688-.719-1.781-1.781 1.781-1.781.688-.719-1.406-1.406-.719.688-1.781 1.781-1.781-1.781-.719-.688z"/></symbol><symbol id="yen" viewBox="0 0 8 8"><path d="M0 0l2.25 3h-2.25v1h3v1h-3v1h3v2h1v-2h3v-1h-3v-1h3v-1h-2.25l2.25-3h-1l-2.313 3h-.375l-2.313-3h-1z"/></symbol><symbol id="zoom-in" viewBox="0 0 8 8"><path d="M3.5 0c-1.927 0-3.5 1.573-3.5 3.5s1.573 3.5 3.5 3.5c.592 0 1.166-.145 1.656-.406a1 1 0 0 0 .094.094l1.031 1.031a1.016 1.016 0 1 0 1.438-1.438l-1.031-1.031a1 1 0 0 0-.125-.094c.266-.493.438-1.059.438-1.656 0-1.927-1.573-3.5-3.5-3.5zm0 1c1.387 0 2.5 1.113 2.5 2.5 0 .587-.196 1.137-.531 1.563-.009.012-.022.02-.031.031a1 1 0 0 0-.063.031 1 1 0 0 0-.281.281 1 1 0 0 0-.063.063c-.422.326-.953.531-1.531.531-1.387 0-2.5-1.113-2.5-2.5s1.113-2.5 2.5-2.5zm-.5 1v1h-1v1h1v1h1v-1h1v-1h-1v-1h-1z"/></symbol><symbol id="zoom-out" viewBox="0 0 8 8"><path d="M3.5 0c-1.927 0-3.5 1.573-3.5 3.5s1.573 3.5 3.5 3.5c.592 0 1.166-.145 1.656-.406a1 1 0 0 0 .094.094l1.031 1.031a1.016 1.016 0 1 0 1.438-1.438l-1.031-1.031a1 1 0 0 0-.125-.094c.266-.493.438-1.059.438-1.656 0-1.927-1.573-3.5-3.5-3.5zm0 1c1.387 0 2.5 1.113 2.5 2.5 0 .587-.196 1.137-.531 1.563-.009.012-.022.02-.031.031a1 1 0 0 0-.063.031 1 1 0 0 0-.281.281 1 1 0 0 0-.063.063c-.422.326-.953.531-1.531.531-1.387 0-2.5-1.113-2.5-2.5s1.113-2.5 2.5-2.5zm-1.5 2v1h3v-1h-3z"/></symbol><symbol id="folder-cover" viewBox="0 0 8 8"><path d="M4 0c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 1c.333 0 .637.086.938.188-.214.197-.45.383-.406.563.04.18.688.13.688.5 0 .27-.425.346-.125.656.35.35-.636.978-.656 1.438-.03.83.841.969 1.531.969.424 0 .503.195.469.438-.546.758-1.438 1.25-2.438 1.25-.378 0-.729-.09-1.063-.219.224-.442-.313-1.344-.781-1.625-.226-.226-.689-.114-.969-.219-.092-.271-.178-.545-.188-.844.031-.05.081-.094.156-.094.19 0 .454.374.594.344.18-.04-.742-1.313-.313-1.563.2-.12.609.394.469-.156-.12-.51.366-.276.656-.406.26-.11.455-.414.125-.594-.057-.031-.133-.104-.219-.188.45-.27.972-.438 1.531-.438zm2.313 1.094c.184.222.323.481.438.75-.043.065-.083.114-.188.219-.29.27-.327-.212-.438-.313-.13-.11-.638.025-.688-.125-.077-.181.499-.418.875-.531z"/></symbol></defs></svg>
-<svg class="svgsprite" version="1.1" xmlns="http://www.w3.org/2000/svg"><symbol id="twitter" viewBox="0 0 512 512"><path d="M492 109.5c-17.4 7.7-36 12.9-55.6 15.3 20-12 35.4-31 42.6-53.6-18.7 11.1-39.4 19.2-61.5 23.5C399.8 75.8 374.6 64 346.8 64c-53.5 0-96.8 43.4-96.8 96.9 0 7.6.8 15 2.5 22.1-80.5-4-151.9-42.6-199.6-101.3-8.3 14.3-13.1 31-13.1 48.7 0 33.6 17.2 63.3 43.2 80.7-16-.4-31-4.8-44-12.1v1.2c0 47 33.4 86.1 77.7 95-8.1 2.2-16.7 3.4-25.5 3.4-6.2 0-12.3-.6-18.2-1.8 12.3 38.5 48.1 66.5 90.5 67.3-33.1 26-74.9 41.5-120.3 41.5-7.8 0-15.5-.5-23.1-1.4C62.8 432 113.7 448 168.3 448 346.6 448 444 300.3 444 172.2c0-4.2-.1-8.4-.3-12.5C462.6 146 479 129 492 109.5z"/></symbol><symbol id="facebook" viewBox="0 0 512 512"><path d="M288 192v-38.1c0-17.2 3.8-25.9 30.5-25.9H352V64h-55.9c-68.5 0-91.1 31.4-91.1 85.3V192h-45v64h45v192h83V256h56.4l7.6-64h-64z"/></symbol><symbol id="dropbox" viewBox="0 0 512 512"><path d="M177 77L64 150.9l78.1 62.7L256 143.1zM64 276.3l113 73.9 79-66.1-113.9-70.5zM256 284.1l79 66.1 113-73.9-78.1-62.7zM448 150.9L335 77l-79 66.1 113.9 70.5zM256.2 298.3l-79.8 66-34.4-22.2V367l114 68 114-68v-24.9l-34.2 22.2z"/></symbol><symbol id="share-ion" viewBox="0 0 512 512"><path d="M383.822 344.427c-16.045 0-31.024 5.326-41.721 15.979l-152.957-88.42c1.071-5.328 2.142-9.593 2.142-14.919 0-5.328-1.071-9.593-2.142-14.919l150.826-87.35c11.762 10.653 26.741 17.041 43.852 17.041 35.295 0 64.178-28.766 64.178-63.92C448 72.767 419.117 44 383.822 44c-35.297 0-64.179 28.767-64.179 63.92 0 5.327 1.065 9.593 2.142 14.919l-150.821 87.35c-11.767-10.654-26.741-17.041-43.856-17.041-35.296 0-63.108 28.766-63.108 63.92 0 35.153 28.877 63.92 64.178 63.92 17.115 0 32.089-6.389 43.856-17.042l151.891 88.421c-1.076 4.255-2.141 8.521-2.141 13.847 0 34.094 27.806 61.787 62.037 61.787 34.229 0 62.036-27.693 62.036-61.787.001-34.094-27.805-61.787-62.035-61.787z"/></symbol><symbol id="copy" viewBox="0 0 512 512"><path d="M296 48H176.5C154.4 48 136 65.4 136 87.5V96h-7.5C106.4 96 88 113.4 88 135.5v288c0 22.1 18.4 40.5 40.5 40.5h208c22.1 0 39.5-18.4 39.5-40.5V416h8.5c22.1 0 39.5-18.4 39.5-40.5V176L296 48zm0 44.6l83.4 83.4H296V92.6zm48 330.9c0 4.7-3.4 8.5-7.5 8.5h-208c-4.4 0-8.5-4.1-8.5-8.5v-288c0-4.1 3.8-7.5 8.5-7.5h7.5v255.5c0 22.1 10.4 32.5 32.5 32.5H344v7.5zm48-48c0 4.7-3.4 8.5-7.5 8.5h-208c-4.4 0-8.5-4.1-8.5-8.5v-288c0-4.1 3.8-7.5 8.5-7.5H264v128h128v167.5z"/></symbol>
-        <symbol id="clockwise" viewBox="0 0 16 16">
-            <path fill-rule="evenodd" d="M3.17 6.706a5 5 0 017.103-3.16.5.5 0 10.454-.892A6 6 0 1013.455 5.5a.5.5 0 00-.91.417 5 5 0 11-9.375.789z" clip-rule="evenodd"/>
-            <path fill-rule="evenodd" d="M8.147.146a.5.5 0 01.707 0l2.5 2.5a.5.5 0 010 .708l-2.5 2.5a.5.5 0 11-.707-.708L10.293 3 8.147.854a.5.5 0 010-.708z" clip-rule="evenodd"/>
-        </symbol>
-        <symbol id="counterclockwise" viewBox="0 0 16 16">
-	    <path fill-rule="evenodd" d="M12.83 6.706a5 5 0 00-7.103-3.16.5.5 0 11-.454-.892A6 6 0 112.545 5.5a.5.5 0 11.91.417 5 5 0 109.375.789z" clip-rule="evenodd"/>
-            <path fill-rule="evenodd" d="M7.854.146a.5.5 0 00-.708 0l-2.5 2.5a.5.5 0 000 .708l2.5 2.5a.5.5 0 10.708-.708L5.707 3 7.854.854a.5.5 0 000-.708z" clip-rule="evenodd"/>
-        </symbol>
+<svg class="svgsprite hidden" version="1.1" xmlns="http://www.w3.org/2000/svg"><defs>
+	<symbol id="account-login" viewBox="0 0 8 8"><path d="M3 0v1h4v5h-4v1h5v-7h-5zm1 2v1h-4v1h4v1l2-1.5-2-1.5z"/></symbol>
+	<symbol id="account-logout" viewBox="0 0 8 8"><path d="M3 0v1h4v5h-4v1h5v-7h-5zm-1 2l-2 1.5 2 1.5v-1h4v-1h-4v-1z"/></symbol>
+	<symbol id="action-redo" viewBox="0 0 8 8"><path d="M3.5 0c-1.93 0-3.5 1.57-3.5 3.5 0-1.38 1.12-2.5 2.5-2.5s2.5 1.12 2.5 2.5v.5h-1l2 2 2-2h-1v-.5c0-1.93-1.57-3.5-3.5-3.5z" transform="translate(0 1)"/></symbol>
+	<symbol id="action-undo" viewBox="0 0 8 8"><path d="M4.5 0c-1.93 0-3.5 1.57-3.5 3.5v.5h-1l2 2 2-2h-1v-.5c0-1.38 1.12-2.5 2.5-2.5s2.5 1.12 2.5 2.5c0-1.93-1.57-3.5-3.5-3.5z" transform="translate(0 1)"/></symbol>
+	<symbol id="align-center" viewBox="0 0 8 8"><path d="M0 0v1h8v-1h-8zm1 2v1h6v-1h-6zm-1 2v1h8v-1h-8zm1 2v1h6v-1h-6z"/></symbol>
+	<symbol id="align-left" viewBox="0 0 8 8"><path d="M0 0v1h8v-1h-8zm0 2v1h6v-1h-6zm0 2v1h8v-1h-8zm0 2v1h6v-1h-6z"/></symbol>
+	<symbol id="align-right" viewBox="0 0 8 8"><path d="M0 0v1h8v-1h-8zm2 2v1h6v-1h-6zm-2 2v1h8v-1h-8zm2 2v1h6v-1h-6z"/></symbol>
+	<symbol id="aperture" viewBox="0 0 8 8"><path d="M4 0c-.69 0-1.336.19-1.906.5l3.219 2.344.719-2.25c-.59-.36-1.281-.594-2.031-.594zm-2.75 1.125c-.76.73-1.25 1.735-1.25 2.875 0 .25.022.489.063.719l3.094-2.219-1.906-1.375zm5.625.125l-1.219 3.75h2.219c.08-.32.125-.65.125-1 0-1.07-.435-2.03-1.125-2.75zm-4.719 3.188l-1.75 1.281c.55 1.13 1.595 1.989 2.875 2.219l-1.125-3.5zm1.563 1.563l.625 1.969c1.33-.11 2.454-.879 3.094-1.969h-3.719z"/></symbol>
+	<symbol id="arrow-bottom" viewBox="0 0 8 8"><path d="M2 0v5h-2l2.531 3 2.469-3h-2v-5h-1z" transform="translate(1)"/></symbol>
+	<symbol id="arrow-circle-bottom" viewBox="0 0 8 8"><path d="M4 0c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm-1 1h2v3h2l-3 3-3-3h2v-3z"/></symbol>
+	<symbol id="arrow-circle-left" viewBox="0 0 8 8"><path d="M4 0c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 1v2h3v2h-3v2l-3-3 3-3z"/></symbol>
+	<symbol id="arrow-circle-right" viewBox="0 0 8 8"><path d="M4 0c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 1l3 3-3 3v-2h-3v-2h3v-2z"/></symbol>
+	<symbol id="arrow-circle-top" viewBox="0 0 8 8"><path d="M4 0c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 1l3 3h-2v3h-2v-3h-2l3-3z"/></symbol>
+	<symbol id="arrow-left" viewBox="0 0 8 8"><path d="M3 0l-3 2.531 3 2.469v-2h5v-1h-5v-2z" transform="translate(0 1)"/></symbol>
+	<symbol id="arrow-right" viewBox="0 0 8 8"><path d="M5 0v2h-5v1h5v2l3-2.531-3-2.469z" transform="translate(0 1)"/></symbol>
+	<symbol id="arrow-thick-bottom" viewBox="0 0 8 8"><path d="M2 0v5h-2l3.031 3 2.969-3h-2v-5h-2z" transform="translate(1)"/></symbol>
+	<symbol id="arrow-thick-left" viewBox="0 0 8 8"><path d="M3 0l-3 3.031 3 2.969v-2h5v-2h-5v-2z" transform="translate(0 1)"/></symbol>
+	<symbol id="arrow-thick-right" viewBox="0 0 8 8"><path d="M5 0v2h-5v2h5v2l3-3.031-3-2.969z" transform="translate(0 1)"/></symbol>
+	<symbol id="arrow-thick-top" viewBox="0 0 8 8"><path d="M2.969 0l-2.969 3h2v5h2v-5h2l-3.031-3z" transform="translate(1)"/></symbol>
+	<symbol id="arrow-top" viewBox="0 0 8 8"><path d="M2.469 0l-2.469 3h2v5h1v-5h2l-2.531-3z" transform="translate(1)"/></symbol>
+	<symbol id="audio-spectrum" viewBox="0 0 8 8"><path d="M4 0v8h1v-8h-1zm-2 1v6h1v-6h-1zm4 1v4h1v-4h-1zm-6 1v2h1v-2h-1z"/></symbol>
+	<symbol id="audio" viewBox="0 0 8 8"><path d="M1.188 0c-.734.722-1.188 1.748-1.188 2.844 0 1.095.454 2.09 1.188 2.813l.688-.719c-.546-.538-.875-1.269-.875-2.094s.329-1.587.875-2.125l-.688-.719zm5.625 0l-.688.719c.552.552.875 1.289.875 2.125 0 .836-.327 1.554-.875 2.094l.688.719c.732-.72 1.188-1.708 1.188-2.813 0-1.104-.459-2.115-1.188-2.844zm-4.219 1.406c-.362.362-.594.889-.594 1.438 0 .548.232 1.045.594 1.406l.688-.719c-.178-.178-.281-.416-.281-.688 0-.272.103-.54.281-.719l-.688-.719zm2.813 0l-.688.719c.183.183.281.434.281.719s-.099.505-.281.688l.688.719c.357-.357.594-.851.594-1.406 0-.555-.236-1.08-.594-1.438z" transform="translate(0 1)"/></symbol>
+	<symbol id="badge" viewBox="0 0 8 8"><path d="M2 0c-1.105 0-2 .895-2 2s.895 2 2 2 2-.895 2-2-.895-2-2-2zm-1 4.813v3.188l1-1 1 1v-3.188c-.31.11-.65.188-1 .188s-.69-.077-1-.188z" transform="translate(2)"/></symbol>
+	<symbol id="ban" viewBox="0 0 8 8"><path d="M4 0c-2.203 0-4 1.797-4 4 0 2.203 1.797 4 4 4 2.203 0 4-1.797 4-4 0-2.203-1.797-4-4-4zm0 1c.655 0 1.258.209 1.75.563l-4.188 4.188c-.353-.492-.563-1.095-.563-1.75 0-1.663 1.337-3 3-3zm2.438 1.25c.353.492.563 1.095.563 1.75 0 1.663-1.337 3-3 3-.655 0-1.258-.209-1.75-.563l4.188-4.188z"/></symbol>
+	<symbol id="bar-chart" viewBox="0 0 8 8"><path d="M0 0v7h8v-1h-7v-6h-1zm5 0v5h2v-5h-2zm-3 2v3h2v-3h-2z"/></symbol>
+	<symbol id="basket" viewBox="0 0 8 8"><path d="M3.969 0c-.127.011-.259.083-.344.188l-2.344 2.813h-1.281v1h1v3.656c0 .18.164.344.344.344h5.313c.18 0 .344-.164.344-.344v-3.656h1v-1h-1.281c-.274-.329-2.387-2.866-2.406-2.875-.105-.09-.216-.136-.344-.125zm.031 1.281l1.438 1.719h-2.875l1.438-1.719zm-1.5 3.719c.28 0 .5.22.5.5v1c0 .28-.22.5-.5.5s-.5-.22-.5-.5v-1c0-.28.22-.5.5-.5zm3 0c.28 0 .5.22.5.5v1c0 .28-.22.5-.5.5s-.5-.22-.5-.5v-1c0-.28.22-.5.5-.5z"/></symbol>
+	<symbol id="battery-empty" viewBox="0 0 8 8"><path d="M.094 0c-.06 0-.094.034-.094.094v5.813c0 .06.034.094.094.094h6.813c.06 0 .094-.034.094-.094v-1.906h1v-2h-1v-1.906c0-.06-.034-.094-.094-.094h-6.813zm.906 1h5v4h-5v-4z" transform="translate(0 1)"/></symbol>
+	<symbol id="battery-full" viewBox="0 0 8 8"><path d="M.094 0c-.06 0-.094.034-.094.094v5.813c0 .06.034.094.094.094h6.813c.06 0 .094-.034.094-.094v-1.906h1v-2h-1v-1.906c0-.06-.034-.094-.094-.094h-6.813z" transform="translate(0 1)"/></symbol>
+	<symbol id="beaker" viewBox="0 0 8 8"><path d="M1.344 0a.502.502 0 0 0 .156 1h.5v1.406c-.088.172-1.194 2.313-1.656 3.094-.153.268-.344.612-.344 1.063 0 .383.139.764.406 1.031.26.26.643.406 1.031.406h5.125c.383 0 .764-.139 1.031-.406.26-.26.406-.643.406-1.031 0-.452-.194-.801-.344-1.063-.463-.78-1.568-2.922-1.656-3.094v-1.406h.5a.5.5 0 1 0 0-1h-5a.5.5 0 0 0-.094 0 .502.502 0 0 0-.063 0zm1.656 1h2v1.625l.063.094s.652 1.233 1.219 2.281h-4.563c.567-1.049 1.219-2.281 1.219-2.281l.063-.094v-1.625z"/></symbol>
+	<symbol id="bell" viewBox="0 0 8 8"><path d="M4 0c-1.1 0-2 .9-2 2 0 1.04-.524 1.976-1.344 2.656-.42.34-.656.824-.656 1.344h8c0-.52-.236-1.004-.656-1.344-.82-.68-1.344-1.616-1.344-2.656 0-1.1-.9-2-2-2zm-1 7c0 .55.45 1 1 1s1-.45 1-1h-2z"/></symbol>
+	<symbol id="bluetooth" viewBox="0 0 8 8"><path d="M1.5 0v2.5l-.75-.75-.75.75 1.5 1.5-1.5 1.5.75.75.75-.75v2.5h.5l3.5-2.5-2.25-1.531 2.25-1.469-3.5-2.5h-.5zm1 1.5l1.5 1-1.5 1v-2zm0 3l1.5 1-1.5 1v-2z" transform="translate(1)"/></symbol>
+	<symbol id="bold" viewBox="0 0 8 8"><path d="M0 0v1c.55 0 1 .45 1 1v4c0 .55-.45 1-1 1v1h5.5c1.38 0 2.5-1.12 2.5-2.5 0-1-.588-1.85-1.438-2.25.27-.34.438-.78.438-1.25 0-1.1-.9-2-2-2h-5zm3 1h1c.55 0 1 .45 1 1s-.45 1-1 1h-1v-2zm0 3h1.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-1.5v-3z"/></symbol>
+	<symbol id="bolt" viewBox="0 0 8 8"><path d="M3 0l-3 5h2v3l3-5h-2v-3z" transform="translate(1)"/></symbol>
+	<symbol id="book" viewBox="0 0 8 8"><path d="M1 0c-.07 0-.127.001-.188.031-.39.08-.701.391-.781.781-.03.06-.031.118-.031.188v5.5c0 .83.67 1.5 1.5 1.5h5.5v-1h-5.5c-.28 0-.5-.22-.5-.5s.22-.5.5-.5h5.5v-5.5c0-.28-.22-.5-.5-.5h-.5v3l-1-1-1 1v-3h-3z"/></symbol>
+	<symbol id="bookmark" viewBox="0 0 8 8"><path d="M0 0v8l2-2 2 2v-8h-4z" transform="translate(2)"/></symbol>
+	<symbol id="box" viewBox="0 0 8 8"><path d="M0 0v1h8v-1h-8zm0 2v5.906c0 .06.034.094.094.094h7.813c.06 0 .094-.034.094-.094v-5.906h-2.969v1.031h-2.031v-1.031h-3z"/></symbol>
+	<symbol id="briefcase" viewBox="0 0 8 8"><path d="M3 0c-.554 0-1 .458-1 1v1h-1.906c-.06 0-.094.034-.094.094v2.406c0 .28.22.5.5.5h7c.28 0 .5-.22.5-.5v-2.406c0-.06-.034-.094-.094-.094h-1.906v-1c0-.542-.446-1-1-1h-2zm0 1h2v1h-2v-1zm-3 4.906v2c0 .06.034.094.094.094h7.813c.06 0 .094-.034.094-.094v-2c-.16.05-.32.094-.5.094h-7c-.18 0-.34-.044-.5-.094z"/></symbol>
+	<symbol id="british-pound" viewBox="0 0 8 8"><path d="M3 0c-.619 0-1.159.262-1.5.688-.341.426-.5.986-.5 1.563 0 .692.165 1.245.25 1.75h-1.25v1h1.219c-.112.448-.37.964-1.063 1.656l-.156.125v1.219h6v-1h-4.906c.641-.729.982-1.397 1.125-2h1.781v-1h-1.719c-.078-.683-.281-1.242-.281-1.75 0-.394.115-.731.281-.938.166-.207.368-.313.719-.313.394 0 .609.109.75.25.141.141.25.356.25.75h1c0-.576-.165-1.102-.531-1.469-.366-.366-.893-.531-1.469-.531z" transform="translate(1)"/></symbol>
+	<symbol id="browser" viewBox="0 0 8 8"><path d="M.344 0a.5.5 0 0 0-.344.5v7a.5.5 0 0 0 .5.5h7a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.5-.5h-7a.5.5 0 0 0-.094 0 .5.5 0 0 0-.063 0zm1.156 1c.28 0 .5.22.5.5s-.22.5-.5.5-.5-.22-.5-.5.22-.5.5-.5zm2 0h3c.28 0 .5.22.5.5s-.22.5-.5.5h-3c-.28 0-.5-.22-.5-.5s.22-.5.5-.5zm-2.5 2h6v4h-6v-4z"/></symbol>
+	<symbol id="brush" viewBox="0 0 8 8"><path d="M7.438.031c-.029-.001-.037.016-.063.031l-3.75 2.656c-.04.03-.095.106-.125.156l-.125.25c.719.229 1.271.781 1.5 1.5l.25-.125c.05-.02.126-.075.156-.125l2.656-3.75c.03-.04.04-.116 0-.156l-.406-.406c-.02-.02-.065-.03-.094-.031zm-4.781 3.969c-.73 0-1.313.614-1.313 1.344 0 .99-.544 1.821-1.344 2.281.4.23.864.375 1.344.375 1.48 0 2.656-1.176 2.656-2.656 0-.73-.604-1.344-1.344-1.344z"/></symbol>
+	<symbol id="bug" viewBox="0 0 8 8"><path d="M3.5 0c-1.19 0-1.978 1.69-1.188 2.5-.09.07-.196.137-.281.219l-1.313-.656a.5.5 0 0 0-.344-.063.5.5 0 0 0-.094.938l1.156.563c-.09.156-.186.328-.25.5h-.688a.5.5 0 0 0-.094 0 .502.502 0 1 0 .094 1h.5c0 .227.023.445.063.656l-.781.406a.5.5 0 1 0 .438.875l.656-.344c.245.46.59.844 1 1.094.35-.19.625-.439.625-.719v-1.438a.5.5 0 0 0 0-.094v-.813a.5.5 0 0 0 0-.219c.045-.231.254-.406.5-.406.28 0 .5.22.5.5v.875a.5.5 0 0 0 0 .094v.063a.5.5 0 0 0 0 .094v1.344c0 .27.275.497.625.688.41-.245.755-.604 1-1.063l.656.344a.5.5 0 1 0 .438-.875l-.781-.406c.04-.211.063-.429.063-.656h.5a.5.5 0 1 0 0-1h-.688c-.064-.172-.16-.344-.25-.5l1.156-.563a.5.5 0 0 0-.313-.938.5.5 0 0 0-.125.063l-1.313.656c-.086-.082-.191-.149-.281-.219.78-.83.003-2.5-1.188-2.5z"/></symbol>
+	<symbol id="bullhorn" viewBox="0 0 8 8"><path d="M6.094 0c-.03 0-.06.022-.094.031v5.969c.033.007.065 0 .094 0h.813c.06 0 .094-.034.094-.094v-5.813c0-.06-.034-.094-.094-.094h-.813zm-1.094.5l-2.906 1.469c-.05.02-.127.031-.188.031h-1.813c-.06 0-.094.034-.094.094v1.813c0 .06.034.094.094.094h.906l1.031 2.719c.11.25.406.36.656.25.25-.11.36-.406.25-.656l-.719-1.781c.033-.136.136-.25.281-.25v-.031l2.5 1.25v-5z"/></symbol>
+	<symbol id="calculator" viewBox="0 0 8 8"><path d="M.094 0c-.06 0-.094.034-.094.094v7.813c0 .06.034.094.094.094h6.813c.06 0 .094-.034.094-.094v-7.813c0-.06-.034-.094-.094-.094h-6.813zm.906 1h5v2h-5v-2zm0 3h1v1h-1v-1zm2 0h1v1h-1v-1zm2 0h1v3h-1v-3zm-4 2h1v1h-1v-1zm2 0h1v1h-1v-1z"/></symbol>
+	<symbol id="calendar" viewBox="0 0 8 8"><path d="M0 0v2h7v-2h-7zm0 3v4.906c0 .06.034.094.094.094h6.813c.06 0 .094-.034.094-.094v-4.906h-7zm1 1h1v1h-1v-1zm2 0h1v1h-1v-1zm2 0h1v1h-1v-1zm-4 2h1v1h-1v-1zm2 0h1v1h-1v-1z"/></symbol>
+	<symbol id="camera-slr" viewBox="0 0 8 8"><path d="M4.094 0c-.06 0-.105.044-.125.094l-.938 1.813c-.02.05-.065.094-.125.094h-1.406c-.83 0-1.5.67-1.5 1.5v4.406c0 .06.034.094.094.094h7.813c.06 0 .094-.034.094-.094v-5.813c0-.06-.034-.094-.094-.094h-.813c-.06 0-.105-.044-.125-.094l-.938-1.813c-.02-.05-.065-.094-.125-.094h-1.813zm-2.594 3c.28 0 .5.22.5.5s-.22.5-.5.5-.5-.22-.5-.5.22-.5.5-.5zm3.5 0c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm0 1c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1z"/></symbol>
+	<symbol id="caret-bottom" viewBox="0 0 8 8"><path d="M0 0l4 4 4-4h-8z" transform="translate(0 2)"/></symbol>
+	<symbol id="caret-left" viewBox="0 0 8 8"><path d="M4 0l-4 4 4 4v-8z" transform="translate(2)"/></symbol>
+	<symbol id="caret-right" viewBox="0 0 8 8"><path d="M0 0v8l4-4-4-4z" transform="translate(2)"/></symbol>
+	<symbol id="caret-top" viewBox="0 0 8 8"><path d="M4 0l-4 4h8l-4-4z" transform="translate(0 2)"/></symbol>
+	<symbol id="cart" viewBox="0 0 8 8"><path d="M.344 0a.502.502 0 0 0 .156 1h1.5l.094.25.406 1.25.406 1.25c.04.13.204.25.344.25h3.5c.14 0 .304-.12.344-.25l.813-2.531c.04-.12-.016-.219-.156-.219h-4.438l-.375-.719a.5.5 0 0 0-.438-.281h-2a.5.5 0 0 0-.094 0 .502.502 0 0 0-.063 0zm3.156 5c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5zm3 0c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5z" transform="translate(0 1)"/></symbol>
+	<symbol id="chat" viewBox="0 0 8 8"><path d="M0 0v5l1-1h1v-3h3v-1h-5zm3 2v4h4l1 1v-5h-5z"/></symbol>
+	<symbol id="check" viewBox="0 0 8 8"><path d="M6.406 0l-.719.688-2.781 2.781-.781-.781-.719-.688-1.406 1.406.688.719 1.5 1.5.719.688.719-.688 3.5-3.5.688-.719-1.406-1.406z" transform="translate(0 1)"/></symbol>
+	<symbol id="chevron-bottom" viewBox="0 0 8 8"><path d="M1.5 0l-1.5 1.5 4 4 4-4-1.5-1.5-2.5 2.5-2.5-2.5z" transform="translate(0 1)"/></symbol>
+	<symbol id="chevron-left" viewBox="0 0 8 8"><path d="M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z" transform="translate(1)"/></symbol>
+	<symbol id="chevron-right" viewBox="0 0 8 8"><path d="M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z" transform="translate(1)"/></symbol>
+	<symbol id="chevron-top" viewBox="0 0 8 8"><path d="M4 0l-4 4 1.5 1.5 2.5-2.5 2.5 2.5 1.5-1.5-4-4z" transform="translate(0 1)"/></symbol>
+	<symbol id="circle-check" viewBox="0 0 8 8"><path d="M4 0c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm2 1.781l.719.719-3.219 3.219-1.719-1.719.719-.719 1 1 2.5-2.5z"/></symbol>
+	<symbol id="circle-x" viewBox="0 0 8 8"><path d="M4 0c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm-1.5 1.781l1.5 1.5 1.5-1.5.719.719-1.5 1.5 1.5 1.5-.719.719-1.5-1.5-1.5 1.5-.719-.719 1.5-1.5-1.5-1.5.719-.719z"/></symbol>
+	<symbol id="clipboard" viewBox="0 0 8 8"><path d="M3.5 0c-.28 0-.5.22-.5.5v.5h-.75c-.14 0-.25.11-.25.25v.75h3v-.75c0-.14-.11-.25-.25-.25h-.75v-.5c0-.28-.22-.5-.5-.5zm-3.25 1c-.14 0-.25.11-.25.25v6.5c0 .14.11.25.25.25h6.5c.14 0 .25-.11.25-.25v-6.5c0-.14-.11-.25-.25-.25h-.75v2h-5v-2h-.75z"/></symbol>
+	<symbol id="clock" viewBox="0 0 8 8"><path d="M4 0c-2.203 0-4 1.797-4 4 0 2.203 1.797 4 4 4 2.203 0 4-1.797 4-4 0-2.203-1.797-4-4-4zm0 1c1.663 0 3 1.337 3 3s-1.337 3-3 3-3-1.337-3-3 1.337-3 3-3zm-.5 1v2.219l.156.125.5.5.344.375.719-.719-.375-.344-.344-.344v-1.813h-1z"/></symbol>
+	<symbol id="cloud-download" viewBox="0 0 8 8"><path d="M4.5 0c-1.21 0-2.27.86-2.5 2-1.1 0-2 .9-2 2 0 .37.111.7.281 1h2.719v-.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5v.5h1.906c.05-.16.094-.32.094-.5 0-.65-.42-1.29-1-1.5v-.5c0-1.38-1.12-2.5-2.5-2.5zm-.156 4a.5.5 0 0 0-.344.5v1.5h-1.5l2 2 2-2h-1.5v-1.5a.5.5 0 0 0-.594-.5.5.5 0 0 0-.063 0z"/></symbol>
+	<symbol id="cloud-upload" viewBox="0 0 8 8"><path d="M4.5 0c-1.21 0-2.27.86-2.5 2-1.1 0-2 .9-2 2 0 .37.111.7.281 1h2.219l2-2 2 2h1.406c.05-.16.094-.32.094-.5 0-.65-.42-1.29-1-1.5v-.5c0-1.38-1.12-2.5-2.5-2.5zm0 4.5l-2.5 2.5h2v.5a.5.5 0 1 0 1 0v-.5h2l-2.5-2.5z"/></symbol>
+	<symbol id="cloud" viewBox="0 0 8 8"><path d="M4.5 0c-1.21 0-2.27.86-2.5 2-1.1 0-2 .9-2 2s.9 2 2 2h4.5c.83 0 1.5-.67 1.5-1.5 0-.65-.42-1.29-1-1.5v-.5c0-1.38-1.12-2.5-2.5-2.5z" transform="translate(0 1)"/></symbol>
+	<symbol id="cloudy" viewBox="0 0 8 8"><path d="M2.5 0c-1.38 0-2.5 1.12-2.5 2.5 0 .39.09.743.25 1.063.3-.21.63-.379 1-.469.55-1.25 1.82-2.084 3.25-2.094-.46-.6-1.18-1-2-1zm2 2c-1.21 0-2.27.86-2.5 2-1.1 0-2 .9-2 2s.9 2 2 2h4.5c.83 0 1.5-.67 1.5-1.5 0-.65-.42-1.29-1-1.5v-.5c0-1.38-1.12-2.5-2.5-2.5z"/></symbol>
+	<symbol id="code" viewBox="0 0 8 8"><path d="M5 0l-3 6h1l3-6h-1zm-4 1l-1 2 1 2h1l-1-2 1-2h-1zm5 0l1 2-1 2h1l1-2-1-2h-1z" transform="translate(0 1)"/></symbol>
+	<symbol id="cog" viewBox="0 0 8 8"><path d="M3.5 0l-.5 1.188c-.1.04-.191.085-.281.125l-1.188-.5-.719.719.5 1.188c-.05.1-.095.181-.125.281l-1.188.5v1l1.188.5c.03.1.075.213.125.313l-.5 1.156.719.719 1.188-.5c.1.05.181.085.281.125l.5 1.188h1l.5-1.188c.1-.03.191-.085.281-.125l1.188.5.719-.719-.5-1.188c.04-.09.085-.181.125-.281l1.188-.5v-1l-1.188-.5c-.03-.09-.075-.191-.125-.281l.469-1.188-.688-.719-1.188.5c-.09-.04-.181-.095-.281-.125l-.5-1.188h-1zm.5 2.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5-1.5-.67-1.5-1.5.67-1.5 1.5-1.5z"/></symbol>
+	<symbol id="collapse-down" viewBox="0 0 8 8"><path d="M0 0v2h8v-2h-8zm2 3l2 2 2-2h-4zm-2 4v1h8v-1h-8z"/></symbol>
+	<symbol id="collapse-left" viewBox="0 0 8 8"><path d="M0 0v8h1v-8h-1zm6 0v8h2v-8h-2zm-1 2l-2 2 2 2v-4z"/></symbol>
+	<symbol id="collapse-right" viewBox="0 0 8 8"><path d="M0 0v8h2v-8h-2zm7 0v8h1v-8h-1zm-4 2v4l2-2-2-2z"/></symbol>
+	<symbol id="collapse-up" viewBox="0 0 8 8"><path d="M0 0v1h8v-1h-8zm4 3l-2 2h4l-2-2zm-4 3v2h8v-2h-8z"/></symbol>
+	<symbol id="command" viewBox="0 0 8 8"><path d="M1.5 0c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5h.5v1h-.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5v-.5h1v.5c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5-.67-1.5-1.5-1.5h-.5v-1h.5c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5v.5h-1v-.5c0-.83-.67-1.5-1.5-1.5zm0 1c.28 0 .5.22.5.5v.5h-.5c-.28 0-.5-.22-.5-.5s.22-.5.5-.5zm4 0c.28 0 .5.22.5.5s-.22.5-.5.5h-.5v-.5c0-.28.22-.5.5-.5zm-2.5 2h1v1h-1v-1zm-1.5 2h.5v.5c0 .28-.22.5-.5.5s-.5-.22-.5-.5.22-.5.5-.5zm3.5 0h.5c.28 0 .5.22.5.5s-.22.5-.5.5-.5-.22-.5-.5v-.5z"/></symbol>
+	<symbol id="comment-square" viewBox="0 0 8 8"><path d="M.094 0c-.06 0-.094.034-.094.094v5.813c0 .06.034.094.094.094h5.906l2 2v-7.906c0-.06-.034-.094-.094-.094h-7.813z"/></symbol>
+	<symbol id="compass" viewBox="0 0 8 8"><path d="M4 0c-2.203 0-4 1.797-4 4 0 2.203 1.797 4 4 4 2.203 0 4-1.797 4-4 0-2.203-1.797-4-4-4zm0 1c1.663 0 3 1.337 3 3s-1.337 3-3 3-3-1.337-3-3 1.337-3 3-3zm2 1l-3 1-1 3 3-1 1-3zm-2 1.5c.28 0 .5.22.5.5s-.22.5-.5.5-.5-.22-.5-.5.22-.5.5-.5z"/></symbol>
+	<symbol id="contrast" viewBox="0 0 8 8"><path d="M4 0c-2.203 0-4 1.797-4 4 0 2.203 1.797 4 4 4 2.203 0 4-1.797 4-4 0-2.203-1.797-4-4-4zm0 1c1.663 0 3 1.337 3 3s-1.337 3-3 3v-6z"/></symbol>
+	<symbol id="copywriting" viewBox="0 0 8 8"><path d="M0 0v1h8v-1h-8zm0 2v1h5v-1h-5zm0 3v1h8v-1h-8zm0 2v1h6v-1h-6zm7.5 0c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5z"/></symbol>
+	<symbol id="credit-card" viewBox="0 0 8 8"><path d="M.25 0c-.14 0-.25.11-.25.25v.75h8v-.75c0-.14-.11-.25-.25-.25h-7.5zm-.25 2v3.75c0 .14.11.25.25.25h7.5c.14 0 .25-.11.25-.25v-3.75h-8zm1 2h1v1h-1v-1zm2 0h1v1h-1v-1z" transform="translate(0 1)"/></symbol>
+	<symbol id="crop" viewBox="0 0 8 8"><path d="M1 0v1h-1v1h1v5h5v1h1v-1h1v-1h-1v-4.5l1-1-.5-.5-1 1h-4.5v-1h-1zm1 2h3.5l-3.5 3.5v-3.5zm4 .5v3.5h-3.5l3.5-3.5z"/></symbol>
+	<symbol id="dashboard" viewBox="0 0 8 8"><path d="M4 0c-2.203 0-4 1.797-4 4 0 2.203 1.797 4 4 4 2.203 0 4-1.797 4-4 0-2.203-1.797-4-4-4zm0 1c1.663 0 3 1.337 3 3s-1.337 3-3 3-3-1.337-3-3 1.337-3 3-3zm0 1c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5zm-1.656 1a.5.5 0 0 0-.188.844l.906.906c-.023.085-.063.158-.063.25 0 .552.448 1 1 1s1-.448 1-1-.448-1-1-1c-.092 0-.165.039-.25.063l-.906-.906a.5.5 0 0 0-.438-.156.5.5 0 0 0-.063 0zm3.156 0c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5z"/></symbol>
+	<symbol id="data-transfer-download" viewBox="0 0 8 8"><path d="M3 0v3h-2l3 3 3-3h-2v-3h-2zm-3 7v1h8v-1h-8z"/></symbol>
+	<symbol id="data-transfer-upload" viewBox="0 0 8 8"><path d="M0 0v1h8v-1h-8zm4 2l-3 3h2v3h2v-3h2l-3-3z"/></symbol>
+	<symbol id="delete" viewBox="0 0 8 8"><path d="M2 0l-2 3 2 3h6v-6h-6zm1.5.781l1.5 1.5 1.5-1.5.719.719-1.5 1.5 1.5 1.5-.719.719-1.5-1.5-1.5 1.5-.719-.719 1.5-1.5-1.5-1.5.719-.719z" transform="translate(0 1)"/></symbol>
+	<symbol id="dial" viewBox="0 0 8 8"><path d="M4 0c-2.201 0-4 1.799-4 4h1c0-1.659 1.341-3 3-3s3 1.341 3 3h1c0-2.201-1.799-4-4-4zm-.594 2.094c-.82.25-1.406 1.006-1.406 1.906 0 1.1.9 2 2 2s2-.9 2-2c0-.9-.586-1.656-1.406-1.906l-.594.875-.594-.875z" transform="translate(0 1)"/></symbol>
+	<symbol id="document" viewBox="0 0 8 8"><path d="M0 0v8h7v-4h-4v-4h-3zm4 0v3h3l-3-3zm-3 2h1v1h-1v-1zm0 2h1v1h-1v-1zm0 2h4v1h-4v-1z"/></symbol>
+	<symbol id="dollar" viewBox="0 0 8 8"><path d="M2 0v1h-.75c-.686 0-1.25.564-1.25 1.25v.5c0 .678.437 1.242 1.094 1.406l2.563.656c.143.036.344.296.344.438v.5c0 .134-.116.25-.25.25h-2.5c-.116 0-.212-.037-.25-.063v-.938h-1v1c0 .342.203.627.438.781.234.155.518.219.813.219h.75v1h1v-1h.75c.686 0 1.25-.564 1.25-1.25v-.5c0-.678-.437-1.242-1.094-1.406l-2.563-.656c-.143-.036-.344-.296-.344-.438v-.5c0-.134.116-.25.25-.25h2.5c.116 0 .212.037.25.063v.938h1v-1c0-.342-.203-.627-.438-.781-.234-.155-.518-.219-.813-.219h-.75v-1h-1z" transform="translate(1)"/></symbol>
+	<symbol id="double-quote-sans-left" viewBox="0 0 8 8"><path d="M0 0v6l3-3v-3h-3zm5 0v6l3-3v-3h-3z" transform="translate(0 1)"/></symbol>
+	<symbol id="double-quote-sans-right" viewBox="0 0 8 8"><path d="M3 0l-3 3v3h3v-6zm5 0l-3 3v3h3v-6z" transform="translate(0 1)"/></symbol>
+	<symbol id="double-quote-serif-left" viewBox="0 0 8 8"><path d="M3 0c-1.651 0-3 1.349-3 3v3h3v-3h-2c0-1.109.891-2 2-2v-1zm5 0c-1.651 0-3 1.349-3 3v3h3v-3h-2c0-1.109.891-2 2-2v-1z" transform="translate(0 1)"/></symbol>
+	<symbol id="double-quote-serif-right" viewBox="0 0 8 8"><path d="M0 0v3h2c0 1.109-.891 2-2 2v1c1.651 0 3-1.349 3-3v-3h-3zm5 0v3h2c0 1.109-.891 2-2 2v1c1.651 0 3-1.349 3-3v-3h-3z" transform="translate(0 1)"/></symbol>
+	<symbol id="droplet" viewBox="0 0 8 8"><path d="M3 0l-.344.344c-.11.11-2.656 2.685-2.656 4.875 0 1.65 1.35 3 3 3s3-1.35 3-3c0-2.19-2.546-4.765-2.656-4.875l-.344-.344zm-1.5 4.719c.28 0 .5.22.5.5 0 .55.45 1 1 1 .28 0 .5.22.5.5s-.22.5-.5.5c-1.1 0-2-.9-2-2 0-.28.22-.5.5-.5z" transform="translate(1)"/></symbol>
+	<symbol id="eject" viewBox="0 0 8 8"><path d="M4 0l-4 5h8l-4-5zm-4 6v2h8v-2h-8z"/></symbol>
+	<symbol id="elevator" viewBox="0 0 8 8"><path d="M3 0l-3 3h6l-3-3zm-3 5l3 3 3-3h-6z" transform="translate(1)"/></symbol>
+	<symbol id="ellipses" viewBox="0 0 8 8"><path d="M0 0v2h2v-2h-2zm3 0v2h2v-2h-2zm3 0v2h2v-2h-2z" transform="translate(0 3)"/></symbol>
+	<symbol id="envelope-closed" viewBox="0 0 8 8"><path d="M0 0v1l4 2 4-2v-1h-8zm0 2v4h8v-4l-4 2-4-2z" transform="translate(0 1)"/></symbol>
+	<symbol id="envelope-open" viewBox="0 0 8 8"><path d="M4 0l-4 2v6h8v-6l-4-2zm0 1.125l3 1.5v1.875l-3 1.5-3-1.5v-1.875l3-1.5zm-2 1.875v1l2 1 2-1v-1h-4z"/></symbol>
+	<symbol id="euro" viewBox="0 0 8 8"><path d="M6 0c-1.858 0-3.398 1.278-3.844 3h-1.906l-.25 1h2c0 .345.073.68.156 1h-1.969l-.188 1h2.563c.696 1.185 1.969 2 3.438 2 .734 0 1.407-.215 2-.563v-1.219c-.531.479-1.225.781-2 .781-.888 0-1.671-.392-2.219-1h2.219l.156-1h-2.969c-.113-.317-.188-.643-.188-1h3.344l.156-1h-3.313c.414-1.16 1.507-2 2.813-2 .655 0 1.258.209 1.75.563l.156-1.063c-.57-.313-1.213-.5-1.906-.5z" transform="translate(-1)"/></symbol>
+	<symbol id="excerpt" viewBox="0 0 8 8"><path d="M0 0v1h7v-1h-7zm0 2v1h5v-1h-5zm0 2v1h8v-1h-8zm0 2v1h1v-1h-1zm2 0v1h1v-1h-1zm2 0v1h1v-1h-1z"/></symbol>
+	<symbol id="expand-down" viewBox="0 0 8 8"><path d="M0 0v1h8v-1h-8zm2 2l2 2 2-2h-4zm-2 4v2h8v-2h-8z"/></symbol>
+	<symbol id="expand-left" viewBox="0 0 8 8"><path d="M0 0v8h1v-8h-1zm6 0v8h2v-8h-2zm-4 2v4l2-2-2-2z"/></symbol>
+	<symbol id="expand-right" viewBox="0 0 8 8"><path d="M0 0v8h2v-8h-2zm7 0v8h1v-8h-1zm-1 2l-2 2 2 2v-4z"/></symbol>
+	<symbol id="expand-up" viewBox="0 0 8 8"><path d="M0 0v2h8v-2h-8zm4 4l-2 2h4l-2-2zm-4 3v1h8v-1h-8z"/></symbol>
+	<symbol id="external-link" viewBox="0 0 8 8"><path d="M0 0v8h8v-2h-1v1h-6v-6h1v-1h-2zm4 0l1.5 1.5-2.5 2.5 1 1 2.5-2.5 1.5 1.5v-4h-4z"/></symbol>
+	<symbol id="eye" viewBox="0 0 8 8"><path d="M4.031 0c-2.53 0-4.031 3-4.031 3s1.501 3 4.031 3c2.47 0 3.969-3 3.969-3s-1.499-3-3.969-3zm-.031 1c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm0 1c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1c0-.1-.032-.191-.063-.281-.08.16-.237.281-.438.281-.28 0-.5-.22-.5-.5 0-.2.121-.357.281-.438-.09-.03-.181-.063-.281-.063z" transform="translate(0 1)"/></symbol>
+	<symbol id="eyedropper" viewBox="0 0 8 8"><path d="M3.313 0a.5.5 0 0 0-.188.844l.625.625-3.594 3.656-.156.156v2.719h2.719l.125-.156 3.656-3.656.625.656a.5.5 0 1 0 .719-.688l-.938-.938.656-.656c.59-.58.59-1.545 0-2.125-.56-.57-1.555-.57-2.125 0l-.656.656-.938-.938a.5.5 0 0 0-.469-.156.5.5 0 0 0-.063 0zm1.156 2.188l1.313 1.313-3.156 3.156-1.281-1.313 3.125-3.156z"/></symbol>
+	<symbol id="file" viewBox="0 0 8 8"><path d="M0 0v8h7v-4h-4v-4h-3zm4 0v3h3l-3-3z"/></symbol>
+	<symbol id="fire" viewBox="0 0 8 8"><path d="M2 0c1 2-2 3-2 5s2 3 2 3c-.98-1.98 2-3 2-5s-2-3-2-3zm3 3c1 2-2 3-2 5h3c.4 0 1-.5 1-2 0-2-2-3-2-3z"/></symbol>
+	<symbol id="flag" viewBox="0 0 8 8"><path d="M0 0v8h1v-8h-1zm2 0v4h2v1h4l-2-1.969 2-2.031h-3v-1h-3z"/></symbol>
+	<symbol id="flash" viewBox="0 0 8 8"><path d="M1.5 0l-1.5 3h2l-.656 2h-1.344l1 3 3-3h-1.5l1.5-3h-2l1-2h-1.5z" transform="translate(2)"/></symbol>
+	<symbol id="folder" viewBox="0 0 8 8"><path d="M0 0v2h8v-1h-5v-1h-3zm0 3v4.5c0 .28.22.5.5.5h7c.28 0 .5-.22.5-.5v-4.5h-8z"/></symbol>
+	<symbol id="folder-cover" viewBox="0 0 8 8"><path d="M4 0c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 1c.333 0 .637.086.938.188-.214.197-.45.383-.406.563.04.18.688.13.688.5 0 .27-.425.346-.125.656.35.35-.636.978-.656 1.438-.03.83.841.969 1.531.969.424 0 .503.195.469.438-.546.758-1.438 1.25-2.438 1.25-.378 0-.729-.09-1.063-.219.224-.442-.313-1.344-.781-1.625-.226-.226-.689-.114-.969-.219-.092-.271-.178-.545-.188-.844.031-.05.081-.094.156-.094.19 0 .454.374.594.344.18-.04-.742-1.313-.313-1.563.2-.12.609.394.469-.156-.12-.51.366-.276.656-.406.26-.11.455-.414.125-.594-.057-.031-.133-.104-.219-.188.45-.27.972-.438 1.531-.438zm2.313 1.094c.184.222.323.481.438.75-.043.065-.083.114-.188.219-.29.27-.327-.212-.438-.313-.13-.11-.638.025-.688-.125-.077-.181.499-.418.875-.531z"/></symbol>
+	<symbol id="fork" viewBox="0 0 8 8"><path d="M1.5 0c-.828 0-1.5.672-1.5 1.5 0 .656.414 1.202 1 1.406v2.188c-.586.204-1 .75-1 1.406 0 .828.672 1.5 1.5 1.5s1.5-.672 1.5-1.5c0-.595-.341-1.101-.844-1.344.09-.09.205-.156.344-.156h2c.823 0 1.5-.677 1.5-1.5v-.594c.586-.204 1-.75 1-1.406 0-.828-.672-1.5-1.5-1.5s-1.5.672-1.5 1.5c0 .656.414 1.202 1 1.406v.594c0 .277-.223.5-.5.5h-2c-.171 0-.346.04-.5.094v-1.188c.586-.204 1-.75 1-1.406 0-.828-.672-1.5-1.5-1.5z"/></symbol>
+	<symbol id="fullscreen-enter" viewBox="0 0 8 8"><path d="M0 0v4l1.5-1.5 1.5 1.5 1-1-1.5-1.5 1.5-1.5h-4zm5 4l-1 1 1.5 1.5-1.5 1.5h4v-4l-1.5 1.5-1.5-1.5z"/></symbol>
+	<symbol id="fullscreen-exit" viewBox="0 0 8 8"><path d="M1 0l-1 1 1.5 1.5-1.5 1.5h4v-4l-1.5 1.5-1.5-1.5zm3 4v4l1.5-1.5 1.5 1.5 1-1-1.5-1.5 1.5-1.5h-4z"/></symbol>
+	<symbol id="globe" viewBox="0 0 8 8"><path d="M4 0c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 1c.333 0 .637.086.938.188-.214.197-.45.383-.406.563.04.18.688.13.688.5 0 .27-.425.346-.125.656.35.35-.636.978-.656 1.438-.03.83.841.969 1.531.969.424 0 .503.195.469.438-.546.758-1.438 1.25-2.438 1.25-.378 0-.729-.09-1.063-.219.224-.442-.313-1.344-.781-1.625-.226-.226-.689-.114-.969-.219-.092-.271-.178-.545-.188-.844.031-.05.081-.094.156-.094.19 0 .454.374.594.344.18-.04-.742-1.313-.313-1.563.2-.12.609.394.469-.156-.12-.51.366-.276.656-.406.26-.11.455-.414.125-.594-.057-.031-.133-.104-.219-.188.45-.27.972-.438 1.531-.438zm2.313 1.094c.184.222.323.481.438.75-.043.065-.083.114-.188.219-.29.27-.327-.212-.438-.313-.13-.11-.638.025-.688-.125-.077-.181.499-.418.875-.531z"/></symbol>
+	<symbol id="graph" viewBox="0 0 8 8"><path d="M7.031 0l-3.031 3-1-1-3 3.031 1 1 2-2.031 1 1 4-4-.969-1zm-7.031 7v1h8v-1h-8z"/></symbol>
+	<symbol id="grid-four-up" viewBox="0 0 8 8"><path d="M0 0v1h1v-1h-1zm2 0v1h1v-1h-1zm2 0v1h1v-1h-1zm2 0v1h1v-1h-1zm-6 2v1h1v-1h-1zm2 0v1h1v-1h-1zm2 0v1h1v-1h-1zm2 0v1h1v-1h-1zm-6 2v1h1v-1h-1zm2 0v1h1v-1h-1zm2 0v1h1v-1h-1zm2 0v1h1v-1h-1zm-6 2v1h1v-1h-1zm2 0v1h1v-1h-1zm2 0v1h1v-1h-1zm2 0v1h1v-1h-1z"/></symbol>
+	<symbol id="grid-three-up" viewBox="0 0 8 8"><path d="M0 0v2h2v-2h-2zm3 0v2h2v-2h-2zm3 0v2h2v-2h-2zm-6 3v2h2v-2h-2zm3 0v2h2v-2h-2zm3 0v2h2v-2h-2zm-6 3v2h2v-2h-2zm3 0v2h2v-2h-2zm3 0v2h2v-2h-2z"/></symbol>
+	<symbol id="grid-two-up" viewBox="0 0 8 8"><path d="M0 0v3h3v-3h-3zm5 0v3h3v-3h-3zm-5 5v3h3v-3h-3zm5 0v3h3v-3h-3z"/></symbol>
+	<symbol id="hard-drive" viewBox="0 0 8 8"><path d="M.188 0c-.11 0-.188.077-.188.188v3.313c0 .28.22.5.5.5h6c.28 0 .5-.22.5-.5v-3.313c0-.11-.077-.188-.188-.188h-6.625zm-.188 4.906v2.906c0 .11.077.188.188.188h6.625c.11 0 .188-.077.188-.188v-2.906c-.16.05-.32.094-.5.094h-6c-.18 0-.34-.044-.5-.094zm5.5 1.094c.28 0 .5.22.5.5s-.22.5-.5.5-.5-.22-.5-.5.22-.5.5-.5z"/></symbol>
+	<symbol id="header" viewBox="0 0 8 8"><path d="M0 0v1h.5c.28 0 .5.22.5.5v4c0 .28-.22.5-.5.5h-.5v1h3v-1h-.5c-.28 0-.5-.22-.5-.5v-1.5h3v1.5c0 .28-.22.5-.5.5h-.5v1h3v-1h-.5c-.28 0-.5-.22-.5-.5v-4c0-.28.22-.5.5-.5h.5v-1h-3v1h.5c.28 0 .5.22.5.5v1.5h-3v-1.5c0-.28.22-.5.5-.5h.5v-1h-3z"/></symbol>
+	<symbol id="headphones" viewBox="0 0 8 8"><path d="M4 0c-1.651 0-3 1.349-3 3v1h-.5a.5.5 0 0 0-.5.5v2a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-3.5c0-1.109.891-2 2-2s2 .891 2 2v3.5a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 0-.5-.5h-.5v-1c0-1.651-1.349-3-3-3z"/></symbol>
+	<symbol id="heart" viewBox="0 0 8 8"><path d="M2 0c-.55 0-1.046.224-1.406.594-.37.36-.594.856-.594 1.406 0 .55.224 1.046.594 1.406l3.406 3.438 3.406-3.438c.37-.37.594-.856.594-1.406 0-.55-.224-1.046-.594-1.406-.36-.37-.856-.594-1.406-.594-.55 0-1.046.224-1.406.594-.37.36-.594.856-.594 1.406 0-.55-.224-1.046-.594-1.406-.36-.37-.856-.594-1.406-.594z" transform="translate(0 1)"/></symbol>
+	<symbol id="home" viewBox="0 0 8 8"><path d="M4 0l-4 3h1v4h2v-2h2v2h2v-4.031l1 .031-4-3z"/></symbol>
+	<symbol id="image" viewBox="0 0 8 8"><path d="M0 0v8h8v-8h-8zm1 1h6v3l-1-1-1 1 2 2v1h-1l-4-4-1 1v-3z"/></symbol>
+	<symbol id="inbox" viewBox="0 0 8 8"><path d="M.188 0c-.11 0-.188.077-.188.188v7.625c0 .11.077.188.188.188h7.625c.11 0 .188-.077.188-.188v-7.625c0-.11-.077-.188-.188-.188h-7.625zm.813 2h6v3h-1l-1 1h-2l-1-1h-1v-3z"/></symbol>
+	<symbol id="infinity" viewBox="0 0 8 8"><path d="M2 0c-1.31 0-2 1.01-2 2s.69 2 2 2c.79 0 1.42-.559 2-1.219.58.66 1.19 1.219 2 1.219 1.31 0 2-1.01 2-2s-.69-2-2-2c-.81 0-1.42.559-2 1.219-.57-.66-1.21-1.219-2-1.219zm0 1c.42 0 .884.47 1.344 1-.46.53-.924 1-1.344 1-.74 0-1-.54-1-1 0-.46.26-1 1-1zm4 0c.74 0 1 .54 1 1 0 .46-.26 1-1 1-.43 0-.894-.47-1.344-1 .45-.53.914-1 1.344-1z" transform="translate(0 2)"/></symbol>
+	<symbol id="info" viewBox="0 0 8 8"><path d="M3 0c-.552 0-1 .448-1 1s.448 1 1 1 1-.448 1-1-.448-1-1-1zm-1.5 2.5c-.83 0-1.5.67-1.5 1.5h1c0-.28.22-.5.5-.5s.5.22.5.5-1 1.64-1 2.5c0 .86.67 1.5 1.5 1.5s1.5-.67 1.5-1.5h-1c0 .28-.22.5-.5.5s-.5-.22-.5-.5c0-.36 1-1.84 1-2.5 0-.81-.67-1.5-1.5-1.5z" transform="translate(2)"/></symbol>
+	<symbol id="italic" viewBox="0 0 8 8"><path d="M2 0v1h1.625l-.063.125-2 5-.344.875h-1.219v1h5v-1h-1.625l.063-.125 2-5 .344-.875h1.219v-1h-5z"/></symbol>
+	<symbol id="justify-center" viewBox="0 0 8 8"><path d="M0 0v1h8v-1h-8zm0 2v1h8v-1h-8zm0 2v1h8v-1h-8zm1 2v1h6v-1h-6z"/></symbol>
+	<symbol id="justify-left" viewBox="0 0 8 8"><path d="M0 0v1h8v-1h-8zm0 2v1h8v-1h-8zm0 2v1h8v-1h-8zm0 2v1h6v-1h-6z"/></symbol>
+	<symbol id="justify-right" viewBox="0 0 8 8"><path d="M0 0v1h8v-1h-8zm0 2v1h8v-1h-8zm0 2v1h8v-1h-8zm2 2v1h6v-1h-6z"/></symbol>
+	<symbol id="key" viewBox="0 0 8 8"><path d="M5.5 0c-1.38 0-2.5 1.12-2.5 2.5 0 .16.033.297.063.438l-3.063 3.063v2h3v-2h2v-1l.063-.063c.14.03.277.063.438.063 1.38 0 2.5-1.12 2.5-2.5s-1.12-2.5-2.5-2.5zm.5 1c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1z"/></symbol>
+	<symbol id="laptop" viewBox="0 0 8 8"><path d="M1.344 0a.5.5 0 0 0-.344.5v3.5h-1v1.5c0 .28.22.5.5.5h7c.28 0 .5-.22.5-.5v-1.5h-1v-3.5a.5.5 0 0 0-.5-.5h-5a.5.5 0 0 0-.094 0 .5.5 0 0 0-.063 0zm.656 1h4v3h-1v1h-2v-1h-1v-3z" transform="translate(0 1)"/></symbol>
+	<symbol id="layers" viewBox="0 0 8 8"><path d="M0 0v4h4v-4h-4zm5 2v3h-3v1h4v-4h-1zm2 2v3h-3v1h4v-4h-1z"/></symbol>
+	<symbol id="lightbulb" viewBox="0 0 8 8"><path d="M3.406 0a.5.5 0 0 0-.125.063l-3 1.5a.5.5 0 1 0 .438.875l3-1.5a.5.5 0 0 0-.313-.938zm1 1.5a.5.5 0 0 0-.125.063l-4 2a.5.5 0 1 0 .438.875l4-2a.5.5 0 0 0-.313-.938zm0 2a.5.5 0 0 0-.125.063l-3 1.5a.5.5 0 0 0 .219.938h2a.502.502 0 0 0 .156-1l1.063-.563a.5.5 0 0 0-.313-.938zm-2.563 3.5a.502.502 0 0 0 .156 1h1a.5.5 0 1 0 0-1h-1a.5.5 0 0 0-.094 0 .502.502 0 0 0-.063 0z" transform="translate(1)"/></symbol>
+	<symbol id="link-broken" viewBox="0 0 8 8"><path d="M2 0v1h-1v1h2v-2h-1zm3.875.031c-.184.01-.354.03-.531.094-.27.095-.531.25-.75.469l-.438.438a.5.5 0 1 0 .688.688l.438-.438c.101-.101.245-.173.375-.219.352-.126.78-.064 1.063.219.395.389.4 1.037 0 1.438l-1.5 1.5a.5.5 0 1 0 .688.688l1.5-1.5c.78-.78.785-2.041 0-2.813-.279-.279-.606-.452-.969-.531-.181-.039-.379-.041-.563-.031zm-3.594 2.906a.5.5 0 0 0-.188.156l-1.5 1.5c-.78.78-.785 2.041 0 2.813.557.557 1.355.722 2.063.469.27-.095.531-.25.75-.469l.438-.438a.5.5 0 1 0-.688-.688l-.438.438c-.101.101-.245.173-.375.219-.352.126-.78.064-1.063-.219-.395-.389-.4-1.037 0-1.438l1.5-1.5a.5.5 0 0 0-.438-.844.5.5 0 0 0-.063 0zm2.719 3.063v2h1v-1h1v-1h-2z"/></symbol>
+	<symbol id="link-intact" viewBox="0 0 8 8"><path d="M5.875.031c-.184.01-.354.03-.531.094-.27.095-.531.25-.75.469a.5.5 0 1 0 .688.688c.101-.101.245-.173.375-.219.352-.126.78-.064 1.063.219.395.389.4 1.037 0 1.438l-1.5 1.5c-.434.434-.799.483-1.063.469-.264-.015-.406-.125-.406-.125a.504.504 0 1 0-.5.875s.34.222.844.25c.504.028 1.197-.165 1.813-.781l1.5-1.5c.78-.78.785-2.041 0-2.813-.279-.279-.606-.452-.969-.531-.181-.039-.379-.041-.563-.031zm-2 2.313c-.501-.019-1.186.155-1.781.75l-1.5 1.5c-.78.78-.785 2.041 0 2.813.557.557 1.355.722 2.063.469.27-.095.531-.25.75-.469a.5.5 0 1 0-.688-.688c-.101.101-.245.173-.375.219-.352.126-.78.064-1.063-.219-.395-.389-.4-1.037 0-1.438l1.5-1.5c.405-.405.752-.448 1.031-.438.279.011.469.094.469.094a.5.5 0 1 0 .438-.875s-.343-.199-.844-.219z"/></symbol>
+	<symbol id="list-rich" viewBox="0 0 8 8"><path d="M0 0v3h3v-3h-3zm4 0v1h4v-1h-4zm0 2v1h3v-1h-3zm-4 2v3h3v-3h-3zm4 0v1h4v-1h-4zm0 2v1h3v-1h-3z"/></symbol>
+	<symbol id="list" viewBox="0 0 8 8"><path d="M.5 0c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5zm1.5 0v1h6v-1h-6zm-1.5 2c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5zm1.5 0v1h6v-1h-6zm-1.5 2c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5zm1.5 0v1h6v-1h-6zm-1.5 2c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5zm1.5 0v1h6v-1h-6z"/></symbol>
+	<symbol id="location" viewBox="0 0 8 8"><path d="M8 0l-8 4 3 1 1 3 4-8z"/></symbol>
+	<symbol id="lock-locked" viewBox="0 0 8 8"><path d="M3 0c-1.099 0-2 .901-2 2v1h-1v4h6v-4h-1v-1c0-1.099-.901-2-2-2zm0 1c.561 0 1 .439 1 1v1h-2v-1c0-.561.439-1 1-1z" transform="translate(1)"/></symbol>
+	<symbol id="lock-unlocked" viewBox="0 0 8 8"><path d="M3 0c-1.099 0-2 .901-2 2h1c0-.561.439-1 1-1 .561 0 1 .439 1 1v2h-4v4h6v-4h-1v-2c0-1.099-.901-2-2-2z" transform="translate(1)"/></symbol>
+	<symbol id="loop-circular" viewBox="0 0 8 8"><path d="M4 0c-1.651 0-3 1.349-3 3h-1l1.5 2 1.5-2h-1c0-1.109.891-2 2-2v-1zm2.5 1l-1.5 2h1c0 1.109-.891 2-2 2v1c1.651 0 3-1.349 3-3h1l-1.5-2z" transform="translate(0 1)"/></symbol>
+	<symbol id="loop-square" viewBox="0 0 8 8"><path d="M1 0v2h1v-1h4v2h-1l1.5 2.5 1.5-2.5h-1v-3h-6zm.5 2.5l-1.5 2.5h1v3h6v-2h-1v1h-4v-2h1l-1.5-2.5z"/></symbol>
+	<symbol id="loop" viewBox="0 0 8 8"><path d="M6 0v1h-5c-.554 0-1 .446-1 1v1h1v-1h5v1l2-1.5-2-1.5zm-4 4l-2 1.5 2 1.5v-1h5c.542 0 1-.458 1-1v-1h-1v1h-5v-1z"/></symbol>
+	<symbol id="magnifying-glass" viewBox="0 0 8 8"><path d="M3.5 0c-1.927 0-3.5 1.573-3.5 3.5s1.573 3.5 3.5 3.5c.592 0 1.166-.145 1.656-.406a1 1 0 0 0 .125.125l1 1a1.016 1.016 0 1 0 1.438-1.438l-1-1a1 1 0 0 0-.156-.125c.266-.493.438-1.059.438-1.656 0-1.927-1.573-3.5-3.5-3.5zm0 1c1.387 0 2.5 1.113 2.5 2.5 0 .661-.241 1.273-.656 1.719-.01.011-.021.021-.031.031a1 1 0 0 0-.125.125c-.442.397-1.043.625-1.688.625-1.387 0-2.5-1.113-2.5-2.5s1.113-2.5 2.5-2.5z"/></symbol>
+	<symbol id="map-marker" viewBox="0 0 8 8"><path d="M3 0c-1.66 0-3 1.34-3 3 0 2 3 5 3 5s3-3 3-5c0-1.66-1.34-3-3-3zm0 1c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2z" transform="translate(1)"/></symbol>
+	<symbol id="map" viewBox="0 0 8 8"><path d="M0 0v8h8v-2.375a.5.5 0 0 0 0-.219v-5.406h-8zm1 1h6v4h-1.5a.5.5 0 0 0-.094 0 .502.502 0 1 0 .094 1h1.5v1h-6v-6zm2.5 1c-.83 0-1.5.67-1.5 1.5 0 1 1.5 2.5 1.5 2.5s1.5-1.5 1.5-2.5c0-.83-.67-1.5-1.5-1.5zm0 1c.28 0 .5.22.5.5s-.22.5-.5.5-.5-.22-.5-.5.22-.5.5-.5z"/></symbol>
+	<symbol id="media-pause" viewBox="0 0 8 8"><path d="M0 0v6h2v-6h-2zm4 0v6h2v-6h-2z" transform="translate(1 1)"/></symbol>
+	<symbol id="media-play" viewBox="0 0 8 8"><path d="M0 0v6l6-3-6-3z" transform="translate(1 1)"/></symbol>
+	<symbol id="media-record" viewBox="0 0 8 8"><path d="M3 0c-1.657 0-3 1.343-3 3s1.343 3 3 3 3-1.343 3-3-1.343-3-3-3z" transform="translate(1 1)"/></symbol>
+	<symbol id="media-skip-backward" viewBox="0 0 8 8"><path d="M4 0l-4 3 4 3v-6zm0 3l4 3v-6l-4 3z" transform="translate(0 1)"/></symbol>
+	<symbol id="media-skip-forward" viewBox="0 0 8 8"><path d="M0 0v6l4-3-4-3zm4 3v3l4-3-4-3v3z" transform="translate(0 1)"/></symbol>
+	<symbol id="media-step-backward" viewBox="0 0 8 8"><path d="M0 0v6h2v-6h-2zm2 3l5 3v-6l-5 3z" transform="translate(0 1)"/></symbol>
+	<symbol id="media-step-forward" viewBox="0 0 8 8"><path d="M0 0v6l5-3-5-3zm5 3v3h2v-6h-2v3z" transform="translate(0 1)"/></symbol>
+	<symbol id="media-stop" viewBox="0 0 8 8"><path d="M0 0v6h6v-6h-6z" transform="translate(1 1)"/></symbol>
+	<symbol id="medical-cross" viewBox="0 0 8 8"><path d="M2 0v2h-2v4h2v2h4v-2h2v-4h-2v-2h-4z"/></symbol>
+	<symbol id="menu" viewBox="0 0 8 8"><path d="M0 0v1h8v-1h-8zm0 2.969v1h8v-1h-8zm0 3v1h8v-1h-8z" transform="translate(0 1)"/></symbol>
+	<symbol id="microphone" viewBox="0 0 8 8"><path d="M2.906-.031a1 1 0 0 0-.125.031 1 1 0 0 0-.781 1v2a1 1 0 1 0 2 0v-2a1 1 0 0 0-1.094-1.031zm-2.563 2.031a.5.5 0 0 0-.344.5v.5c0 1.476 1.091 2.693 2.5 2.938v1.063h-.5c-.55 0-1 .45-1 1h4c0-.55-.45-1-1-1h-.5v-1.063c1.409-.244 2.5-1.461 2.5-2.938v-.5a.5.5 0 1 0-1 0v.5c0 1.109-.891 2-2 2s-2-.891-2-2v-.5a.5.5 0 0 0-.594-.5.5.5 0 0 0-.063 0z" transform="translate(1)"/></symbol>
+	<symbol id="minus" viewBox="0 0 8 8"><path d="M0 0v2h8v-2h-8z" transform="translate(0 3)"/></symbol>
+	<symbol id="monitor" viewBox="0 0 8 8"><path d="M.344 0a.5.5 0 0 0-.344.5v5a.5.5 0 0 0 .5.5h2.5v1h-1c-.55 0-1 .45-1 1h6c0-.55-.45-1-1-1h-1v-1h2.5a.5.5 0 0 0 .5-.5v-5a.5.5 0 0 0-.5-.5h-7a.5.5 0 0 0-.094 0 .5.5 0 0 0-.063 0zm.656 1h6v4h-6v-4z"/></symbol>
+	<symbol id="moon" viewBox="0 0 8 8"><path d="M2.719 0c-1.58.53-2.719 2.021-2.719 3.781 0 2.21 1.79 4 4 4 1.76 0 3.251-1.17 3.781-2.75-.4.14-.831.25-1.281.25-2.21 0-4-1.79-4-4 0-.44.079-.881.219-1.281z"/></symbol>
+	<symbol id="move" viewBox="0 0 8 8"><path d="M3.5 0l-1.5 1.5h1v1.5h-1.5v-1l-1.5 1.5 1.5 1.5v-1h1.5v1.5h-1l1.5 1.5 1.5-1.5h-1v-1.5h1.5v1l1.5-1.5-1.5-1.5v1h-1.5v-1.5h1l-1.5-1.5z"/></symbol>
+	<symbol id="musical-note" viewBox="0 0 8 8"><path d="M8 0c-5 0-6 1-6 1v4.094c-.154-.054-.327-.094-.5-.094-.828 0-1.5.672-1.5 1.5s.672 1.5 1.5 1.5 1.5-.672 1.5-1.5v-3.969c.732-.226 1.99-.438 4-.5v2.063c-.154-.054-.327-.094-.5-.094-.828 0-1.5.672-1.5 1.5s.672 1.5 1.5 1.5 1.5-.672 1.5-1.5v-5.5z"/></symbol>
+	<symbol id="paperclip" viewBox="0 0 8 8"><path d="M5 0c-.514 0-1.021.201-1.406.594l-2.781 2.719c-1.07 1.07-1.07 2.805 0 3.875 1.07 1.07 2.805 1.07 3.875 0l1.25-1.25-.688-.688-.906.875-.344.375c-.69.69-1.81.69-2.5 0-.682-.682-.668-1.778 0-2.469l2.781-2.719v-.031c.389-.395 1.037-.4 1.438 0 .388.381.378 1.006 0 1.406l-2.5 2.469c-.095.095-.28.095-.375 0-.095-.095-.095-.28 0-.375l.375-.344.594-.625-.688-.688-.875.875-.094.094c-.485.485-.485 1.265 0 1.75.485.485 1.265.485 1.75 0l2.5-2.438c.78-.78.785-2.041 0-2.813-.39-.39-.893-.594-1.406-.594z"/></symbol>
+	<symbol id="pencil" viewBox="0 0 8 8"><path d="M6 0l-1 1 2 2 1-1-2-2zm-2 2l-4 4v2h2l4-4-2-2z"/></symbol>
+	<symbol id="people" viewBox="0 0 8 8"><path d="M5.5 0c-.51 0-.949.355-1.219.875.45.54.719 1.275.719 2.125 0 .29-.034.574-.094.844.18.11.374.156.594.156.83 0 1.5-.9 1.5-2s-.67-2-1.5-2zm-3 1c-.828 0-1.5.895-1.5 2s.672 2 1.5 2 1.5-.895 1.5-2-.672-2-1.5-2zm4.75 3.156c-.43.51-1.018.824-1.688.844.27.38.438.844.438 1.344v.656h2v-1.656c0-.52-.31-.968-.75-1.188zm-6.5 1c-.44.22-.75.668-.75 1.188v1.656h5v-1.656c0-.52-.31-.968-.75-1.188-.44.53-1.06.844-1.75.844s-1.31-.314-1.75-.844z"/></symbol>
+	<symbol id="person" viewBox="0 0 8 8"><path d="M4 0c-1.105 0-2 1.119-2 2.5s.895 2.5 2 2.5 2-1.119 2-2.5-.895-2.5-2-2.5zm-2.094 5c-1.07.04-1.906.92-1.906 2v1h8v-1c0-1.08-.836-1.96-1.906-2-.54.61-1.284 1-2.094 1-.81 0-1.554-.39-2.094-1z"/></symbol>
+	<symbol id="phone" viewBox="0 0 8 8"><path d="M.188 0c-.11 0-.188.077-.188.188v7.625c0 .11.077.188.188.188h4.625c.11 0 .188-.077.188-.188v-7.625c0-.11-.077-.188-.188-.188h-4.625zm.813 1h3v5h-3v-5zm1.5 5.5c.28 0 .5.22.5.5s-.22.5-.5.5-.5-.22-.5-.5.22-.5.5-.5z" transform="translate(1)"/></symbol>
+	<symbol id="pie-chart" viewBox="0 0 8 8"><path d="M3.5 0c-.97 0-1.839.391-2.469 1.031l2.969 2.969v-3.969c-.16-.03-.33-.031-.5-.031zm1.5 1.063v3.406l-2.719 2.719c.6.5 1.369.813 2.219.813 1.93 0 3.5-1.57 3.5-3.5 0-1.76-1.31-3.197-3-3.438zm-4.094 1.313c-.55.54-.906 1.285-.906 2.125 0 .95.435 1.804 1.125 2.344l2.156-2.125-2.375-2.344z"/></symbol>
+	<symbol id="pin" viewBox="0 0 8 8"><path d="M1.344 0a.502.502 0 0 0 .156 1h.5v2h-1c-.55 0-1 .45-1 1h3v3l.438 1 .563-1v-3h3c0-.55-.45-1-1-1h-1v-2h.5a.5.5 0 1 0 0-1h-4a.5.5 0 0 0-.094 0 .502.502 0 0 0-.063 0z"/></symbol>
+	<symbol id="play-circle" viewBox="0 0 8 8"><path d="M4 0c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm-1 2l3 2-3 2v-4z"/></symbol>
+	<symbol id="plus" viewBox="0 0 8 8"><path d="M3 0v3h-3v2h3v3h2v-3h3v-2h-3v-3h-2z"/></symbol>
+	<symbol id="power-standby" viewBox="0 0 8 8"><path d="M3 0v4h1v-4h-1zm-1.281 1.438l-.375.313c-.803.64-1.344 1.634-1.344 2.75 0 1.929 1.571 3.5 3.5 3.5s3.5-1.571 3.5-3.5c0-1.116-.529-2.11-1.344-2.75l-.375-.313-.625.781.375.313c.585.46.969 1.165.969 1.969 0 1.391-1.109 2.5-2.5 2.5s-2.5-1.109-2.5-2.5c0-.804.361-1.509.938-1.969l.406-.313-.625-.781z"/></symbol>
+	<symbol id="print" viewBox="0 0 8 8"><path d="M2 0v2h4v-2h-4zm-1.906 3c-.06 0-.094.034-.094.094v2.813c0 .06.034.094.094.094h.906v-2h6v2h.906c.06 0 .094-.034.094-.094v-2.813c0-.06-.034-.094-.094-.094h-7.813zm1.906 2v3h4v-3h-4z"/></symbol>
+	<symbol id="project" viewBox="0 0 8 8"><path d="M0 0v7h1v-7h-1zm7 0v7h1v-7h-1zm-5 1v1h2v-1h-2zm1 2v1h2v-1h-2zm1 2v1h2v-1h-2z"/></symbol>
+	<symbol id="pulse" viewBox="0 0 8 8"><path d="M3.25 0l-.469 1.531-.781 2.563-.031-.063-.094-.344h-1.875v1h1.156l.375 1.156.469 1.469.469-1.469.781-2.5.781 2.5.406 1.313.531-1.281.594-1.469.125.281h2.313v-1h-1.688l-.375-.719-.5-1-.406 1.031-.469 1.188-.844-2.656-.469-1.531z"/></symbol>
+	<symbol id="puzzle-piece" viewBox="0 0 8 8"><path d="M3 0c-.28 0-.539.101-.719.281-.18.18-.281.439-.281.719 0 .28.181.479.281.719.03.06.063.161.063.281h-2.344v6h2.344c0-.12-.011-.221-.031-.281-.11-.24-.313-.439-.313-.719 0-.28.101-.539.281-.719.18-.18.439-.281.719-.281.28 0 .539.101.719.281.18.18.281.439.281.719 0 .28-.181.479-.281.719-.03.06-.063.161-.063.281h2.344v-2.344c.12 0 .221.011.281.031.24.11.439.313.719.313.28 0 .539-.101.719-.281.18-.18.281-.439.281-.719 0-.28-.101-.539-.281-.719-.18-.18-.439-.281-.719-.281-.28 0-.479.181-.719.281-.06.03-.161.063-.281.063v-2.344h-2.344c0-.12.011-.221.031-.281.11-.24.313-.439.313-.719 0-.28-.101-.539-.281-.719-.18-.18-.439-.281-.719-.281z"/></symbol>
+	<symbol id="question-mark" viewBox="0 0 8 8"><path d="M2.469 0c-.854 0-1.48.256-1.875.656s-.54.901-.594 1.281l1 .125c.036-.26.125-.497.313-.688.188-.19.491-.375 1.156-.375.664 0 1.019.163 1.219.344.199.181.281.405.281.656 0 .833-.313 1.063-.813 1.5-.5.438-1.188 1.083-1.188 2.25v.25h1v-.25c0-.833.344-1.063.844-1.5.5-.438 1.156-1.083 1.156-2.25 0-.479-.168-1.02-.594-1.406-.426-.387-1.071-.594-1.906-.594zm-.5 7v1h1v-1h-1z" transform="translate(2)"/></symbol>
+	<symbol id="rain" viewBox="0 0 8 8"><path d="M4.5 0c-1.21 0-2.27.86-2.5 2-1.1 0-2 .9-2 2 0 .52.201 1.015.531 1.375.26-.22.599-.375.969-.375.2 0 .393.055.563.125.17-.64.748-1.125 1.438-1.125s1.268.485 1.438 1.125c.17-.07.362-.125.563-.125.63 0 1.155.388 1.375.938.64-.17 1.125-.747 1.125-1.438 0-.65-.42-1.29-1-1.5v-.5c0-1.38-1.12-2.5-2.5-2.5zm-1.156 5a.5.5 0 0 0-.344.5v2a.5.5 0 1 0 1 0v-2a.5.5 0 0 0-.594-.5.5.5 0 0 0-.063 0zm-2 1a.5.5 0 0 0-.344.5v1a.5.5 0 1 0 1 0v-1a.5.5 0 0 0-.594-.5.5.5 0 0 0-.063 0zm4 0a.5.5 0 0 0-.344.5v1a.5.5 0 1 0 1 0v-1a.5.5 0 0 0-.594-.5.5.5 0 0 0-.063 0z"/></symbol>
+	<symbol id="random" viewBox="0 0 8 8"><path d="M6 0v1h-.5c-.354 0-.6.116-.813.375l-1.406 1.75-1.5-1.75v-.031c-.212-.236-.427-.344-.781-.344h-1v1h1c-.037 0 .008-.011.031 0v.031l1.625 1.906-1.625 2.031c.016-.02.019.022 0 .031-.019.009-.068 0-.031 0h-1v1h1c.354 0 .6-.116.813-.375l1.531-1.906 1.625 1.906v.031c.212.236.427.344.781.344h.25v1l2-1.5-2-1.5v1h-.25c.037 0-.008.011-.031 0v-.031l-1.75-2.063 1.5-1.875v-.031c.019-.009.068 0 .031 0h.5v1l2-1.5-2-1.5z"/></symbol>
+	<symbol id="reload" viewBox="0 0 8 8"><path d="M4 0c-2.201 0-4 1.799-4 4s1.799 4 4 4c1.104 0 2.092-.456 2.813-1.188l-.688-.688c-.54.548-1.289.875-2.125.875-1.659 0-3-1.341-3-3s1.341-3 3-3c.834 0 1.545.354 2.094.906l-1.094 1.094h3v-3l-1.188 1.188c-.731-.72-1.719-1.188-2.813-1.188z"/></symbol>
+	<symbol id="resize-both" viewBox="0 0 8 8"><path d="M4 0l1.656 1.656-4 4-1.656-1.656v4h4l-1.656-1.656 4-4 1.656 1.656v-4h-4z"/></symbol>
+	<symbol id="resize-height" viewBox="0 0 8 8"><path d="M2.5 0l-2.5 3h2v2h-2l2.5 3 2.5-3h-2v-2h2l-2.5-3z" transform="translate(1)"/></symbol>
+	<symbol id="resize-width" viewBox="0 0 8 8"><path d="M3 0l-3 2.5 3 2.5v-2h2v2l3-2.5-3-2.5v2h-2v-2z" transform="translate(0 1)"/></symbol>
+	<symbol id="rss-alt" viewBox="0 0 8 8"><path d="M0 0v2c3.331 0 6 2.669 6 6h2c0-4.409-3.591-8-8-8zm0 3v2c1.67 0 3 1.33 3 3h2c0-2.75-2.25-5-5-5zm0 3v2h2c0-1.11-.89-2-2-2z"/></symbol>
+	<symbol id="rss" viewBox="0 0 8 8"><path d="M1 0v1c3.32 0 6 2.68 6 6h1c0-3.86-3.14-7-7-7zm0 2v1c2.221 0 4 1.779 4 4h1c0-2.759-2.241-5-5-5zm0 2v1c1.109 0 2 .891 2 2h1c0-1.651-1.349-3-3-3zm0 2c-.552 0-1 .448-1 1s.448 1 1 1 1-.448 1-1-.448-1-1-1z"/></symbol>
+	<symbol id="script" viewBox="0 0 8 8"><path d="M3 0c-.55 0-1 .45-1 1v5.5c0 .28-.22.5-.5.5s-.5-.22-.5-.5v-1.5h-1v2c0 .55.45 1 1 1h5c.55 0 1-.45 1-1v-3h-4v-2.5c0-.28.22-.5.5-.5s.5.22.5.5v1.5h4v-2c0-.55-.45-1-1-1h-4z"/></symbol>
+	<symbol id="share-boxed" viewBox="0 0 8 8"><path d="M.75 0c-.402 0-.75.348-.75.75v5.5c0 .402.348.75.75.75h4.5c.402 0 .75-.348.75-.75v-1.25h-1v1h-4v-5h2v-1h-2.25zm5.25 0v1c-2.05 0-3.704 1.544-3.938 3.531.213-.875.999-1.531 1.938-1.531h2v1l2-2-2-2z"/></symbol>
+	<symbol id="share" viewBox="0 0 8 8"><path d="M5 0v2c-4 0-5 2.05-5 5 .52-1.98 2-3 4-3h1v2l3-3.156-3-2.844z"/></symbol>
+	<symbol id="shield" viewBox="0 0 8 8"><path d="M4 0l-.188.094-3.5 1.469-.313.125v.313c0 1.657.666 3.122 1.469 4.188.401.533.828.969 1.25 1.281.422.313.826.531 1.281.531.455 0 .86-.219 1.281-.531.422-.313.849-.749 1.25-1.281.803-1.065 1.469-2.53 1.469-4.188v-.313l-.313-.125-3.5-1.469-.188-.094zm0 1.094v5.906c-.045 0-.328-.069-.656-.313s-.714-.631-1.063-1.094c-.642-.851-1.137-2.025-1.219-3.281l2.938-1.219z"/></symbol>
+	<symbol id="signal" viewBox="0 0 8 8"><path d="M6 0v8h1v-8h-1zm-2 1v7h1v-7h-1zm-2 2v5h1v-5h-1zm-2 2v3h1v-3h-1z"/></symbol>
+	<symbol id="signpost" viewBox="0 0 8 8"><path d="M3 0v1h-2l-1 1 1 1h2v5h1v-4h2l1-1-1-1h-2v-2h-1z"/></symbol>
+	<symbol id="sort-ascending" viewBox="0 0 8 8"><path d="M2 0v6h-2l2.5 2 2.5-2h-2v-6h-1zm2 0v1h2v-1h-2zm0 2v1h3v-1h-3zm0 2v1h4v-1h-4z"/></symbol>
+	<symbol id="sort-descending" viewBox="0 0 8 8"><path d="M2 0v6h-2l2.5 2 2.5-2h-2v-6h-1zm2 0v1h4v-1h-4zm0 2v1h3v-1h-3zm0 2v1h2v-1h-2z"/></symbol>
+	<symbol id="spreadsheet" viewBox="0 0 8 8"><path d="M.75 0c-.402 0-.75.348-.75.75v5.5c0 .402.348.75.75.75h6.5c.402 0 .75-.348.75-.75v-5.5c0-.402-.348-.75-.75-.75h-6.5zm.25 1h1v1h-1v-1zm2 0h4v1h-4v-1zm-2 2h1v1h-1v-1zm2 0h4v1h-4v-1zm-2 2h1v1h-1v-1zm2 0h4v1h-4v-1z"/></symbol>
+	<symbol id="star" viewBox="0 0 8 8"><path d="M4 0l-1 3h-3l2.5 2-1 3 2.5-2 2.5 2-1-3 2.5-2h-3l-1-3z"/></symbol>
+	<symbol id="sun" viewBox="0 0 8 8"><path d="M4 0c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5zm-2.5 1c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5zm5 0c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5zm-2.5 1c-1.105 0-2 .895-2 2s.895 2 2 2 2-.895 2-2-.895-2-2-2zm-3.5 1.5c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5zm7 0c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5zm-6 2.5c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5zm5 0c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5zm-2.5 1c-.276 0-.5.224-.5.5s.224.5.5.5.5-.224.5-.5-.224-.5-.5-.5z"/></symbol>
+	<symbol id="tablet" viewBox="0 0 8 8"><path d="M.344 0c-.18 0-.344.164-.344.344v7.313c0 .18.164.344.344.344h6.313c.18 0 .344-.164.344-.344v-7.313c0-.18-.164-.344-.344-.344h-6.313zm.656 1h5v5h-5v-5zm2.5 5.5c.28 0 .5.22.5.5s-.22.5-.5.5-.5-.22-.5-.5.22-.5.5-.5z"/></symbol>
+	<symbol id="tag" viewBox="0 0 8 8"><path d="M0 0v3l5 5 3-3-5-5h-3zm2 1c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1z"/></symbol>
+	<symbol id="tags" viewBox="0 0 8 8"><path d="M0 0v2l3 3 1.5-1.5.5-.5-2-2-1-1h-2zm3.406 0l3 3-1.188 1.219.781.781 2-2-3-3h-1.594zm-1.906 1c.28 0 .5.22.5.5s-.22.5-.5.5-.5-.22-.5-.5.22-.5.5-.5z" transform="translate(0 1)"/></symbol>
+	<symbol id="target" viewBox="0 0 8 8"><path d="M4 0c-2.203 0-4 1.797-4 4 0 2.203 1.797 4 4 4 2.203 0 4-1.797 4-4 0-2.203-1.797-4-4-4zm0 1c1.663 0 3 1.337 3 3s-1.337 3-3 3-3-1.337-3-3 1.337-3 3-3zm0 1c-1.099 0-2 .901-2 2s.901 2 2 2 2-.901 2-2-.901-2-2-2zm0 1c.558 0 1 .442 1 1s-.442 1-1 1-1-.442-1-1 .442-1 1-1z"/></symbol>
+	<symbol id="task" viewBox="0 0 8 8"><path d="M0 0v7h7v-3.594l-1 1v1.594h-5v-5h3.594l1-1h-5.594zm7 0l-3 3-1-1-1 1 2 2 4-4-1-1z"/></symbol>
+	<symbol id="terminal" viewBox="0 0 8 8"><path d="M.094 0c-.06 0-.094.034-.094.094v7.813c0 .06.034.094.094.094h7.813c.06 0 .094-.034.094-.094v-7.813c0-.06-.034-.094-.094-.094h-7.813zm1.406.781l1.719 1.719-1.719 1.719-.719-.719 1-1-1-1 .719-.719zm2.5 2.219h3v1h-3v-1z"/></symbol>
+	<symbol id="text" viewBox="0 0 8 8"><path d="M0 0v2h.5c0-.55.45-1 1-1h1.5v5.5c0 .28-.22.5-.5.5h-.5v1h4v-1h-.5c-.28 0-.5-.22-.5-.5v-5.5h1.5c.55 0 1 .45 1 1h.5v-2h-8z"/></symbol>
+	<symbol id="thumb-down" viewBox="0 0 8 8"><path d="M0 0v4h1v-4h-1zm2 0v4.001c.28 0 .529.101.719.281.18.19 1.151 2.115 1.281 2.375.13.26.386.393.656.313.26-.08.393-.355.313-.625-.08-.26-.469-1.594-.469-1.844s.22-.5.5-.5h1.5c.28 0 .5-.22.5-.5s-1.031-3.188-1.031-3.188c-.08-.18-.259-.313-.469-.313h-3.5z"/></symbol>
+	<symbol id="thumb-up" viewBox="0 0 8 8"><path d="M4.438 0c-.19.021-.34.149-.438.344-.13.26-1.101 2.185-1.281 2.375-.19.18-.439.281-.719.281v4.001h3.5c.21 0 .389-.133.469-.313 0 0 1.031-2.908 1.031-3.188 0-.28-.22-.5-.5-.5h-1.5c-.28 0-.5-.25-.5-.5s.389-1.574.469-1.844c.08-.27-.053-.545-.313-.625-.067-.02-.155-.038-.219-.031zm-4.438 3v4h1v-4h-1z"/></symbol>
+	<symbol id="timer" viewBox="0 0 8 8"><path d="M2 0v1h1v.031c-1.697.241-3 1.707-3 3.469 0 1.929 1.571 3.5 3.5 3.5s3.5-1.571 3.5-3.5c0-.45-.086-.874-.219-1.25l-.938.344c.107.304.156.596.156.906 0 1.391-1.109 2.5-2.5 2.5s-2.5-1.109-2.5-2.5 1.109-2.5 2.5-2.5c.298 0 .585.051.875.156l.344-.938c-.221-.081-.471-.119-.719-.156v-.063h1v-1h-3zm5 1.125s-3.675 2.8-3.875 3c-.2.2-.2.519 0 .719.2.2.519.2.719 0 .2-.19 3.156-3.719 3.156-3.719z"/></symbol>
+	<symbol id="transfer" viewBox="0 0 8 8"><path d="M6 0v1h-6v1h6v1l2-1.5-2-1.5zm-4 4l-2 1.5 2 1.5v-1h6v-1h-6v-1z"/></symbol>
+	<symbol id="trash" viewBox="0 0 8 8"><path d="M3 0c-.55 0-1 .45-1 1h-1c-.55 0-1 .45-1 1h7c0-.55-.45-1-1-1h-1c0-.55-.45-1-1-1h-1zm-2 3v4.813c0 .11.077.188.188.188h4.625c.11 0 .188-.077.188-.188v-4.813h-1v3.5c0 .28-.22.5-.5.5s-.5-.22-.5-.5v-3.5h-1v3.5c0 .28-.22.5-.5.5s-.5-.22-.5-.5v-3.5h-1z"/></symbol>
+	<symbol id="underline" viewBox="0 0 8 8"><path d="M1 0v4c0 1.1 1.12 2 2.5 2h.5c1.1 0 2-.9 2-2v-4h-1v4c0 .55-.45 1-1 1s-1-.45-1-1v-4h-2zm-1 7v1h7v-1h-7z"/></symbol>
+	<symbol id="vertical-align-bottom" viewBox="0 0 8 8"><path d="M.094 0c-.06 0-.094.034-.094.094v4.813c0 .06.034.094.094.094h1.813c.06 0 .094-.034.094-.094v-4.813c0-.06-.034-.094-.094-.094h-1.813zm6 0c-.06 0-.094.034-.094.094v4.813c0 .06.034.094.094.094h1.813c.06 0 .094-.034.094-.094v-4.813c0-.06-.034-.094-.094-.094h-1.813zm-3 2c-.06 0-.094.034-.094.094v2.813c0 .06.034.094.094.094h1.813c.06 0 .094-.034.094-.094v-2.813c0-.06-.034-.094-.094-.094h-1.813zm-3.094 4v1h8v-1h-8z"/></symbol>
+	<symbol id="vertical-align-center" viewBox="0 0 8 8"><path d="M.094 0c-.06 0-.094.034-.094.094v1.906h2v-1.906c0-.06-.034-.094-.094-.094h-1.813zm6 0c-.06 0-.094.034-.094.094v1.906h2v-1.906c0-.06-.034-.094-.094-.094h-1.813zm-3 1c-.06 0-.094.034-.094.094v.906h2v-.906c0-.06-.034-.094-.094-.094h-1.813zm-3.094 2v1h8v-1h-8zm0 2v1.906c0 .06.034.094.094.094h1.813c.06 0 .094-.034.094-.094v-1.906h-2zm3 0v.906c0 .06.034.094.094.094h1.813c.06 0 .094-.034.094-.094v-.906h-2zm3 0v1.906c0 .06.034.094.094.094h1.813c.06 0 .094-.034.094-.094v-1.906h-2z"/></symbol>
+	<symbol id="vertical-align-top" viewBox="0 0 8 8"><path d="M0 0v1h8v-1h-8zm.094 2c-.06 0-.094.034-.094.094v4.813c0 .06.034.094.094.094h1.813c.06 0 .094-.034.094-.094v-4.813c0-.06-.034-.094-.094-.094h-1.813zm3 0c-.06 0-.094.034-.094.094v2.813c0 .06.034.094.094.094h1.813c.06 0 .094-.034.094-.094v-2.813c0-.06-.034-.094-.094-.094h-1.813zm3 0c-.06 0-.094.034-.094.094v4.813c0 .06.034.094.094.094h1.813c.06 0 .094-.034.094-.094v-4.813c0-.06-.034-.094-.094-.094h-1.813z"/></symbol>
+	<symbol id="video" viewBox="0 0 8 8"><path d="M.5 0c-.28 0-.5.22-.5.5v4c0 .28.22.5.5.5h5c.28 0 .5-.22.5-.5v-1.5l1 1h1v-3h-1l-1 1v-1.5c0-.28-.22-.5-.5-.5h-5z" transform="translate(0 1)"/></symbol>
+	<symbol id="volume-high" viewBox="0 0 8 8"><path d="M3.344 0l-1.344 2h-2v4h2l1.344 2h.656v-8h-.656zm1.656 1v1c.152 0 .313.026.469.063h.031c.86.215 1.5.995 1.5 1.938 0 .942-.64 1.722-1.5 1.938-.166.041-.338.063-.5.063v1c.258 0 .516-.035.75-.094 1.3-.325 2.25-1.508 2.25-2.906 0-1.398-.95-2.581-2.25-2.906-.234-.059-.492-.094-.75-.094zm0 2v2c.04 0 .134-.002.25-.031.433-.118.75-.507.75-.969 0-.446-.325-.819-.75-.938v-.031c-.005-.001-.025.002-.031 0-.043-.011-.111-.031-.219-.031z"/></symbol>
+	<symbol id="volume-low" viewBox="0 0 8 8"><path d="M3.344 0l-1.344 2h-2v4h2l1.344 2h.656v-8h-.656zm1.656 3v2c.04 0 .134-.002.25-.031.433-.118.75-.507.75-.969 0-.446-.325-.819-.75-.938v-.031c-.005-.001-.025.002-.031 0-.043-.011-.111-.031-.219-.031z" transform="translate(1)"/></symbol>
+	<symbol id="volume-off" viewBox="0 0 8 8"><path d="M3.344 0l-1.344 2h-2v4h2l1.344 2h.656v-8h-.656z" transform="translate(2)"/></symbol>
+	<symbol id="warning" viewBox="0 0 8 8"><path d="M3.094 0c-.06 0-.105.044-.125.094l-2.938 6.813c-.02.05-.031.128-.031.188v.813c0 .06.034.094.094.094h6.813c.06 0 .094-.034.094-.094v-.813c0-.06-.011-.128-.031-.188l-2.938-6.813c-.02-.05-.065-.094-.125-.094h-.813zm-.094 3h1v2h-1v-2zm0 3h1v1h-1v-1z"/></symbol>
+	<symbol id="wifi" viewBox="0 0 8 8"><path d="M3.75 0c-1.374 0-2.66.372-3.75 1.063l.531.875c.93-.59 2.033-.938 3.219-.938 1.2 0 2.323.31 3.25.906l.531-.813c-1.093-.703-2.401-1.094-3.781-1.094zm.031 3c-.795 0-1.531.227-2.156.625l.531.844c.475-.302 1.02-.469 1.625-.469.593 0 1.13.177 1.594.469l.531-.844c-.616-.388-1.338-.625-2.125-.625zm-.031 3c-.552 0-1 .448-1 1s.448 1 1 1 1-.448 1-1-.448-1-1-1z"/></symbol>
+	<symbol id="wrench" viewBox="0 0 8 8"><path d="M5.5 0c-1.38 0-2.5 1.12-2.5 2.5 0 .32.078.626.188.906l-2.906 2.875c-.39.39-.39 1.016 0 1.406.2.2.459.313.719.313.26 0 .519-.091.719-.281l2.875-2.875c.28.1.586.156.906.156 1.38 0 2.5-1.12 2.5-2.5 0-.16-.032-.297-.063-.438l-.938.938h-2v-2l.938-.938c-.14-.03-.277-.062-.438-.063zm-4.5 6.5c.28 0 .5.22.5.5s-.22.5-.5.5-.5-.22-.5-.5.22-.5.5-.5z"/></symbol>
+	<symbol id="x" viewBox="0 0 8 8"><path d="M1.406 0l-1.406 1.406.688.719 1.781 1.781-1.781 1.781-.688.719 1.406 1.406.719-.688 1.781-1.781 1.781 1.781.719.688 1.406-1.406-.688-.719-1.781-1.781 1.781-1.781.688-.719-1.406-1.406-.719.688-1.781 1.781-1.781-1.781-.719-.688z"/></symbol>
+	<symbol id="yen" viewBox="0 0 8 8"><path d="M0 0l2.25 3h-2.25v1h3v1h-3v1h3v2h1v-2h3v-1h-3v-1h3v-1h-2.25l2.25-3h-1l-2.313 3h-.375l-2.313-3h-1z"/></symbol>
+	<symbol id="zoom-in" viewBox="0 0 8 8"><path d="M3.5 0c-1.927 0-3.5 1.573-3.5 3.5s1.573 3.5 3.5 3.5c.592 0 1.166-.145 1.656-.406a1 1 0 0 0 .094.094l1.031 1.031a1.016 1.016 0 1 0 1.438-1.438l-1.031-1.031a1 1 0 0 0-.125-.094c.266-.493.438-1.059.438-1.656 0-1.927-1.573-3.5-3.5-3.5zm0 1c1.387 0 2.5 1.113 2.5 2.5 0 .587-.196 1.137-.531 1.563-.009.012-.022.02-.031.031a1 1 0 0 0-.063.031 1 1 0 0 0-.281.281 1 1 0 0 0-.063.063c-.422.326-.953.531-1.531.531-1.387 0-2.5-1.113-2.5-2.5s1.113-2.5 2.5-2.5zm-.5 1v1h-1v1h1v1h1v-1h1v-1h-1v-1h-1z"/></symbol>
+	<symbol id="zoom-out" viewBox="0 0 8 8"><path d="M3.5 0c-1.927 0-3.5 1.573-3.5 3.5s1.573 3.5 3.5 3.5c.592 0 1.166-.145 1.656-.406a1 1 0 0 0 .094.094l1.031 1.031a1.016 1.016 0 1 0 1.438-1.438l-1.031-1.031a1 1 0 0 0-.125-.094c.266-.493.438-1.059.438-1.656 0-1.927-1.573-3.5-3.5-3.5zm0 1c1.387 0 2.5 1.113 2.5 2.5 0 .587-.196 1.137-.531 1.563-.009.012-.022.02-.031.031a1 1 0 0 0-.063.031 1 1 0 0 0-.281.281 1 1 0 0 0-.063.063c-.422.326-.953.531-1.531.531-1.387 0-2.5-1.113-2.5-2.5s1.113-2.5 2.5-2.5zm-1.5 2v1h3v-1h-3z"/></symbol>
+	<symbol id="telescope" viewBox="0 0 16 16" ><path d="m4.75 5.75 1 2.5m3.5-4.5 1.5 3.5m-9 0 1 2.5 11.5-3.5-2-4.5z"/><path d="m7.75 11.2v3m-3-0.5 2.25-2.5 1.75-0.5 2.5 3"/></symbol>
+	<symbol id="password-eye" viewBox="0 0 576 512"><path fill="currentColor" d="M572.52 241.4C518.29 135.59 410.93 64 288 64S57.68 135.64 3.48 241.41a32.35 32.35 0 0 0 0 29.19C57.71 376.41 165.07 448 288 448s230.32-71.64 284.52-177.41a32.35 32.35 0 0 0 0-29.19zM288 400a144 144 0 1 1 144-144 143.93 143.93 0 0 1-144 144zm0-240a95.31 95.31 0 0 0-25.31 3.79 47.85 47.85 0 0 1-66.9 66.9A95.78 95.78 0 1 0 288 160z"/></symbol>
+  	<symbol id="password-eye-closed" viewBox="0 0 640 512"><path fill="currentColor" d="M320 400c-75.85 0-137.25-58.71-142.9-133.11L72.2 185.82c-13.79 17.3-26.48 35.59-36.72 55.59a32.35 32.35 0 0 0 0 29.19C89.71 376.41 197.07 448 320 448c26.91 0 52.87-4 77.89-10.46L346 397.39a144.13 144.13 0 0 1-26 2.61zm313.82 58.1l-110.55-85.44a331.25 331.25 0 0 0 81.25-102.07 32.35 32.35 0 0 0 0-29.19C550.29 135.59 442.93 64 320 64a308.15 308.15 0 0 0-147.32 37.7L45.46 3.37A16 16 0 0 0 23 6.18L3.37 31.45A16 16 0 0 0 6.18 53.9l588.36 454.73a16 16 0 0 0 22.46-2.81l19.64-25.27a16 16 0 0 0-2.82-22.45zm-183.72-142l-39.3-30.38A94.75 94.75 0 0 0 416 256a94.76 94.76 0 0 0-121.31-92.21A47.65 47.65 0 0 1 304 192a46.64 46.64 0 0 1-1.54 10l-73.61-56.89A142.31 142.31 0 0 1 320 112a143.92 143.92 0 0 1 144 144c0 21.63-5.29 41.79-13.9 60.11z"/></symbol>
+</defs></svg>
+
+<svg class="svgsprite hidden" version="1.1" xmlns="http://www.w3.org/2000/svg">
+	<symbol id="twitter" viewBox="0 0 512 512"><path d="M492 109.5c-17.4 7.7-36 12.9-55.6 15.3 20-12 35.4-31 42.6-53.6-18.7 11.1-39.4 19.2-61.5 23.5C399.8 75.8 374.6 64 346.8 64c-53.5 0-96.8 43.4-96.8 96.9 0 7.6.8 15 2.5 22.1-80.5-4-151.9-42.6-199.6-101.3-8.3 14.3-13.1 31-13.1 48.7 0 33.6 17.2 63.3 43.2 80.7-16-.4-31-4.8-44-12.1v1.2c0 47 33.4 86.1 77.7 95-8.1 2.2-16.7 3.4-25.5 3.4-6.2 0-12.3-.6-18.2-1.8 12.3 38.5 48.1 66.5 90.5 67.3-33.1 26-74.9 41.5-120.3 41.5-7.8 0-15.5-.5-23.1-1.4C62.8 432 113.7 448 168.3 448 346.6 448 444 300.3 444 172.2c0-4.2-.1-8.4-.3-12.5C462.6 146 479 129 492 109.5z"/></symbol>
+	<symbol id="facebook" viewBox="0 0 512 512"><path d="M288 192v-38.1c0-17.2 3.8-25.9 30.5-25.9H352V64h-55.9c-68.5 0-91.1 31.4-91.1 85.3V192h-45v64h45v192h83V256h56.4l7.6-64h-64z"/></symbol>
+	<symbol id="dropbox" viewBox="0 0 512 512"><path d="M177 77L64 150.9l78.1 62.7L256 143.1zM64 276.3l113 73.9 79-66.1-113.9-70.5zM256 284.1l79 66.1 113-73.9-78.1-62.7zM448 150.9L335 77l-79 66.1 113.9 70.5zM256.2 298.3l-79.8 66-34.4-22.2V367l114 68 114-68v-24.9l-34.2 22.2z"/></symbol>
+	<symbol id="share-ion" viewBox="0 0 512 512"><path d="M383.822 344.427c-16.045 0-31.024 5.326-41.721 15.979l-152.957-88.42c1.071-5.328 2.142-9.593 2.142-14.919 0-5.328-1.071-9.593-2.142-14.919l150.826-87.35c11.762 10.653 26.741 17.041 43.852 17.041 35.295 0 64.178-28.766 64.178-63.92C448 72.767 419.117 44 383.822 44c-35.297 0-64.179 28.767-64.179 63.92 0 5.327 1.065 9.593 2.142 14.919l-150.821 87.35c-11.767-10.654-26.741-17.041-43.856-17.041-35.296 0-63.108 28.766-63.108 63.92 0 35.153 28.877 63.92 64.178 63.92 17.115 0 32.089-6.389 43.856-17.042l151.891 88.421c-1.076 4.255-2.141 8.521-2.141 13.847 0 34.094 27.806 61.787 62.037 61.787 34.229 0 62.036-27.693 62.036-61.787.001-34.094-27.805-61.787-62.035-61.787z"/></symbol>
+	<symbol id="copy" viewBox="0 0 512 512"><path d="M296 48H176.5C154.4 48 136 65.4 136 87.5V96h-7.5C106.4 96 88 113.4 88 135.5v288c0 22.1 18.4 40.5 40.5 40.5h208c22.1 0 39.5-18.4 39.5-40.5V416h8.5c22.1 0 39.5-18.4 39.5-40.5V176L296 48zm0 44.6l83.4 83.4H296V92.6zm48 330.9c0 4.7-3.4 8.5-7.5 8.5h-208c-4.4 0-8.5-4.1-8.5-8.5v-288c0-4.1 3.8-7.5 8.5-7.5h7.5v255.5c0 22.1 10.4 32.5 32.5 32.5H344v7.5zm48-48c0 4.7-3.4 8.5-7.5 8.5h-208c-4.4 0-8.5-4.1-8.5-8.5v-288c0-4.1 3.8-7.5 8.5-7.5H264v128h128v167.5z"/></symbol>
+	<symbol id="clockwise" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M3.17 6.706a5 5 0 017.103-3.16.5.5 0 10.454-.892A6 6 0 1013.455 5.5a.5.5 0 00-.91.417 5 5 0 11-9.375.789z" clip-rule="evenodd"/><path fill-rule="evenodd" d="M8.147.146a.5.5 0 01.707 0l2.5 2.5a.5.5 0 010 .708l-2.5 2.5a.5.5 0 11-.707-.708L10.293 3 8.147.854a.5.5 0 010-.708z" clip-rule="evenodd"/></symbol>
+	<symbol id="counterclockwise" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M12.83 6.706a5 5 0 00-7.103-3.16.5.5 0 11-.454-.892A6 6 0 112.545 5.5a.5.5 0 11.91.417 5 5 0 109.375.789z" clip-rule="evenodd"/><path fill-rule="evenodd" d="M7.854.146a.5.5 0 00-.708 0l-2.5 2.5a.5.5 0 000 .708l2.5 2.5a.5.5 0 10.708-.708L5.707 3 7.854.854a.5.5 0 000-.708z" clip-rule="evenodd"/></symbol>
 </svg>
-<!-- endinject -->
+
+<svg class="svgsprite hidden" version="1.1" xmlns="http://www.w3.org/2000/svg">
+	<symbol id="masonry" viewBox="0 0 20 20"><rect x="1.75" y="1.75" width="6.47143" height="4.67143" rx="1.25" stroke-width="1.5"></rect><rect x="11.7786" y="13.5786" width="6.47143" height="4.67143" rx="1.25" stroke-width="1.5"></rect><rect x="11.7786" y="1.75" width="6.47143" height="8.27143" rx="1.25" stroke-width="1.5"></rect><rect x="1.75" y="9.97858" width="6.47143" height="8.27143" rx="1.25" stroke-width="1.5"></rect></symbol>
+	<symbol id="squares" viewBox="0 0 20 20"><rect x="1.75" y="1.75003" width="6.47143" height="6.47143" rx="1.25" stroke-width="1.5"></rect><rect x="11.7786" y="1.75003" width="6.47143" height="6.47143" rx="1.25" stroke-width="1.5"></rect><rect x="11.7786" y="11.7786" width="6.47143" height="6.47143" rx="1.25" stroke-width="1.5"></rect><rect x="1.75" y="11.7786" width="6.47143" height="6.47143" rx="1.25" stroke-width="1.5"></rect></symbol>
+	<symbol id="grid" viewBox="0 0 20 20"><rect x="1.75" y="1.75" width="6.47143" height="5.7" rx="1.25" stroke-width="1.5"></rect><rect x="11.7786" y="13.0643" width="6.47143" height="5.18572" rx="1.25" stroke-width="1.5"></rect><rect x="11.7786" y="1.75" width="6.47143" height="8.01429" rx="1.25" stroke-width="1.5"></rect><rect x="1.75" y="13.0643" width="6.47143" height="5.18572" rx="1.25" stroke-width="1.5"></rect></symbol>
+	<symbol id="justified" viewBox="0 0 20 20"><path fill-rule="evenodd" clip-rule="evenodd" d="M2.5 17L2.5 13.0286C2.5 12.7524 2.72386 12.5286 3 12.5286L5.17143 12.5286C5.44757 12.5286 5.67143 12.7524 5.67143 13.0286L5.67143 17C5.67143 17.2761 5.44757 17.5 5.17143 17.5L3 17.5C2.72386 17.5 2.5 17.2761 2.5 17ZM3 19C1.89543 19 1 18.1046 1 17L1 13.0286C1 11.924 1.89543 11.0286 3 11.0286L5.17143 11.0286C6.276 11.0286 7.17143 11.924 7.17143 13.0286L7.17143 17C7.17143 18.1046 6.276 19 5.17143 19L3 19ZM14.3286 6.97143L14.3286 3C14.3286 2.72386 14.5524 2.5 14.8286 2.5L17 2.5C17.2761 2.5 17.5 2.72386 17.5 3L17.5 6.97143C17.5 7.24757 17.2761 7.47143 17 7.47143L14.8286 7.47143C14.5524 7.47143 14.3286 7.24757 14.3286 6.97143ZM14.8286 8.97143C13.724 8.97143 12.8286 8.076 12.8286 6.97143L12.8286 3C12.8286 1.89543 13.724 0.999999 14.8286 0.999999L17 0.999999C18.1046 0.999999 19 1.89543 19 3L19 6.97143C19 8.076 18.1046 8.97143 17 8.97143L14.8286 8.97143ZM2.50001 3L2.50001 6.97143C2.50001 7.24757 2.72386 7.47143 3.00001 7.47143L8.77144 7.47143C9.04758 7.47143 9.27144 7.24757 9.27144 6.97143L9.27144 3C9.27144 2.72386 9.04758 2.5 8.77144 2.5L3.00001 2.5C2.72386 2.5 2.50001 2.72386 2.50001 3ZM1.00001 6.97143C1.00001 8.076 1.89544 8.97143 3.00001 8.97143L8.77144 8.97143C9.87601 8.97143 10.7714 8.076 10.7714 6.97143L10.7714 3C10.7714 1.89543 9.87601 0.999998 8.77144 0.999998L3.00001 0.999998C1.89544 0.999998 1.00001 1.89543 1.00001 3L1.00001 6.97143ZM10.7286 17L10.7286 13.0286C10.7286 12.7524 10.9524 12.5286 11.2286 12.5286L17 12.5286C17.2761 12.5286 17.5 12.7524 17.5 13.0286L17.5 17C17.5 17.2761 17.2762 17.5 17 17.5L11.2286 17.5C10.9524 17.5 10.7286 17.2761 10.7286 17ZM11.2286 19C10.124 19 9.22858 18.1046 9.22858 17L9.22858 13.0286C9.22858 11.924 10.124 11.0286 11.2286 11.0286L17 11.0286C18.1046 11.0286 19 11.924 19 13.0286L19 17C19 18.1046 18.1046 19 17 19L11.2286 19Z"></path></symbol>
+</svg>
\ No newline at end of file
diff --git a/resources/views/install/setup-success.blade.php b/resources/views/install/setup-success.blade.php
index bf8331f92d4..082544e3d68 100644
--- a/resources/views/install/setup-success.blade.php
+++ b/resources/views/install/setup-success.blade.php
@@ -7,7 +7,7 @@
 @section('content')
 	<strong>Admin account has been created.</strong>
 	<div class="buttons">
-	<a href="{{ route('home') }}" class="button" >
+	<a href="{{ config('app.livewire') !== true ? route('home') : route('livewire-index') }}" class="button" >
 			Open Lychee <i class="fa fa-angle-right fa-fw" aria-hidden="true"></i>
 		</a>
 	</div>
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..1a2ac20c7e6
--- /dev/null
+++ b/resources/views/livewire/components/context-menu.blade.php
@@ -0,0 +1,16 @@
+<div>
+@if($isOpen)
+<div class="z-10 fixed flex items-center justify-center w-full h-full top-0 left-0 box-border" data-closable="true">
+	<div class="py-1 menu-shadow rounded-md
+		border-solid border-black/80 border
+		max-w-xs absolute
+		bg-gradient-to-b from-bg-400 to-bg-500
+		animate-scaleIn"
+		role="dialog"
+		x-on:click.away="$wire.closeContextMenu()"
+		style="{{ $style }}">
+		@livewire($type, ['params' => $params])
+	</div>
+</div>
+@endif
+</div>
\ 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..f559f2a9bbf
--- /dev/null
+++ b/resources/views/livewire/components/left-menu.blade.php
@@ -0,0 +1,67 @@
+<aside id="default-sidebar" x-data="{ leftMenuOpen: @entangle('isOpen') }" x-bind:class="!leftMenuOpen ? '' : 'w-full sm:w-[250px]'"
+    class="z-40 w-0 h-screen transition-width duration-500" aria-label="Sidebar">
+    <div class="h-full py-4 overflow-y-auto bg-bg-900">
+        <ul class="space-y-0.5">
+            <x-leftbar.leftbar-item x-on:click="leftMenuOpen = ! leftMenuOpen" icon="chevron-left">
+                {{ __('lychee.CLOSE') }}
+            </x-leftbar.leftbar-item>
+            @can(SettingsPolicy::CAN_EDIT, [App\Models\Configs::class])
+                <x-leftbar.leftbar-item href="{{ route('settings') }}" wire:navigate icon="cog">
+                    {{ __('lychee.SETTINGS') }}
+                </x-leftbar.leftbar-item>
+            @endcan
+            @can(UserPolicy::CAN_EDIT, [App\Models\User::class])
+                <x-leftbar.leftbar-item href="{{ route('profile') }}" wire:navigate icon="person">
+                    {{ __('lychee.PROFILE') }}
+                </x-leftbar.leftbar-item>
+            @endcan
+            @can(UserPolicy::CAN_CREATE_OR_EDIT_OR_DELETE, [App\Models\User::class])
+                <x-leftbar.leftbar-item href="{{ route('users') }}" wire:navigate icon="people">
+                    {{ __('lychee.USERS') }}
+                </x-leftbar.leftbar-item>
+            @endcan
+            <x-leftbar.leftbar-item href="{{ route('profile') }}" wire:navigate icon="key">
+                {{ __('lychee.U2F') }}
+            </x-leftbar.leftbar-item>
+            @can(AlbumPolicy::CAN_SHARE_WITH_USERS, [App\Contracts\Models\AbstractAlbum::class, null])
+                <x-leftbar.leftbar-item href="{{ route('sharing') }}" wire:navigate icon="cloud">
+                    {{ __('lychee.SHARING') }}</x-leftbar.leftbar-item>
+            @endcan
+            @can(SettingsPolicy::CAN_SEE_LOGS, [App\Models\Configs::class])
+                <x-leftbar.leftbar-item href="{{ route('log-viewer.index') }}" icon="excerpt">
+                    {{ __('lychee.LOGS') }}
+                </x-leftbar.leftbar-item>
+                <x-leftbar.leftbar-item href="{{ route('jobs') }}" wire:navigate icon="project">
+                    {{ __('lychee.JOBS') }}
+                </x-leftbar.leftbar-item>
+            @endcan
+            @can(SettingsPolicy::CAN_SEE_DIAGNOSTICS, [App\Models\Configs::class])
+                <x-leftbar.leftbar-item href="{{ route('diagnostics') }}" wire:navigate icon="wrench">
+                    {{ __('lychee.DIAGNOSTICS') }}
+                </x-leftbar.leftbar-item>
+            @endcan
+            <x-leftbar.leftbar-item wire:click="openAboutModal" icon="info">
+                {{ __('lychee.ABOUT_LYCHEE') }}
+            </x-leftbar.leftbar-item>
+            <x-leftbar.leftbar-item wire:click="logout" icon="account-logout">
+                {{ __('lychee.SIGN_OUT') }}
+            </x-leftbar.leftbar-item>
+            @if ($has_dev_tools)
+                <li class="px-4 pt-14 pb-1">
+                    <span
+                        class="p-2 rounded-lg text-text-main-400 whitespace-nowrap text-base">
+                        Dev Tools
+                    </span>
+                </li>
+                @if ($clockwork_url !== null)
+                    <x-leftbar.leftbar-item href="{{ $clockwork_url }}" icon="telescope">Clockwork
+                        App</x-leftbar.leftbar-item>
+                @endif
+                @if ($doc_api_url !== null)
+                    <x-leftbar.leftbar-item href="{{ $doc_api_url }}" icon="document">Api
+                        Documentation</x-leftbar.leftbar-item>
+                @endif
+            @endif
+        </ul>
+    </div>
+</aside>
diff --git a/resources/views/livewire/components/modal.blade.php b/resources/views/livewire/components/modal.blade.php
new file mode 100644
index 00000000000..b24489f6bda
--- /dev/null
+++ b/resources/views/livewire/components/modal.blade.php
@@ -0,0 +1,22 @@
+<div>
+    @if ($isOpen)
+        <div class="basicModalContainer transition-opacity duration-1000 ease-in animate-fadeIn
+					bg-black/80 z-50 fixed flex items-center justify-center w-full
+					h-full top-0 left-0 box-border opacity-100 menu-shadow"
+            data-closable="true">
+            <div class="basicModal transition-opacity ease-in duration-1000
+						opacity-100 bg-gradient-to-b from-bg-300 to-bg-400
+						relative w-[500px] text-sm rounded-md text-text-main-400 animate-moveUp
+						"
+                role="dialog" x-on:click.away="$wire.closeModal()">
+                @livewire($type, compact('params'))
+                @if ($close_text !== '')
+                    <div class="basicModal__buttons">
+                        <x-forms.buttons.cancel wire:click="closeModal"
+                            class="border-t border-t-black/20 w-full hover:bg-white/[.02]">{{ Lang::get($close_text) }}</x-forms.buttons.cancel>
+                    </div>
+                @endif
+            </div>
+        </div>
+    @endif
+</div>
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..69d730baedf
--- /dev/null
+++ b/resources/views/livewire/context-menus/album-add.blade.php
@@ -0,0 +1,16 @@
+<div class="w-full relative">
+	<x-context-menu.item wire:click='openUploadModal' icon='image'>{{ __('lychee.UPLOAD_PHOTO') }}</x-context-menu.item>
+	<x-context-menu.separator />
+	<x-context-menu.item wire:click='openImportFromUrlModal' icon='link-intact'>{{ __('lychee.IMPORT_LINK') }}</x-context-menu.item>
+	@can(AlbumPolicy::CAN_IMPORT_FROM_SERVER, [App\Contracts\Models\AbstractAlbum::class])
+		@if(Configs::getValueAsString('dropbox_key') !== '')
+		<x-context-menu.item icon='dropbox' icon_class="ionicons">{{ __('lychee.IMPORT_DROPBOX') }}</x-context-menu.item>
+		@endif
+	<x-context-menu.item wire:click='openImportFromServerModal' icon='terminal'>{{ __('lychee.IMPORT_SERVER') }}</x-context-menu.item>
+	@endcan
+	<x-context-menu.separator />
+	<x-context-menu.item wire:click='openAlbumCreateModal' icon='folder'>{{ __('lychee.NEW_ALBUM') }}</x-context-menu.item>
+	@if($params[Params::PARENT_ID] === null)
+	<x-context-menu.item wire:click='openTagAlbumCreateModal' icon='tags'>{{ __('lychee.NEW_TAG_ALBUM') }}</x-context-menu.item>
+	@endif
+</div>
\ No newline at end of file
diff --git a/resources/views/livewire/context-menus/album-dropdown.blade.php b/resources/views/livewire/context-menus/album-dropdown.blade.php
new file mode 100644
index 00000000000..cc80f1c5a4d
--- /dev/null
+++ b/resources/views/livewire/context-menus/album-dropdown.blade.php
@@ -0,0 +1,10 @@
+<div class="w-full relative">
+	@if ($params['parentID'] !== null)
+	<x-context-menu.item wire:click='setAsCover' icon='folder-cover'>{{ __('lychee.SET_COVER') }}</x-context-menu.item>
+	@endif
+	<x-context-menu.item wire:click='rename' icon='pencil'>{{ __('lychee.RENAME') }}</x-context-menu.item>
+	<x-context-menu.item wire:click='merge' icon='collapse-left'>{{ __('lychee.MERGE') }}</x-context-menu.item>
+	<x-context-menu.item wire:click='move' icon='transfer'>{{ __('lychee.MOVE') }}</x-context-menu.item>
+	<x-context-menu.item wire:click='delete' icon='trash'>{{ __('lychee.DELETE') }}</x-context-menu.item>
+	<x-context-menu.item wire:click='download' icon='cloud-download'>{{ __('lychee.DOWNLOAD') }}</x-context-menu.item>
+</div>
\ No newline at end of file
diff --git a/resources/views/livewire/context-menus/albums-dropdown.blade.php b/resources/views/livewire/context-menus/albums-dropdown.blade.php
new file mode 100644
index 00000000000..bfa9e0db231
--- /dev/null
+++ b/resources/views/livewire/context-menus/albums-dropdown.blade.php
@@ -0,0 +1,7 @@
+<div class="w-full relative">
+	<x-context-menu.item wire:click='renameAll' icon='pencil'>{{ __('lychee.RENAME_ALL') }}</x-context-menu.item>
+	<x-context-menu.item wire:click='mergeAll' icon='collapse-left'>{{ __('lychee.MERGE_ALL') }}</x-context-menu.item>
+	<x-context-menu.item wire:click='moveAll' icon='transfer'>{{ __('lychee.MOVE_ALL') }}</x-context-menu.item>
+	<x-context-menu.item wire:click='deleteAll' icon='trash'>{{ __('lychee.DELETE_ALL') }}</x-context-menu.item>
+	<x-context-menu.item wire:click='downloadAll' icon='cloud-download'>{{ __('lychee.DOWNLOAD_ALL') }}</x-context-menu.item>
+</div>
\ No newline at end of file
diff --git a/resources/views/livewire/context-menus/photo-dropdown.blade.php b/resources/views/livewire/context-menus/photo-dropdown.blade.php
new file mode 100644
index 00000000000..d9224bd3b42
--- /dev/null
+++ b/resources/views/livewire/context-menus/photo-dropdown.blade.php
@@ -0,0 +1,15 @@
+<div class="w-full relative">
+	@if (!$is_starred)
+	<x-context-menu.item wire:click='star' icon_class='hover:fill-yello-400' icon='star'>{{ __('lychee.STAR') }}</x-context-menu.item>
+	@else
+	<x-context-menu.item wire:click='unstar' icon='star'>{{ __('lychee.UNSTAR') }}</x-context-menu.item>
+	@endif
+	<x-context-menu.item wire:click='tag' icon='tag'>{{ __('lychee.TAG') }}</x-context-menu.item>
+	<x-context-menu.item wire:click='setAsCover' icon='folder-cover'>{{ __('lychee.SET_COVER') }}</x-context-menu.item>
+	<x-context-menu.separator />
+	<x-context-menu.item wire:click='rename' icon='pencil'>{{ __('lychee.RENAME') }}</x-context-menu.item>
+	<x-context-menu.item wire:click='copyTo' icon='layers'>{{ __('lychee.COPY_TO') }}</x-context-menu.item>
+	<x-context-menu.item wire:click='move' icon='transfer'>{{ __('lychee.MOVE') }}</x-context-menu.item>
+	<x-context-menu.item wire:click='delete' icon='trash'>{{ __('lychee.DELETE') }}</x-context-menu.item>
+	<x-context-menu.item wire:click='download' icon='cloud-download'>{{ __('lychee.DOWNLOAD') }}</x-context-menu.item>
+</div>
\ 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 @@
+<div class="basicContext" style="left: 800px; top: 22px; transform-origin: 137px 0px; opacity: 1;">
+	<table aria-hidden="true"> {{-- Refactor me later to not use table --}}>
+			<tbody>
+
+<tr class="basicContext__item ">
+<td class="basicContext__data" data-num="0"><svg class="iconic "><use xlink:href="#fullscreen-enter"></use></svg>Open Original</td>
+</tr>
+
+<tr class="basicContext__item ">
+<td class="basicContext__data" data-num="1"><svg class="iconic "><use xlink:href="#cloud-download"></use></svg>Download</td>
+</tr>
+
+			</tbody>
+	</table>
+</div>
\ No newline at end of file
diff --git a/resources/views/livewire/context-menus/photos-dropdown.blade.php b/resources/views/livewire/context-menus/photos-dropdown.blade.php
new file mode 100644
index 00000000000..1ba0662dc77
--- /dev/null
+++ b/resources/views/livewire/context-menus/photos-dropdown.blade.php
@@ -0,0 +1,14 @@
+<div class="w-full relative">
+	@if(!$are_starred)
+	<x-context-menu.item wire:click='starAll' icon='star'>{{ __('lychee.STAR_ALL') }}</x-context-menu.item>
+	@else
+	<x-context-menu.item wire:click='unstarAll' icon='star'>{{ __('lychee.UNSTAR_ALL') }}</x-context-menu.item>
+	@endif
+	<x-context-menu.item wire:click='tagAll' icon='tag'>{{ __('lychee.TAG_ALL') }}</x-context-menu.item>
+	<x-context-menu.separator />
+	<x-context-menu.item wire:click='renameAll' icon='pencil'>{{ __('lychee.RENAME_ALL') }}</x-context-menu.item>
+	<x-context-menu.item wire:click='copyAllTo' icon='layers'>{{ __('lychee.COPY_ALL_TO') }}</x-context-menu.item>
+	<x-context-menu.item wire:click='moveAll' icon='transfer'>{{ __('lychee.MOVE_ALL') }}</x-context-menu.item>
+	<x-context-menu.item wire:click='deleteAll' icon='trash'>{{ __('lychee.DELETE_ALL') }}</x-context-menu.item>
+	<x-context-menu.item wire:click='downloadAll' icon='cloud-download'>{{ __('lychee.DOWNLOAD_ALL') }}</x-context-menu.item>
+</div>
\ No newline at end of file
diff --git a/resources/views/livewire/forms/add/create-tag.blade.php b/resources/views/livewire/forms/add/create-tag.blade.php
new file mode 100644
index 00000000000..d4bb4693caf
--- /dev/null
+++ b/resources/views/livewire/forms/add/create-tag.blade.php
@@ -0,0 +1,23 @@
+<div>
+    <div class="p-9">
+        <p class="mb-5 text-neutral-200 text-sm/4">{{ __('lychee.NEW_TAG_ALBUM') }}</p>
+        <form>
+            <div class="my-3 first:mt-0 last:mb-0">
+                <x-forms.inputs.text class="w-full" autocapitalize="off" wire:model="title"
+                    x-intersect="$el.focus()"
+                    placeholder="{{ __('lychee.UNTITLED') }}" :has_error="$errors->has('title')" />
+            </div>
+            <div class="my-3 first:mt-0 last:mb-0">
+                <x-forms.inputs.text class="w-full" autocapitalize="off" wire:model="tag"
+                    placeholder="{{ __('lychee.PHOTO_TAGS') }}" :has_error="$errors->has('tags')" />
+            </div>
+        </form>
+    </div>
+    <div class="flex w-full box-border">
+        <x-forms.buttons.cancel class="border-t border-t-bg-800 rounded-bl-md w-full"
+            wire:click="close">{{ __('lychee.CANCEL') }}</x-forms.buttons.cancel>
+        <x-forms.buttons.action class="border-t border-t-bg-800 rounded-br-md w-full"
+            @keydown.enter.window="$wire.submit()"
+            wire:click="submit">{{ __('lychee.CREATE_TAG_ALBUM') }}</x-forms.buttons.action>
+    </div>
+</div>
diff --git a/resources/views/livewire/forms/add/create.blade.php b/resources/views/livewire/forms/add/create.blade.php
new file mode 100644
index 00000000000..7911500290d
--- /dev/null
+++ b/resources/views/livewire/forms/add/create.blade.php
@@ -0,0 +1,19 @@
+<div>
+    <div class="p-9">
+        <p class="mb-5 text-neutral-200 text-sm/4">{{ __('lychee.TITLE_NEW_ALBUM') }}</p>
+        <form>
+            <div class="my-3 first:mt-0 last:mb-0">
+                <x-forms.inputs.text class="w-full" autocapitalize="off" wire:model="title"
+                    x-intersect="$el.focus()"
+                    placeholder="{{ __('lychee.UNTITLED') }}" :has_error="$errors->has('title')" />
+            </div>
+        </form>
+    </div>
+    <div class="flex w-full box-border">
+        <x-forms.buttons.cancel class="border-t border-t-bg-800 rounded-bl-md w-full"
+            wire:click="close">{{ __('lychee.CANCEL') }}</x-forms.buttons.cancel>
+        <x-forms.buttons.action class="border-t border-t-bg-800 rounded-br-md w-full"
+            @keydown.enter.window="$wire.submit()"
+            wire:click="submit">{{ __('lychee.CREATE_ALBUM') }}</x-forms.buttons.action>
+    </div>
+</div>
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..04b52ffa52f
--- /dev/null
+++ b/resources/views/livewire/forms/add/import-from-server.blade.php
@@ -0,0 +1,15 @@
+<div>
+	<div class="p-9">
+		<p class="mb-5 text-neutral-200 text-sm/4">This functionality is no longer available for the following reasons:
+			<ul class="pl-5">
+				<li class="list-decimal list-outside">Long process required to keep the browser window open.</li>
+				<li class="list-decimal list-outside">Sessions time-out were breaking the process.</li>
+				<li class="list-decimal list-outside">A more efficient command line alternative is available:<br>
+					<pre class="inline-block font-mono text-neutral-200">php artisan lychee:sync</pre></li>
+			</ul>
+		</p>
+	</div>
+	<div class="flex w-full box-border">
+		<x-forms.buttons.cancel class="border-t border-t-bg-800 rounded-bl-md w-full" wire:click="close">{{ __('lychee.CLOSE') }}</x-forms.buttons.cancel>
+	</div>
+</div>
\ No newline at end of file
diff --git a/resources/views/livewire/forms/add/import-from-server.old.blade.php b/resources/views/livewire/forms/add/import-from-server.old.blade.php
new file mode 100644
index 00000000000..9f175220d41
--- /dev/null
+++ b/resources/views/livewire/forms/add/import-from-server.old.blade.php
@@ -0,0 +1,47 @@
+<div>
+	<div class="p-9"
+		x-data="{
+			import_via_symlink: @entangle('form.import_via_symlink'),
+			delete_imported: @entangle('form.delete_imported'),
+			skip_duplicates: @entangle('form.skip_duplicates'),
+			resync_metadata: @entangle('form.resync_metadata')
+		}">
+		<p class="mb-5 text-neutral-200 text-sm/4">{{ __('lychee.UPLOAD_IMPORT_SERVER_INSTR') }}</p>
+		{{-- <div class="text-red-500 font-bold">@error('form.paths') {{ $message }} @enderror</div>
+		<div class="text-red-500 font-bold">@error('form.import_via_symlink') {{ $message }} @enderror</div>
+		<div class="text-red-500 font-bold">@error('form.delete_imported') {{ $message }} @enderror</div>
+		<div class="text-red-500 font-bold">@error('form.skip_duplicates') {{ $message }} @enderror</div>
+		<div class="text-red-500 font-bold">@error('form.resync_metadata') {{ $message }} @enderror</div> --}}
+		<form>
+			<div class="my-3 first:mt-0 last:mb-0">
+				<x-forms.inputs.text class="w-full" autocapitalize="off" wire:model="form.path" :has_error="$errors->has('form.paths.*')" x-intersect="$el.focus()" />
+			</div>
+			<div class='relative my-3 pl-9 transition-color duration-300' x-bind:class="import_via_symlink ? 'disabled' : 'text-neutral-200'">
+				<label class="font-bold block " for="server_import_dialog_delete_imported_check">{{ __('lychee.UPLOAD_IMPORT_DELETE_ORIGINALS') }}</label>
+				<x-forms.defaulttickbox id="server_import_dialog_delete_imported_check" x-model='delete_imported' x-bind:disabled="import_via_symlink" />
+				<p>{{ __('lychee.UPLOAD_IMPORT_DELETE_ORIGINALS_EXPL') }}</p>
+			</div>
+			<div class='relative my-3 pl-9 transition-color duration-300' x-bind:class="delete_imported ? 'disabled' : 'text-neutral-200'">
+				<label class="font-bold block " for="server_import_dialog_symlink_check">{{ __('lychee.UPLOAD_IMPORT_VIA_SYMLINK') }}</label>
+				<x-forms.defaulttickbox id="server_import_dialog_symlink_check" x-model='import_via_symlink' x-bind:disabled="delete_imported" />
+				<p>{{ __('lychee.UPLOAD_IMPORT_VIA_SYMLINK_EXPL') }}</p>
+			</div>
+			<div class='relative my-3 pl-9 transition-color duration-300 text-neutral-200'>
+				<label class="font-bold block " for="server_import_dialog_skip_check">{{ __('lychee.UPLOAD_IMPORT_SKIP_DUPLICATES') }}</label>
+				<x-forms.defaulttickbox id="server_import_dialog_skip_check" x-model='skip_duplicates' />
+				<p>{{ __('lychee.UPLOAD_IMPORT_SKIP_DUPLICATES_EXPL') }}</p>
+			</div>
+			<div class='relative my-3 pl-9 transition-color duration-300' x-bind:class="skip_duplicates ? 'text-neutral-200' : 'disabled'">
+				<label class="font-bold block " for="server_import_dialog_resync_check">{{ __('lychee.UPLOAD_IMPORT_RESYNC_METADATA') }}</label>
+				<x-forms.defaulttickbox id="server_import_dialog_resync_check" x-model='resync_metadata' x-bind:disabled="!skip_duplicates"  />
+				<p>{{ __('lychee.UPLOAD_IMPORT_RESYNC_METADATA_EXPL') }}</p>
+			</div>
+		</form>
+	</div>
+	<div class="flex w-full box-border">
+		<x-forms.buttons.cancel class="border-t border-t-bg-800 rounded-bl-md w-full" wire:click="close">{{ __('lychee.CANCEL') }}</x-forms.buttons.cancel>
+		<x-forms.buttons.action class="border-t border-t-bg-800 rounded-br-md w-full"
+			@keydown.enter.window="$wire.submit()"
+			wire:click="submit">{{ __('lychee.UPLOAD_IMPORT') }}</x-forms.buttons.action>
+	</div>
+</div>
\ 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
new file mode 100644
index 00000000000..1b9b0322c7d
--- /dev/null
+++ b/resources/views/livewire/forms/add/import-from-url.blade.php
@@ -0,0 +1,16 @@
+<div>
+	<div class="p-9" >
+		<p class="mb-5 text-neutral-200 text-sm/4">{{ __('lychee.UPLOAD_IMPORT_INSTR') }}</p>
+		<form>
+			<div class="my-3 first:mt-0 last:mb-0">
+				<x-forms.inputs.text class="w-full" x-intersect="$el.focus()" autocapitalize="off" wire:model="form.url" placeholder="https://" :has_error="$errors->has('form.urls.*')" />
+			</div>
+		</form>
+	</div>
+	<div class="flex w-full box-border">
+		<x-forms.buttons.cancel class="border-t border-t-bg-800 rounded-bl-md w-full" wire:click="close">{{ __('lychee.CANCEL') }}</x-forms.buttons.cancel>
+		<x-forms.buttons.action class="border-t border-t-bg-800 rounded-br-md w-full"
+			@keydown.enter.window="$wire.submit()"
+			wire:click="submit">{{ __('lychee.UPLOAD_IMPORT') }}</x-forms.buttons.action>
+	</div>
+</div>
\ No newline at end of file
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..3aad200583a
--- /dev/null
+++ b/resources/views/livewire/forms/add/upload.blade.php
@@ -0,0 +1,94 @@
+<div>
+    <div class="p-9" x-data="upload({{ $chunkSize }}, {{ $parallelism }})" x-on:drop="isDropping = false"
+        x-on:drop.prevent="($event) => {
+        if ($event.dataTransfer.files.length > 0) {
+            fileList = $event.dataTransfer.files;
+            fileList.forEach((file, index) => {
+                @this.set('uploads.' + index + '.fileName', file.name);
+                @this.set('uploads.' + index + '.fileSize', file.size);
+                @this.set('uploads.' + index + '.lastModified', file.lastModified);
+                @this.set('uploads.' + index + '.stage', 'uploading');
+                @this.set('uploads.' + index + '.progress', 0);
+                chnkStarts[index] = 0;
+            });
+            
+            start(@this);
+        }
+    }"
+        x-on:dragover.prevent="isDropping = true" x-on:dragleave.prevent="isDropping = false">
+        @if (count($uploads) === 0)
+            <div class="absolute top-0 bottom-0 left-0 right-0 z-30 flex items-center justify-center bg-primary-500 opacity-90"
+                x-show="isDropping">
+                <span class="text-3xl text-text-main-0">Release file to upload!</span>
+            </div>
+            <label
+                class="flex flex-col items-center justify-center hover:bg-bg-400 border border-bg-500 shadow cursor-pointer h-1/2 rounded-2xl p-6"
+                for="myFiles">
+                <h3 class="text-xl text-center">Click here to select files to upload</h3>
+                <em class="italic text-slate-400">(Or drag files to the page)</em>
+            </label>
+            <input type="file" id="myFiles" multiple
+                x-on:change="
+                fileList = [...$el.files];
+                fileList.forEach((file, index) => {
+                    @this.set('uploads.' + index + '.fileName', file.name);
+                    @this.set('uploads.' + index + '.fileSize', file.size);
+                    @this.set('uploads.' + index + '.lastModified', file.lastModified);
+                    @this.set('uploads.' + index + '.stage', 'uploading');
+                    @this.set('uploads.' + index + '.progress', 0);
+                    chnkStarts[index] = 0;
+                });
+                
+                start(@this);
+            "
+                class="hidden">
+        @else
+            <h1 class="text-center text-text-main-0 text-lg font-bold">{{ __('lychee.UPLOAD_UPLOADING') }}</h1>
+            <div class="overflow-y-auto rounded max-h-[20rem]">
+                @foreach ($uploads as $i => $upl)
+                    <div class="pt-2 pr-4 pl-4 pb-2 bg-bg-800">
+                        <label class="flow-root">
+                            <div class="float-left">{{ $upl['fileName'] }}</div>
+                            @switch($upl['stage'])
+                                @case('uploading')
+                                    <div class="float-right text-primary-400">{{ $upl['progress'] }}%</div>
+                                @break
+
+                                @case('processing')
+                                    <div class="float-right text-green-800">{{ __('lychee.UPLOAD_PROCESSING') }}</div>
+                                @break
+
+                                @case('done')
+                                    <div class="float-right text-green-600">{{ __('lychee.UPLOAD_FINISHED') }}</div>
+                                @break
+
+                                @case('skipped')
+                                    <div class="float-right text-orange-400">{{ __('lychee.UPLOAD_SKIPPED') }}</div>
+                                @break
+
+                                @case('error')
+                                    <div class="float-right text-danger-600 font-bold">{{ __('lychee.UPLOAD_FAILED') }}</div>
+                                @break
+
+                                @default
+                                    <div class="float-right">{{ $upl['stage'] }}</div>
+                            @endswitch
+                        </label>
+                        @if ($upl['stage'] === 'error')
+                        <div class="h-1 w-full bg-red-700"></div>
+                        <div class="text-text-main-400 text-left">
+                            {{ __('lychee.UPLOAD_FAILED_ERROR') }}
+                        </div>
+                        @elseif($upl['stage'] === 'done')
+                        <div class="h-1 w-full bg-green-600"></div>
+                        @else
+                        <div class="h-1 w-full bg-neutral-800">
+                            <div class="h-1 bg-primary-400" style="width: {{ $upl['progress'] }}%"></div>
+                        </div>
+                        @endif
+                    </div>
+                @endforeach
+            </div>
+        @endif
+    </div>
+</div>
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..ea53f9ed3e5
--- /dev/null
+++ b/resources/views/livewire/forms/album/delete-panel.blade.php
@@ -0,0 +1,6 @@
+<div class="text-neutral-200 text-sm p-9 max-w-3xl">
+	<p class="mb-4 text-center">{{ sprintf(__('lychee.DELETE_ALBUM_CONFIRMATION'), $title) }}</p>
+	<x-forms.buttons.danger class="rounded-md w-full" wire:click='delete'>
+		{{ __('lychee.DELETE_ALBUM_QUESTION') }}
+	</x-forms.buttons.danger>
+</div>
\ 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
new file mode 100644
index 00000000000..5f6f75db4ca
--- /dev/null
+++ b/resources/views/livewire/forms/album/delete.blade.php
@@ -0,0 +1,22 @@
+<div>
+    <div class="p-9">
+        <p class="mb-4 text-center">
+            @if ($num === 1)
+                {{ sprintf(__('lychee.DELETE_ALBUM_CONFIRMATION'), $title) }}
+            @else
+                {{ sprintf(__('lychee.DELETE_ALBUMS_CONFIRMATION'), $num) }}
+            @endif
+            {{-- TODO add confirmation by typing album name? --}}
+        </p>
+    </div>
+    <div class="flex w-full box-border">
+        <x-forms.buttons.cancel class="border-t border-t-bg-800 rounded-bl-md w-full" wire:click="close"
+            @keydown.escape.window="$wire.close()"
+            >
+            {{ $num === 1 ? __('lychee.KEEP_ALBUM') : __('lychee.KEEP_ALBUMS') }}
+        </x-forms.buttons.cancel>
+        <x-forms.buttons.danger class="rounded-md w-full" wire:click='delete'>
+            {{ $num === 1 ? __('lychee.DELETE_ALBUM_QUESTION') : __('lychee.DELETE_ALBUMS_QUESTION') }}
+        </x-forms.buttons.danger>
+    </div>
+</div>
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..cd285b75e7a
--- /dev/null
+++ b/resources/views/livewire/forms/album/merge.blade.php
@@ -0,0 +1,37 @@
+<div>
+    @if ($title !== null && $title !== '')
+        <div class="p-9">
+            <p class="mb-4 text-center">
+                @if ($num === 1)
+                    {{ sprintf(__('lychee.ALBUM_MERGE'), $titleMoved, $title) }}
+                @else
+                    {{ sprintf(__('lychee.ALBUMS_MERGE'), $title) }}
+                @endif
+            </p>
+        </div>
+        <div class="flex w-full box-border">
+            <x-forms.buttons.cancel class="border-t border-t-bg-800 rounded-bl-md w-full"
+                @keydown.escape.window="$wire.close()" wire:click="close">
+                {{ __('lychee.DONT_MERGE') }}
+            </x-forms.buttons.cancel>
+            <x-forms.buttons.action class="rounded-md w-full"
+                @keydown.enter.window="$wire.submit()" wire:click='submit'>
+                {{ __('lychee.MERGE_ALBUM') }}
+            </x-forms.buttons.action>
+        </div>
+    @else
+        <div class="p-9">
+            <div class="w-full">
+                <span class="font-bold">
+                    {{ __('lychee.MERGE_ALBUM') }} into
+                </span>
+            </div>
+            <livewire:forms.album.search-album lazy :parent_id="$parent_id" :lft="$lft" :rgt="$rgt" />
+        </div>
+        <div class="flex w-full box-border">
+            <x-forms.buttons.cancel class="border-t border-t-bg-800 rounded-bl-md w-full" wire:click="close">
+                {{ __('lychee.CANCEL') }}
+            </x-forms.buttons.cancel>
+        </div>
+    @endif
+</div>
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..9f83aabdf91
--- /dev/null
+++ b/resources/views/livewire/forms/album/move-panel.blade.php
@@ -0,0 +1,15 @@
+<div class="text-neutral-200 text-sm p-9 text-center w-full max-w-3xl min-h-[16rem]">
+	@if ($title !== null && $title !== '')
+	<p class="mb-4 text-center">{{ sprintf(__('lychee.ALBUM_MOVE'), $titleMoved, $title) }}</p>
+	<x-forms.buttons.action class="rounded-md w-full" wire:click='move'>
+		{{ __('lychee.MOVE_ALBUM') }}
+	</x-forms.buttons.action>
+	@else
+	<div class="w-full">
+		<div class="w-full">
+			<span class="font-bold">{{ "Move to" }}</span>
+		</div>
+		<livewire:forms.album.search-album lazy :parent_id="$parent_id" :lft="$lft" :rgt="$rgt" />
+	</div>
+	@endif
+</div>
\ 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..8f6667cf7bb
--- /dev/null
+++ b/resources/views/livewire/forms/album/move.blade.php
@@ -0,0 +1,37 @@
+<div>
+    @if ($title !== null && $title !== '')
+        <div class="p-9">
+            <p class="mb-4 text-center">
+                @if ($num === 1)
+                    {{ sprintf(__('lychee.ALBUM_MOVE'), $titleMoved, $title) }}
+                @else
+                    {{ sprintf(__('lychee.ALBUMS_MOVE'), $title) }}
+                @endif
+            </p>
+        </div>
+        <div class="flex w-full box-border">
+            <x-forms.buttons.cancel class="border-t border-t-bg-800 rounded-bl-md w-full"
+                @keydown.escape.window="$wire.close()" wire:click="close">
+                {{ __('lychee.NOT_MOVE_ALBUMS') }}
+            </x-forms.buttons.cancel>
+            <x-forms.buttons.action class="rounded-md w-full"
+                @keydown.enter.window="$wire.submit()" wire:click='submit'>
+                {{ $num === 1 ? __('lychee.MOVE_ALBUM') : __('lychee.MOVE_ALBUMS') }}
+            </x-forms.buttons.action>
+        </div>
+    @else
+        <div class="p-9">
+            <div class="w-full">
+                <span class="font-bold">
+                    {{ $num === 1 ? __('lychee.MOVE_ALBUM') : __('lychee.MOVE_ALBUMS') }} to
+                </span>
+            </div>
+            <livewire:forms.album.search-album lazy :parent_id="$parent_id" :lft="$lft" :rgt="$rgt" />
+        </div>
+        <div class="flex w-full box-border">
+            <x-forms.buttons.cancel class="border-t border-t-bg-800 rounded-bl-md w-full" wire:click="close">
+                {{ __('lychee.CANCEL') }}
+            </x-forms.buttons.cancel>
+        </div>
+    @endif
+</div>
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..36c48f62eb8
--- /dev/null
+++ b/resources/views/livewire/forms/album/properties.blade.php
@@ -0,0 +1,26 @@
+<div class="text-neutral-200 text-sm p-9 sm:p-4 xl:px-9 max-sm:w-full sm:min-w-[32rem] flex-shrink-0">
+	<form>
+        <div class="mb-4 h-12">
+            <p class="font-bold">{{ __('lychee.ALBUM_TITLE') }}:</p>
+            <x-forms.inputs.text wire:model='title' id="albumTitle" />
+            <x-forms.error-message field='title' />
+        </div>
+        <div class="my-4 h-56">
+            <p class="font-bold">{{ __('lychee.ALBUM_DESCRIPTION') }}:</p>
+            <x-forms.textarea class="w-full h-48" wire:model="description"  id="albumDescription"></x-forms.textarea>
+            <x-forms.error-message field='description' />
+        </div>
+        <div class="mt-4 h-10">
+            <span class="font-bold">{{ __('lychee.ALBUM_ORDERING') }}</span>
+            <x-forms.dropdown class="mx-2" :options="$this->photoSortingColumns" id="sorting_dialog_column_select" wire:model='sorting_column'/>
+            <x-forms.dropdown class="mx-2" :options="$this->sortingOrders" id="sorting_dialog_order_select" wire:model='sorting_order'/>
+        </div>
+        <div class="h-10">
+            <span class="font-bold">{{ __('lychee.ALBUM_SET_LICENSE') }}</span>
+            <x-forms.dropdown class="mx-2" :options="$this->licenses" id="license_dialog_select" wire:model='license'/>
+        </div>
+        <x-forms.buttons.action class="rounded w-full" wire:click='submit' >
+            {{ __('lychee.SAVE') }}
+        </x-forms.buttons.action>
+    </form>
+</div>
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..56d4c0602cf
--- /dev/null
+++ b/resources/views/livewire/forms/album/rename.blade.php
@@ -0,0 +1,21 @@
+<div>
+    <div class="p-9">
+        <p class="mb-5 text-neutral-200 text-sm/4">
+            {{ $num === 1 ? __('lychee.ALBUM_NEW_TITLE') : sprintf(__('lychee.ALBUMS_NEW_TITLE'), $num) }}
+        </p>
+        <form>
+            <div class="my-3 first:mt-0 last:mb-0">
+                <x-forms.inputs.text class="w-full" autocapitalize="off" wire:model="title" x-intersect="$el.focus()" 
+                    placeholder="{{ __('lychee.UNTITLED') }}" :has_error="$errors->has('title')" />
+            </div>
+        </form>
+    </div>
+    <div class="flex w-full box-border">
+        <x-forms.buttons.cancel class="border-t border-t-bg-800 rounded-bl-md w-full"
+            @keydown.escape.window="$wire.close()"
+            wire:click="close">{{ __('lychee.CANCEL') }}</x-forms.buttons.cancel>
+        <x-forms.buttons.action class="border-t border-t-bg-800 rounded-br-md w-full"
+            @keydown.enter.window="$wire.submit()"
+            wire:click="submit">{{ __('lychee.ALBUM_SET_TITLE') }}</x-forms.buttons.action>
+    </div>
+</div>
diff --git a/resources/views/livewire/forms/album/search-album.blade.php b/resources/views/livewire/forms/album/search-album.blade.php
new file mode 100644
index 00000000000..e62793931b0
--- /dev/null
+++ b/resources/views/livewire/forms/album/search-album.blade.php
@@ -0,0 +1,49 @@
+<div class="relative mt-3 w-full"  x-data="{ isOpen: true }" x-on:click.away="isOpen = false">
+	<input
+		wire:model.live.debounce.500ms="search"
+		type="text"
+		class="bg-neutral-800 text-sm rounded-full w-full px-4 pl-8 py-1 focus:outline-none focus:shadow-outline
+			placeholder:text-text-main-400"
+		placeholder="Search (Press '/' to focus)"
+		x-ref="search"
+		@keydown.window="
+			if (event.key === '/') {
+				event.preventDefault();
+				$refs.search.focus();
+			}
+		"
+		@focus="isOpen = true"
+		@keydown="isOpen = true"
+		@keydown.escape.window="isOpen = false"
+		@keydown.shift.tab="isOpen = false"
+	>
+	<div class="absolute top-0">
+		<svg class="fill-current w-4 text-text-main-400 mt-2 ml-2" viewBox="0 0 24 24">
+			<path d="M16.32 14.9l5.39 5.4a1 1 0 01-1.42 1.4l-5.38-5.38a8 8 0 111.41-1.41zM10 16a6 6 0 100-12 6 6 0 000 12z"/>
+		</svg>
+	</div>
+
+	<div wire:loading class="spinner top-0 right-0 mr-4 mt-3"></div>
+
+	<div class="z-50 absolute bg-neutral-800 text-xs rounded w-full mt-4"
+		x-show.transition.opacity="isOpen">
+		@if ($this->albumList->count() > 0)
+			<ul class=" max-h-[50vh] overflow-y-auto">
+				@foreach ($this->albumList as $result)
+					<li class="border-b border-neutral-700 cursor-pointer transition-all ease-in-out duration-300
+						hover:bg-gradient-to-b hover:from-primary-500 hover:to-primary-600 hover:text-text-main-0"
+						wire:click="$parent.setAlbum('{{ $result['id'] }}', '{{ $result['original'] }}')">
+						<a class="px-3 py-1 flex items-center"
+							@if ($loop->last) @keydown.tab="isOpen = false" @endif
+						>
+						<img src="{{ URL::asset($result['thumb']) }}" alt="poster" class=" w-4 rounded-sm">
+						<span class="ml-4 text-left">{{ $result['short_title'] }}</span>
+					</a>
+					</li>
+				@endforeach
+			</ul>
+		@else
+			<div class="px-3 py-3">No results for "{{ $search }}"</div>
+		@endif
+	</div>
+</div>
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..082281f889b
--- /dev/null
+++ b/resources/views/livewire/forms/album/share-with-line.blade.php
@@ -0,0 +1,20 @@
+<div class="w-full flex my-1" >
+	<p class="w-full flex align-middle">
+		@if($album_title !== '')
+		<span class="h-4 w-56 inline-block mt-1.5">{{ $album_title }}</span>
+		@endif
+		<span class="h-4 w-56 inline-block mt-1.5">{{ $username }}</span>
+		<span class="w-56 inline-block text-center">
+		<x-forms.tickbox title="User can access picture in full size"  wire:model.live='grants_full_photo_access' />
+		<x-forms.tickbox title="User can download the album/pictures" wire:model.live='grants_download' />
+		<x-forms.tickbox title="User can add other pictures to the album" wire:model.live='grants_upload' />
+		<x-forms.tickbox title="User can edit the album" wire:model.live='grants_edit' />
+		<x-forms.tickbox title="User can delete content from the album" wire:model.live='grants_delete' />
+		</span>
+		<a class="basicModal__button pt-0.5 pb-0.5 w-20 rounded flex-shrink
+			cursor-pointer inline-block font-bold text-center transition-colors ease-in-out select-none
+			text-red-800 hover:text-text-main-0 hover:bg-red-800"  wire:click="$parent.delete('{{ $perm->id }}')">
+			{{ __('lychee.DELETE') }}
+		</a>
+	</p>
+</div>
\ 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..c5b21df4a53
--- /dev/null
+++ b/resources/views/livewire/forms/album/share-with.blade.php
@@ -0,0 +1,114 @@
+<div class="text-neutral-200 text-sm p-9 sm:p-4 xl:px-9 max-sm:w-full sm:min-w-[40rem] flex-shrink-0">
+    <div class="flex flex-col">
+        <div class="w-full flex my-1 relative">
+            <div class="absolute top-0 right-0 peer">
+                <x-icons.iconic class=" text-neutral-200 px-0.5 w-4 h-4 mb-1" icon="question-mark" />
+            </div>
+            <ul
+                class="mt-1 p-4 peer-hover:block hidden top-4 right-4 absolute border-neutral-600 border border-solid bg-bg-700 z-20 drop-shadow">
+                <li class=""><x-icons.iconic class=" text-neutral-200 px-0.5 w-4 h-4 mb-1" icon="fullscreen-enter" />
+                    : grants full photo access</li>
+                <li class=""><x-icons.iconic class=" text-neutral-200 px-0.5 w-4 h-4 mb-1"
+                        icon="data-transfer-download" /> : grants download</li>
+                <li class=""><x-icons.iconic class=" text-neutral-200 px-0.5 w-4 h-4 mb-1"
+                        icon="data-transfer-upload" /> : grants upload</li>
+                <li class=""><x-icons.iconic class=" text-neutral-200 px-0.5 w-4 h-4 mb-1" icon="pencil" />
+                    : grants edit</li>
+                <li class=""><x-icons.iconic class=" text-neutral-200 px-0.5 w-4 h-4 mb-1" icon="trash" />
+                    : grants delete</li>
+            </ul>
+        </div>
+        @if (count($perms) > 0)
+            <div class="w-full flex my-1 border-b border-solid border-neutral-600 pb-3">
+                <p class="w-full flex align-middle">
+                    <span class="h-4 w-56 inline-block mt-2.5">{{ __('lychee.USERNAME') }}</span>
+                    <span class="h-4 w-56 inline-block text-center">
+                        <x-icons.iconic class=" text-neutral-200 px-2 w-8 h-8 mb-2" icon="fullscreen-enter" />
+                        <x-icons.iconic class=" text-neutral-200 px-2 w-8 h-8 mb-2" icon="data-transfer-download" />
+                        <x-icons.iconic class=" text-neutral-200 px-2 w-8 h-8 mb-2" icon="data-transfer-upload" />
+                        <x-icons.iconic class=" text-neutral-200 px-2 w-8 h-8 mb-2" icon="pencil" />
+                        <x-icons.iconic class=" text-neutral-200 px-2 w-8 h-8 mb-2" icon="trash" />
+                    </span>
+                </p>
+            </div>
+        @endif
+        @foreach ($perms as $perm)
+            <livewire:forms.album.share-with-line :$perm :key="$perm->id" />
+        @endforeach
+    </div>
+    <div class="mt-4" x-data="{ isSearchUserOpen: false }" x-on:click.away="isSearchUserOpen = false">
+        <form>
+            @if ($username !== null)
+                {{-- <p class="my-3 w-full">Select the rights granted: full photo access, download, upload, edit, and delete.</p> --}}
+                <div class="w-full flex my-1">
+                    <p class="w-full flex align-middle">
+                        <span class="h-4 w-56 inline-block mt-2.5"></span>
+                        <span class="h-4 w-56 inline-block text-center">
+                            <x-icons.iconic class=" text-neutral-200 px-2 w-8 h-8 mb-2" icon="fullscreen-enter" />
+                            <x-icons.iconic class=" text-neutral-200 px-2 w-8 h-8 mb-2" icon="data-transfer-download" />
+                            <x-icons.iconic class=" text-neutral-200 px-2 w-8 h-8 mb-2" icon="data-transfer-upload" />
+                            <x-icons.iconic class=" text-neutral-200 px-2 w-8 h-8 mb-2" icon="pencil" />
+                            <x-icons.iconic class=" text-neutral-200 px-2 w-8 h-8 mb-2" icon="trash" />
+                        </span>
+                    </p>
+                </div>
+                <span class="h-4 w-56 inline-block relative mt-2.5 cursor-pointer">{{ $username }} <a
+                        class="block absolute right-0 top-0" wire:click="clearUsername()">
+                        <x-icons.iconic class=" fill-red-800 w-4 h-4 mb-2" icon="x" /></a>
+                </span>
+                <span class="w-56 inline-block text-center">
+                    <x-forms.tickbox title="User can access picture in full size"
+                        wire:model.live='grants_full_photo_access' />
+                    <x-forms.tickbox title="User can download the album/pictures" wire:model.live='grants_download' />
+                    <x-forms.tickbox title="User can add other pictures to the album" wire:model.live='grants_upload' />
+                    <x-forms.tickbox title="User can edit the album" wire:model.live='grants_edit' />
+                    <x-forms.tickbox title="User can delete content from the album" wire:model.live='grants_delete' />
+                </span>
+                <x-forms.buttons.create class="rounded w-20"
+                    wire:click='add'>{{ __('lychee.ADD') }}</x-forms.buttons.action>
+                @else
+                    <p class="my-3 w-full">Select the users to share this album with: </p>
+                    <p class="relative">
+                        <input wire:model.live.debounce.500ms="search" type="text"
+                            class="bg-neutral-800 text-sm rounded-full w-56 px-2 pl-8 py-1 focus:outline-none focus:shadow-outline
+				placeholder:text-text-main-400"
+                            placeholder="Search (Press '/' to focus)" x-ref="search"
+                            @keydown.window="
+				if (event.key === '/') {
+					event.preventDefault();
+					$refs.search.focus();
+				}"
+                            @focus="isSearchUserOpen = true" @keydown="isSearchUserOpen = true"
+                            @keydown.escape.window="isSearchUserOpen = false"
+                            @keydown.shift.tab="isSearchUserOpen = false">
+                        <span class="absolute block top-0">
+                            <svg class="fill-current w-4 text-text-main-400 mt-2 ml-2" viewBox="0 0 24 24">
+                                <path
+                                    d="M16.32 14.9l5.39 5.4a1 1 0 01-1.42 1.4l-5.38-5.38a8 8 0 111.41-1.41zM10 16a6 6 0 100-12 6 6 0 000 12z" />
+                            </svg>
+                        </span>
+                    </p>
+                    <div wire:loading class="spinner top-0 right-0 mr-4 mt-3"></div>
+                    <div class="z-50 absolute bg-neutral-800 text-xs rounded w-56 mt-4"
+                        x-show.transition.opacity="isSearchUserOpen">
+                        @if (count($this->userList) > 0)
+                            <ul class=" max-h-[50vh] overflow-y-auto">
+                                @foreach ($this->userList as $result)
+                                    <li class="border-b border-neutral-700 cursor-pointer transition-all ease-in-out duration-300
+							hover:bg-gradient-to-b hover:from-primary-500 hover:to-primary-600 hover:text-text-main-0"
+                                        wire:click="select('{{ $result['id'] }}','{{ $result['username'] }}')">
+                                        <a class="px-1 py-1 flex items-center"
+                                            @if ($loop->last) @keydown.tab="isSearchUserOpen = false" @endif>
+                                            <span class="ml-4 text-left">{{ $result['username'] }}</span>
+                                        </a>
+                                    </li>
+                                @endforeach
+                            </ul>
+                        @else
+                            <div class="px-3 py-3">No results for "{{ $search }}"</div>
+                        @endif
+                    </div>
+            @endif
+        </form>
+    </div>
+</div>
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..9b84b1074a2
--- /dev/null
+++ b/resources/views/livewire/forms/album/transfer.blade.php
@@ -0,0 +1,11 @@
+<div class="text-neutral-200 text-sm p-9 text-center max-w-3xl">
+	<p class="mb-4 text-center">{{ 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) }}<br>{{ "This action can’t be undone!" }}</p>
+	<div class="mt-4 h-12">
+		<span class="font-bold">{{ "Transfer to" }}</span>
+		<x-forms.dropdown class="mx-2" :options="$this->users" wire:model='username'/>
+	</div>
+	<x-forms.buttons.danger class="rounded-md w-full" wire:click='transfer'>
+		{{ "Transfer ownership of album and photos" }}
+	</x-forms.buttons.danger>
+</div>
\ No newline at end of file
diff --git a/resources/views/livewire/forms/album/unlock-album.blade.php b/resources/views/livewire/forms/album/unlock-album.blade.php
new file mode 100644
index 00000000000..e17a54d16ff
--- /dev/null
+++ b/resources/views/livewire/forms/album/unlock-album.blade.php
@@ -0,0 +1,36 @@
+<div class="basicModalContainer transition-opacity duration-1000 ease-in animate-fadeIn
+    bg-black/80 fixed flex items-center justify-center w-full h-full top-0 left-0 box-border opacity-100"
+    data-closable="true" >
+    <div class="basicModal transition-opacity ease-in duration-1000
+        opacity-100 bg-gradient-to-b from-bg-300 to-bg-400
+        relative w-[500px] text-sm rounded-md text-text-main-400 animate-moveUp"
+        role="dialog"
+        >
+        <div class="flex flex-wrap p-9 gap-5 justify-center align-top text-text-main-0/80">
+            <x-forms.error-message field='password' />
+            <form class="" wire:submit="submit">
+                <div class="my-4 mx-0">
+                    <p class="text-center">
+                        {{ __('lychee.ALBUM_PASSWORD_REQUIRED') }}
+                    </p>
+                    <x-forms.inputs.password class="w-full" autocomplete="album-password"
+                        x-intersect="$el.focus()" 
+                        placeholder="{{ __('lychee.PASSWORD') }}"
+                        wire:model="password"
+                        wire:keydown.enter="submit"
+                         />
+                </div>
+            </form>
+        </div>
+        <div class="flex w-full box-border">
+            <x-forms.buttons.cancel class="border-t border-t-bg-800 rounded-bl-md w-full"
+                @keydown.escape.window="$parent.back()" x-on:click="$parent.back()">
+                {{ __('lychee.CANCEL') }}
+            </x-forms.buttons.cancel>
+            <x-forms.buttons.action class="border-t border-t-bg-800 rounded-br-md w-full"
+                @keydown.enter.window="$wire.submit()" wire:click="submit">
+                {{ __('lychee.ENTER') }}
+            </x-forms.buttons.action>
+        </div>
+    </div>
+</div>
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..4f3cb7e7258
--- /dev/null
+++ b/resources/views/livewire/forms/album/visibility.blade.php
@@ -0,0 +1,48 @@
+<div class="text-neutral-200 text-sm p-4 xl:px-9 sm:min-w-[32rem]">
+	<form>
+		<div class="h-12 mb-4">
+			<label for="pp_dialog_public_check" class="font-bold">{{ __('lychee.ALBUM_PUBLIC') }}</label>
+			<x-forms.toggle id="pp_dialog_public_check" wire:model.live="is_public" />
+			<p class="my-1.5">{{ __('lychee.ALBUM_PUBLIC_EXPL') }}</p>
+		</div>
+		<div @class(['relative h-12 my-4 pl-9 transition-color duration-300', 
+			'text-text-main-400'=> !$is_public,
+			'text-neutral-200' => $is_public ])>
+			<label class="font-bold block " for="pp_dialog_full_check">{{ __('lychee.ALBUM_FULL') }}</label>
+			<x-forms.defaulttickbox id="pp_dialog_full_check" wire:model.live='grants_full_photo_access' :disabled="!$is_public" />
+			<p class="my-1.5">{{ __('lychee.ALBUM_FULL_EXPL') }}</p>
+		</div>
+		<div @class(['relative h-12 my-4 pl-9 transition-color duration-300', 
+			'text-text-main-400'=> !$is_public,
+			'text-neutral-200' => $is_public ])>
+			<label class="font-bold block " for="pp_dialog_link_check">{{ __('lychee.ALBUM_HIDDEN') }}</label>
+			<x-forms.defaulttickbox id="pp_dialog_link_check" wire:model.live='is_link_required' :disabled="!$is_public" />
+			<p class="my-1.5">{{ __('lychee.ALBUM_HIDDEN_EXPL') }}</p>
+		</div>
+		<div @class(['relative h-12 my-4 pl-9 transition-color duration-300', 
+			'text-text-main-400'=> !$is_public,
+			'text-neutral-200' => $is_public ])>
+			<label class="font-bold block " for="pp_dialog_downloadable_check">{{ __('lychee.ALBUM_DOWNLOADABLE') }}</label>
+			<x-forms.defaulttickbox id="pp_dialog_downloadable_check" wire:model.live='grants_download' :disabled="!$is_public" />
+			<p class="my-1.5">{{ __('lychee.ALBUM_DOWNLOADABLE_EXPL') }}</p>
+		</div>
+		<div @class(['relative h-12 my-4 pl-9 transition-color duration-300', 
+			'text-text-main-400'=> !$is_public,
+			'text-neutral-200' => $is_public ])>
+			<label class="font-bold block " for="pp_dialog_password_check">{{ __('lychee.ALBUM_PASSWORD_PROT') }}</label>
+			<x-forms.defaulttickbox id="pp_dialog_password_check" wire:model.live='is_password_required' :disabled="!$is_public" />
+			<p class="my-1.5">{{ __('lychee.ALBUM_PASSWORD_PROT_EXPL') }}</p>
+			<div @class(["hidden" => !$is_password_required])>
+				<x-forms.inputs.text wire:model.live.debounce.500ms='password' placeholder="{{ __('lychee.ALBUM_PASSWORD') }}" />
+			</div>
+		</div>
+	</form>
+	<hr class="block my-6 w-full border-t border-solid border-black/30">
+	<form>
+		<div class="relative h-12 my-4 transition-color duration-300">
+			<label for="pp_dialog_nsfw_check" class="font-bold">{{ __('lychee.ALBUM_NSFW') }}</label>
+			<x-forms.toggle id="pp_dialog_nsfw_check" wire:model.live="is_nsfw" />
+			<p class="my-1.5">{{ __('lychee.ALBUM_NSFW_EXPL') }}</p>
+		</div>
+	</form>
+</div>
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..5da2e09ba77
--- /dev/null
+++ b/resources/views/livewire/forms/confirms/save-all.blade.php
@@ -0,0 +1,11 @@
+<div @keydown.enter.window="$wire.confirm()">
+	<div class="p-9">
+		<p class="text-red-700 text-xl font-bold capitalize text-center">
+			{{ __('lychee.SETTINGS_ADVANCED_SAVE') }}
+		</p>
+	</div>
+	<div class="flex w-full box-border">
+		<x-forms.buttons.cancel class="border-t border-t-bg-800 rounded-bl-md w-full" wire:click="close">{{ __('lychee.CANCEL') }}</x-forms.buttons.cancel>
+		<x-forms.buttons.danger class="border-t border-t-bg-800 rounded-br-md w-full" wire:click="confirm">{{ __('lychee.CONFIRM') }}</x-forms.buttons.action>
+	</div>
+</div>
\ 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..ebcbb5f4d5b
--- /dev/null
+++ b/resources/views/livewire/forms/default.blade.php
@@ -0,0 +1,29 @@
+<div>
+	<div class="p-9">
+		<p class="mb-5 text-neutral-200">{{ $title }}</p>
+		<form>
+		@foreach($form as $f => $v)
+			{{-- Only display the allowed forms --}}
+			@if(!in_array($f, $formHidden, true))
+				@if (is_string($f))
+					<div class="my-3 first:mt-0 last:mb-0">
+						<x-forms.inputs.text
+						:has_error="$errors->has('form.' . $f)"
+						autocomplete="on" placeholder="{{ $formLocale[$f] }}"
+						autocapitalize="off"
+						wire:model="form.{{ $f }}"
+						/>
+						<x-forms.error-message :field="'form.' . $f" />
+					</div>
+				@else
+					{{ $f }} not supported yet.
+				@endif
+			@endif
+		@endforeach
+		</form>
+	</div>
+	<div class="flex w-full box-border">
+		<x-forms.buttons.cancel class="border-t border-t-bg-800 rounded-bl-md w-full" wire:click="close">{{ $cancel }}</x-forms.buttons.cancel>
+		<x-forms.buttons.action class="border-t border-t-bg-800 rounded-br-md w-full" wire:click="submit">{{ $validate }}</x-forms.buttons.action>
+	</div>
+</div>
\ No newline at end of file
diff --git a/resources/views/livewire/forms/photo/copyTo.blade.php b/resources/views/livewire/forms/photo/copyTo.blade.php
new file mode 100644
index 00000000000..251f40f4e5b
--- /dev/null
+++ b/resources/views/livewire/forms/photo/copyTo.blade.php
@@ -0,0 +1,16 @@
+<div>
+    <div class="p-9">
+        <p>
+            @if ($num === 1)
+                {{ sprintf('Copy %s to:', $title) }}
+            @else
+                {{ sprintf('Copy %d photos to:', $num) }}
+            @endif
+        </p>
+        <livewire:forms.album.search-album lazy :parent_id="$parent_id" />
+    </div>
+    <div class="flex w-full box-border">
+        <x-forms.buttons.cancel class="border-t border-t-bg-800 rounded-bl-md w-full"
+            wire:click="close">{{ __('lychee.CANCEL') }}</x-forms.buttons.cancel>
+    </div>
+</div>
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..ee2852bd799
--- /dev/null
+++ b/resources/views/livewire/forms/photo/delete.blade.php
@@ -0,0 +1,21 @@
+<div>
+    <div class="p-9">
+        <p>
+            @if ($num === 1)
+                {{ sprintf(__('lychee.PHOTO_DELETE_CONFIRMATION'), $title) }}
+            @else
+                {{ sprintf(__('lychee.PHOTO_DELETE_ALL'), $num) }}
+            @endif
+        </p>
+    </div>
+    <div class="flex w-full box-border">
+        <x-forms.buttons.cancel class="border-t border-t-bg-800 rounded-bl-md w-full"
+            @keydown.escape.window="$wire.close()" wire:click="close">
+            {{ __('lychee.PHOTO_KEEP') }}
+        </x-forms.buttons.cancel>
+        <x-forms.buttons.danger class="border-t border-t-bg-800 rounded-br-md w-full"
+            @keydown.enter.window="$wire.submit()" wire:click="submit">
+            {{ $num === 1 ? __('lychee.PHOTO_DELETE') : __('lychee.DELETE_ALL') }}
+        </x-forms.buttons.danger>
+    </div>
+</div>
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..859635c4930
--- /dev/null
+++ b/resources/views/livewire/forms/photo/download.blade.php
@@ -0,0 +1,9 @@
+<div>
+	<x-gallery.photo.download :photo="$this->photo" />
+	<div class="flex w-full box-border">
+		<x-forms.buttons.cancel class="border-t border-t-bg-800 rounded-bl-md w-full"
+			@keydown.enter.window="$wire.close()" wire:click="close">
+			{{ __('lychee.CANCEL' ) }}
+		</x-forms.buttons.cancel>
+	</div>
+</div>
\ No newline at end of file
diff --git a/resources/views/livewire/forms/photo/move.blade.php b/resources/views/livewire/forms/photo/move.blade.php
new file mode 100644
index 00000000000..97c368823ba
--- /dev/null
+++ b/resources/views/livewire/forms/photo/move.blade.php
@@ -0,0 +1,16 @@
+<div>
+    <div class="p-9">
+        <p>
+            @if ($num === 1)
+                {{ sprintf('Move %s to:', $title) }}
+            @else
+                {{ sprintf('Move %d photos to:', $num) }}
+            @endif
+        </p>
+        <livewire:forms.album.search-album lazy :parent_id="$parent_id" />
+    </div>
+    <div class="flex w-full box-border">
+        <x-forms.buttons.cancel class="border-t border-t-bg-800 rounded-bl-md w-full"
+            wire:click="close">{{ __('lychee.CANCEL') }}</x-forms.buttons.cancel>
+    </div>
+</div>
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..03d1fc82c4e
--- /dev/null
+++ b/resources/views/livewire/forms/photo/rename.blade.php
@@ -0,0 +1,23 @@
+<div>
+    <div class="p-9">
+        <p class="mb-5 text-neutral-200 text-sm/4">
+            {{ $num === 1 ? __('lychee.PHOTO_NEW_TITLE') : sprintf(__('lychee.PHOTOS_NEW_TITLE'), $num) }}
+        </p>
+        <form>
+            <div class="my-3 first:mt-0 last:mb-0">
+                <x-forms.inputs.text class="w-full" autocapitalize="off" wire:model="title" x-intersect="$el.focus()"
+                    placeholder="{{ __('lychee.UNTITLED') }}" :has_error="$errors->has('title')" />
+            </div>
+        </form>
+    </div>
+    <div class="flex w-full box-border">
+        <x-forms.buttons.cancel class="border-t border-t-bg-800 rounded-bl-md w-full"
+            @keydown.escape.window="$wire.close()" wire:click="close">
+            {{ __('lychee.CANCEL') }}
+        </x-forms.buttons.cancel>
+        <x-forms.buttons.action class="border-t border-t-bg-800 rounded-br-md w-full"
+            @keydown.enter.window="$wire.submit()" wire:click="submit">
+            {{ $num === 1 ? __('lychee.RENAME') : __('lychee.RENAME_ALL') }}
+        </x-forms.buttons.action>
+    </div>
+</div>
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..645de5495b9
--- /dev/null
+++ b/resources/views/livewire/forms/photo/tag.blade.php
@@ -0,0 +1,29 @@
+<div>
+    <div class="p-9">
+        <p class="mb-5 text-neutral-200 text-sm/4">
+            {{ $num === 1 ? __('lychee.PHOTO_NEW_TAGS') : sprintf(__('lychee.PHOTOS_NEW_TAGS'), $num) }}
+        </p>
+        <form>
+            <div class="my-3 first:mt-0 last:mb-0">
+                <x-forms.inputs.text class="w-full" autocapitalize="off" wire:model="tag" x-intersect="$el.focus()" 
+                    placeholder="{{ __('lychee.NO_TAGS') }}" :has_error="$errors->has('tags')" />
+            </div>
+            <div class='relative h-12 my-4 pl-9 transition-color duration-300'>
+                <label class="block text-neutral-200"
+                    for="pp_shall_override_check">{{ __('lychee.TAGS_OVERRIDE_INFO') }}</label>
+                <x-forms.defaulttickbox id="pp_shall_override_check" wire:model='shall_override' />
+            </div>
+
+        </form>
+    </div>
+    <div class="flex w-full box-border">
+        <x-forms.buttons.cancel class="border-t border-t-bg-800 rounded-bl-md w-full"
+            @keydown.escape.window="$wire.close()" wire:click="close">
+            {{ __('lychee.CANCEL') }}
+        </x-forms.buttons.cancel>
+        <x-forms.buttons.action class="border-t border-t-bg-800 rounded-br-md w-full"
+            @keydown.enter.window="$wire.submit()" wire:click="submit">
+            {{ __('lychee.PHOTO_SET_TAGS') }}
+        </x-forms.buttons.action>
+    </div>
+</div>
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..c8b0e777e42
--- /dev/null
+++ b/resources/views/livewire/forms/profile/get-api-token.blade.php
@@ -0,0 +1,22 @@
+<div class="p-9">
+    <form>
+        <label for="token-dialog-token">Token</label>
+        <input @disabled($isDisabled) class="mx-2 w-2/3 bg-transparent pt-1 pb-0 px-0.5 h-7
+            border-b border-b-solid focus:border-b-primary-400 border-b-neutral-800
+             disabled:italic disabled:text-center text-neutral-200 disabled:text-text-main-400
+            " value="{{ $token }}" @readonly(true) type="text" />
+
+        <div class="inline">
+            <a id="button_reset_token" class='cursor-pointer' title='{{ __('lychee.RESET') }}' wire:click='resetToken'>
+                <x-icons.iconic class='my-0 ml-1 w-4 h-4 ionicons  hover:fill-primary-500' icon='reload' />
+            </a>
+            {{-- <a id="button_copy_token" @class(['button' , 'hidden'=>$isDisabled]) title='{{ __('lychee.URL_COPY_TO_CLIPBOARD') }}'>
+                <x-icons.iconic class='my-0 ml-1 ionicons' icon='copy' />
+            </a> --}}
+            <a id="button_disable_token" tile='{{ __('lychee.DISABLE_TOKEN_TOOLTIP') }}'
+                wire:click='disableToken' @class(['cursor-pointer' , 'hidden'=>$isDisabled]) >
+                <x-icons.iconic class='w-4 h-4 my-0 ml-1 ionicons hover:fill-red-700' icon='ban' />
+            </a>
+        </div>
+    </form>
+</div>
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..c35baac8963
--- /dev/null
+++ b/resources/views/livewire/forms/profile/manage-second-factor.blade.php
@@ -0,0 +1,4 @@
+<div class="u2f_view_line flex">
+	<x-forms.inputs.text class="w-full mt-4" wire:model.live.debounce.500ms="alias" :$has_error />
+	<x-forms.buttons.danger wire:click="$parent.delete('{{ $credential->id }}')" class="w-1/4 rounded-r-md">{{ __('lychee.DELETE') }}</x-forms.buttons.danger>
+</div>
\ 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..d4041d697ec
--- /dev/null
+++ b/resources/views/livewire/forms/profile/set-login.blade.php
@@ -0,0 +1,27 @@
+<div class="setLogin my-10">
+    <form>
+        <div class="py-5">
+            {{ __('lychee.PASSWORD_TITLE') }}
+            <x-forms.inputs.password class="w-full mt-2" wire:model="oldPassword" placeholder="{{ __('lychee.PASSWORD_CURRENT') }}"
+            :has_error="$errors->has('oldPassword')" />
+            <x-forms.error-message field='oldPassword' />
+        </div>
+        <div>
+            {{ __('lychee.PASSWORD_TEXT') }}
+            <x-forms.inputs.text class="w-full mt-2" wire:model="username" placeholder="{{ __('lychee.LOGIN_USERNAME') }}" :has_error="$errors->has('username')" />
+            <x-forms.error-message field='username' />
+            <x-forms.inputs.password class="mt-2" wire:model="password" placeholder="{{ __('lychee.LOGIN_PASSWORD') }}" :has_error="$errors->has('password')" />
+            <x-forms.error-message field='password' />
+            <x-forms.inputs.password class="mt-2" wire:model="password_confirmation" placeholder="{{ __('lychee.LOGIN_PASSWORD_CONFIRM') }}" :has_error="$errors->has('confirm')" />
+            <x-forms.error-message field='password_confirmation' />
+        </div>
+        <div class="basicModal__buttons flex">
+            <x-forms.buttons.action wire:click="submit" wire:loading.attr="disabled" class="rounded-md w-full">
+                {{ __('lychee.PASSWORD_CHANGE') }}
+            </x-forms.buttons.action>
+            <x-forms.buttons.action wire:click="openApiTokenModal" class="rounded-md w-full">
+                {{ __('lychee.TOKEN_BUTTON') }}
+            </x-forms.buttons.action>
+        </div>
+    </form>
+</div>
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 @@
+<div class="my-7">
+    <p class="w-full">
+        {{ $begin }}
+		<x-forms.dropdown wire:model.live="value1" :options="$this->options1" />
+        {{ $middle }}
+		<x-forms.dropdown wire:model.live="value2" :options="$this->options2" />
+        {{ $end }}
+    </p>
+</div>
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 @@
+<div class="my-4">
+	<p>
+		{{ $description }}
+		<x-forms.dropdown wire:model.live="value" :options="$this->options" />
+	</p>
+</div>
\ 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..8bc5b320e6f
--- /dev/null
+++ b/resources/views/livewire/forms/settings/input.blade.php
@@ -0,0 +1,9 @@
+<div class="my-8">
+	<p class="m-0 w-full text-text-main-400">
+		{!! $description !!}
+		<x-forms.inputs.text class="mt-2 w-full" placeholder="{{ $placeholder }}" wire:model="value" />
+	</p>
+	<div class="basicModal__buttons w-full">
+		<x-forms.buttons.action class="rounded-md w-full" wire:click="save">{{ $action }}</x-forms.buttons.action>
+	</div>
+</div>
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 @@
+<div class="my-7">
+	<p class="pb-2">
+		{{ $description }}
+		<x-forms.toggle wire:model.live="flag" />
+	</p>
+	@if($footer !== '')
+	<p>
+		{!! $footer !!}
+	</p>
+	@endif
+</div>
diff --git a/resources/views/livewire/modals/about.blade.php b/resources/views/livewire/modals/about.blade.php
new file mode 100644
index 00000000000..ba35095b23c
--- /dev/null
+++ b/resources/views/livewire/modals/about.blade.php
@@ -0,0 +1,27 @@
+<div class="p-9 text-neutral-200">
+	<h1 class="mb-6 text-center text-xl font-bold text-text-main-0">
+		Lychee
+		<span class="version-number">{{ $version }}</span>
+		@if($is_new_release_available)
+			<span class="text-sm font-normal up-to-date-release text-center">
+				– <a target="_blank"
+						class=" border-b-neutral-200 border-b-[1px] border-dashed"
+						rel="noopener"
+						href="https://github.com/LycheeOrg/Lychee/releases"
+						data-tabindex="-1">{{ __('lychee.UPDATE_AVAILABLE') }}</a>
+			</span>
+		@elseif($is_git_update_available)
+			<span class="text-sm font-normal up-to-date-git">
+				– <a target="_blank"
+						class=" border-b-neutral-200 border-b-[1px] border-dashed"
+						rel="noopener"
+						href="https://github.com/LycheeOrg/Lychee"
+						data-tabindex="-1">{{ __('lychee.UPDATE_AVAILABLE') }}</a>
+			</span>
+		@endif
+	</h1>
+	<h2 class="my-6 font-bold text-text-main-0">{{__("lychee.ABOUT_SUBTITLE") }}</h2>
+	<p class="about-desc">
+		{!! sprintf(__("lychee.ABOUT_DESCRIPTION"), "https://LycheeOrg.github.io") !!}
+	</p>
+</div>
diff --git a/resources/views/livewire/modals/login.blade.php b/resources/views/livewire/modals/login.blade.php
new file mode 100644
index 00000000000..c679d55a23f
--- /dev/null
+++ b/resources/views/livewire/modals/login.blade.php
@@ -0,0 +1,34 @@
+<div>
+	<div class="p-9">
+		<x-forms.error-message field='wrongLogin' />
+		<form class="" wire:submit="submit">
+			<div class="mb-4 mx-0">
+				<x-forms.inputs.text class="w-full" autocomplete="on"
+					autofocus
+					x-intersect="$el.focus()"
+					placeholder="{{ __('lychee.USERNAME') }}"
+					autocapitalize="off"
+					wire:model="username" />
+			</div>
+			<div class="my-4 mx-0">
+				<x-forms.inputs.password class="w-full" autocomplete="current-password"
+					placeholder="{{ __('lychee.PASSWORD') }}"
+					wire:model="password"
+					wire:keydown.enter="submit"
+					 />
+			</div>
+		</form>
+		<p class="version text-xs text-right text-neutral-200">
+			Lychee
+			@if($version !== null) <span class="version-number">{{ $version }}</span> @endif
+			@if($is_new_release_available) <x-update-status href="https://github.com/LycheeOrg/Lychee/releases" />
+			@elseif($is_git_update_available) <x-update-status href="https://github.com/LycheeOrg/Lychee" />
+			@endif
+		</p>
+	</div>
+	<div class="flex w-full box-border">
+		<x-forms.buttons.cancel
+	 		class="border-t border-t-bg-800 rounded-bl-md w-full" x-on:click="$wire.dispatch('login-close')">{{ __('lychee.CANCEL') }}</x-forms.buttons.cancel>
+		<x-forms.buttons.action class="border-t border-t-bg-800 rounded-br-md w-full" wire:click="submit">{{ __('lychee.SIGN_IN') }}</x-forms.buttons.action>
+	</div>
+</div>
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 @@
+<p class="font-mono">
+    {{ $title }}
+    {{ str_repeat('-', Str::length($title)) }}
+    @forelse($this->data as $line)
+    <span class="{{ $line['color'] }}">{{ $line['type'] }}</span> {{ $line['line']  }}
+    @empty
+    {{ $error_msg }}
+    @endforelse
+</p>
\ 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..98a0761dbb8
--- /dev/null
+++ b/resources/views/livewire/modules/diagnostics/pre.blade.php
@@ -0,0 +1,9 @@
+<p class="font-mono">
+    {{ $title }}
+    {{ str_repeat('-', Str::length($title)) }}
+    @forelse($this->data as $line)
+    {{ $line }}
+    @empty
+    {{ $this->errorMessage }}
+    @endforelse
+</p>
\ No newline at end of file
diff --git a/resources/views/livewire/modules/diagnostics/with-action-call.blade.php b/resources/views/livewire/modules/diagnostics/with-action-call.blade.php
new file mode 100644
index 00000000000..bdf34595ec8
--- /dev/null
+++ b/resources/views/livewire/modules/diagnostics/with-action-call.blade.php
@@ -0,0 +1,16 @@
+<div><p class="font-mono">
+    {{ $title }}
+    {{ str_repeat('-', Str::length($title)) }}
+@if(count($result) > 0)@foreach ($result as $resultLine)
+        {{ $resultLine }}
+@endforeach
+@else
+        <a wire:click="do" wire:loading.remove class="basicModal__button
+    ml-5
+    pt-3 pb-4 flex-shrink border-t border-t-bg-800 w-96
+    cursor-pointer inline-block font-bold text-center transition-colors select-none text-primary-500
+    hover:bg-primary-500 hover:text-text-main-0 rounded-md
+">{{ $action }}</a><span wire:loading class="text-primary-500 font-bold">{{ __('lychee.LOADING') }} ...</span>
+@endif
+</p>
+</div>
\ 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..2f2481054ac
--- /dev/null
+++ b/resources/views/livewire/modules/gallery/sensitive-warning.blade.php
@@ -0,0 +1,14 @@
+<div id="sensitive_warning" class="
+	{{ $isBlurred ? 'backdrop-blur-lg' : 'bg-red-950' }}
+	{{ $isOpen ? 'flex' : 'hidden' }}
+	flex-col align-middle justify-center text-center text-text-main-0 absolute top-0 left-0 h-full w-full"
+	wire:click="close">
+	@if($text === '')
+	<div class="w-full flex justify-center">
+	<h1 class="text-xl font-bold border-solid border-b-2 border-white mb-3 w-max">{{ __('lychee.NSFW_HEADER') }}</h1></div>
+	<p class="text-base">{{ __('lychee.NSFW_EXPLANATION') }}</p>
+	<p class="text-base">{{ __('lychee.TAP_CONSENT') }}</p>
+	@else
+	{!! $text !!}
+	@endif
+</div>
\ 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..8ae6b7f9e4e
--- /dev/null
+++ b/resources/views/livewire/modules/profile/second-factor.blade.php
@@ -0,0 +1,31 @@
+<div class="u2f_view my-10" 
+	x-data="registerWebAuthn('{{ __("lychee.U2F_REGISTRATION_SUCCESS") }}', '{{ __("lychee.ERROR_TEXT") }}')"
+	>
+	{{-- 
+	'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_CREDENTIALS_DELETED' => 'Credentials deleted!',
+	--}}
+	<div class="u2f_view_line border-b border-solid border-neutral-600 pb-3 mb-2">
+		<p>
+			<span class="text text-sm font-bold">
+				{{ __('lychee.U2F_CREDENTIALS') }}
+			</span>
+		</p>
+	</div>
+	@forelse ($this->credentials as $credential)
+		<livewire:forms.profile.manage-second-factor :$credential key="{{ $credential->id }}" />
+	@empty
+		<div class="u2f_view_line pb-9">
+			<p class="single">Credentials list is empty!</p>
+		</div>
+	@endforelse
+	<div class="w-full text-text-main-0/80 text-lg font-bold" x-show="isWebAuthnUnavailable()" x-cloak>
+		<h1 class="p-3 text-center w-full">{{ __('lychee.U2F_NOT_SECURE') }}</h1>
+	</div>
+	<div class="u2f_view_line" x-show="!isWebAuthnUnavailable()" x-cloak>
+		<x-forms.buttons.create class="rounded-md w-full" x-on:click='register()' >Register new device.</x-forms.buttons.create>
+	</div>
+</div>
\ No newline at end of file
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..f4c69f422a7
--- /dev/null
+++ b/resources/views/livewire/modules/users/user-line.blade.php
@@ -0,0 +1,15 @@
+<div class="users_view_line w-full flex my-1">
+	<p class="w-full flex">
+		<x-forms.inputs.text class="w-full mt-4" wire:model.live="username" type="text" placeholder="{{ __('lychee.LOGIN_USERNAME') }}" />
+		<x-forms.inputs.important class="w-full mt-4" wire:model.live="password" type="text" placeholder="{{ __('lychee.LOGIN_PASSWORD') }}" />
+		<x-forms.tickbox class="mt-2.5" title="{{ __('lychee.ALLOW_UPLOADS') }}" wire:model.live='may_upload' />
+		<x-forms.tickbox class="mt-2.5" title="{{ __('lychee.ALLOW_USER_SELF_EDIT') }}" wire:model.live='may_edit_own_settings' />
+	</p>
+	@if($this->hasChanged)
+	<x-forms.buttons.action wire:click='save' class="w-1/6 rounded-r-md h-11" >{{ __('lychee.SAVE') }}</x-forms.buttons.action>
+	@elseif($user->may_administrate !== true)
+	<x-forms.buttons.danger wire:click='$parent.delete({{ $id }})' class="w-1/6 rounded-r-md h-11" >{{ __('lychee.DELETE') }}</x-forms.buttons.action>
+	@else 
+	<a class="inline-block h-10 invisible w-1/6 pt-2 pb-4 border-t border-t-bg-800">{{ __('lychee.SAVE') }}</a>
+	@endif
+</div>
\ 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..1a9ccfa19fb
--- /dev/null
+++ b/resources/views/livewire/pages/all-settings.blade.php
@@ -0,0 +1,52 @@
+<div class="w-full">
+    <x-header.bar>
+        <x-header.back @keydown.escape.window="$wire.back();" wire:click="back" />
+        <x-header.title>{{ __('lychee.SETTINGS') }}</x-header.title>
+    </x-header.bar>
+	<div class="overflow-x-clip overflow-y-auto h-[calc(100vh-56px)]">
+		<div class="settings_view w-10/12 max-w-2xl text-text-main-400 text-sm mx-auto">
+			<div class="pt-12">
+				<p class="warning">
+					{{ __("lychee.SETTINGS_ADVANCED_WARNING_EXPL") }}
+				</p>
+			</div>
+			@php
+				$previousCategory = '';
+			@endphp
+			@foreach ($form->configs as $idx => $config)
+				@if($config->cat !== $previousCategory)
+				<div class="setting_category text-xl px-1 w-full mt-5 pt-3 font-bold text-text-main-0">
+					<p>{{ $config->cat }}</p>
+				</div>
+				@php
+				$previousCategory = $config->cat;
+				@endphp
+				@endif
+				<div class="setting_line my-0.5">
+					<p class="break-words w-full group relative" wire:key="config-{{ $config->id }}">
+						<span class="inline-block text pt-2 pb-0 px-1 w-80 text-text-main-0">{{ $config->key }}</span>
+						<x-forms.inputs.text class="w-1/2"
+							wire:model="form.values.{{ $idx }}"
+							:has_error="$errors->has('form.values.' . $idx)"
+							wire:dirty.class="text-yellow-500"
+							/>
+						@foreach ($errors->get('form.values.' . $idx) as $err)
+						<span class="w-full block -mt-1 text-danger-600 pl-1 pb-1 pt-0">{{ $err }}</span>
+						@endforeach
+						@if($config->description !== '')
+						<span class="
+						{{-- absolute left-0 bg-bg-800 group-hover:block hidden p-2 z-10 --}}
+						text-text-main-400
+						block -mt-1 w-full pl-1 pb-1 pt-0
+						">{{ $config->description }}</span>
+						@endif
+					</p>
+				</div>
+			@endforeach
+			<x-forms.buttons.danger
+				@keydown.enter.window="$wire.openConfirmSave()"
+				class="w-full mt-7 mb-8 rounded-md"
+				wire:click="openConfirmSave">{{ __("lychee.SETTINGS_ADVANCED_SAVE") }}</x-forms.buttons.danger>
+		</div>
+	</div>
+</div>
\ 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..9c5f1960be2
--- /dev/null
+++ b/resources/views/livewire/pages/diagnostics.blade.php
@@ -0,0 +1,15 @@
+<div class="w-full">
+    <x-header.bar>
+        <x-header.back @keydown.escape.window="$wire.back();" wire:click="back" />
+        <x-header.title>{{ __('lychee.DIAGNOSTICS') }}</x-header.title>
+    </x-header.bar>
+	<div class="overflow-x-clip overflow-y-auto h-[calc(100vh-56px)]">
+<pre class="logs_diagnostics_view text-text-main-200 text-xs mx-8">
+<livewire:modules.diagnostics.errors lazy />
+<livewire:modules.diagnostics.infos />
+<livewire:modules.diagnostics.space />
+<livewire:modules.diagnostics.optimize />
+<livewire:modules.diagnostics.configurations />
+</pre>
+	</div>
+</div>
\ No newline at end of file
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..7710dcbbaf0
--- /dev/null
+++ b/resources/views/livewire/pages/gallery/album.blade.php
@@ -0,0 +1,67 @@
+<div class="w-full" x-data="albumView(
+    @js(route('livewire-gallery')),
+    @entangle('sessionFlags.nsfwAlbumsVisible'),
+    @entangle('sessionFlags.is_fullscreen'),
+    @entangle('sessionFlags.are_photo_details_open'),
+    @js($rights),
+    @js($album->id),
+    @js($this->albumIDs),
+    @js($this->photosResource),
+    @js($photoId),
+    @js($this->overlayType),
+    @js($this->layouts)
+)" @keydown.window="handleKeydown(event)" @popstate.window="handlePopState(event)">
+    <!-- toolbar -->
+    <x-header.bar class="opacity-0" x-bind:class="isFullscreen ? 'opacity-0 h-0' : 'opacity-100 h-14'">
+        <x-header.back wire:navigate href="{{ $this->back }}" />
+        <x-header.title>{{ $this->title }}</x-header.title>
+        <x-header.actions-menus />
+        @if ($rights->can_edit && $flags->is_base_album)
+            <x-header.button x-on:click="toggleDetails" icon="chevron-top" fill="fill-primary-500" x-cloak
+                x-show="albumFlags.isDetailsOpen" />
+            <x-header.button x-on:click="toggleDetails" icon="chevron-bottom" x-cloak
+                x-show="!albumFlags.isDetailsOpen" />
+        @endif
+    </x-header.bar>
+    @if ($flags->is_password_protected)
+        <livewire:gallery.album.unlock albumID="$albumId" />
+    @elseif(!$flags->is_accessible)
+        <x-gallery.album.login-dialog />
+    @else
+        <div id="lychee_view_content"
+            class="relative flex flex-wrap content-start w-full justify-start overflow-y-auto"
+            x-bind:class="isFullscreen ? 'h-[calc(100vh-3px)]' : 'h-[calc(100vh-56px)]'">
+            @if ($rights->can_edit && $flags->is_base_album)
+                <x-gallery.album.menu.menu :album="$this->album" :userCount="$this->num_users" />
+            @endif
+            @if ($this->albumFormatted !== null && ($num_albums > 0 || $num_photos > 0))
+                <x-gallery.album.hero x-show="! albumFlags.isDetailsOpen" />
+                <x-gallery.album.details x-show="! albumFlags.isDetailsOpen" />
+            @endif
+            @if ($num_albums === 0 && $num_photos === 0)
+                <div class="flex w-full h-full items-center justify-center text-xl text-text-main-400">
+                    <span class="block">
+                    {{ $this->noImagesAlbumsMessage }}
+                    </span>
+                </div>
+            @endif
+            @if ($num_albums > 0 && $num_photos > 0)
+                <x-gallery.divider title="{{ __('lychee.ALBUMS') }}" />
+            @endif
+            @if ($num_albums > 0)
+                @foreach ($this->albums as $data)
+                    <x-gallery.album.thumbs.album :data="$data" />
+                @endforeach
+            @endif
+            @if ($num_albums > 0 && $num_photos > 0)
+                <x-gallery.divider title="{{ __('lychee.PHOTOS') }}" />
+            @endif
+            <x-gallery.view.photo-listing />
+            @if ($this->flags->is_base_album)
+                <livewire:pages.gallery.sensitive-warning :album="$this->album" />
+            @endif
+        </div>
+        <x-gallery.view.photo />
+        <x-gallery.album.sharing-links :album="$this->album" x-show="albumFlags.isSharingLinksOpen" />
+    @endif
+</div>
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..5b367cc86d5
--- /dev/null
+++ b/resources/views/livewire/pages/gallery/albums.blade.php
@@ -0,0 +1,79 @@
+<div class="w-full"
+    x-data="albumView(
+        @js(route('livewire-gallery')),
+        @entangle('sessionFlags.nsfwAlbumsVisible'),
+        @entangle('sessionFlags.is_fullscreen'),
+        @entangle('sessionFlags.are_photo_details_open'),
+        @js($rights),
+        @js(null),
+        @entangle('albumIDs')
+        )"
+    @keydown.window="handleKeydown(event)"
+    x-on:login-close="loginModalOpen = false">
+    <!-- toolbar -->
+    <x-header.bar>
+        @guest
+            <!-- NOT LOGGED -->
+            <x-header.button x-on:click="loginModalOpen = true" icon="account-login" />
+        @endguest
+        @auth
+            <x-header.button x-on:click="$dispatch('toggleLeftMenu')" icon="cog" />
+        @endauth
+        <x-header.title>{{ $title }}</x-header.title>
+        @if($flags->is_search_accessible)
+        <x-header.button class="flex flex-grow justify-end" href="{{ route('livewire-search') }}" wire:navigate icon="magnifying-glass" />
+        @endif
+        <x-header.actions-menus />
+    </x-header.bar>
+    <!-- albums -->
+    <div class="overflow-x-clip overflow-y-auto h-[calc(100vh-56px)] flex flex-col">
+        @if ($this->smartAlbums->isEmpty() && $this->albums->isEmpty() && $this->sharedAlbums->isEmpty())
+            <div class="h-full flex flex-col justify-center"  x-init='loginModalOpen = true'>
+                <div class="w-full text-center"><x-icons.iconic icon="eye" /></div>
+                <p class="w-full text-center text-text-main-400">{{ __('lychee.VIEW_NO_PUBLIC_ALBUMS') }}</p>
+            </div>
+        @else
+            <div class="flex flex-wrap flex-row flex-shrink w-full justify-start align-top">
+                @if ($this->smartAlbums->count() > 0)
+                    <x-gallery.divider title="{{ __('lychee.SMART_ALBUMS') }}" />
+                    @foreach ($this->smartAlbums as $album)
+                        <x-gallery.album.thumbs.album :data="$album" />
+                    @endforeach
+                    @if ($this->albums->count() > 0)
+                        <x-gallery.divider title="{{ __('lychee.ALBUMS') }}" />
+                    @endif
+                @endif
+
+                @if ($this->albums->count() > 0)
+                    @foreach ($this->albums as $album)
+                        <x-gallery.album.thumbs.album :data="$album" />
+                    @endforeach
+                @endif
+
+                @if ($this->sharedAlbums->count() > 0)
+                    <x-gallery.divider title="{{ __('lychee.SHARED_ALBUMS') }}" />
+                    @foreach ($this->sharedAlbums as $album)
+                        <x-gallery.album.thumbs.album :data="$album" />
+                    @endforeach
+                @endif
+            </div>
+        @endif
+        <x-footer />
+    </div>
+    @guest
+        <div class="basicModalContainer transition-opacity duration-1000 ease-in animate-fadeIn
+	bg-black/80 z-50 fixed flex items-center justify-center w-full h-full top-0 left-0 box-border opacity-100"
+            data-closable="true" x-cloak x-show="loginModalOpen">
+            <div class="basicModal transition-opacity ease-in duration-1000
+                opacity-100 bg-gradient-to-b from-bg-300 to-bg-400
+                relative w-[500px] text-sm rounded-md text-text-main-400 animate-moveUp
+                "
+                role="dialog" x-on:click.away="loginModalOpen = false">
+                <livewire:modals.login />
+            </div>
+        </div>
+    @endguest
+    @if($flags->can_use_2fa)
+    <x-webauthn.login />
+    @endif
+</div>
diff --git a/resources/views/livewire/pages/gallery/frame.blade.php b/resources/views/livewire/pages/gallery/frame.blade.php
new file mode 100644
index 00000000000..e0642b950d3
--- /dev/null
+++ b/resources/views/livewire/pages/gallery/frame.blade.php
@@ -0,0 +1,40 @@
+<div class="w-full" x-data="{
+		refreshTimeout: @js($timeout),
+		imgSrc: @js($src),
+		imgSrcset: @js($srcset),
+
+		start() {
+			$refs.shutter.classList.add('opacity-0');
+			setTimeout(() => this.rotate(), 1000 * this.refreshTimeout);
+		},
+
+		async rotate() {
+			let newPhotos = await $wire.loadPhoto();
+			$refs.shutter.classList.remove('opacity-0');
+			setTimeout(() => this.changePhoto(newPhotos), 1000);
+			setTimeout(() => this.rotate(), 1000 * this.refreshTimeout);
+		},
+
+		changePhoto(newPhotos) {
+			this.imgSrc = newPhotos.src;
+			this.imgSrcset = newPhotos.srcset;
+			$refs.shutter.classList.add('opacity-0');
+		}
+	}"
+    x-init="start()"
+    >
+	<div class="h-screen w-screen">
+		<img 
+			alt="image background" class="absolute w-screen h-screen object-cover blur-lg object-center" :src="imgSrc">
+		<div class="w-screen h-screen flex justify-center items-center flex-wrap bg-repeat bg-noise">
+			<img alt="Random Image" class="h-[95%] w-[95%] object-contain filter drop-shadow-black"
+				:src="imgSrc" :srcset="imgSrcset">
+		</div>
+		<div x-ref="shutter"
+			class="absolute w-screen h-screen bg-bg-900 transition-opacity duration-1000 ease-in-out top-0 left-0">
+		</div>
+	</div>
+	<div class="absolute top-0 left-0 p-3">
+		<x-header.back wire:navigate @keydown.escape.window="Livewire.navigate($el.href);" href="{{ $this->back }}" />
+	</div>
+</div>
diff --git a/resources/views/livewire/pages/gallery/map.blade.php b/resources/views/livewire/pages/gallery/map.blade.php
new file mode 100644
index 00000000000..32d08ea398f
--- /dev/null
+++ b/resources/views/livewire/pages/gallery/map.blade.php
@@ -0,0 +1,22 @@
+<div class="w-full" x-data="
+    mapView(
+    @js($map_provider->getLayer()),
+    @js($map_provider->getAtributionHtml()),
+    '{{ __('lychee.CAMERA_DATE') }}',
+    @js($this->data),
+    )"
+    x-init="mapInit()"
+    >
+    <!-- toolbar -->
+    <x-header.bar>
+        <x-header.back @keydown.escape.window="$wire.back();" wire:click="back" />
+        <x-header.title>{{ $title }}</x-header.title>
+    </x-header.bar>
+    <!-- maps -->
+    <div id="lychee_map_container"
+        class="
+        leaflet-container leaflet-touch leaflet-retina leaflet-fade-anim leaflet-grab leaflet-touch-drag leaflet-touch-zoom
+        h-[calc(100vh-56px)] w-full"
+        tabindex="0" style="">
+    </div>
+</div>
diff --git a/resources/views/livewire/pages/gallery/search.blade.php b/resources/views/livewire/pages/gallery/search.blade.php
new file mode 100644
index 00000000000..11f4b576747
--- /dev/null
+++ b/resources/views/livewire/pages/gallery/search.blade.php
@@ -0,0 +1,85 @@
+<div class="w-full" x-data="albumView(
+    @js(route('livewire-search')),
+    @entangle('sessionFlags.nsfwAlbumsVisible'),
+    @entangle('sessionFlags.is_fullscreen'),
+    @entangle('sessionFlags.are_photo_details_open'),
+    @js($rights),
+    @js(null),
+    @js($this->albumIDs),
+    @js($this->photosResource),
+    @js(null),
+    @js($this->overlayType),
+    @js($this->layouts),
+    @js(true)
+)" @keydown.window="handleKeydown(event)" @popstate.window="handlePopState(event)">
+    <!-- toolbar -->
+    <x-header.bar class="opacity-0" x-bind:class="isFullscreen ? 'opacity-0 h-0' : 'opacity-100 h-14'">
+        <x-header.back wire:navigate href="{{ $this->back }}" />
+        <x-header.title>{{ $this->title }}</x-header.title>
+        <x-header.actions-menus />
+    </x-header.bar>
+    <div id="lychee_view_content"
+        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)]'">
+        <div x-data="searchPanel(
+            @entangle('searchQuery'),
+            @js($search_minimum_length_required),
+            select,
+            )"
+            class="flex items-center justify-center w-full p-4 flex-wrap mb-5 bg-none transition-all"
+            x-bind:class="searchQuery.length < {{ $search_minimum_length_required }} ? 'h-4/5' : ''"
+            >
+            <div class="w-full flex items-center flex-wrap justify-center" x-cloak>
+                <div class="items-center relative text-right">
+                    <input
+                        class="w-80 px-3 pt-1.5 pb-1 rounded-full placeholder:text-text-main-200 bg-bg-800 border border-solid border-bg-900
+                        opacity-60 drop-shadow text-text-main-100 focus:border-primary-500 focus:opacity-100 peer transition-all"
+                        x-ref="search" x-model.debounce.500ms="searchQuery" type="text" name="search"
+                        placeholder="{{ __('lychee.SEARCH') }}" />
+                    <a class="header__clear absolute top-1/2 -translate-y-1/2 right-2 opacity-0 text-text-main-100
+                            peer-focus:opacity-100 cursor-pointer text-lg"
+                        x-on:click="$refs.search.value = ''">&times;</a>
+                </div>
+                <div class="items-center text-danger-700 w-full text-center"
+                    x-bind:class="hideMessage ? 'opacity-100' : 'opacity-0'">
+                    Minimum {{ $search_minimum_length_required }} characters required.
+                </div>
+            </div>
+        </div>
+        @if ($this->rights->can_edit && $this->flags->is_base_album)
+            <x-gallery.album.menu.menu :album="$this->album" :userCount="$this->num_users" />
+        @endif
+        @if ($this->albumFormatted !== null && ($this->num_albums > 0 || $this->num_photos > 0))
+            <x-gallery.album.hero x-show="! albumFlags.isDetailsOpen" />
+            <x-gallery.album.details x-show="! albumFlags.isDetailsOpen" />
+        @endif
+        @if ($this->num_albums === 0 && $this->num_photos === 0)
+            <span class="mt-[33%] w-full text-center text-xl text-text-main-400 align-middle">
+                {{ $this->noImagesAlbumsMessage }}
+            </span>
+        @endif
+        @if ($this->num_albums > 0 && $this->num_photos > 0)
+            <x-gallery.divider title="{{ __('lychee.ALBUMS') }}" />
+        @endif
+        @if ($this->num_albums > 0)
+            @foreach ($this->albums as $data)
+                <x-gallery.album.thumbs.album :data="$data" />
+            @endforeach
+        @endif
+        @if ($this->num_albums > 0 && $this->num_photos > 0)
+            <x-gallery.divider title="{{ __('lychee.PHOTOS') }}" />
+        @endif
+        @if ($this->num_photos > 0)
+            <div class="items-center w-full">
+                {{ $this->photos->onEachSide(1)->links() }}
+            </div>
+        @endif
+        <x-gallery.view.photo-listing />
+        @if ($this->num_photos > 0)
+            <div class="items-center w-full">
+                {{ $this->photos->onEachSide(1)->links() }}
+            </div>
+        @endif
+    </div>
+    <x-gallery.view.photo />
+</div>
diff --git a/resources/views/livewire/pages/jobs.blade.php b/resources/views/livewire/pages/jobs.blade.php
new file mode 100644
index 00000000000..f51ff06cf60
--- /dev/null
+++ b/resources/views/livewire/pages/jobs.blade.php
@@ -0,0 +1,24 @@
+<div class="w-full">
+    <x-header.bar>
+        <x-header.back @keydown.escape.window="$wire.back();" wire:click="back" />
+        <x-header.title>{{ __('lychee.JOBS') }}</x-header.title>
+    </x-header.bar>
+	<div class="overflow-x-clip overflow-y-auto h-[calc(100vh-56px)]">
+		<div class="settings_view max-w-4xl text-text-main-400 text-sm mx-auto">
+			@forelse($this->jobs as $job)
+				<span class="mx-2">{{ $job->created_at }}</span>
+				@if($job->status->name() === 'success')
+					<span class="mx-2 text-green-600"><pre class="inline">{{ str_pad($job->status->name(), 7) }}</pre></span>
+				@else
+					<span class="mx-2 text-red-700"><pre class="inline">{{ str_pad($job->status->name(), 7) }}</pre></span>
+				@endif
+				<span class="mx-2">{{ $job->owner->name }}</span>
+				<span class="mx-2">{{ $job->title ?? __('lychee.UNSORTED') }}</span>
+				<span class="mx-2">{{ $job->job }}</span>
+				<br>
+			@empty
+				No Jobs have been executed yet.
+			@endforelse
+		</div>
+	</div>
+</div>
\ 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..ba6a75c2a8b
--- /dev/null
+++ b/resources/views/livewire/pages/landing.blade.php
@@ -0,0 +1,51 @@
+<main id="landing" class="w-screen h-screen bg-black roboto overflow-hidden"
+	x-data="{ introVisible: true }"
+	x-init="setTimeout(() => introVisible = false, 4000);">
+    <div id="header"
+        class="fixed top-0 left-0 right-0 z-50 overflow-y-hidden">
+        <div id="logo" class=" float-left p-4 text-text-main-0 translate-y-[-300px] opacity-0 animate-ladningAnimateDown">
+            <a href="#">
+                <h1 class="text-lg font-bold uppercase text-center roboto">{{ $title }}
+                    <span class="p-0 text-2xs block font-thin tracking-wide leading-[0]">{{ $subtitle }}</span>
+                </h1>
+            </a>
+        </div>
+    </div>
+
+    <div id="menu_wrap"
+        class="fixed top-0 right-0 z-50 w-4/5 overflow-y-hidden">
+        <div id="menu" class="w-full translate-y-[-300px] opacity-0 animate-ladningAnimateDown">
+            <ul class="menu list-none">
+                <li class="menu-item relative block float-right pt-6 pb-5 px-3">
+                    {{-- Here we can also use livewire to directly open the gallery without reloading the full page --}}
+                    <a href="{{ route('livewire-gallery') }}" class="block text-xs uppercase font-normal text-text-main-0 hover:text-text-main-400 "
+                        wire:navigate.hover >{{ __('lychee.GALLERY') }}</a>
+                </li>
+            </ul>
+        </div>
+    </div>
+
+    <div id="intro" :class="introVisible ? '' : 'hidden'"
+		class=" z-50 bg-black fixed flex align-middle justify-center left-0 right-0 top-0 bottom-0
+			animate-landingIntroFadeOut">
+		<div id="intro_content" class=" self-center">
+			<h1 class="
+				text-center text-2xl  text-text-main-0       uppercase font-extralight animate-landingIntroPopIn">{{ $title }}</h1>
+			<h2><span class="
+				text-center text-base text-text-main-400 uppercase font-extralight animate-landingIntroPopIn">{{ $subtitle }}</span></h2>
+		</div>
+	</div>
+
+    <div id="slides"
+	class="bg-black absolute overflow-hidden left-0 top-0 w-screen h-[98vh] ">
+        <div class="slides-container w-full h-full opacity-0 animate-landingSlidesPopIn">
+            <ul class="list-none">
+                <li class="w-full h-full">
+                    {{-- <div class="overlay"></div> --}}
+                    <img class="w-full h-full object-cover absolute top-0 left-0" src="{{ $background }}" alt="landing image" />
+                </li>
+            </ul>
+        </div>
+    </div>
+    <x-footer layout="footer-landing" />
+</div>
diff --git a/resources/views/livewire/pages/profile.blade.php b/resources/views/livewire/pages/profile.blade.php
new file mode 100644
index 00000000000..e6a06161004
--- /dev/null
+++ b/resources/views/livewire/pages/profile.blade.php
@@ -0,0 +1,20 @@
+<div class="w-full">
+    <x-header.bar>
+        <x-header.back @keydown.escape.window="$wire.back();" wire:click="back" />
+        <x-header.title>{{ __('lychee.PROFILE') }}</x-header.title>
+    </x-header.bar>
+	<div class="overflow-x-clip overflow-y-auto h-[calc(100vh-56px)]">
+		<div class="settings_view max-w-xl text-text-main-400 text-sm mx-auto">
+			<livewire:forms.profile.set-login />
+			@if($are_notification_active)
+			<div>
+				<p>
+					{{ __('lychee.USER_EMAIL_INSTRUCTION') }}
+				</p>
+			</div>
+			<livewire:forms.profile.set-email />
+			@endif
+			<livewire:forms.profile.second-factor />
+		</div>
+	</div>
+</div>
\ 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..ff0eb8aa76b
--- /dev/null
+++ b/resources/views/livewire/pages/settings.blade.php
@@ -0,0 +1,70 @@
+<div class="w-full">
+    <x-header.bar>
+        <x-header.back @keydown.escape.window="$wire.back();" wire:click="back" />
+        <x-header.title>{{ __('lychee.SETTINGS') }}</x-header.title>
+    </x-header.bar>
+	<div class="overflow-x-clip overflow-y-auto h-[calc(100vh-56px)]">
+		<div class="settings_view w-10/12 max-w-xl text-text-main-400 text-sm mx-auto">
+			<livewire:forms.settings.base.string-setting key="set-dropbox-key" description="DROPBOX_TEXT"
+				placeholder="SETTINGS_DROPBOX_KEY" action="DROPBOX_TITLE" name="dropbox_key" />
+			<livewire:forms.settings.set-album-sorting-setting />
+			<livewire:forms.settings.set-photo-sorting-setting />
+			<livewire:forms.settings.set-lang-setting />
+			<livewire:forms.settings.set-license-default-setting />
+			<div class="mb-4 -mt-4"><p>
+				<a href="https://creativecommons.org/choose/" class="text-neutral-200 hover:text-text-main-0 border-b border-dashed border-neutral-400" target="_blank">{{ __('lychee.ALBUM_LICENSE_HELP') }}</a>
+			</p></div>
+			<livewire:forms.settings.set-layout-setting />
+			<livewire:forms.settings.base.boolean-setting key="set-public_search"
+				description="PUBLIC_SEARCH_TEXT" name="search_public" />
+			<livewire:forms.settings.set-album-decoration-setting />
+			<livewire:forms.settings.set-album-decoration-orientation-setting />
+			<livewire:forms.settings.set-photo-overlay-setting />
+			<livewire:forms.settings.base.boolean-setting key="set-map_display"
+				description="MAP_DISPLAY_TEXT" name="map_display" />
+			<livewire:forms.settings.base.boolean-setting key="set-map_display_public"
+				description="MAP_DISPLAY_PUBLIC_TEXT" name="map_display_public" />
+			<livewire:forms.settings.set-map-provider-setting />
+			<livewire:forms.settings.base.boolean-setting key="set-map_include_subalbums"
+				description="MAP_INCLUDE_SUBALBUMS_TEXT" name="map_include_subalbums" />
+			<livewire:forms.settings.base.boolean-setting key="set-location_decoding"
+				description="LOCATION_DECODING" name="location_decoding" />
+			<livewire:forms.settings.base.boolean-setting key="set-location_show"
+				description="LOCATION_SHOW" name="location_show" />
+			<livewire:forms.settings.base.boolean-setting key="set-location_show_public"
+				description="LOCATION_SHOW_PUBLIC" name="location_show_public" />
+			<livewire:forms.settings.base.boolean-setting key="set-nsfw_visible"
+				description="NSFW_VISIBLE_TEXT_1" name="nsfw_visible" footer="NSFW_VISIBLE_TEXT_2" />
+			<livewire:forms.settings.base.boolean-setting key="set-new_photos_notification"
+				description="NEW_PHOTOS_NOTIFICATION" name="new_photos_notification" />
+
+			<div class="my-4">
+				<p>{{ __('lychee.CSS_TEXT') }}</p>
+				<textarea id="css" class="p-2 h-28 bg-transparent text-text-main-0 border border-solid border-neutral-400 resize-y w-full
+					hover:border-primary-400
+					focus:border-primary-400 focus-visible:outline-none"
+					wire:model='css'>
+				</textarea>
+				<div class="basicModal__buttons">
+					<x-forms.buttons.action wire:click='setCSS' class="rounded-md w-full" >{{ __('lychee.CSS_TITLE') }}</x-forms.buttons.action>
+				</div>
+			</div>
+
+			<div class="my-4">
+				<p>{{ __('lychee.JS_TEXT') }}</p>
+				<textarea id="js" class="p-2 h-28 bg-transparent text-text-main-0 border border-solid border-neutral-400 resize-y w-full
+					hover:border-primary-400
+					focus:border-primary-400 focus-visible:outline-none"
+					wire:model='js'>
+				</textarea>
+				<div class="basicModal__buttons">
+					<x-forms.buttons.action wire:click='setJS' class="rounded-md w-full" >{{ __('lychee.JS_TITLE') }}</x-forms.buttons.action>
+				</div>
+			</div>
+
+			<div class="my-4">
+				<x-forms.buttons.danger class="rounded-md w-full" wire:navigate href="{{ route('all-settings') }}">{{ __('lychee.MORE') }}</x-forms.buttons.danger>
+			</div>
+		</div>
+	</div>
+</div>
\ 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..7444ed6af26
--- /dev/null
+++ b/resources/views/livewire/pages/sharing.blade.php
@@ -0,0 +1,58 @@
+<div class="w-full">
+    <x-header.bar>
+        <x-header.back @keydown.escape.window="$wire.back();" wire:click="back" />
+        <x-header.title>{{ __('lychee.SHARING') }}</x-header.title>
+    </x-header.bar>
+    <div class="overflow-x-clip overflow-y-auto h-[calc(100vh-56px)]">
+        <div class="settings_view max-w-3xl text-text-main-400 text-sm mx-auto">
+            <div class="w-full mt-5">
+                <p>
+                    This page gives an overview and edit the sharing rights associated with albums.
+                </p>
+                <div class="w-full flex relative translate-y-2">
+                    <div class="absolute top-0 right-2 peer">
+                        <x-icons.iconic class=" text-neutral-200 px-0.5 w-5 h-5 mb-1" icon="question-mark" />
+                    </div>
+                    <ul
+                        class="mt-1 p-4 peer-hover:block hidden top-4 right-4 absolute border-neutral-600 border border-solid bg-bg-700 z-20 drop-shadow">
+                        <li class=""><x-icons.iconic class=" text-neutral-200 px-0.5 w-4 h-4 mb-1"
+                                icon="fullscreen-enter" />
+                            : grants full photo access</li>
+                        <li class=""><x-icons.iconic class=" text-neutral-200 px-0.5 w-4 h-4 mb-1"
+                                icon="data-transfer-download" /> : grants download</li>
+                        <li class=""><x-icons.iconic class=" text-neutral-200 px-0.5 w-4 h-4 mb-1"
+                                icon="data-transfer-upload" /> : grants upload</li>
+                        <li class=""><x-icons.iconic class=" text-neutral-200 px-0.5 w-4 h-4 mb-1"
+                                icon="pencil" />
+                            : grants edit</li>
+                        <li class=""><x-icons.iconic class=" text-neutral-200 px-0.5 w-4 h-4 mb-1"
+                                icon="trash" />
+                            : grants delete</li>
+                    </ul>
+                </div>
+            </div>
+            <div class="flex flex-col">
+                <div class="w-full flex my-1">
+                    <p class="w-full flex align-middle border-b border-solid border-neutral-600 pb-3 text-neutral-200">
+                        <span class="h-4 w-56 inline-block mt-2.5 font-bold">{{ __('lychee.ALBUM_TITLE') }}</span>
+                        <span class="h-4 w-56 inline-block mt-2.5 font-bold">{{ __('lychee.USERNAME') }}</span>
+                        <span class="h-4 w-56 inline-block text-center">
+                            <x-icons.iconic class=" fill-neutral-200 px-2 w-8 h-8 mb-2" icon="fullscreen-enter" />
+                            <x-icons.iconic class=" fill-neutral-200 px-2 w-8 h-8 mb-2" icon="data-transfer-download" />
+                            <x-icons.iconic class=" fill-neutral-200 px-2 w-8 h-8 mb-2" icon="data-transfer-upload" />
+                            <x-icons.iconic class=" fill-neutral-200 px-2 w-8 h-8 mb-2" icon="pencil" />
+                            <x-icons.iconic class=" fill-neutral-200 px-2 w-8 h-8 mb-2" icon="trash" />
+                        </span>
+                    </p>
+                </div>
+                @forelse ($this->perms as $perm)
+                    <livewire:forms.album.share-with-line :$perm :key="$perm->id" :album_title="$perm->album->title" />
+                @empty
+                    <p class="text-center">
+                        Sharing list is empty
+                    </p>
+                @endforelse
+            </div>
+        </div>
+    </div>
+</div>
diff --git a/resources/views/livewire/pages/users.blade.php b/resources/views/livewire/pages/users.blade.php
new file mode 100644
index 00000000000..834661ceca9
--- /dev/null
+++ b/resources/views/livewire/pages/users.blade.php
@@ -0,0 +1,55 @@
+<div class="w-full">
+    <x-header.bar>
+        <x-header.back @keydown.escape.window="$wire.back();" wire:click="back()" />
+        <x-header.title>{{ __('lychee.USERS') }}</x-header.title>
+    </x-header.bar>
+    <div class="overflow-x-clip overflow-y-auto h-[calc(100vh-56px)]">
+        <div class="settings_view max-w-3xl text-text-main-400 text-sm mx-auto">
+            <div class="w-full mt-5">
+                <p>
+                    This pages allows you to manage users.
+                <ul class="mt-1">
+                    <li class="ml-4 pt-2"><x-icons.iconic class="fill-white w-4 h-4" icon="data-transfer-upload" />
+                        : When selected, the user can upload content.</li>
+                    <li class="ml-4 pt-2"><x-icons.iconic class="fill-white w-4 h-4" icon="lock-unlocked" />
+                        : When selected, the user can modify their profile (username, password).</li>
+                </ul>
+                </p>
+
+            </div>
+            <div class="users_view_line w-full flex mt-5 border-b border-solid border-neutral-600 pb-3">
+                <p class="full w-full flex">
+                    <span
+                        class="inline-block text font-bold w-full pt-2 px-1 mr-2 mt-2.5 text-text-main-0">{{ __('lychee.USERNAME') }}</span>
+                    <span
+                        class="inline-block text font-bold w-full pt-2 px-1 mr-2 mt-2.5 text-text-main-0">{{ __('lychee.LOGIN_PASSWORD') }}</span>
+                    <span class="inline-block text_icon mt-2.5 w-12 mx-2" title="{{ __('lychee.ALLOW_UPLOADS') }}">
+                        <x-icons.iconic class="fill-white w-4 h-4" icon="data-transfer-upload" />
+                    </span>
+                    <span class="inline-block text_icon mt-2.5 w-12 mx-1"
+                        title="{{ __('lychee.ALLOW_USER_SELF_EDIT') }}">
+                        <x-icons.iconic class="fill-white w-4 h-4" icon="lock-unlocked" />
+                    </span>
+                </p>
+                <a class="inline-block invisible w-1/6 pt-3 pb-4 border-t border-t-bg-800">Save</a>
+            </div>
+            @foreach ($this->users as $user)
+                <livewire:modules.users.user-line :user="$user" key="user-{{ $user->id }}" />
+            @endforeach
+
+            <div class="users_view_line w-full flex my-5">
+                <p class="full w-full flex">
+                    <x-forms.inputs.text class="w-full mt-2" wire:model="username" type="text"
+                        placeholder="{{ __('lychee.LOGIN_USERNAME') }}" />
+                    <x-forms.inputs.important class="w-full mt-2" wire:model="password" type="text"
+                        placeholder="{{ __('lychee.LOGIN_PASSWORD') }}" />
+                    <x-forms.tickbox class="mt-1" title="{{ __('lychee.ALLOW_UPLOADS') }}" wire:model='may_upload' />
+                    <x-forms.tickbox class="mt-1" title="{{ __('lychee.ALLOW_USER_SELF_EDIT') }}"
+                        wire:model='may_edit_own_settings' />
+                </p>
+                <x-forms.buttons.create class="w-1/6 rounded-r-md"
+                    wire:click="create">{{ __('lychee.CREATE') }}</x-forms.buttons.create>
+            </div>
+        </div>
+    </div>
+</div>
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 @@
+<div>
+    @if ($paginator->hasPages())
+        <nav role="navigation" aria-label="Pagination Navigation" class="flex justify-between">
+            <span>
+                {{-- Previous Page Link --}}
+                @if ($paginator->onFirstPage())
+                    <span class="relative inline-flex items-center px-4 py-2 text-sm font-medium text-gray-500 bg-white border border-gray-300 cursor-default leading-5 rounded-md select-none">
+                        {!! __('pagination.previous') !!}
+                    </span>
+                @else
+                    @if(method_exists($paginator,'getCursorName'))
+                        {{-- // @todo: Remove `wire:key` once mutation observer has been fixed to detect parameter change for the `setPage()` method call --}}
+                        <button type="button" dusk="previousPage" wire:key="cursor-{{ $paginator->getCursorName() }}-{{ $paginator->previousCursor()->encode() }}" wire:click="setPage('{{$paginator->previousCursor()->encode()}}','{{ $paginator->getCursorName() }}')" wire:loading.attr="disabled" class="relative inline-flex items-center px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 leading-5 rounded-md hover:text-gray-500 focus:outline-none focus:shadow-outline-blue focus:border-blue-300 active:bg-gray-100 active:text-gray-700 transition ease-in-out duration-150">
+                                {!! __('pagination.previous') !!}
+                        </button>
+                    @else
+                        <button type="button" wire:click="previousPage('{{ $paginator->getPageName() }}')" wire:loading.attr="disabled" dusk="previousPage{{ $paginator->getPageName() == 'page' ? '' : '.' . $paginator->getPageName() }}" class="relative inline-flex items-center px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 leading-5 rounded-md hover:text-gray-500 focus:outline-none focus:shadow-outline-blue focus:border-blue-300 active:bg-gray-100 active:text-gray-700 transition ease-in-out duration-150">
+                                {!! __('pagination.previous') !!}
+                        </button>
+                    @endif
+                @endif
+            </span>
+
+            <span>
+                {{-- Next Page Link --}}
+                @if ($paginator->hasMorePages())
+                    @if(method_exists($paginator,'getCursorName'))
+                        {{-- // @todo: Remove `wire:key` once mutation observer has been fixed to detect parameter change for the `setPage()` method call --}}
+                        <button type="button" dusk="nextPage" wire:key="cursor-{{ $paginator->getCursorName() }}-{{ $paginator->nextCursor()->encode() }}" wire:click="setPage('{{$paginator->nextCursor()->encode()}}','{{ $paginator->getCursorName() }}')" wire:loading.attr="disabled" class="relative inline-flex items-center px-4 py-2 ml-3 text-sm font-medium text-gray-700 bg-white border border-gray-300 leading-5 rounded-md hover:text-gray-500 focus:outline-none focus:shadow-outline-blue focus:border-blue-300 active:bg-gray-100 active:text-gray-700 transition ease-in-out duration-150">
+                                {!! __('pagination.next') !!}
+                        </button>
+                    @else
+                        <button type="button" wire:click="nextPage('{{ $paginator->getPageName() }}')" wire:loading.attr="disabled" dusk="nextPage{{ $paginator->getPageName() == 'page' ? '' : '.' . $paginator->getPageName() }}" class="relative inline-flex items-center px-4 py-2 ml-3 text-sm font-medium text-gray-700 bg-white border border-gray-300 leading-5 rounded-md hover:text-gray-500 focus:outline-none focus:shadow-outline-blue focus:border-blue-300 active:bg-gray-100 active:text-gray-700 transition ease-in-out duration-150">
+                                {!! __('pagination.next') !!}
+                        </button>
+                    @endif
+                @else
+                    <span class="relative inline-flex items-center px-4 py-2 text-sm font-medium text-gray-500 bg-white border border-gray-300 cursor-default leading-5 rounded-md select-none">
+                        {!! __('pagination.next') !!}
+                    </span>
+                @endif
+            </span>
+        </nav>
+    @endif
+</div>
diff --git a/resources/views/vendor/livewire/tailwind.blade.php b/resources/views/vendor/livewire/tailwind.blade.php
new file mode 100644
index 00000000000..aa598629e5d
--- /dev/null
+++ b/resources/views/vendor/livewire/tailwind.blade.php
@@ -0,0 +1,171 @@
+<div class="my-4">
+    @if ($paginator->hasPages())
+        <nav role="navigation" aria-label="Pagination Navigation" class="flex items-center justify-between">
+            {{-- Previous | Next buttons --}}
+            <div class="flex justify-between flex-1 sm:hidden">
+                <span>
+                    @if ($paginator->onFirstPage())
+                        <span
+                            class="relative inline-flex items-center px-4 py-2 text-sm font-medium
+                             text-text-main-400 bg-bg-600 border border-bg-900 cursor-default leading-5 rounded-md select-none">
+                            {!! __('pagination.previous') !!}
+                        </span>
+                    @else
+                        <button type="button" wire:click="previousPage('{{ $paginator->getPageName() }}')"
+                            wire:loading.attr="disabled"
+                            dusk="previousPage{{ $paginator->getPageName() == 'page' ? '' : '.' . $paginator->getPageName() }}.before"
+                            class="relative inline-flex items-center px-4 py-2 text-sm font-medium
+                            text-text-400 bg-bg-600 border border-bg-900 leading-5 rounded-md
+                            hover:bg-bg-400 text-text-main-400 focus:outline-none focus:shadow-outline-blue focus:border-primary-300
+                            active:border-primary-100 transition ease-in-out duration-150">
+                            {!! __('pagination.previous') !!}
+                        </button>
+                    @endif
+                </span>
+
+                <span>
+                    @if ($paginator->hasMorePages())
+                        <button type="button" wire:click="nextPage('{{ $paginator->getPageName() }}')"
+                            wire:loading.attr="disabled"
+                            dusk="nextPage{{ $paginator->getPageName() == 'page' ? '' : '.' . $paginator->getPageName() }}.before"
+                            class="relative inline-flex items-center px-4 py-2 ml-3 text-sm font-medium
+                            text-text-400 bg-bg-600 border border-bg-900 leading-5 rounded-md
+                            hover:bg-bg-400 text-text-main-400 focus:outline-none focus:shadow-outline-blue focus:border-primary-300
+                            active:border-primary-100 transition ease-in-out duration-150">
+                            {!! __('pagination.next') !!}
+                        </button>
+                    @else
+                        <span
+                            class="relative inline-flex items-center px-4 py-2 ml-3 text-sm font-medium
+                             text-text-main-400 bg-bg-600 border border-bg-900 cursor-default leading-5 rounded-md select-none">
+                            {!! __('pagination.next') !!}
+                        </span>
+                    @endif
+                </span>
+            </div>
+
+            {{-- text + 1234 ... buttons --}}
+            <div class="hidden sm:flex-1 sm:flex sm:items-center sm:justify-between flex-wrap">
+                <div class="w-full mb-4">
+                    <p class="text-sm text-text-main-200 leading-5 text-center">
+                        <span>{!! __('Showing') !!}</span>
+                        <span class="font-medium">{{ $paginator->firstItem() }}</span>
+                        <span>{!! __('to') !!}</span>
+                        <span class="font-medium">{{ $paginator->lastItem() }}</span>
+                        <span>{!! __('of') !!}</span>
+                        <span class="font-medium">{{ $paginator->total() }}</span>
+                        <span>{!! __('results') !!}</span>
+                    </p>
+                </div>
+
+                <div class="w-full text-center">
+                    <span class="relative z-0 inline-flex rounded-md shadow-sm">
+                        <span>
+                            {{-- Previous Page Link --}}
+                            @if ($paginator->onFirstPage())
+                                <span aria-disabled="true" aria-label="{{ __('pagination.previous') }}">
+                                    <span
+                                        class="relative inline-flex items-center px-2 py-2 text-sm font-medium
+                                         text-text-main-400 bg-bg-600 border border-bg-900 cursor-default rounded-l-md leading-5"
+                                        aria-hidden="true">
+                                        <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
+                                            <path fill-rule="evenodd"
+                                                d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z"
+                                                clip-rule="evenodd" />
+                                        </svg>
+                                    </span>
+                                </span>
+                            @else
+                                <button type="button" wire:click="previousPage('{{ $paginator->getPageName() }}')"
+                                    dusk="previousPage{{ $paginator->getPageName() == 'page' ? '' : '.' . $paginator->getPageName() }}.after"
+                                    rel="prev"
+                                    class="relative inline-flex items-center px-2 py-2 text-sm font-medium
+                                    text-text-main-400 bg-bg-600 border border-bg-900 rounded-l-md leading-5
+                                    hover:bg-bg-400 focus:z-10 focus:outline-none focus:border-primary-300 focus:shadow-outline-blue
+                                    active:border-primary-100 active:text-text-main-400 transition ease-in-out duration-150"
+                                    aria-label="{{ __('pagination.previous') }}">
+                                    <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
+                                        <path fill-rule="evenodd"
+                                            d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z"
+                                            clip-rule="evenodd" />
+                                    </svg>
+                                </button>
+                            @endif
+                        </span>
+
+                        {{-- Pagination Elements --}}
+                        @foreach ($elements as $element)
+                            {{-- "Three Dots" Separator --}}
+                            @if (is_string($element))
+                                <span aria-disabled="true">
+                                    <span
+                                        class="relative inline-flex items-center px-4 py-2 -ml-px text-sm font-medium
+                                        text-text-400 bg-bg-600 border border-bg-900 cursor-default leading-5 select-none">{{ $element }}</span>
+                                </span>
+                            @endif
+
+                            {{-- Array Of Links --}}
+                            @if (is_array($element))
+                                @foreach ($element as $page => $url)
+                                    <span
+                                        wire:key="paginator-{{ $paginator->getPageName() }}-page{{ $page }}">
+                                        @if ($page == $paginator->currentPage())
+                                            <span aria-current="page">
+                                                <span
+                                                    class="relative inline-flex items-center px-4 py-2 -ml-px text-sm font-medium
+                                                     text-text-main-100 bg-primary-500  border border-bg-900 cursor-default leading-5 select-none">{{ $page }}</span>
+                                            </span>
+                                        @else
+                                            <button type="button"
+                                                wire:click="gotoPage({{ $page }}, '{{ $paginator->getPageName() }}')"
+                                                class="relative inline-flex items-center px-4 py-2 -ml-px text-sm font-medium
+                                                text-text-400 bg-bg-600 border border-bg-900 leading-5
+                                                hover:bg-bg-400 text-text-main-400 focus:z-10 focus:outline-none focus:border-primary-300 focus:shadow-outline-blue
+                                                active:border-primary-100 transition ease-in-out duration-150"
+                                                aria-label="{{ __('Go to page :page', ['page' => $page]) }}">
+                                                {{ $page }}
+                                            </button>
+                                        @endif
+                                    </span>
+                                @endforeach
+                            @endif
+                        @endforeach
+
+                        <span>
+                            {{-- Next Page Link --}}
+                            @if ($paginator->hasMorePages())
+                                <button type="button" wire:click="nextPage('{{ $paginator->getPageName() }}')"
+                                    dusk="nextPage{{ $paginator->getPageName() == 'page' ? '' : '.' . $paginator->getPageName() }}.after"
+                                    rel="next"
+                                    class="relative inline-flex items-center px-2 py-2 -ml-px text-sm font-medium
+                                     text-text-main-400 bg-bg-600 border border-bg-900 rounded-r-md leading-5
+                                    hover:bg-bg-400 focus:z-10 focus:outline-none focus:border-primary-300 focus:shadow-outline-blue
+                                    active:border-primary-100 active:text-text-main-400 transition ease-in-out duration-150"
+                                    aria-label="{{ __('pagination.next') }}">
+                                    <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
+                                        <path fill-rule="evenodd"
+                                            d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z"
+                                            clip-rule="evenodd" />
+                                    </svg>
+                                </button>
+                            @else
+                                <span aria-disabled="true" aria-label="{{ __('pagination.next') }}">
+                                    <span
+                                        class="relative inline-flex items-center px-2 py-2 -ml-px text-sm font-medium
+                                         text-text-main-400 bg-bg-600 border border-bg-900 cursor-default rounded-r-md leading-5"
+                                        aria-hidden="true">
+                                        <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
+                                            <path fill-rule="evenodd"
+                                                d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z"
+                                                clip-rule="evenodd" />
+                                        </svg>
+                                    </span>
+                                </span>
+                            @endif
+                        </span>
+                    </span>
+                </div>
+            </div>
+        </nav>
+    @endif
+</div>
diff --git a/resources/views/vendor/pagination/tailwind.blade.php b/resources/views/vendor/pagination/tailwind.blade.php
new file mode 100644
index 00000000000..5c2a15dbb9a
--- /dev/null
+++ b/resources/views/vendor/pagination/tailwind.blade.php
@@ -0,0 +1,148 @@
+@if ($paginator->hasPages())
+    <nav role="navigation" aria-label="{{ __('Pagination Navigation') }}" class="flex items-center justify-between">
+        {{-- Previous | Next buttons --}}
+        <div class="flex justify-between flex-1 sm:hidden">
+            @if ($paginator->onFirstPage())
+                <span
+                    class="relative inline-flex items-center px-4 py-2 text-sm font-medium text-gray-500
+                    bg-white border border-gray-300 cursor-default leading-5 rounded-md">
+                    {!! __('pagination.previous') !!}
+                </span>
+            @else
+                <a href="{{ $paginator->previousPageUrl() }}"
+                    class="relative inline-flex items-center px-4 py-2 text-sm font-medium text-gray-700
+                    bg-white border border-gray-300 leading-5 rounded-md hover:text-gray-500 focus:outline-none focus:ring
+                    ring-gray-300 focus:border-blue-300 active:bg-gray-100 active:text-gray-700 transition ease-in-out duration-150">
+                    {!! __('pagination.previous') !!}
+                </a>
+            @endif
+
+            @if ($paginator->hasMorePages())
+                <a href="{{ $paginator->nextPageUrl() }}"
+                    class="relative inline-flex items-center px-4 py-2 ml-3 text-sm font-medium text-gray-700
+                    bg-white border border-gray-300 leading-5 rounded-md hover:text-gray-500 focus:outline-none focus:ring
+                    ring-gray-300 focus:border-blue-300 active:bg-gray-100 active:text-gray-700 transition ease-in-out duration-150">
+                    {!! __('pagination.next') !!}
+                </a>
+            @else
+                <span
+                    class="relative inline-flex items-center px-4 py-2 ml-3 text-sm font-medium text-gray-500
+                    bg-white border border-gray-300 cursor-default leading-5 rounded-md">
+                    {!! __('pagination.next') !!}
+                </span>
+            @endif
+        </div>
+
+        {{-- text + 1234 ... buttons --}}
+        <div class="hidden sm:flex-1 sm:flex sm:items-center sm:justify-between flex-wrap">
+            <div class="w-full">
+                <p class="text-sm text-gray-700 leading-5">
+                    {!! __('Showing') !!}
+                    @if ($paginator->firstItem())
+                        <span class="font-medium">{{ $paginator->firstItem() }}</span>
+                        {!! __('to') !!}
+                        <span class="font-medium">{{ $paginator->lastItem() }}</span>
+                    @else
+                        {{ $paginator->count() }}
+                    @endif
+                    {!! __('of') !!}
+                    <span class="font-medium">{{ $paginator->total() }}</span>
+                    {!! __('results') !!}
+                </p>
+            </div>
+
+            <div class="w-full">
+                <span class="relative z-0 inline-flex shadow-sm rounded-md">
+                    {{-- Previous Page Link --}}
+                    @if ($paginator->onFirstPage())
+                        <span aria-disabled="true" aria-label="{{ __('pagination.previous') }}">
+                            <span
+                                class="relative inline-flex items-center px-2 py-2 text-sm font-medium text-gray-500
+                                bg-white border border-gray-300 cursor-default rounded-l-md leading-5"
+                                aria-hidden="true">
+                                <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
+                                    <path fill-rule="evenodd"
+                                        d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z"
+                                        clip-rule="evenodd" />
+                                </svg>
+                            </span>
+                        </span>
+                    @else
+                        <a href="{{ $paginator->previousPageUrl() }}" rel="prev"
+                            class="relative inline-flex items-center px-2 py-2 text-sm font-medium text-gray-500
+                            bg-white border border-gray-300 rounded-l-md leading-5 hover:text-gray-400 focus:z-10 focus:outline-none focus:ring
+                            ring-gray-300 focus:border-blue-300 active:bg-gray-100 active:text-gray-500 transition ease-in-out duration-150"
+                            aria-label="{{ __('pagination.previous') }}">
+                            <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
+                                <path fill-rule="evenodd"
+                                    d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z"
+                                    clip-rule="evenodd" />
+                            </svg>
+                        </a>
+                    @endif
+
+                    {{-- Pagination Elements --}}
+                    @foreach ($elements as $element)
+                        {{-- "Three Dots" Separator --}}
+                        @if (is_string($element))
+                            <span aria-disabled="true">
+                                <span
+                                    class="relative inline-flex items-center px-4 py-2 -ml-px text-sm font-medium text-gray-700
+                                    bg-white border border-gray-300 cursor-default leading-5">{{ $element }}</span>
+                            </span>
+                        @endif
+
+                        {{-- Array Of Links --}}
+                        @if (is_array($element))
+                            @foreach ($element as $page => $url)
+                                @if ($page == $paginator->currentPage())
+                                    <span aria-current="page">
+                                        <span
+                                            class="relative inline-flex items-center px-4 py-2 -ml-px text-sm font-medium text-gray-500
+                                            bg-white border border-gray-300 cursor-default leading-5">{{ $page }}</span>
+                                    </span>
+                                @else
+                                    <a href="{{ $url }}"
+                                        class="relative inline-flex items-center px-4 py-2 -ml-px text-sm font-medium text-gray-700
+                                        bg-white border border-gray-300 leading-5 hover:text-gray-500 focus:z-10 focus:outline-none focus:ring
+                                        ring-gray-300 focus:border-blue-300 active:bg-gray-100 active:text-gray-700 transition ease-in-out duration-150"
+                                        aria-label="{{ __('Go to page :page', ['page' => $page]) }}">
+                                        {{ $page }}
+                                    </a>
+                                @endif
+                            @endforeach
+                        @endif
+                    @endforeach
+
+                    {{-- Next Page Link --}}
+                    @if ($paginator->hasMorePages())
+                        <a href="{{ $paginator->nextPageUrl() }}" rel="next"
+                            class="relative inline-flex items-center px-2 py-2 -ml-px text-sm font-medium text-gray-500
+                            bg-white border border-gray-300 rounded-r-md leading-5 hover:text-gray-400 focus:z-10 focus:outline-none focus:ring
+                            ring-gray-300 focus:border-blue-300 active:bg-gray-100 active:text-gray-500 transition ease-in-out duration-150"
+                            aria-label="{{ __('pagination.next') }}">
+                            <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
+                                <path fill-rule="evenodd"
+                                    d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z"
+                                    clip-rule="evenodd" />
+                            </svg>
+                        </a>
+                    @else
+                        <span aria-disabled="true" aria-label="{{ __('pagination.next') }}">
+                            <span
+                                class="relative inline-flex items-center px-2 py-2 -ml-px text-sm font-medium text-gray-500
+                                bg-white border border-gray-300 cursor-default rounded-r-md leading-5"
+                                aria-hidden="true">
+                                <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
+                                    <path fill-rule="evenodd"
+                                        d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z"
+                                        clip-rule="evenodd" />
+                                </svg>
+                            </span>
+                        </span>
+                    @endif
+                </span>
+            </div>
+        </div>
+    </nav>
+@endif
diff --git a/routes/web-livewire.php b/routes/web-livewire.php
new file mode 100644
index 00000000000..ea72ab88997
--- /dev/null
+++ b/routes/web-livewire.php
@@ -0,0 +1,50 @@
+<?php
+
+namespace App\Livewire\Components\Pages;
+
+use App\Livewire\Components\Pages\Gallery\Album;
+use App\Livewire\Components\Pages\Gallery\Albums;
+use App\Livewire\Components\Pages\Gallery\Search;
+use App\Models\Configs;
+use Illuminate\Support\Facades\Route;
+use Illuminate\Support\Facades\URL;
+
+/*
+|--------------------------------------------------------------------------
+| Livewire Routes
+|--------------------------------------------------------------------------
+|
+| Here is where you can register livewire routes for your application. These
+| routes are loaded by the RouteServiceProvider within a group which
+| contains the "web" middleware group. Now create something great!
+|
+*/
+
+if (config('app.force_https')) {
+	URL::forceScheme('https');
+}
+
+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('/map/{albumId?}', Map::class)->name('livewire-map');
+			Route::get('/frame/{albumId?}', Frame::class)->name('livewire-frame');
+			Route::get('/gallery', Albums::class)->name('livewire-gallery');
+			Route::get('/search/{albumId?}', Search::class)->name('livewire-search');
+			Route::get('/gallery/{albumId}/', Album::class)->name('livewire-gallery-album');
+			Route::get('/gallery/{albumId}/{photoId}', Album::class)->name('livewire-gallery-photo');
+			Route::get('/', function () {
+				return redirect(Configs::getValueAsBool('landing_page_enable') ? route('landing') : route('livewire-gallery'));
+			})->name('livewire-index');
+		});
+	});
+
diff --git a/routes/web.php b/routes/web.php
index b53327184e2..835fd570b1b 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', '.*');
diff --git a/scripts/post-merge b/scripts/post-merge
index 409b2c78f42..5bdd6fd140a 100755
--- a/scripts/post-merge
+++ b/scripts/post-merge
@@ -16,6 +16,15 @@ else
         printf "\n${ORANGE}Dev mode detected${NO_COLOR}\n"
         echo "composer install"
         composer install
+        if command -v npm > /dev/null; then
+            printf "\n${ORANGE}npm detected${NO_COLOR}\n"
+            if  [ -f "package.json" ]; then
+                echo "npm install --no-audit --no-fund"
+                npm install --no-audit --no-fund
+            else
+                printf "${GREEN}no package.json found${NO_COLOR}\n"
+            fi
+        fi
     else
         printf "\n${ORANGE}--no-dev mode detected${NO_COLOR}\n"
         echo "composer install --no-dev --prefer-dist"
diff --git a/scripts/pre-commit b/scripts/pre-commit
index a04e928b9cd..53fbf69c06d 100755
--- a/scripts/pre-commit
+++ b/scripts/pre-commit
@@ -8,6 +8,8 @@ printf "\n${GREEN}pre commit hook start${NO_COLOR}\n"
 PHP_CS_FIXER="vendor/bin/php-cs-fixer"
 PHP_CS_FIXER_IGNORE_ENV=1
 
+NPM_FORMAT="node_modules/prettier"
+
 if [ -x "$PHP_CS_FIXER" ]; then
     git status --porcelain | grep -e '^[AM]\(.*\).php$' | cut -c 3- | while read line; do
         ${PHP_CS_FIXER} fix --config=.php-cs-fixer.php ${line};
@@ -21,4 +23,17 @@ else
     echo ""
 fi
 
+if [ -x "$NPM_FORMAT" ]; then
+    npm run format
+    git status --porcelain | grep -e '^[AM]\(.*\).js$' | cut -c 3- | while read line; do
+        git add "$line";
+    done
+else
+    echo ""
+    printf "${YELLOW}Please install prettier, e.g.:${NO_COLOR}"
+    echo ""
+    echo "  npm run install"
+    echo ""
+fi
+
 printf "\n${GREEN}pre commit hook finish${NO_COLOR}\n"
diff --git a/tailwind.config.js b/tailwind.config.js
new file mode 100644
index 00000000000..a8870f17656
--- /dev/null
+++ b/tailwind.config.js
@@ -0,0 +1,183 @@
+/** @type {import('tailwindcss').Config} */
+module.exports = {
+  content: [
+    "./resources/**/*.blade.php",
+    "./resources/**/*.js",
+    "./resources/**/*.vue",
+  ],
+  theme: {
+    extend: {
+      backgroundImage: {
+        'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))',
+        'noise': "url('../img/noise.png')"
+      },
+      dropShadow: {
+        '3xl': '0 20px 20px rgba(0, 0, 0, 1)',
+      },
+      fontSize: {
+        '3xs': ['0.55rem', '0.7rem'],
+        '2xs' : ['0.65rem', '0.8rem'],
+      },
+      colors: {
+        primary: {
+          200: 'var(--primary-200)',
+          300: 'var(--primary-300)',
+          400: 'var(--primary-400)',
+          500: 'var(--primary-500)',
+          600: 'var(--primary-600)',
+          700: 'var(--primary-700)',
+        },
+        'text-main': {
+          0: 'var(--text-main-0)',
+          100: 'var(--text-main-100)',
+          200: 'var(--text-main-200)',
+          400: 'var(--text-main-400)',
+        },
+        'text-hover': 'var(--text-hover)',
+        bg: {
+          50: 'var(--bg-50)',
+          100: 'var(--bg-100)',
+          200: 'var(--bg-200)',
+          300: 'var(--bg-300)',
+          400: 'var(--bg-400)',
+          500: 'var(--bg-500)',
+          600: 'var(--bg-600)',
+          700: 'var(--bg-700)',
+          800: 'var(--bg-800)',
+          900: 'var(--bg-900)',
+          950: 'var(--bg-950)',
+        },
+        danger: {
+          600: 'var(--danger)',
+          700: 'var(--danger-dark)',
+          800: 'var(--danger-darker)',
+        },
+        warning: {
+          600: 'var(--warning)',
+          700: 'var(--warning-dark)',
+        },
+        create: {
+          600: 'var(--create)',
+          700: 'var(--create-dark)',
+        }
+      },
+      flexShrink: {
+        2: '2'
+      },
+      transitionProperty: {
+        width: ['width'],
+      },
+      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)'
+          }
+        },
+        popIn: {
+          '0%': {
+            'opacity': '0',
+            'transform': 'scale(1.1)'
+          },
+          '100%': {
+            'opacity': '1',
+            'transform': 'scale(1)'
+          }
+        },
+        scaleIn: {
+          '0%': {
+            'transform': 'scale(0)'
+          },
+          '100%': {
+            'transform': 'scale(1)'
+          }
+        },
+        scaleOut: {
+          '0%': {
+            'transform': 'scale(1)'
+          },
+          '100%': {
+            'transform': 'scale(0)'
+          }
+        },
+        animateDown: {
+          '0%': {
+            'opacity': '0',
+            'transform': 'translateY(-300px)'
+          },
+          '100%': {
+            'opacity': '1',
+            'transform': 'translateY(0px)'
+          }
+        },
+        animateUp: {
+          '0%': {
+            'opacity': '0',
+            'transform': 'translateY(300px)'
+          },
+          '100%': {
+            'opacity': '1',
+            'transform': 'translateY(0px)'
+          }
+        }
+
+
+      },
+      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)',
+        'scaleIn': 'scaleIn 0.3s forwards cubic-bezier(0.51,0.92,0.24,1.2)',
+        'scaleOut': 'scaleOut 0.3s forwards cubic-bezier(0.51,0.92,0.24,1.2)',
+
+        'slowFadeIn': 'fadeIn 2s forwards cubic-bezier(0.51, 0.92, 0.24, 1)',
+        'slowFadeOut': 'fadeOut 2s forwards cubic-bezier(0.51, 0.92, 0.24, 1)',
+        'slowZoomIn': 'zoomIn 2s forwards cubic-bezier(0.51, 0.92, 0.24, 1)',
+        'slowZoomOut': 'zoomOut 2s forwards cubic-bezier(0.51, 0.92, 0.24, 1)',
+
+        'slowMoveUp': 'moveUp 2s forwards cubic-bezier(0.51, 0.92, 0.24, 1)',
+        'slowPopIn': 'popIn 2s forwards cubic-bezier(0.51, 0.92, 0.24, 1)',
+
+        'landingIntroPopIn': 'popIn 2s forwards ease-in-out',
+        'landingIntroFadeOut': 'fadeOut 2s 2s forwards ease-in-out', // delayed by 2s
+        'landingSlidesPopIn': 'popIn 2s 3s forwards ease-in-out', // delayed by 2s
+        'ladningAnimateDown': 'animateDown 1s 3.1s forwards ease-in-out', 
+        'ladningAnimateUp': 'animateUp 1s 3.1s forwards ease-in-out',
+        'delayedFadeOut': 'fadeOut 2s 2s forwards ease-in-out'
+      }
+    },
+  },
+  plugins: [],
+}
\ No newline at end of file
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 00000000000..d12fe33b990
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,112 @@
+{
+  "include": ["resources/js/**/*", "resources/css/**/*"],
+  "compilerOptions": {
+    /* Visit https://aka.ms/tsconfig to read more about this file */
+
+    /* Projects */
+    // "incremental": true,                              /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
+    // "composite": true,                                /* Enable constraints that allow a TypeScript project to be used with project references. */
+    // "tsBuildInfoFile": "./.tsbuildinfo",              /* Specify the path to .tsbuildinfo incremental compilation file. */
+    // "disableSourceOfProjectReferenceRedirect": true,  /* Disable preferring source files instead of declaration files when referencing composite projects. */
+    // "disableSolutionSearching": true,                 /* Opt a project out of multi-project reference checking when editing. */
+    // "disableReferencedProjectLoad": true,             /* Reduce the number of projects loaded automatically by TypeScript. */
+
+    /* Language and Environment */
+    "target": "es6",                                  /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
+    "lib": ["ES6", "DOM"],                            /* Specify a set of bundled library declaration files that describe the target runtime environment. */
+    // "jsx": "preserve",                                /* Specify what JSX code is generated. */
+    // "experimentalDecorators": true,                   /* Enable experimental support for legacy experimental decorators. */
+    // "emitDecoratorMetadata": true,                    /* Emit design-type metadata for decorated declarations in source files. */
+    // "jsxFactory": "",                                 /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
+    // "jsxFragmentFactory": "",                         /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
+    // "jsxImportSource": "",                            /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
+    // "reactNamespace": "",                             /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
+    // "noLib": true,                                    /* Disable including any library files, including the default lib.d.ts. */
+    // "useDefineForClassFields": true,                  /* Emit ECMAScript-standard-compliant class fields. */
+    // "moduleDetection": "auto",                        /* Control what method is used to detect module-format JS files. */
+
+    /* Modules */
+    "module": "CommonJS",                                /* Specify what module code is generated. */
+    // "rootDir": "./",                                  /* Specify the root folder within your source files. */
+    // "moduleResolution": "node10",                     /* Specify how TypeScript looks up a file from a given module specifier. */
+    // "baseUrl": "./",                                  /* Specify the base directory to resolve non-relative module names. */
+    "paths": {
+      "@/*": ["./resources/js/*"]
+    },                                                   /* Specify a set of entries that re-map imports to additional lookup locations. */
+    // "rootDirs": [],                                   /* Allow multiple folders to be treated as one when resolving modules. */
+    // "typeRoots": [],                                  /* Specify multiple folders that act like './node_modules/@types'. */
+    // "types": [],                                      /* Specify type package names to be included without being referenced in a source file. */
+    // "allowUmdGlobalAccess": true,                     /* Allow accessing UMD globals from modules. */
+    // "moduleSuffixes": [],                             /* List of file name suffixes to search when resolving a module. */
+    // "allowImportingTsExtensions": true,               /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */
+    // "resolvePackageJsonExports": true,                /* Use the package.json 'exports' field when resolving package imports. */
+    // "resolvePackageJsonImports": true,                /* Use the package.json 'imports' field when resolving imports. */
+    // "customConditions": [],                           /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */
+    // "resolveJsonModule": true,                        /* Enable importing .json files. */
+    // "allowArbitraryExtensions": true,                 /* Enable importing files with any extension, provided a declaration file is present. */
+    // "noResolve": true,                                /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */
+
+    /* JavaScript Support */
+    "allowJs": true,                                  /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
+    "checkJs": true,                                  /* Enable error reporting in type-checked JavaScript files. */
+    // "maxNodeModuleJsDepth": 1,                        /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
+
+    /* Emit */
+    // "declaration": true,                              /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
+    // "declarationMap": true,                           /* Create sourcemaps for d.ts files. */
+    // "emitDeclarationOnly": true,                      /* Only output d.ts files and not JavaScript files. */
+    // "sourceMap": true,                                /* Create source map files for emitted JavaScript files. */
+    // "inlineSourceMap": true,                          /* Include sourcemap files inside the emitted JavaScript. */
+    // "outFile": "./",                                  /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
+    // "outDir": "./",                                   /* Specify an output folder for all emitted files. */
+    // "removeComments": true,                           /* Disable emitting comments. */
+    // "noEmit": true,                                   /* Disable emitting files from a compilation. */
+    // "importHelpers": true,                            /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
+    // "importsNotUsedAsValues": "remove",               /* Specify emit/checking behavior for imports that are only used for types. */
+    // "downlevelIteration": true,                       /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
+    // "sourceRoot": "",                                 /* Specify the root path for debuggers to find the reference source code. */
+    // "mapRoot": "",                                    /* Specify the location where debugger should locate map files instead of generated locations. */
+    // "inlineSources": true,                            /* Include source code in the sourcemaps inside the emitted JavaScript. */
+    // "emitBOM": true,                                  /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
+    // "newLine": "crlf",                                /* Set the newline character for emitting files. */
+    // "stripInternal": true,                            /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
+    // "noEmitHelpers": true,                            /* Disable generating custom helper functions like '__extends' in compiled output. */
+    // "noEmitOnError": true,                            /* Disable emitting files if any type checking errors are reported. */
+    // "preserveConstEnums": true,                       /* Disable erasing 'const enum' declarations in generated code. */
+    // "declarationDir": "./",                           /* Specify the output directory for generated declaration files. */
+    // "preserveValueImports": true,                     /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */
+
+    /* Interop Constraints */
+    "isolatedModules": true,                          /* Ensure that each file can be safely transpiled without relying on other imports. */
+    // "verbatimModuleSyntax": true,                     /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */
+    // "allowSyntheticDefaultImports": true,             /* Allow 'import x from y' when a module doesn't have a default export. */
+    "esModuleInterop": true,                             /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
+    // "preserveSymlinks": true,                         /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
+    "forceConsistentCasingInFileNames": true,            /* Ensure that casing is correct in imports. */
+
+    /* Type Checking */
+    "strict": true,                                      /* Enable all strict type-checking options. */
+    // "noImplicitAny": true,                            /* Enable error reporting for expressions and declarations with an implied 'any' type. */
+    // "strictNullChecks": true,                         /* When type checking, take into account 'null' and 'undefined'. */
+    // "strictFunctionTypes": true,                      /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
+    // "strictBindCallApply": true,                      /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
+    // "strictPropertyInitialization": true,             /* Check for class properties that are declared but not set in the constructor. */
+    // "noImplicitThis": true,                           /* Enable error reporting when 'this' is given the type 'any'. */
+    // "useUnknownInCatchVariables": true,               /* Default catch clause variables as 'unknown' instead of 'any'. */
+    // "alwaysStrict": true,                             /* Ensure 'use strict' is always emitted. */
+    // "noUnusedLocals": true,                           /* Enable error reporting when local variables aren't read. */
+    // "noUnusedParameters": true,                       /* Raise an error when a function parameter isn't read. */
+    // "exactOptionalPropertyTypes": true,               /* Interpret optional property types as written, rather than adding 'undefined'. */
+    // "noImplicitReturns": true,                        /* Enable error reporting for codepaths that do not explicitly return in a function. */
+    // "noFallthroughCasesInSwitch": true,               /* Enable error reporting for fallthrough cases in switch statements. */
+    // "noUncheckedIndexedAccess": true,                 /* Add 'undefined' to a type when accessed using an index. */
+    // "noImplicitOverride": true,                       /* Ensure overriding members in derived classes are marked with an override modifier. */
+    // "noPropertyAccessFromIndexSignature": true,       /* Enforces using indexed accessors for keys declared using an indexed type. */
+    // "allowUnusedLabels": true,                        /* Disable error reporting for unused labels. */
+    // "allowUnreachableCode": true,                     /* Disable error reporting for unreachable code. */
+
+    /* Completeness */
+    // "skipDefaultLibCheck": true,                      /* Skip type checking .d.ts files that are included with TypeScript. */
+    // "skipLibCheck": true,                                 /* Skip type checking all .d.ts files. */
+  }
+}
diff --git a/version.md b/version.md
index 01b73abe550..28cbf7c0aae 100644
--- a/version.md
+++ b/version.md
@@ -1,1 +1,1 @@
-4.13.0
\ No newline at end of file
+5.0.0
\ No newline at end of file
diff --git a/vite.config.js b/vite.config.js
new file mode 100644
index 00000000000..5b22a143aa7
--- /dev/null
+++ b/vite.config.js
@@ -0,0 +1,33 @@
+import { defineConfig } from 'vite';
+import laravel from 'laravel-vite-plugin';
+import commonjs from 'vite-plugin-commonjs'
+import checker from 'vite-plugin-checker'
+
+export default defineConfig({
+  plugins: [
+    commonjs(/* options */),
+
+    laravel({
+      input: ['resources/css/app.css', 'resources/js/app.ts'],
+      refresh: true,
+    }),
+
+    checker({
+      // e.g. use TypeScript check
+      typescript: true,
+    }),
+  ],
+  server: {
+    watch: {
+      ignored: [
+        "**/.*/**",
+        "**/database/**",
+        "**/node_modules/**",
+        "**/public/**",
+        "**/storage/**",
+        "**/tests/**",
+        "vendor/**",
+      ],
+    },
+  }
+});


Test patch:
diff --git a/tests/AbstractTestCase.php b/tests/AbstractTestCase.php
index 177d2b140c7..474fb3fa075 100644
--- a/tests/AbstractTestCase.php
+++ b/tests/AbstractTestCase.php
@@ -116,4 +116,17 @@ protected static function getRecentPhotoIDs(): BaseCollection
 
 		return Photo::query()->select('id')->where($recentFilter)->pluck('id');
 	}
+
+	/**
+	 * Because we are now using hard coded urls for the images size_variants instead of relative.
+	 * We need to drop that prefix in order to access them from public_path().
+	 *
+	 * @param string $url
+	 *
+	 * @return string prefix removed
+	 */
+	protected function dropUrlPrefix(string $url): string
+	{
+		return str_replace(config('app.url'), '', $url);
+	}
 }
diff --git a/tests/Feature/BasePhotosAddHandler.php b/tests/Feature/BasePhotosAddHandler.php
index 44cc05796a1..2cb5b2cd3f4 100644
--- a/tests/Feature/BasePhotosAddHandler.php
+++ b/tests/Feature/BasePhotosAddHandler.php
@@ -489,7 +489,7 @@ public function testUploadMultibyteTitle(): void
 			'title' => 'fin de journée',
 			'description' => null,
 			'tags' => [],
-			'license' => 'None',
+			'license' => 'none',
 			'is_public' => false,
 			'is_starred' => false,
 			'iso' => '400',
diff --git a/tests/Feature/CommandFixPermissionsTest.php b/tests/Feature/CommandFixPermissionsTest.php
index 9c15b6b8128..4f879127008 100644
--- a/tests/Feature/CommandFixPermissionsTest.php
+++ b/tests/Feature/CommandFixPermissionsTest.php
@@ -27,7 +27,7 @@ class CommandFixPermissionsTest extends Base\BasePhotoTest
 	 */
 	public function testFixPermissions(): void
 	{
-		if (config('filesystems.images.visibility', 'public') !== 'public') {
+		if (config('filesystems.disks.images.visibility', 'public') !== 'public') {
 			static::markTestSkipped('Wrong setting in .env file or configuration');
 		}
 
@@ -38,7 +38,7 @@ public function testFixPermissions(): void
 			static::createUploadedFile(TestConstants::SAMPLE_FILE_MONGOLIA_IMAGE)
 		));
 
-		$filePath = public_path($photo->size_variants->original->url);
+		$filePath = public_path($this->dropUrlPrefix($photo->size_variants->original->url));
 		$dirPath = pathinfo($filePath, PATHINFO_DIRNAME);
 
 		static::skipIfNotFileOwner($filePath);
diff --git a/tests/Feature/CommandGenerateThumbsTest.php b/tests/Feature/CommandGenerateThumbsTest.php
index 4692d73df31..3931a918b1d 100644
--- a/tests/Feature/CommandGenerateThumbsTest.php
+++ b/tests/Feature/CommandGenerateThumbsTest.php
@@ -51,7 +51,7 @@ public function testThumbRecreation(): void
 		));
 
 		// Remove the size variant "small" from disk and from DB
-		unlink(public_path($photo1->size_variants->small->url));
+		unlink(public_path($this->dropUrlPrefix($photo1->size_variants->small->url)));
 		DB::table('size_variants')
 			->where('photo_id', '=', $photo1->id)
 			->where('type', '=', SizeVariantType::SMALL)
@@ -67,6 +67,6 @@ public function testThumbRecreation(): void
 		$this->assertNotNull($photo2->size_variants->small);
 		$this->assertEquals($photo1->size_variants->small->width, $photo2->size_variants->small->width);
 		$this->assertEquals($photo1->size_variants->small->height, $photo2->size_variants->small->height);
-		$this->assertFileExists(public_path($photo2->size_variants->small->url));
+		$this->assertFileExists(public_path($this->dropUrlPrefix($photo2->size_variants->small->url)));
 	}
 }
diff --git a/tests/Feature/CommandGhostbusterTest.php b/tests/Feature/CommandGhostbusterTest.php
index 82633171ac0..65a66097d72 100644
--- a/tests/Feature/CommandGhostbusterTest.php
+++ b/tests/Feature/CommandGhostbusterTest.php
@@ -30,13 +30,13 @@ public function testRemoveOrphanedFiles(): void
 		// and thumb, because these size variants must be generated at least
 		// otherwise we have nothing to test.
 		$fileURLs = array_diff([
-			$photo->size_variants->original->url,
-			$photo->size_variants->medium2x?->url,
-			$photo->size_variants->medium?->url,
-			$photo->size_variants->small2x?->url,
-			$photo->size_variants->small?->url,
-			$photo->size_variants->thumb2x?->url,
-			$photo->size_variants->thumb->url,
+			$this->dropUrlPrefix($photo->size_variants->original->url),
+			$this->dropUrlPrefix($photo->size_variants->medium2x?->url),
+			$this->dropUrlPrefix($photo->size_variants->medium?->url),
+			$this->dropUrlPrefix($photo->size_variants->small2x?->url),
+			$this->dropUrlPrefix($photo->size_variants->small?->url),
+			$this->dropUrlPrefix($photo->size_variants->thumb2x?->url),
+			$this->dropUrlPrefix($photo->size_variants->thumb->url),
 		], [null]);
 		$this->assertNotEmpty($fileURLs);
 
@@ -79,18 +79,18 @@ public function testRemoveZombiePhotos(): void
 		// otherwise we have nothing to test.
 		$originalFileURL = $photo->size_variants->original->url;
 		$fileURLs = array_diff([
-			$originalFileURL,
-			$photo->size_variants->medium2x?->url,
-			$photo->size_variants->medium?->url,
-			$photo->size_variants->small2x?->url,
-			$photo->size_variants->small?->url,
-			$photo->size_variants->thumb2x?->url,
-			$photo->size_variants->thumb->url,
+			$this->dropUrlPrefix($originalFileURL),
+			$this->dropUrlPrefix($photo->size_variants->medium2x?->url),
+			$this->dropUrlPrefix($photo->size_variants->medium?->url),
+			$this->dropUrlPrefix($photo->size_variants->small2x?->url),
+			$this->dropUrlPrefix($photo->size_variants->small?->url),
+			$this->dropUrlPrefix($photo->size_variants->thumb2x?->url),
+			$this->dropUrlPrefix($photo->size_variants->thumb->url),
 		], [null]);
 		$this->assertNotEmpty($fileURLs);
 
 		// Remove original file
-		\Safe\unlink(public_path($originalFileURL));
+		\Safe\unlink(public_path($this->dropUrlPrefix($originalFileURL)));
 
 		// Ghostbuster, ...
 		$this->artisan(self::COMMAND, [
diff --git a/tests/Feature/CommandTakeDateTest.php b/tests/Feature/CommandTakeDateTest.php
index 88a8a10d11a..402fa7a5a01 100644
--- a/tests/Feature/CommandTakeDateTest.php
+++ b/tests/Feature/CommandTakeDateTest.php
@@ -47,7 +47,7 @@ public function testSetUploadTimeFromFileTime(): void
 		/** @var \App\Models\Photo */
 		$photo = static::convertJsonToObject($this->photos_tests->get($id));
 
-		$file_time = \Safe\filemtime(public_path($photo->size_variants->original->url));
+		$file_time = \Safe\filemtime(public_path($this->dropUrlPrefix($photo->size_variants->original->url)));
 		$carbon = new Carbon($photo->created_at);
 
 		$this->assertEquals($file_time, $carbon->getTimestamp());
diff --git a/tests/Feature/CommandVideoDataTest.php b/tests/Feature/CommandVideoDataTest.php
index a71232a9c0a..741de6c4fef 100644
--- a/tests/Feature/CommandVideoDataTest.php
+++ b/tests/Feature/CommandVideoDataTest.php
@@ -31,7 +31,7 @@ public function testThumbRecreation(): void
 		));
 
 		// Remove the size variant "thumb" from disk and from DB
-		\Safe\unlink(public_path($photo1->size_variants->thumb->url));
+		\Safe\unlink(public_path($this->dropUrlPrefix($photo1->size_variants->thumb->url)));
 		DB::table('size_variants')
 			->where('photo_id', '=', $photo1->id)
 			->where('type', '=', SizeVariantType::THUMB)
@@ -47,6 +47,6 @@ public function testThumbRecreation(): void
 		$this->assertNotNull($photo2->size_variants->thumb);
 		$this->assertEquals($photo1->size_variants->thumb->width, $photo2->size_variants->thumb->width);
 		$this->assertEquals($photo1->size_variants->thumb->height, $photo2->size_variants->thumb->height);
-		$this->assertFileExists(public_path($photo2->size_variants->thumb->url));
+		$this->assertFileExists(public_path($this->dropUrlPrefix($photo2->size_variants->thumb->url)));
 	}
 }
diff --git a/tests/Feature/PhotosAddMethodsTest.php b/tests/Feature/PhotosAddMethodsTest.php
index 3fb9d9b2d27..949d8a6d5aa 100644
--- a/tests/Feature/PhotosAddMethodsTest.php
+++ b/tests/Feature/PhotosAddMethodsTest.php
@@ -35,7 +35,12 @@ public function testImportViaMove(): void
 	{
 		// import the photo
 		copy(base_path(TestConstants::SAMPLE_FILE_NIGHT_IMAGE), static::importPath('night.jpg'));
-		$this->photos_tests->importFromServer(static::importPath(), null, true, false, false);
+		$this->photos_tests->importFromServer(
+			path: static::importPath(),
+			album_id: null,
+			delete_imported: true,
+			skip_duplicates: false,
+			import_via_symlink: false);
 
 		// check if the file has been moved
 		$this->assertEquals(false, file_exists(static::importPath('night.jpg')));
@@ -45,7 +50,12 @@ public function testImportViaCopy(): void
 	{
 		// import the photo
 		copy(base_path(TestConstants::SAMPLE_FILE_NIGHT_IMAGE), static::importPath('night.jpg'));
-		$this->photos_tests->importFromServer(static::importPath(), null, false, false, false);
+		$this->photos_tests->importFromServer(
+			path: static::importPath(),
+			album_id: null,
+			delete_imported: false,
+			skip_duplicates: false,
+			import_via_symlink: false);
 
 		// check if the file is still there
 		$this->assertEquals(true, file_exists(static::importPath('night.jpg')));
@@ -67,7 +77,7 @@ public function testImportViaSymlink(): void
 		$photo_id = $ids_after->diff($ids_before)->first();
 		/** @var \App\Models\Photo $photo */
 		$photo = static::convertJsonToObject($this->photos_tests->get($photo_id));
-		$symlink_path = public_path($photo->size_variants->original->url);
+		$symlink_path = public_path($this->dropUrlPrefix($photo->size_variants->original->url));
 		$this->assertEquals(true, is_link($symlink_path));
 	}
 
@@ -190,8 +200,8 @@ public function testAppleLivePhotoImportViaSymlink(): void
 		$this->assertEquals(pathinfo($photo->live_photo_url, PATHINFO_FILENAME), pathinfo($photo->size_variants->original->url, PATHINFO_FILENAME));
 
 		// get the paths of the original size variant and the live photo and check whether they are truly symbolic links
-		$symlink_path1 = public_path($photo->size_variants->original->url);
-		$symlink_path2 = public_path($photo->live_photo_url);
+		$symlink_path1 = public_path($this->dropUrlPrefix($photo->size_variants->original->url));
+		$symlink_path2 = public_path($this->dropUrlPrefix($photo->live_photo_url));
 		$this->assertEquals(true, is_link($symlink_path1));
 		$this->assertEquals(true, is_link($symlink_path2));
 	}
diff --git a/tests/Feature/PhotosOperationsTest.php b/tests/Feature/PhotosOperationsTest.php
index cde528dfa33..07737df9a0a 100644
--- a/tests/Feature/PhotosOperationsTest.php
+++ b/tests/Feature/PhotosOperationsTest.php
@@ -150,7 +150,7 @@ public function testManyFunctionsAtOnce(): void
 			'album_id' => null,
 			'id' => $id,
 			'created_at' => $updated_taken_at->setTimezone('UTC')->format('Y-m-d\TH:i:sP'),
-			'license' => 'All Rights Reserved',
+			'license' => 'reserved',
 			'is_public' => true,
 			'is_starred' => true,
 			'tags' => ['night', 'trees'],
@@ -190,7 +190,7 @@ public function testManyFunctionsAtOnce(): void
 				'focal' => '16 mm',
 				'iso' => '1250',
 				'lens' => 'EF16-35mm f/2.8L USM',
-				'license' => 'All Rights Reserved',
+				'license' => 'reserved',
 				'make' => 'Canon',
 				'model' => 'Canon EOS R',
 				'is_public' => true,
diff --git a/tests/Feature/Traits/RequiresEmptyUsers.php b/tests/Feature/Traits/RequiresEmptyUsers.php
index adf7c18f3e0..2af5ae6989c 100644
--- a/tests/Feature/Traits/RequiresEmptyUsers.php
+++ b/tests/Feature/Traits/RequiresEmptyUsers.php
@@ -24,7 +24,7 @@ protected function setUpRequiresEmptyUsers(): void
 		static::assertEquals(
 			0,
 			DB::table('users')
-				->where('may_administrate', '=', false)
+				->where('id', '>', 1)
 				->count()
 		);
 	}
@@ -32,6 +32,6 @@ protected function setUpRequiresEmptyUsers(): void
 	protected function tearDownRequiresEmptyUsers(): void
 	{
 		// Clean up remaining stuff from tests
-		DB::table('users')->where('may_administrate', '=', false)->delete();
+		DB::table('users')->where('id', '>', 1)->delete();
 	}
 }
diff --git a/tests/Livewire/Base/BaseLivewireTest.php b/tests/Livewire/Base/BaseLivewireTest.php
new file mode 100644
index 00000000000..c06fd63296a
--- /dev/null
+++ b/tests/Livewire/Base/BaseLivewireTest.php
@@ -0,0 +1,94 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Base;
+
+use App\Enum\Livewire\NotificationType;
+use App\Models\Album;
+use App\Models\Photo;
+use App\Models\User;
+use Illuminate\Foundation\Testing\DatabaseTransactions;
+use Tests\AbstractTestCase;
+use Tests\Feature\Traits\RequiresEmptyAlbums;
+use Tests\Feature\Traits\RequiresEmptyPhotos;
+use Tests\Feature\Traits\RequiresEmptyUsers;
+
+abstract class BaseLivewireTest extends AbstractTestCase
+{
+	use RequiresEmptyUsers;
+	use RequiresEmptyAlbums;
+	use RequiresEmptyPhotos;
+	use DatabaseTransactions;
+
+	protected User $admin;
+
+	protected Album $album1;
+	protected Album $album2;
+	protected Album $subAlbum1;
+	protected Album $subAlbum2;
+	protected Photo $photo1;
+	protected Photo $photo1b;
+	protected Photo $photo2;
+	protected Photo $subPhoto1;
+	protected Photo $subPhoto2;
+	protected Photo $photoUnsorted;
+
+	protected User $userLocked;
+	protected User $userMayUpload1;
+	protected User $userMayUpload2;
+	protected User $userNoUpload;
+
+	public function setUp(): void
+	{
+		parent::setUp();
+		$this->setUpRequiresEmptyUsers();
+		$this->setUpRequiresEmptyAlbums();
+		$this->setUpRequiresEmptyPhotos();
+
+		$this->admin = User::factory()->may_administrate()->create();
+		$this->userMayUpload1 = User::factory()->may_upload()->create();
+		$this->userMayUpload2 = User::factory()->may_upload()->create();
+		$this->userNoUpload = User::factory()->create();
+		$this->userLocked = User::factory()->locked()->create();
+
+		$this->album1 = Album::factory()->as_root()->owned_by($this->userMayUpload1)->create();
+		$this->photo1 = Photo::factory()->owned_by($this->userMayUpload1)->with_GPS_coordinates()->in($this->album1)->create();
+		$this->photo1b = Photo::factory()->owned_by($this->userMayUpload1)->with_subGPS_coordinates()->in($this->album1)->create();
+
+		$this->subAlbum1 = Album::factory()->children_of($this->album1)->owned_by($this->userMayUpload1)->create();
+		$this->subPhoto1 = Photo::factory()->owned_by($this->userMayUpload1)->with_GPS_coordinates()->in($this->subAlbum1)->create();
+
+		$this->album2 = Album::factory()->as_root()->owned_by($this->userMayUpload1)->create();
+		$this->photo2 = Photo::factory()->owned_by($this->userMayUpload1)->with_GPS_coordinates()->in($this->album2)->create();
+
+		$this->subAlbum2 = Album::factory()->children_of($this->album2)->owned_by($this->userMayUpload1)->create();
+		$this->subPhoto2 = Photo::factory()->owned_by($this->userMayUpload1)->with_GPS_coordinates()->in($this->subAlbum2)->create();
+
+		$this->photoUnsorted = Photo::factory()->owned_by($this->userMayUpload1)->with_GPS_coordinates()->create();
+
+		$this->withoutVite();
+	}
+
+	public function tearDown(): void
+	{
+		$this->tearDownRequiresEmptyPhotos();
+		$this->tearDownRequiresEmptyAlbums();
+		$this->tearDownRequiresEmptyUsers();
+
+		parent::tearDown();
+	}
+
+	final public static function notifySuccess(): array
+	{
+		return ['msg' => __('lychee.CHANGE_SUCCESS'), 'type' => NotificationType::SUCCESS->value];
+	}
+}
\ No newline at end of file
diff --git a/tests/Livewire/Forms/Album/CreateTagTest.php b/tests/Livewire/Forms/Album/CreateTagTest.php
new file mode 100644
index 00000000000..ec055463625
--- /dev/null
+++ b/tests/Livewire/Forms/Album/CreateTagTest.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Forms\Album;
+
+use App\Livewire\Components\Forms\Album\CreateTag;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class CreateTagTest extends BaseLivewireTest
+{
+	public function testCreateLoggedOut(): void
+	{
+		Livewire::test(CreateTag::class)
+			->assertForbidden();
+	}
+
+	public function testCreateLoggedNoRights(): void
+	{
+		Livewire::actingAs($this->userNoUpload)->test(CreateTag::class)
+			->assertForbidden();
+	}
+
+	public function testCreateLoggedIn(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(CreateTag::class)
+			->assertOk()
+			->assertViewIs('livewire.forms.add.create-tag')
+			->call('close')
+			->assertDispatched('closeModal');
+
+		Livewire::actingAs($this->userMayUpload1)->test(CreateTag::class)
+			->assertOk()
+			->assertViewIs('livewire.forms.add.create-tag')
+			->set('title', fake()->country() . ' ' . fake()->year())
+			->set('tag', 'something')
+			->call('submit')
+			->assertRedirect();
+	}
+}
diff --git a/tests/Livewire/Forms/Album/CreateTest.php b/tests/Livewire/Forms/Album/CreateTest.php
new file mode 100644
index 00000000000..93927d0f292
--- /dev/null
+++ b/tests/Livewire/Forms/Album/CreateTest.php
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Forms\Album;
+
+use App\Contracts\Livewire\Params;
+use App\Livewire\Components\Forms\Album\Create;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class CreateTest extends BaseLivewireTest
+{
+	public function testCreateLoggedOut(): void
+	{
+		Livewire::test(Create::class, ['params' => [Params::PARENT_ID => null]])
+			->assertForbidden();
+
+		Livewire::test(Create::class, ['params' => [Params::PARENT_ID => $this->album1->id]])
+			->assertForbidden();
+	}
+
+	public function testCreateLoggedNoRights(): void
+	{
+		Livewire::actingAs($this->userNoUpload)->test(Create::class, ['params' => [Params::PARENT_ID => null]])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userNoUpload)->test(Create::class, ['params' => [Params::PARENT_ID => $this->album1->id]])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userMayUpload2)->test(Create::class, ['params' => [Params::PARENT_ID => $this->album1->id]])
+			->assertForbidden();
+	}
+
+	public function testCreateLoggedIn(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(Create::class, ['params' => [Params::PARENT_ID => $this->album1->id]])
+			->assertOk()
+			->assertViewIs('livewire.forms.add.create')
+			->call('close')
+			->assertDispatched('closeModal');
+
+		Livewire::actingAs($this->userMayUpload1)->test(Create::class, ['params' => [Params::PARENT_ID => $this->album1->id]])
+			->assertOk()
+			->assertViewIs('livewire.forms.add.create')
+			->set('title', fake()->country() . ' ' . fake()->year())
+			->call('submit')
+			->assertRedirect();
+
+		$this->assertCount(2, $this->album1->fresh()->load('children')->children);
+	}
+}
diff --git a/tests/Livewire/Forms/Album/DeletePanelTest.php b/tests/Livewire/Forms/Album/DeletePanelTest.php
new file mode 100644
index 00000000000..41ba8d46b2b
--- /dev/null
+++ b/tests/Livewire/Forms/Album/DeletePanelTest.php
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Forms\Album;
+
+use App\Livewire\Components\Forms\Album\DeletePanel;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class DeletePanelTest extends BaseLivewireTest
+{
+	public function testDeletePanelLoggedOut(): void
+	{
+		Livewire::test(DeletePanel::class, ['album' => $this->album1])
+			->assertForbidden();
+	}
+
+	public function testDeletePanelLoggedNoRights(): void
+	{
+		Livewire::actingAs($this->userNoUpload)->test(DeletePanel::class, ['album' => $this->album1])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userMayUpload2)->test(DeletePanel::class, ['album' => $this->album1])
+			->assertForbidden();
+	}
+
+	public function testDeletePanelLoggedIn(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(DeletePanel::class, ['album' => $this->subAlbum1])
+			->assertOk()
+			->assertViewIs('livewire.forms.album.delete-panel')
+			->call('delete')
+			->assertRedirect(route('livewire-gallery-album', ['albumId' => $this->album1->id]));
+
+		$this->assertCount(0, $this->album1->fresh()->load('children')->children);
+
+		Livewire::actingAs($this->userMayUpload1)->test(DeletePanel::class, ['album' => $this->album1])
+			->assertOk()
+			->assertViewIs('livewire.forms.album.delete-panel')
+			->call('delete')
+			->assertRedirect(route('livewire-gallery'));
+	}
+}
diff --git a/tests/Livewire/Forms/Album/DeleteTest.php b/tests/Livewire/Forms/Album/DeleteTest.php
new file mode 100644
index 00000000000..7127acc9882
--- /dev/null
+++ b/tests/Livewire/Forms/Album/DeleteTest.php
@@ -0,0 +1,58 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Forms\Album;
+
+use App\Contracts\Livewire\Params;
+use App\Livewire\Components\Forms\Album\Delete;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class DeleteTest extends BaseLivewireTest
+{
+	public function testDeleteLoggedOut(): void
+	{
+		Livewire::test(Delete::class, ['params' => [Params::PARENT_ID => null, Params::ALBUM_ID => $this->album1->id]])
+			->assertForbidden();
+
+		Livewire::test(Delete::class, ['params' => [Params::PARENT_ID => $this->album1->id, Params::ALBUM_ID => $this->subAlbum1->id]])
+			->assertForbidden();
+	}
+
+	public function testDeleteLoggedNoRights(): void
+	{
+		Livewire::actingAs($this->userNoUpload)->test(Delete::class, ['params' => [Params::PARENT_ID => null, Params::ALBUM_ID => $this->album1->id]])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userNoUpload)->test(Delete::class, ['params' => [Params::PARENT_ID => $this->album1->id, Params::ALBUM_ID => $this->subAlbum1->id]])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userMayUpload2)->test(Delete::class, ['params' => [Params::PARENT_ID => $this->album1->id, Params::ALBUM_ID => $this->subAlbum1->id]])
+			->assertForbidden();
+	}
+
+	public function testDeleteLoggedIn(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(Delete::class, ['params' => [Params::PARENT_ID => $this->album1->id, Params::ALBUM_ID => $this->subAlbum1->id]])
+			->assertOk()
+			->assertViewIs('livewire.forms.album.delete')
+			->call('close');
+
+		Livewire::actingAs($this->userMayUpload1)->test(Delete::class, ['params' => [Params::PARENT_ID => $this->album1->id, Params::ALBUM_ID => $this->subAlbum1->id]])
+			->assertOk()
+			->assertViewIs('livewire.forms.album.delete')
+			->call('delete')
+			->assertRedirect(route('livewire-gallery-album', ['albumId' => $this->album1->id]));
+
+		$this->assertCount(0, $this->album1->fresh()->load('children')->children);
+	}
+}
diff --git a/tests/Livewire/Forms/Album/MergeMoveTest.php b/tests/Livewire/Forms/Album/MergeMoveTest.php
new file mode 100644
index 00000000000..339319f99db
--- /dev/null
+++ b/tests/Livewire/Forms/Album/MergeMoveTest.php
@@ -0,0 +1,132 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Forms\Album;
+
+use App\Contracts\Livewire\Params;
+use App\Livewire\Components\Forms\Album\Merge;
+use App\Livewire\Components\Forms\Album\Move;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class MergeMoveTest extends BaseLivewireTest
+{
+	public function testMergeLoggedOut(): void
+	{
+		Livewire::test(Merge::class, ['params' => [Params::PARENT_ID => null, Params::ALBUM_ID => $this->album1->id]])
+			->assertForbidden();
+
+		Livewire::test(Merge::class, ['params' => [Params::PARENT_ID => $this->album1->id, Params::ALBUM_ID => $this->subAlbum1->id]])
+			->assertForbidden();
+
+		Livewire::test(Merge::class, ['params' => [Params::PARENT_ID => null, Params::ALBUM_IDS => [$this->album1->id, $this->subAlbum1->id]]])
+			->assertForbidden();
+	}
+
+	public function testMoveLoggedOut(): void
+	{
+		Livewire::test(Move::class, ['params' => [Params::PARENT_ID => null, Params::ALBUM_ID => $this->album1->id]])
+			->assertForbidden();
+
+		Livewire::test(Move::class, ['params' => [Params::PARENT_ID => $this->album1->id, Params::ALBUM_ID => $this->subAlbum1->id]])
+			->assertForbidden();
+	}
+
+	public function testMergeLoggedNoRights(): void
+	{
+		Livewire::actingAs($this->userNoUpload)->test(Merge::class, ['params' => [Params::PARENT_ID => null, Params::ALBUM_ID => $this->album1->id]])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userNoUpload)->test(Merge::class, ['params' => [Params::PARENT_ID => $this->album1->id, Params::ALBUM_ID => $this->subAlbum1->id]])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userMayUpload2)->test(Merge::class, ['params' => [Params::PARENT_ID => $this->album1->id, Params::ALBUM_ID => $this->subAlbum1->id]])
+			->assertForbidden();
+	}
+
+	public function testMoveLoggedNoRights(): void
+	{
+		Livewire::actingAs($this->userNoUpload)->test(Move::class, ['params' => [Params::PARENT_ID => null, Params::ALBUM_ID => $this->album1->id]])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userNoUpload)->test(Move::class, ['params' => [Params::PARENT_ID => $this->album1->id, Params::ALBUM_ID => $this->subAlbum1->id]])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userMayUpload2)->test(Move::class, ['params' => [Params::PARENT_ID => $this->album1->id, Params::ALBUM_ID => $this->subAlbum1->id]])
+			->assertForbidden();
+	}
+
+	public function testMergeLoggedIn(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(Merge::class, ['params' => [Params::PARENT_ID => $this->album1->id, Params::ALBUM_ID => $this->subAlbum1->id]])
+			->assertOk()
+			->assertViewIs('livewire.forms.album.merge')
+			->call('close');
+
+		Livewire::actingAs($this->userMayUpload1)->test(Merge::class, ['params' => [Params::PARENT_ID => $this->album1->id, Params::ALBUM_ID => $this->subAlbum1->id]])
+			->assertOk()
+			->assertViewIs('livewire.forms.album.merge')
+			->call('setAlbum', $this->album1->id, $this->album1->title)
+			->assertSet('albumID', $this->album1->id)
+			->assertSet('title', $this->album1->title)
+			->assertOk()
+			->call('submit')
+			->assertRedirect(route('livewire-gallery-album', ['albumId' => $this->album1->id]));
+
+		$this->assertCount(0, $this->album1->fresh()->load('children')->children);
+
+		Livewire::actingAs($this->userMayUpload1)->test(Merge::class, ['params' => [Params::PARENT_ID => null, Params::ALBUM_ID => $this->album1->id]])
+			->assertOk()
+			->assertViewIs('livewire.forms.album.merge')
+			->call('setAlbum', $this->album2->id, $this->album2->title)
+			->assertSet('albumID', $this->album2->id)
+			->assertSet('title', $this->album2->title)
+			->assertOk()
+			->call('submit')
+			->assertRedirect(route('livewire-gallery'));
+
+		$this->assertCount(1, $this->album2->fresh()->load('children')->children);
+	}
+
+	public function testMoveLoggedIn(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(Move::class, ['params' => [Params::PARENT_ID => $this->album1->id, Params::ALBUM_ID => $this->subAlbum1->id]])
+			->assertOk()
+			->assertViewIs('livewire.forms.album.move')
+			->call('close');
+
+		Livewire::actingAs($this->userMayUpload1)->test(Move::class, ['params' => [Params::PARENT_ID => $this->album1->id, Params::ALBUM_ID => $this->subAlbum1->id]])
+			->assertOk()
+			->assertViewIs('livewire.forms.album.move')
+			->call('setAlbum', $this->album2->id, $this->album2->title)
+			->assertSet('albumID', $this->album2->id)
+			->assertSet('title', $this->album2->title)
+			->assertOk()
+			->call('submit')
+			->assertRedirect(route('livewire-gallery-album', ['albumId' => $this->album1->id]));
+
+		$this->assertCount(0, $this->album1->fresh()->load('children')->children);
+		$this->assertCount(2, $this->album2->fresh()->load('children')->children);
+
+		Livewire::actingAs($this->userMayUpload1)->test(Move::class, ['params' => [Params::PARENT_ID => null, Params::ALBUM_ID => $this->album1->id]])
+			->assertOk()
+			->assertViewIs('livewire.forms.album.move')
+			->call('setAlbum', $this->album2->id, $this->album2->title)
+			->assertSet('albumID', $this->album2->id)
+			->assertSet('title', $this->album2->title)
+			->assertOk()
+			->call('submit')
+			->assertRedirect(route('livewire-gallery'));
+
+		$this->assertCount(3, $this->album2->fresh()->load('children')->children);
+	}
+}
diff --git a/tests/Livewire/Forms/Album/MovePanelTest.php b/tests/Livewire/Forms/Album/MovePanelTest.php
new file mode 100644
index 00000000000..a42cfc24a6c
--- /dev/null
+++ b/tests/Livewire/Forms/Album/MovePanelTest.php
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Forms\Album;
+
+use App\Livewire\Components\Forms\Album\MovePanel;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class MovePanelTest extends BaseLivewireTest
+{
+	public function testMoveLoggedOut(): void
+	{
+		Livewire::test(MovePanel::class, ['album' => $this->subAlbum1])
+			->assertForbidden();
+
+		Livewire::test(MovePanel::class, ['album' => $this->subAlbum1])
+			->assertForbidden();
+	}
+
+	public function testMoveLoggedNoRights(): void
+	{
+		Livewire::actingAs($this->userNoUpload)->test(MovePanel::class, ['album' => $this->subAlbum1])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userMayUpload2)->test(MovePanel::class, ['album' => $this->subAlbum1])
+			->assertForbidden();
+	}
+
+	public function testMoveLoggedIn(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(MovePanel::class, ['album' => $this->subAlbum1])
+			->assertOk()
+			->assertViewIs('livewire.forms.album.move-panel')
+			->call('setAlbum', $this->album2->id, $this->album2->title)
+			->assertSet('albumID', $this->album2->id)
+			->assertSet('title', $this->album2->title)
+			->assertOk()
+			->call('move')
+			->assertRedirect(route('livewire-gallery-album', ['albumId' => $this->album1->id]));
+
+		$this->assertCount(0, $this->album1->fresh()->load('children')->children);
+		$this->assertCount(2, $this->album2->fresh()->load('children')->children);
+
+		Livewire::actingAs($this->userMayUpload1)->test(MovePanel::class, ['album' => $this->album1])
+			->assertOk()
+			->assertViewIs('livewire.forms.album.move-panel')
+			->call('setAlbum', $this->album2->id, $this->album2->title)
+			->assertSet('albumID', $this->album2->id)
+			->assertSet('title', $this->album2->title)
+			->assertOk()
+			->call('move')
+			->assertRedirect(route('livewire-gallery'));
+
+		$this->assertCount(3, $this->album2->fresh()->load('children')->children);
+	}
+}
diff --git a/tests/Livewire/Forms/Album/PropertiesTest.php b/tests/Livewire/Forms/Album/PropertiesTest.php
new file mode 100644
index 00000000000..9bfb7c3ae08
--- /dev/null
+++ b/tests/Livewire/Forms/Album/PropertiesTest.php
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Forms\Album;
+
+use App\Livewire\Components\Forms\Album\Properties;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class PropertiesTest extends BaseLivewireTest
+{
+	public function testPropertiesLoggedOut(): void
+	{
+		Livewire::test(Properties::class, ['album' => $this->album1])->assertForbidden();
+	}
+
+	public function testPropertiesLoggedIn(): void
+	{
+		Livewire::actingAs($this->admin)->test(Properties::class, ['album' => $this->album1])
+			->assertOk()
+			->assertViewIs('livewire.forms.album.properties')
+			->call('submit')
+			->assertOk()
+			->assertDispatched('notify', self::notifySuccess());
+
+		Livewire::actingAs($this->admin)->test(Properties::class, ['album' => $this->album1])
+			->assertOk()
+			->assertViewIs('livewire.forms.album.properties')
+			->set('license', 'WTFPL')
+			->call('submit')
+			->assertOk()
+			->assertNotDispatched('notify', self::notifySuccess());
+	}
+}
diff --git a/tests/Livewire/Forms/Album/RenameTest.php b/tests/Livewire/Forms/Album/RenameTest.php
new file mode 100644
index 00000000000..7834a4f2e31
--- /dev/null
+++ b/tests/Livewire/Forms/Album/RenameTest.php
@@ -0,0 +1,61 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Forms\Album;
+
+use App\Contracts\Livewire\Params;
+use App\Livewire\Components\Forms\Album\Rename;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class RenameTest extends BaseLivewireTest
+{
+	public function testRenameLoggedOut(): void
+	{
+		Livewire::test(Rename::class, ['params' => [Params::PARENT_ID => null, Params::ALBUM_ID => $this->album1->id]])
+			->assertForbidden();
+
+		Livewire::test(Rename::class, ['params' => [Params::PARENT_ID => $this->album1->id, Params::ALBUM_ID => $this->subAlbum1->id]])
+			->assertForbidden();
+	}
+
+	public function testRenameLoggedNoRights(): void
+	{
+		Livewire::actingAs($this->userNoUpload)->test(Rename::class, ['params' => [Params::PARENT_ID => null, Params::ALBUM_ID => $this->album1->id]])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userNoUpload)->test(Rename::class, ['params' => [Params::PARENT_ID => $this->album1->id, Params::ALBUM_ID => $this->subAlbum1->id]])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userMayUpload2)->test(Rename::class, ['params' => [Params::PARENT_ID => null, Params::ALBUM_ID => $this->album1->id]])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userMayUpload2)->test(Rename::class, ['params' => [Params::PARENT_ID => $this->album1->id, Params::ALBUM_ID => $this->subAlbum1->id]])
+			->assertForbidden();
+	}
+
+	public function testRenameLoggedIn(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(Rename::class, ['params' => [Params::PARENT_ID => $this->album1->id, Params::ALBUM_ID => $this->subAlbum1->id]])
+			->assertOk()
+			->assertViewIs('livewire.forms.album.rename')
+			->call('close');
+
+		Livewire::actingAs($this->userMayUpload1)->test(Rename::class, ['params' => [Params::PARENT_ID => $this->album1->id, Params::ALBUM_ID => $this->subAlbum1->id]])
+			->assertOk()
+			->assertViewIs('livewire.forms.album.rename')
+			->set('title', $this->album1->title)
+			->assertOk()
+			->call('submit')
+			->assertDispatched('reloadPage');
+	}
+}
diff --git a/tests/Livewire/Forms/Album/SearchAlbumTest.php b/tests/Livewire/Forms/Album/SearchAlbumTest.php
new file mode 100644
index 00000000000..3274ac8a6b8
--- /dev/null
+++ b/tests/Livewire/Forms/Album/SearchAlbumTest.php
@@ -0,0 +1,137 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Forms\Album;
+
+use App\Livewire\Components\Forms\Album\SearchAlbum;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class SearchAlbumTest extends BaseLivewireTest
+{
+	public function setUp(): void
+	{
+		parent::setUp();
+		$this->album2->title = 'vzreckosowoigygagvarcknkxubsbmrczvkmwqayhsemhpwidplztkifahdywtuaghlyighdcrzxjlzzdcuj';
+		$this->album2->save();
+	}
+
+	public function testSearchAlbumLoggedOut(): void
+	{
+		Livewire::test(SearchAlbum::class, ['parent_id' => null, 'lft' => null, 'rgt' => null])
+			->assertOk()
+			->assertCount('albumListSaved', 0)
+			->assertSet('albumListSaved', []);
+
+		Livewire::test(SearchAlbum::class, ['parent_id' => $this->album1->id, 'lft' => $this->album1->_lft, 'rgt' => $this->album1->_rgt])
+			->assertOk()
+			->assertCount('albumListSaved', 1)
+			->assertSet('albumListSaved', [
+				[
+					'id' => null,
+					'title' => __('lychee.ROOT'),
+					'original' => __('lychee.ROOT'),
+					'short_title' => __('lychee.ROOT'),
+					'thumb' => 'img/no_images.svg',
+				],
+			]);
+	}
+
+	public function testSearchAlbumLoggedInAsNotOwner(): void
+	{
+		Livewire::actingAs($this->userMayUpload2)->test(SearchAlbum::class, ['parent_id' => null, 'lft' => null, 'rgt' => null])
+			->assertOk()
+			->assertCount('albumListSaved', 0)
+			->assertSet('albumListSaved', []);
+
+		Livewire::actingAs($this->userMayUpload2)->test(SearchAlbum::class, ['parent_id' => $this->album1->id, 'lft' => $this->album1->_lft, 'rgt' => $this->album1->_rgt])
+			->assertOk()
+			->assertCount('albumListSaved', 1)
+			->assertSet('albumListSaved', [
+				[
+					'id' => null,
+					'title' => __('lychee.ROOT'),
+					'original' => __('lychee.ROOT'),
+					'short_title' => __('lychee.ROOT'),
+					'thumb' => 'img/no_images.svg',
+				],
+			]);
+	}
+
+	public function testSearchAlbumLoggedInAsOwner(): void
+	{
+		$shorten1 = substr($this->album1->title, 0, 3);
+		$shorten2 = substr($this->album2->title, 0, 3);
+		$shorten2b = substr($this->subAlbum2->title, 0, 3);
+
+		$count = 2;
+
+		// This is because names are randomly generated and we might get a colision
+		if ($shorten2 === $shorten1) {
+			$count += 2;
+		} elseif ($shorten2b === $shorten1) {
+			$count++;
+		}
+
+		Livewire::actingAs($this->userMayUpload1)->test(SearchAlbum::class, ['parent_id' => null, 'lft' => null, 'rgt' => null])
+			->assertOk()
+			->assertCount('albumListSaved', 4)
+			->assertCount('albumList', 4)
+			->set('search', $shorten1)
+			->assertOk()
+			->assertCount('albumList', $count);
+
+		if ($shorten2b === $shorten2) {
+			$count = 2;
+		} else {
+			$count = 1;
+		}
+
+		Livewire::actingAs($this->userMayUpload1)->test(SearchAlbum::class, ['parent_id' => $this->album1->id, 'lft' => $this->album1->_lft, 'rgt' => $this->album1->_rgt])
+			->assertOk()
+			->assertCount('albumListSaved', 3)
+			->assertCount('albumList', 3)
+			->set('search', $shorten2b)
+			->assertCount('albumList', $count);
+	}
+
+	// public function testSearchAlbumLoggedNoRights(): void
+	// {
+	// 	Livewire::actingAs($this->userNoUpload)->test(SearchAlbum::class, ['params' => [Params::PARENT_ID => null, Params::ALBUM_ID => $this->album1->id]])
+	// 		->assertForbidden();
+
+	// 	Livewire::actingAs($this->userNoUpload)->test(SearchAlbum::class, ['params' => [Params::PARENT_ID => $this->album1->id, Params::ALBUM_ID => $this->subAlbum1->id]])
+	// 		->assertForbidden();
+
+	// 	Livewire::actingAs($this->userMayUpload2)->test(SearchAlbum::class, ['params' => [Params::PARENT_ID => null, Params::ALBUM_ID => $this->album1->id]])
+	// 		->assertForbidden();
+
+	// 	Livewire::actingAs($this->userMayUpload2)->test(SearchAlbum::class, ['params' => [Params::PARENT_ID => $this->album1->id, Params::ALBUM_ID => $this->subAlbum1->id]])
+	// 		->assertForbidden();
+	// }
+
+	// public function testSearchAlbumLoggedIn(): void
+	// {
+	// 	Livewire::actingAs($this->userMayUpload1)->test(SearchAlbum::class, ['params' => [Params::PARENT_ID => $this->album1->id, Params::ALBUM_ID => $this->subAlbum1->id]])
+	// 		->assertOk()
+	// 		->assertViewIs('livewire.forms.album.SearchAlbum')
+	// 		->call('close');
+
+	// 	Livewire::actingAs($this->userMayUpload1)->test(SearchAlbum::class, ['params' => [Params::PARENT_ID => $this->album1->id, Params::ALBUM_ID => $this->subAlbum1->id]])
+	// 		->assertOk()
+	// 		->assertViewIs('livewire.forms.album.SearchAlbum')
+	// 		->set('title', $this->album1->title)
+	// 		->assertOk()
+	// 		->call('submit')
+	// 		->assertDispatched('reloadPage');
+	// }
+}
diff --git a/tests/Livewire/Forms/Album/ShareWithTest.php b/tests/Livewire/Forms/Album/ShareWithTest.php
new file mode 100644
index 00000000000..886e0f7afd5
--- /dev/null
+++ b/tests/Livewire/Forms/Album/ShareWithTest.php
@@ -0,0 +1,105 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Forms\Album;
+
+use App\Livewire\Components\Forms\Album\ShareWith;
+use App\Livewire\Components\Forms\Album\ShareWithLine;
+use App\Livewire\Components\Pages\Sharing;
+use App\Models\AccessPermission;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class ShareWithTest extends BaseLivewireTest
+{
+	public function testShareWithLoggedOut(): void
+	{
+		Livewire::test(ShareWith::class, ['album' => $this->album1])->assertForbidden();
+	}
+
+	public function testShareWithLoggedIn(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(ShareWith::class, ['album' => $this->album1])
+			->assertOk()
+			->assertViewIs('livewire.forms.album.share-with')
+			->set('search', 'a')
+			->assertOk()
+			->set('search', 'u')
+			->call('select', $this->userMayUpload2->id, $this->userMayUpload2->username)
+			->assertSet('userID', $this->userMayUpload2->id)
+			->assertSet('username', $this->userMayUpload2->username)
+			->call('clearUsername')
+			->assertSet('userID', null)
+			->assertSet('username', null)
+			->call('select', $this->userMayUpload2->id, $this->userMayUpload2->username)
+			->set('grants_full_photo_access', true)
+			->set('grants_download', true)
+			->set('grants_upload', true)
+			->set('grants_edit', true)
+			->set('grants_delete', true)
+			->call('add')
+			->assertOk();
+
+		$this->album1->fresh();
+		$this->album1->base_class->load('access_permissions');
+
+		// we do have one permission
+		$this->assertEquals(1, $this->album1->access_permissions->count());
+		/** @var AccessPermission $perm */
+		$perm = $this->album1->access_permissions->first();
+
+		$this->assertEquals($this->userMayUpload2->id, $perm->user_id);
+		$this->assertTrue($perm->grants_full_photo_access);
+		$this->assertTrue($perm->grants_download);
+		$this->assertTrue($perm->grants_upload);
+		$this->assertTrue($perm->grants_edit);
+		$this->assertTrue($perm->grants_delete);
+		$this->assertNotNull($perm->album);
+
+		Livewire::actingAs($this->userMayUpload2)->test(ShareWithLine::class, ['perm' => $perm])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userMayUpload1)->test(ShareWithLine::class, ['perm' => $perm])
+			->assertOk()
+			->set('grants_full_photo_access', false)
+			->set('grants_download', false)
+			->set('grants_upload', false)
+			->set('grants_edit', false)
+			->set('grants_delete', false)
+			->assertDispatched('notify', self::notifySuccess())
+			->assertSet('grants_full_photo_access', false)
+			->assertSet('grants_download', false)
+			->assertSet('grants_upload', false)
+			->assertSet('grants_edit', false)
+			->assertSet('grants_delete', false);
+
+		$perm = $perm->fresh();
+		$this->assertFalse($perm->grants_full_photo_access);
+		$this->assertFalse($perm->grants_download);
+		$this->assertFalse($perm->grants_upload);
+		$this->assertFalse($perm->grants_edit);
+		$this->assertFalse($perm->grants_delete);
+
+		Livewire::actingAs($this->userNoUpload)->test(Sharing::class)
+			->assertForbidden();
+
+		Livewire::actingAs($this->userMayUpload2)->test(Sharing::class)
+			->assertOk()
+			->call('delete', $perm->id)
+			->assertForbidden();
+
+		Livewire::actingAs($this->userMayUpload1)->test(ShareWith::class, ['album' => $this->album1])
+			->assertOk()
+			->call('delete', $perm->id)
+			->assertOk();
+	}
+}
diff --git a/tests/Livewire/Forms/Album/TransferTest.php b/tests/Livewire/Forms/Album/TransferTest.php
new file mode 100644
index 00000000000..4145d3c7ad9
--- /dev/null
+++ b/tests/Livewire/Forms/Album/TransferTest.php
@@ -0,0 +1,70 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Forms\Album;
+
+use App\Enum\Livewire\NotificationType;
+use App\Livewire\Components\Forms\Album\Transfer;
+use App\Livewire\Components\Pages\Gallery\Album;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class TransferTest extends BaseLivewireTest
+{
+	public function testTransferLoggedOut(): void
+	{
+		Livewire::test(Transfer::class, ['album' => $this->album1])
+			->assertForbidden();
+	}
+
+	public function testTransferLoggedNoRights(): void
+	{
+		Livewire::actingAs($this->userNoUpload)->test(Transfer::class, ['album' => $this->album1])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userMayUpload2)->test(Transfer::class, ['album' => $this->album1])
+			->assertForbidden();
+	}
+
+	public function testTransferLoggedIn(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(Transfer::class, ['album' => $this->album1])
+			->assertOk()
+			->assertViewIs('livewire.forms.album.transfer')
+			->set('username', $this->userMayUpload2->username)
+			->assertOk()
+			->call('transfer')
+			->assertRedirect(route('livewire-gallery'));
+
+		// user 2 has access
+		Livewire::actingAs($this->userMayUpload2)->test(Album::class, ['albumId' => $this->album1->id])
+			->assertViewIs('livewire.pages.gallery.album')
+			->assertSee($this->album1->id)
+			->assertOk()
+			->assertSet('flags.is_accessible', true);
+
+		// User 1 no longer have access.
+		Livewire::actingAs($this->userMayUpload1)->test(Album::class, ['albumId' => $this->album1->id])
+			->assertRedirect(route('livewire-gallery'));
+	}
+
+	public function testTransferAsAdmin(): void
+	{
+		Livewire::actingAs($this->admin)->test(Transfer::class, ['album' => $this->album1])
+			->assertOk()
+			->assertViewIs('livewire.forms.album.transfer')
+			->set('username', $this->userMayUpload2->username)
+			->assertOk()
+			->call('transfer')
+			->assertDispatched('notify', ['msg' => 'Transfer successful!', 'type' => NotificationType::SUCCESS->value]);
+	}
+}
diff --git a/tests/Livewire/Forms/Album/VisibilityTest.php b/tests/Livewire/Forms/Album/VisibilityTest.php
new file mode 100644
index 00000000000..722dab0e338
--- /dev/null
+++ b/tests/Livewire/Forms/Album/VisibilityTest.php
@@ -0,0 +1,123 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Forms\Album;
+
+use App\Livewire\Components\Forms\Album\UnlockAlbum;
+use App\Livewire\Components\Forms\Album\Visibility;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class VisibilityTest extends BaseLivewireTest
+{
+	public function testVisibilityLoggedOut(): void
+	{
+		Livewire::test(Visibility::class, ['album' => $this->album1])->assertForbidden();
+	}
+
+	public function testVisibilityLoggedIn(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(Visibility::class, ['album' => $this->album1])
+			->assertOk()
+			->assertViewIs('livewire.forms.album.visibility')
+			->toggle('is_public')
+			->assertDispatched('notify', self::notifySuccess());
+
+		$this->album1->fresh();
+		$this->album1->base_class->load('access_permissions');
+		$this->assertNotNull($this->album1->public_permissions());
+
+		Livewire::actingAs($this->userMayUpload1)->test(Visibility::class, ['album' => $this->album1])
+			->assertOk()
+			->assertViewIs('livewire.forms.album.visibility')
+			->set('grants_full_photo_access', true)
+			->assertDispatched('notify', self::notifySuccess())
+			->set('is_link_required', true)
+			->assertDispatched('notify', self::notifySuccess())
+			->set('grants_download', true)
+			->assertDispatched('notify', self::notifySuccess())
+			->set('is_nsfw', true)
+			->assertDispatched('notify', self::notifySuccess())
+			->set('is_password_required', true)
+			->assertDispatched('notify', self::notifySuccess())
+			->set('password', 'password')
+			->assertDispatched('notify', self::notifySuccess());
+
+		$this->album1 = $this->album1->fresh();
+		$this->album1->base_class->load('access_permissions');
+
+		Livewire::actingAs($this->userMayUpload1)->test(Visibility::class, ['album' => $this->album1])
+			->assertOk()
+			->assertSet('is_public', true)
+			->assertSet('grants_full_photo_access', true)
+			->assertSet('is_link_required', true)
+			->assertSet('grants_download', true)
+			->assertSet('is_nsfw', true)
+			->assertSet('is_password_required', true)
+			->toggle('is_public')
+			->assertDispatched('notify', self::notifySuccess())
+			->assertSet('grants_full_photo_access', false)
+			->assertSet('is_link_required', false)
+			->assertSet('grants_download', false)
+			->assertSet('is_nsfw', true)
+			->assertSet('is_password_required', false);
+	}
+
+	public function testUnlocking(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(Visibility::class, ['album' => $this->album1])
+			->assertOk()
+			->assertViewIs('livewire.forms.album.visibility')
+			->toggle('is_public')
+			->assertDispatched('notify', self::notifySuccess())
+			->assertSet('is_public', true)
+			->set('grants_full_photo_access', true)
+			->assertDispatched('notify', self::notifySuccess())
+			->set('is_link_required', true)
+			->assertDispatched('notify', self::notifySuccess())
+			->set('grants_download', true)
+			->assertDispatched('notify', self::notifySuccess())
+			->set('is_nsfw', true)
+			->assertDispatched('notify', self::notifySuccess())
+			->set('is_password_required', true)
+			->assertDispatched('notify', self::notifySuccess())
+			->set('password', 'password')
+			->assertDispatched('notify', self::notifySuccess());
+
+		$this->album1 = $this->album1->fresh();
+		$this->album1->base_class->load('access_permissions');
+
+		Livewire::actingAs($this->userMayUpload2)->test(UnlockAlbum::class, ['albumID' => $this->album1->id])
+			->set('password', 'wrongPassword')
+			->call('submit')
+			->assertForbidden();
+
+		Livewire::actingAs($this->userMayUpload2)->test(UnlockAlbum::class, ['albumID' => $this->album1->id])
+			->set('password', '')
+			->call('submit')
+			->assertDispatched('notify');
+
+		Livewire::actingAs($this->userMayUpload2)->test(UnlockAlbum::class, ['albumID' => $this->album1->id])
+			->set('password', 'password')
+			->call('submit')
+			->assertOk()
+			->assertRedirect(route('livewire-gallery-album', ['albumId' => $this->album1->id]));
+	}
+
+	public function testUnlockingUnlockedAlbum(): void
+	{
+		Livewire::actingAs($this->userMayUpload2)->test(UnlockAlbum::class, ['albumID' => $this->album1->id])
+			->set('password', 'password')
+			->call('submit')
+			->assertForbidden();
+	}
+}
diff --git a/tests/Livewire/Forms/ConfirmTest.php b/tests/Livewire/Forms/ConfirmTest.php
new file mode 100644
index 00000000000..04fab9364b2
--- /dev/null
+++ b/tests/Livewire/Forms/ConfirmTest.php
@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Forms;
+
+use App\Livewire\Components\Forms\Confirms\SaveAll;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class ConfirmTest extends BaseLivewireTest
+{
+	public function testConfirmLoggedOut(): void
+	{
+		Livewire::test(SaveAll::class)->assertForbidden();
+	}
+
+	public function testConfirmLoggedIn(): void
+	{
+		Livewire::actingAs($this->admin)->test(SaveAll::class)
+			->assertOk()
+			->assertViewIs('livewire.forms.confirms.save-all')
+			->call('confirm')
+			->assertDispatched('saveAll')
+			->assertDispatched('closeModal');
+
+		Livewire::actingAs($this->admin)->test(SaveAll::class)
+		->assertOk()
+		->assertViewIs('livewire.forms.confirms.save-all')
+		->call('close')
+		->assertNotDispatched('saveAll')
+		->assertDispatched('closeModal');
+	}
+}
diff --git a/tests/Livewire/Forms/FormsProfileTest.php b/tests/Livewire/Forms/FormsProfileTest.php
new file mode 100644
index 00000000000..27145d392e5
--- /dev/null
+++ b/tests/Livewire/Forms/FormsProfileTest.php
@@ -0,0 +1,198 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Forms;
+
+use App\Livewire\Components\Forms\Profile\GetApiToken;
+use App\Livewire\Components\Forms\Profile\ManageSecondFactor;
+use App\Livewire\Components\Forms\Profile\SecondFactor;
+use App\Livewire\Components\Forms\Profile\SetEmail;
+use App\Livewire\Components\Forms\Profile\SetLogin;
+use Laragear\WebAuthn\Models\WebAuthnCredential;
+use Livewire\Livewire;
+use Tests\Feature\Traits\RequiresEmptyWebAuthnCredentials;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class FormsProfileTest extends BaseLivewireTest
+{
+	use RequiresEmptyWebAuthnCredentials;
+
+	private WebAuthnCredential $credential;
+
+	public function setUp(): void
+	{
+		parent::setUp();
+		$this->setUpRequiresEmptyWebAuthnCredentials();
+
+		$this->credential = $this->userMayUpload1->makeWebAuthnCredential([
+			'id' => '_Xlz-khgFhDdkvOWyy_YqC54ExkYyp1o6HAQiybqLST-9RGBndpgI06TQygIYI7ZL2dayCMYm6J1-bXyl72obA',
+
+			'user_id' => '27117450ff81461d80331fb79c655f39',
+			'alias' => null,
+
+			'counter' => 0,
+			'rp_id' => 'https://localhost',
+			'origin' => 'https://localhost',
+			'transports' => null,
+			'aaguid' => '00000000-0000-0000-0000-000000000000',
+
+			'public_key' => "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEF25MWDQwaeFqZJ2Gy/7HEdZkWaW+\nQCbWjLiplbklmqIq6MSSRhLqJLoegR5PqG2JOqhSLcQDAmf/tzdAvO5MmQ==\n-----END PUBLIC KEY-----\n",
+			'attestation_format' => 'none',
+		]);
+		$this->credential->save();
+	}
+
+	public function tearDown(): void
+	{
+		$this->tearDownRequiresEmptyWebAuthnCredentials();
+		parent::tearDown();
+	}
+
+	public function testSecondFactorLoggedOut(): void
+	{
+		Livewire::test(SecondFactor::class)->assertForbidden();
+	}
+
+	public function testSecondFactorLoggedIn(): void
+	{
+		$this->assertEquals(1, $this->userMayUpload1->webAuthnCredentials()->count());
+		Livewire::actingAs($this->userMayUpload1)->test(SecondFactor::class)
+			->assertViewIs('livewire.modules.profile.second-factor')
+			->assertSeeLivewire(ManageSecondFactor::class)
+			->dispatch('reload-component') // called when a WebAuthn is create
+			->call('delete', '_Xlz-khgFhDdkvOWyy_YqC54ExkYyp1o6HAQiybqLST-9RGBndpgI06TQygIYI7ZL2dayCMYm6J1-bXyl72obA')
+			->assertDontSeeLivewire(ManageSecondFactor::class);
+
+		$this->assertEquals(0, $this->userMayUpload1->webAuthnCredentials()->count());
+	}
+
+	public function testSecondFactorLoggedInCrossInteraction(): void
+	{
+		$this->assertEquals(1, $this->userMayUpload1->webAuthnCredentials()->count());
+		$this->assertEquals(0, $this->userNoUpload->webAuthnCredentials()->count());
+		Livewire::actingAs($this->userNoUpload)->test(SecondFactor::class)
+			->assertViewIs('livewire.modules.profile.second-factor')
+			->assertDontSeeLivewire(ManageSecondFactor::class)
+			->dispatch('reload-component') // called when a WebAuthn is create
+			->call('delete', '_Xlz-khgFhDdkvOWyy_YqC54ExkYyp1o6HAQiybqLST-9RGBndpgI06TQygIYI7ZL2dayCMYm6J1-bXyl72obA')
+			->assertDontSeeLivewire(ManageSecondFactor::class);
+
+		$this->assertEquals(1, $this->userMayUpload1->webAuthnCredentials()->count());
+	}
+
+	public function testManageSecondFactorLogout(): void
+	{
+		Livewire::test(ManageSecondFactor::class)->assertForbidden();
+	}
+
+	public function testManageSecondFactorLoginCrossInteraction(): void
+	{
+		Livewire::actingAs($this->userNoUpload)->test(ManageSecondFactor::class, ['credential' => $this->credential])
+			->assertForbidden();
+	}
+
+	public function testManageSecondFactorLogin(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(ManageSecondFactor::class, ['credential' => $this->credential])
+			->assertViewIs('livewire.forms.profile.manage-second-factor')
+			->assertSet('alias', '_Xlz-khgFhDdkvOWyy_YqC54ExkYyp')
+			->set('alias', '123')
+			->assertSet('alias', '123')
+			->assertDispatched('notify');
+
+		// reload model
+		$this->credential->fresh();
+
+		Livewire::actingAs($this->userMayUpload1)->test(ManageSecondFactor::class, ['credential' => $this->credential])
+			->assertViewIs('livewire.forms.profile.manage-second-factor')
+			->assertSet('alias', '_Xlz-khgFhDdkvOWyy_YqC54ExkYyp')
+			->set('alias', '12345')
+			->assertSet('alias', '12345')
+			->assertDispatched('notify');
+
+		$this->assertEquals('12345', $this->credential->fresh()->alias);
+	}
+
+	public function testGetApiTokenLogout(): void
+	{
+		Livewire::test(GetApiToken::class)
+			->assertUnauthorized();
+	}
+
+	public function testSetEmailLogout(): void
+	{
+		Livewire::test(SetEmail::class)
+			->assertForbidden();
+	}
+
+	public function testSetLoginLogout(): void
+	{
+		Livewire::test(SetLogin::class)
+			->assertForbidden();
+	}
+
+	public function testGetApiTokenLogin(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(GetApiToken::class)
+			->assertViewIs('livewire.forms.profile.get-api-token')
+			->assertSet('token', __('lychee.DISABLED_TOKEN_STATUS_MSG'))
+			->call('resetToken')
+			->assertNotSet('token', __('lychee.DISABLED_TOKEN_STATUS_MSG'))
+			->call('close')
+			->assertDispatched('closeModal');
+
+		Livewire::actingAs($this->userMayUpload1)->test(GetApiToken::class)
+			->assertViewIs('livewire.forms.profile.get-api-token')
+			->assertSet('token', __('lychee.TOKEN_NOT_AVAILABLE'))
+			->call('disableToken')
+			->assertSet('token', __('lychee.DISABLED_TOKEN_STATUS_MSG'));
+
+		$this->assertNull($this->userMayUpload1->fresh()->token);
+	}
+
+	public function testSetEmailLogin(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(SetEmail::class)
+			->assertViewIs('livewire.forms.settings.input')
+			->set('value', 'user@lychee.org')
+			->call('save')
+			->assertOk();
+
+		$this->assertEquals('user@lychee.org', $this->userMayUpload1->fresh()->email);
+	}
+
+	public function testSetLoginLogin(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(SetLogin::class)
+			->assertViewIs('livewire.forms.profile.set-login')
+			->call('openApiTokenModal')
+			->assertDispatched('openModal', 'forms.profile.get-api-token')
+			->set('oldPassword', '')
+			->set('password', '')
+			->set('password_confirmation', '')
+			->set('username', '')
+			->call('submit')
+			->assertHasErrors('oldPassword')
+			->set('oldPassword', 'password')
+			->call('submit')
+			->assertHasErrors('password')
+			->set('username', 'userNoUpload')
+			->set('password', 'password')
+			->call('submit')
+			->assertHasErrors('password')
+			->set('password_confirmation', 'password')
+			->call('submit')
+			->assertHasNoErrors('password');
+
+		$this->assertEquals('userNoUpload', $this->userMayUpload1->fresh()->username());
+	}
+}
diff --git a/tests/Livewire/Forms/ImportFromServerTest.php b/tests/Livewire/Forms/ImportFromServerTest.php
new file mode 100644
index 00000000000..3a994e5ce24
--- /dev/null
+++ b/tests/Livewire/Forms/ImportFromServerTest.php
@@ -0,0 +1,90 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Forms;
+
+use App\Livewire\Components\Forms\Add\ImportFromServer;
+use Illuminate\Foundation\Testing\DatabaseTransactions;
+use Livewire\Livewire;
+use Tests\Feature\Constants\TestConstants;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class ImportFromServerTest extends BaseLivewireTest
+{
+	use DatabaseTransactions;
+
+	public function testLoggedOut(): void
+	{
+		Livewire::test(ImportFromServer::class)
+			->assertForbidden();
+	}
+
+	public function testLoggedInNoRights(): void
+	{
+		Livewire::actingAs($this->userNoUpload)->test(ImportFromServer::class)
+			->assertForbidden();
+
+		Livewire::actingAs($this->userMayUpload1)->test(ImportFromServer::class)
+			->assertForbidden();
+	}
+
+	public function testLoggedInAndError(): void
+	{
+		Livewire::actingAs($this->admin)->test(ImportFromServer::class)
+			->assertViewIs('livewire.forms.add.import-from-server')
+			->assertOk()
+			->set('form.path', '')
+			->call('submit')
+			->assertOk()
+			->assertHasErrors('form.paths.0');
+	}
+
+	// public function testLoggedInWithDeleteImported() : void {
+	// 	copy(base_path(TestConstants::SAMPLE_FILE_NIGHT_IMAGE), static::importPath('night.jpg'));
+
+	// 	Livewire::actingAs($this->admin)->test(ImportFromServer::class)
+	// 		->assertViewIs('livewire.forms.add.import-from-server')
+	// 		->assertOk()
+	// 		->set('form.path', static::importPath())
+	// 		->assertSet('form.delete_imported', false)
+	// 		->call('submit')
+	// 		->assertOk()
+	// 		->assertHasNoErrors('form.paths.0');
+
+	// 	$this->assertEquals(true, file_exists(static::importPath('night.jpg')));
+	// }
+
+	// public function testLoggedInWithoutDeleteImported() : void {
+	// 	copy(base_path(TestConstants::SAMPLE_FILE_NIGHT_IMAGE), static::importPath('night.jpg'));
+
+	// 	Livewire::actingAs($this->admin)->test(ImportFromServer::class)
+	// 		->assertViewIs('livewire.forms.add.import-from-server')
+	// 		->assertOk()
+	// 		->set('form.path', static::importPath())
+	// 		->set('form.delete_imported', true)
+	// 		->assertSet('form.delete_imported', true)
+	// 		->call('submit')
+	// 		->assertOk()
+	// 		->assertHasNoErrors('form.paths.0');
+
+	// 	$this->assertEquals(false, file_exists(static::importPath('night.jpg')));
+	// }
+
+	public function testLoggedInClose(): void
+	{
+		Livewire::actingAs($this->admin)->test(ImportFromServer::class)
+			->assertViewIs('livewire.forms.add.import-from-server')
+			->assertOk()
+			->call('close')
+			->assertDispatched('closeModal');
+	}
+}
\ No newline at end of file
diff --git a/tests/Livewire/Forms/ImportFromUrlTest.php b/tests/Livewire/Forms/ImportFromUrlTest.php
new file mode 100644
index 00000000000..7912c10501f
--- /dev/null
+++ b/tests/Livewire/Forms/ImportFromUrlTest.php
@@ -0,0 +1,57 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Forms;
+
+use App\Livewire\Components\Forms\Add\ImportFromUrl;
+use Illuminate\Foundation\Testing\DatabaseTransactions;
+use Livewire\Livewire;
+use Tests\Feature\Constants\TestConstants;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class ImportFromUrlTest extends BaseLivewireTest
+{
+	use DatabaseTransactions;
+
+	public function testLoggedOut(): void
+	{
+		Livewire::test(ImportFromUrl::class)
+			->assertForbidden();
+	}
+
+	public function testLoggedInNoUpload(): void
+	{
+		Livewire::actingAs($this->userNoUpload)->test(ImportFromUrl::class)
+			->assertForbidden();
+	}
+
+	public function testLoggedIn(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(ImportFromUrl::class)
+			->assertViewIs('livewire.forms.add.import-from-url')
+			->assertOk()
+			->set('form.url', TestConstants::SAMPLE_DOWNLOAD_JPG)
+			->call('submit')
+			->assertOk()
+			->assertDispatched('reloadPage')
+			->assertDispatched('closeModal');
+	}
+
+	public function testLoggedInClose(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(ImportFromUrl::class)
+			->assertViewIs('livewire.forms.add.import-from-url')
+			->assertOk()
+			->call('close')
+			->assertDispatched('closeModal');
+	}
+}
\ No newline at end of file
diff --git a/tests/Livewire/Forms/Photo/CopyToTest.php b/tests/Livewire/Forms/Photo/CopyToTest.php
new file mode 100644
index 00000000000..e234235e7f0
--- /dev/null
+++ b/tests/Livewire/Forms/Photo/CopyToTest.php
@@ -0,0 +1,68 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Forms\Photo;
+
+use App\Contracts\Livewire\Params;
+use App\Enum\SmartAlbumType;
+use App\Livewire\Components\Forms\Photo\CopyTo;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class CopyToTest extends BaseLivewireTest
+{
+	public function testMoveLoggedOut(): void
+	{
+		Livewire::test(CopyTo::class, ['params' => [Params::ALBUM_ID => null, Params::PHOTO_ID => $this->photo1->id]])
+			->assertForbidden();
+
+		Livewire::test(CopyTo::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->subPhoto1->id]])
+			->assertForbidden();
+	}
+
+	public function testMoveLoggedNoRights(): void
+	{
+		Livewire::actingAs($this->userNoUpload)->test(CopyTo::class, ['params' => [Params::ALBUM_ID => null, Params::PHOTO_ID => $this->photo1->id]])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userNoUpload)->test(CopyTo::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->subPhoto1->id]])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userMayUpload2)->test(CopyTo::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->subPhoto1->id]])
+			->assertForbidden();
+	}
+
+	public function testMoveLoggedIn(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(CopyTo::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->subPhoto1->id]])
+			->assertOk()
+			->assertViewIs('livewire.forms.photo.copyTo')
+			->call('close');
+
+		Livewire::actingAs($this->userMayUpload1)->test(CopyTo::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_IDS => [$this->photo1->id, $this->photo1b->id]]])
+			->assertOk()
+			->assertViewIs('livewire.forms.photo.copyTo')
+			->call('setAlbum', $this->album2->id, $this->album2->title)
+			->assertRedirect(route('livewire-gallery-album', ['albumId' => $this->album1->id]));
+
+		$this->assertCount(2, $this->album1->fresh()->load('photos')->photos);
+		$this->assertCount(3, $this->album2->fresh()->load('photos')->photos); // 2 added + 1 old
+
+		Livewire::actingAs($this->userMayUpload1)->test(CopyTo::class, ['params' => [Params::ALBUM_ID => null, Params::PHOTO_ID => $this->photoUnsorted->id]])
+			->assertOk()
+			->assertViewIs('livewire.forms.photo.copyTo')
+			->call('setAlbum', $this->album2->id, $this->album2->title)
+			->assertRedirect(route('livewire-gallery-album', ['albumId' => SmartAlbumType::UNSORTED->value]));
+
+		$this->assertCount(4, $this->album2->fresh()->load('photos')->photos); // 1 added + 3 old (from above)
+	}
+}
diff --git a/tests/Livewire/Forms/Photo/DeleteTest.php b/tests/Livewire/Forms/Photo/DeleteTest.php
new file mode 100644
index 00000000000..9dad74dc5f9
--- /dev/null
+++ b/tests/Livewire/Forms/Photo/DeleteTest.php
@@ -0,0 +1,58 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Forms\Photo;
+
+use App\Contracts\Livewire\Params;
+use App\Livewire\Components\Forms\Photo\Delete;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class DeleteTest extends BaseLivewireTest
+{
+	public function testDeleteLoggedOut(): void
+	{
+		Livewire::test(Delete::class, ['params' => [Params::ALBUM_ID => null, Params::PHOTO_ID => $this->photo1->id]])
+			->assertForbidden();
+
+		Livewire::test(Delete::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->subPhoto1->id]])
+			->assertForbidden();
+	}
+
+	public function testDeleteLoggedNoRights(): void
+	{
+		Livewire::actingAs($this->userNoUpload)->test(Delete::class, ['params' => [Params::ALBUM_ID => null, Params::PHOTO_ID => $this->photo1->id]])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userNoUpload)->test(Delete::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->subPhoto1->id]])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userMayUpload2)->test(Delete::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->subPhoto1->id]])
+			->assertForbidden();
+	}
+
+	public function testDeleteLoggedIn(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(Delete::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->photo1->id]])
+			->assertOk()
+			->assertViewIs('livewire.forms.photo.delete')
+			->call('close');
+
+		Livewire::actingAs($this->userMayUpload1)->test(Delete::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_IDS => [$this->photo1->id, $this->photo1b->id]]])
+			->assertOk()
+			->assertViewIs('livewire.forms.photo.delete')
+			->call('submit')
+			->assertRedirect(route('livewire-gallery-album', ['albumId' => $this->album1->id]));
+
+		$this->assertCount(0, $this->album1->fresh()->load('photos')->photos);
+	}
+}
diff --git a/tests/Livewire/Forms/Photo/DownloadTest.php b/tests/Livewire/Forms/Photo/DownloadTest.php
new file mode 100644
index 00000000000..91dcaedea1f
--- /dev/null
+++ b/tests/Livewire/Forms/Photo/DownloadTest.php
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Forms\Photo;
+
+use App\Contracts\Livewire\Params;
+use App\Livewire\Components\Forms\Photo\Download;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class DownloadTest extends BaseLivewireTest
+{
+	public function testDeleteLoggedOut(): void
+	{
+		Livewire::test(Download::class, ['params' => [Params::ALBUM_ID => null, Params::PHOTO_ID => $this->photo1->id]])
+			->assertForbidden();
+
+		Livewire::test(Download::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_IDS => [$this->subPhoto1->id]]])
+			->assertForbidden();
+	}
+
+	public function testDeleteLoggedNoRights(): void
+	{
+		Livewire::actingAs($this->userNoUpload)->test(Download::class, ['params' => [Params::ALBUM_ID => null, Params::PHOTO_ID => $this->photo1->id]])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userNoUpload)->test(Download::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->subPhoto1->id]])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userMayUpload2)->test(Download::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->subPhoto1->id]])
+			->assertForbidden();
+	}
+
+	public function testDeleteLoggedIn(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(Download::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->photo1->id]])
+			->assertOk()
+			->assertViewIs('livewire.forms.photo.download')
+			->call('close');
+
+		Livewire::actingAs($this->userMayUpload1)->test(Download::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_IDS => [$this->photo1->id, $this->photo1b->id]]])
+			->assertRedirect();
+	}
+}
diff --git a/tests/Livewire/Forms/Photo/MoveTest.php b/tests/Livewire/Forms/Photo/MoveTest.php
new file mode 100644
index 00000000000..eee6a681c82
--- /dev/null
+++ b/tests/Livewire/Forms/Photo/MoveTest.php
@@ -0,0 +1,68 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Forms\Photo;
+
+use App\Contracts\Livewire\Params;
+use App\Enum\SmartAlbumType;
+use App\Livewire\Components\Forms\Photo\Move;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class MoveTest extends BaseLivewireTest
+{
+	public function testMoveLoggedOut(): void
+	{
+		Livewire::test(Move::class, ['params' => [Params::ALBUM_ID => null, Params::PHOTO_ID => $this->photo1->id]])
+			->assertForbidden();
+
+		Livewire::test(Move::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->subPhoto1->id]])
+			->assertForbidden();
+	}
+
+	public function testMoveLoggedNoRights(): void
+	{
+		Livewire::actingAs($this->userNoUpload)->test(Move::class, ['params' => [Params::ALBUM_ID => null, Params::PHOTO_ID => $this->photo1->id]])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userNoUpload)->test(Move::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->subPhoto1->id]])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userMayUpload2)->test(Move::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->subPhoto1->id]])
+			->assertForbidden();
+	}
+
+	public function testMoveLoggedIn(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(Move::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->subPhoto1->id]])
+			->assertOk()
+			->assertViewIs('livewire.forms.photo.move')
+			->call('close');
+
+		Livewire::actingAs($this->userMayUpload1)->test(Move::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_IDS => [$this->photo1->id, $this->photo1b->id]]])
+			->assertOk()
+			->assertViewIs('livewire.forms.photo.move')
+			->call('setAlbum', $this->album2->id, $this->album2->title)
+			->assertRedirect(route('livewire-gallery-album', ['albumId' => $this->album1->id]));
+
+		$this->assertCount(0, $this->album1->fresh()->load('photos')->photos);
+		$this->assertCount(3, $this->album2->fresh()->load('photos')->photos); // 2 added + 1 old
+
+		Livewire::actingAs($this->userMayUpload1)->test(Move::class, ['params' => [Params::ALBUM_ID => null, Params::PHOTO_ID => $this->photoUnsorted->id]])
+			->assertOk()
+			->assertViewIs('livewire.forms.photo.move')
+			->call('setAlbum', $this->album2->id, $this->album2->title)
+			->assertRedirect(route('livewire-gallery-album', ['albumId' => SmartAlbumType::UNSORTED->value]));
+
+		$this->assertCount(4, $this->album2->fresh()->load('photos')->photos); // 1 added + 3 old (from above)
+	}
+}
diff --git a/tests/Livewire/Forms/Photo/RenameTest.php b/tests/Livewire/Forms/Photo/RenameTest.php
new file mode 100644
index 00000000000..716e89d7b19
--- /dev/null
+++ b/tests/Livewire/Forms/Photo/RenameTest.php
@@ -0,0 +1,61 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Forms\Photo;
+
+use App\Contracts\Livewire\Params;
+use App\Livewire\Components\Forms\Photo\Rename;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class RenameTest extends BaseLivewireTest
+{
+	public function testRenameLoggedOut(): void
+	{
+		Livewire::test(Rename::class, ['params' => [Params::ALBUM_ID => null, Params::PHOTO_ID => $this->photo1->id]])
+			->assertForbidden();
+
+		Livewire::test(Rename::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->subPhoto1->id]])
+			->assertForbidden();
+	}
+
+	public function testRenameLoggedNoRights(): void
+	{
+		Livewire::actingAs($this->userNoUpload)->test(Rename::class, ['params' => [Params::ALBUM_ID => null, Params::PHOTO_ID => $this->photo1->id]])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userNoUpload)->test(Rename::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->subPhoto1->id]])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userMayUpload2)->test(Rename::class, ['params' => [Params::ALBUM_ID => null, Params::PHOTO_ID => $this->photo1->id]])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userMayUpload2)->test(Rename::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->subPhoto1->id]])
+			->assertForbidden();
+	}
+
+	public function testRenameLoggedIn(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(Rename::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->subPhoto1->id]])
+			->assertOk()
+			->assertViewIs('livewire.forms.photo.rename')
+			->call('close');
+
+		Livewire::actingAs($this->userMayUpload1)->test(Rename::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->subPhoto1->id]])
+			->assertOk()
+			->assertViewIs('livewire.forms.photo.rename')
+			->set('title', $this->album1->title)
+			->assertOk()
+			->call('submit')
+			->assertDispatched('reloadPage');
+	}
+}
diff --git a/tests/Livewire/Forms/Photo/TagTest.php b/tests/Livewire/Forms/Photo/TagTest.php
new file mode 100644
index 00000000000..6f6fe19f2db
--- /dev/null
+++ b/tests/Livewire/Forms/Photo/TagTest.php
@@ -0,0 +1,70 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Forms\Photo;
+
+use App\Contracts\Livewire\Params;
+use App\Livewire\Components\Forms\Photo\Tag;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class TagTest extends BaseLivewireTest
+{
+	public function testTagLoggedOut(): void
+	{
+		Livewire::test(Tag::class, ['params' => [Params::ALBUM_ID => null, Params::PHOTO_ID => $this->photo1->id]])
+			->assertForbidden();
+
+		Livewire::test(Tag::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->subPhoto1->id]])
+			->assertForbidden();
+	}
+
+	public function testTagLoggedNoRights(): void
+	{
+		Livewire::actingAs($this->userNoUpload)->test(Tag::class, ['params' => [Params::ALBUM_ID => null, Params::PHOTO_ID => $this->photo1->id]])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userNoUpload)->test(Tag::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->subPhoto1->id]])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userMayUpload2)->test(Tag::class, ['params' => [Params::ALBUM_ID => null, Params::PHOTO_ID => $this->photo1->id]])
+			->assertForbidden();
+
+		Livewire::actingAs($this->userMayUpload2)->test(Tag::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->subPhoto1->id]])
+			->assertForbidden();
+	}
+
+	public function testTagLoggedIn(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(Tag::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->subPhoto1->id]])
+			->assertOk()
+			->assertViewIs('livewire.forms.photo.tag')
+			->call('close');
+
+		Livewire::actingAs($this->userMayUpload1)->test(Tag::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->subPhoto1->id]])
+			->assertOk()
+			->assertViewIs('livewire.forms.photo.tag')
+			->set('tag', $this->album1->title)
+			->assertOk()
+			->call('submit')
+			->assertDispatched('reloadPage');
+
+		Livewire::actingAs($this->userMayUpload1)->test(Tag::class, ['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->subPhoto1->id]])
+			->assertOk()
+			->assertViewIs('livewire.forms.photo.tag')
+			->set('tag', $this->album2->title)
+			->set('shall_override', true)
+			->assertOk()
+			->call('submit')
+			->assertDispatched('reloadPage');
+	}
+}
diff --git a/tests/Livewire/Forms/SettingsTest.php b/tests/Livewire/Forms/SettingsTest.php
new file mode 100644
index 00000000000..45d64d3fc94
--- /dev/null
+++ b/tests/Livewire/Forms/SettingsTest.php
@@ -0,0 +1,89 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Forms;
+
+use App\Livewire\Components\Forms\Settings\Base\BooleanSetting;
+use App\Livewire\Components\Forms\Settings\Base\StringSetting;
+use App\Livewire\Components\Forms\Settings\SetAlbumDecorationOrientationSetting;
+use App\Livewire\Components\Forms\Settings\SetAlbumSortingSetting;
+use App\Models\Configs;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class SettingsTest extends BaseLivewireTest
+{
+	public function testDropdown(): void
+	{
+		Livewire::actingAs($this->admin)->test(SetAlbumDecorationOrientationSetting::class)
+			->assertOk()
+			->assertViewIs('livewire.forms.settings.drop-down')
+			->set('value', 'column')
+			->assertDispatched('notify', self::notifySuccess());
+
+		Livewire::actingAs($this->admin)->test(SetAlbumDecorationOrientationSetting::class)
+		->assertOk()
+		->assertViewIs('livewire.forms.settings.drop-down')
+		->set('value', 'something')
+		->assertNotDispatched('notify', self::notifySuccess());
+	}
+
+	public function testDoubleDropdown(): void
+	{
+		Livewire::actingAs($this->admin)->test(SetAlbumSortingSetting::class)
+			->assertOk()
+			->assertViewIs('livewire.forms.settings.double-drop-down')
+			->set('value1', 'title')
+			->assertDispatched('notify', self::notifySuccess())
+			->set('value2', 'DESC')
+			->assertDispatched('notify', self::notifySuccess());
+
+		Livewire::actingAs($this->admin)->test(SetAlbumSortingSetting::class)
+			->assertOk()
+			->assertViewIs('livewire.forms.settings.double-drop-down')
+			->set('value1', 'something')
+			->assertNotDispatched('notify', self::notifySuccess())
+			->set('value1', 'title')
+			->set('value2', 'OTHER')
+			->assertNotDispatched('notify', self::notifySuccess());
+	}
+
+	public function testBoolean(): void
+	{
+		Configs::set('search_public', false);
+
+		Livewire::actingAs($this->admin)->test(BooleanSetting::class,
+			['description' => 'PUBLIC_SEARCH_TEXT', 'name' => 'search_public'])
+			->assertOk()
+			->assertViewIs('livewire.forms.settings.toggle')
+			->assertSet('flag', false)
+			->set('flag', true)
+			->assertDispatched('notify', self::notifySuccess());
+	}
+
+	public function testString(): void
+	{
+		$dropbox = Configs::getValueAsString('dropbox_key');
+		Livewire::actingAs($this->admin)->test(StringSetting::class, [
+			'description' => 'DROPBOX_TEXT',
+			'placeholder' => 'SETTINGS_DROPBOX_KEY',
+			'action' => 'DROPBOX_TITLE',
+			'name' => 'dropbox_key',
+		])
+			->assertOk()
+			->assertViewIs('livewire.forms.settings.input')
+			->assertSet('value', $dropbox)
+			->set('value', 'api')
+			->call('save')
+			->assertDispatched('notify', self::notifySuccess());
+	}
+}
diff --git a/tests/Livewire/Forms/UploadTest.php b/tests/Livewire/Forms/UploadTest.php
new file mode 100644
index 00000000000..1c6f5d1c09f
--- /dev/null
+++ b/tests/Livewire/Forms/UploadTest.php
@@ -0,0 +1,90 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Forms;
+
+use App\Livewire\Components\Forms\Add\Upload;
+use App\Models\Configs;
+use Illuminate\Http\UploadedFile;
+use Livewire\Livewire;
+use function Safe\copy;
+use function Safe\file_get_contents;
+use function Safe\filesize;
+use function Safe\tempnam;
+use Tests\Feature\Constants\TestConstants;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class UploadTest extends BaseLivewireTest
+{
+	private int $upload_chunk_size;
+	private int $upload_processing_limit;
+
+	public function setUp(): void
+	{
+		parent::setUp();
+		$this->upload_chunk_size = Configs::getValueAsInt('upload_chunk_size');
+		$this->upload_processing_limit = Configs::getValueAsInt('upload_processing_limit');
+		Configs::set('upload_processing_limit', 57);
+		Configs::set('upload_chunk_size', 12345);
+	}
+
+	public function tearDown(): void
+	{
+		Configs::set('upload_processing_limit', $this->upload_processing_limit);
+		Configs::set('upload_chunk_size', $this->upload_chunk_size);
+		parent::tearDown();
+	}
+
+	public function testConfirmLoggedOut(): void
+	{
+		Livewire::test(Upload::class)->assertForbidden();
+	}
+
+	public function testLoggedInNoRights(): void
+	{
+		Livewire::actingAs($this->userNoUpload)->test(Upload::class)
+			->assertForbidden();
+	}
+
+	public function testConfirmLoggedIn(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(Upload::class)
+			->assertOk()
+			->assertViewIs('livewire.forms.add.upload')
+			->assertSet('chunkSize', 12345)
+			->assertSet('parallelism', 57)
+			->call('close')
+			->assertDispatched('closeModal');
+
+		// Reset
+		Configs::set('upload_chunk_size', 0);
+
+		$tmpFilename = tempnam(sys_get_temp_dir(), 'lychee');
+		copy(base_path(TestConstants::SAMPLE_FILE_NIGHT_IMAGE), $tmpFilename);
+		$uploadedFile = UploadedFile::fake()->createWithContent('night.jpg', file_get_contents($tmpFilename));
+		$name = TestConstants::SAMPLE_FILE_NIGHT_IMAGE;
+		$size = filesize($tmpFilename);
+
+		Livewire::actingAs($this->userMayUpload1)->test(Upload::class)
+			->assertOk()
+			->assertViewIs('livewire.forms.add.upload')
+			->set([
+				'uploads.0.fileName' => $name,
+				'uploads.0.fileSize' => $size,
+				'uploads.0.lastModified' => 0,
+				'uploads.0.stage' => 'uploading',
+				'uploads.0.progress' => 0,
+			])
+			->set('uploads.0.fileChunk', $uploadedFile)
+			->assertOk();
+	}
+}
diff --git a/tests/Livewire/Menus/AlbumAddTest.php b/tests/Livewire/Menus/AlbumAddTest.php
new file mode 100644
index 00000000000..1c6f75f62c0
--- /dev/null
+++ b/tests/Livewire/Menus/AlbumAddTest.php
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Menus;
+
+use App\Livewire\Components\Menus\AlbumAdd;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class AlbumAddTest extends BaseLivewireTest
+{
+	public function testMenu(): void
+	{
+		Livewire::test(AlbumAdd::class, ['params' => ['parentID' => null]])
+			->assertViewIs('livewire.context-menus.album-add')
+			->assertStatus(200);
+	}
+
+	public function testOpenAlbumCreateModalModal(): void
+	{
+		Livewire::test(AlbumAdd::class, ['params' => ['parentID' => null]])
+		->call('openAlbumCreateModal')
+		->assertDispatched('closeContextMenu')
+		->assertDispatched('openModal', 'forms.album.create');
+	}
+
+	public function testOpenTagAlbumCreateModal(): void
+	{
+		Livewire::test(AlbumAdd::class, ['params' => ['parentID' => null]])
+		->call('openTagAlbumCreateModal')
+		->assertDispatched('closeContextMenu')
+		->assertDispatched('openModal', 'forms.album.create-tag');
+	}
+
+	public function testOpenImportFromServerModal(): void
+	{
+		Livewire::test(AlbumAdd::class, ['params' => ['parentID' => null]])
+		->call('openImportFromServerModal')
+		->assertDispatched('closeContextMenu')
+		->assertDispatched('openModal', 'forms.add.import-from-server');
+	}
+
+	public function testOpenImportFromUrlModal(): void
+	{
+		Livewire::test(AlbumAdd::class, ['params' => ['parentID' => null]])
+		->call('openImportFromUrlModal')
+		->assertDispatched('closeContextMenu')
+		->assertDispatched('openModal', 'forms.add.import-from-url');
+	}
+
+	public function testOpenUploadModal(): void
+	{
+		Livewire::test(AlbumAdd::class, ['params' => ['parentID' => null]])
+		->call('openUploadModal')
+		->assertDispatched('closeContextMenu')
+		->assertDispatched('openModal', 'forms.add.upload');
+	}
+}
diff --git a/tests/Livewire/Menus/AlbumDropdownTest.php b/tests/Livewire/Menus/AlbumDropdownTest.php
new file mode 100644
index 00000000000..72f6d30416a
--- /dev/null
+++ b/tests/Livewire/Menus/AlbumDropdownTest.php
@@ -0,0 +1,85 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Menus;
+
+use App\Livewire\Components\Menus\AlbumDropdown;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class AlbumDropdownTest extends BaseLivewireTest
+{
+	public function testMenu(): void
+	{
+		Livewire::test(
+			AlbumDropdown::class,
+			['params' => ['parentID' => null, 'albumID' => $this->album1->id]]
+		)
+			->assertViewIs('livewire.context-menus.album-dropdown')
+			->assertStatus(200);
+	}
+
+	public function testRename(): void
+	{
+		Livewire::test(
+			AlbumDropdown::class,
+			['params' => ['parentID' => null, 'albumID' => $this->album1->id]]
+		)
+			->call('rename')
+			->assertDispatched('closeContextMenu')
+			->assertDispatched('openModal', 'forms.album.rename');
+	}
+
+	public function testMerge(): void
+	{
+		Livewire::test(
+			AlbumDropdown::class,
+			['params' => ['parentID' => null, 'albumID' => $this->album1->id]]
+		)
+			->call('merge')
+			->assertDispatched('closeContextMenu')
+			->assertDispatched('openModal', 'forms.album.merge');
+	}
+
+	public function testDelete(): void
+	{
+		Livewire::test(
+			AlbumDropdown::class,
+			['params' => ['parentID' => null, 'albumID' => $this->album1->id]]
+		)
+			->call('delete')
+			->assertDispatched('closeContextMenu')
+			->assertDispatched('openModal', 'forms.album.delete');
+	}
+
+	public function testMove(): void
+	{
+		Livewire::test(
+			AlbumDropdown::class,
+			['params' => ['parentID' => null, 'albumID' => $this->album1->id]]
+		)
+			->call('move')
+			->assertDispatched('closeContextMenu')
+			->assertDispatched('openModal', 'forms.album.move');
+	}
+
+	public function testDownload(): void
+	{
+		Livewire::test(
+			AlbumDropdown::class,
+			['params' => ['parentID' => null, 'albumID' => $this->album1->id]]
+		)
+			->call('download')
+			->assertDispatched('closeContextMenu')
+			->assertRedirect(route('download', ['albumIDs' => $this->album1->id]));
+	}
+}
diff --git a/tests/Livewire/Menus/AlbumsDropdownTest.php b/tests/Livewire/Menus/AlbumsDropdownTest.php
new file mode 100644
index 00000000000..9def5567151
--- /dev/null
+++ b/tests/Livewire/Menus/AlbumsDropdownTest.php
@@ -0,0 +1,86 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Menus;
+
+use App\Contracts\Livewire\Params;
+use App\Livewire\Components\Menus\AlbumsDropdown;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class AlbumsDropdownTest extends BaseLivewireTest
+{
+	public function testMenu(): void
+	{
+		Livewire::test(
+			AlbumsDropdown::class,
+			['params' => [Params::PARENT_ID => null, Params::ALBUM_IDS => [$this->album1->id, $this->album2->id]]]
+		)
+			->assertViewIs('livewire.context-menus.albums-dropdown')
+			->assertStatus(200);
+	}
+
+	public function testRename(): void
+	{
+		Livewire::test(
+			AlbumsDropdown::class,
+			['params' => [Params::PARENT_ID => null, Params::ALBUM_IDS => [$this->album1->id, $this->album2->id]]]
+		)
+			->call('renameAll')
+			->assertDispatched('closeContextMenu')
+			->assertDispatched('openModal', 'forms.album.rename');
+	}
+
+	public function testMerge(): void
+	{
+		Livewire::test(
+			AlbumsDropdown::class,
+			['params' => [Params::PARENT_ID => null, Params::ALBUM_IDS => [$this->album1->id, $this->album2->id]]]
+		)
+			->call('mergeAll')
+			->assertDispatched('closeContextMenu')
+			->assertDispatched('openModal', 'forms.album.merge');
+	}
+
+	public function testDelete(): void
+	{
+		Livewire::test(
+			AlbumsDropdown::class,
+			['params' => [Params::PARENT_ID => null, Params::ALBUM_IDS => [$this->album1->id, $this->album2->id]]]
+		)
+			->call('deleteAll')
+			->assertDispatched('closeContextMenu')
+			->assertDispatched('openModal', 'forms.album.delete');
+	}
+
+	public function testMove(): void
+	{
+		Livewire::test(
+			AlbumsDropdown::class,
+			['params' => [Params::PARENT_ID => null, Params::ALBUM_IDS => [$this->album1->id, $this->album2->id]]]
+		)
+			->call('moveAll')
+			->assertDispatched('closeContextMenu')
+			->assertDispatched('openModal', 'forms.album.move');
+	}
+
+	public function testDownload(): void
+	{
+		Livewire::test(
+			AlbumsDropdown::class,
+			['params' => [Params::PARENT_ID => null, Params::ALBUM_IDS => [$this->album1->id, $this->album2->id]]]
+		)
+			->call('downloadAll')
+			->assertDispatched('closeContextMenu')
+			->assertRedirect(route('download') . '?albumIDs=' . $this->album1->id . ',' . $this->album2->id);
+	}
+}
diff --git a/tests/Livewire/Menus/ContextMenuTest.php b/tests/Livewire/Menus/ContextMenuTest.php
new file mode 100644
index 00000000000..370eca24665
--- /dev/null
+++ b/tests/Livewire/Menus/ContextMenuTest.php
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Menus;
+
+use App\Contracts\Livewire\Params;
+use App\Livewire\Components\Base\ContextMenu;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class ContextMenuTest extends BaseLivewireTest
+{
+	public function testMenu(): void
+	{
+		Livewire::test(ContextMenu::class)
+			->assertSet('isOpen', false)
+			->dispatch('openContextMenu', 'menus.AlbumAdd', [Params::PARENT_ID => null], 'right: 30px; top: 30px; transform-origin: top right;')
+			->assertSet('isOpen', true)
+			->assertSet('type', 'menus.AlbumAdd')
+			->dispatch('closeContextMenu')
+			->assertSet('isOpen', false);
+	}
+
+	public function testMenu2(): void
+	{
+		Livewire::test(ContextMenu::class)
+			->assertSet('isOpen', false)
+			->call('openContextMenu', 'menus.AlbumAdd', [Params::PARENT_ID => null], 'right: 30px; top: 30px; transform-origin: top right;')
+			->assertSet('isOpen', true)
+			->assertSet('type', 'menus.AlbumAdd')
+			->dispatch('closeContextMenu')
+			->assertSet('isOpen', false);
+	}
+}
diff --git a/tests/Livewire/Menus/LeftMenuTest.php b/tests/Livewire/Menus/LeftMenuTest.php
new file mode 100644
index 00000000000..88d05972007
--- /dev/null
+++ b/tests/Livewire/Menus/LeftMenuTest.php
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Menus;
+
+use App\Livewire\Components\Menus\LeftMenu;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class LeftMenuTest extends BaseLivewireTest
+{
+	public function testMenu(): void
+	{
+		Livewire::actingAs($this->admin)->test(LeftMenu::class)
+			->assertViewIs('livewire.components.left-menu')
+			->assertSet('isOpen', false)
+			->dispatch('openLeftMenu')
+			->assertSet('isOpen', true)
+			->dispatch('closeLeftMenu')
+			->assertSet('isOpen', false)
+			->dispatch('toggleLeftMenu')
+			->assertSet('isOpen', true)
+			->call('openAboutModal')
+			->assertDispatched('openModal', 'modals.about')
+			->call('logout')
+			->assertRedirect(route('livewire-gallery'));
+	}
+}
diff --git a/tests/Livewire/Menus/PhotoDropdownTest.php b/tests/Livewire/Menus/PhotoDropdownTest.php
new file mode 100644
index 00000000000..76e92041cba
--- /dev/null
+++ b/tests/Livewire/Menus/PhotoDropdownTest.php
@@ -0,0 +1,136 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Menus;
+
+use App\Contracts\Livewire\Params;
+use App\Livewire\Components\Menus\PhotoDropdown;
+use App\Models\Photo;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class PhotoDropdownTest extends BaseLivewireTest
+{
+	public function testMenu(): void
+	{
+		Livewire::test(PhotoDropdown::class,
+			['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->photo1->id]])
+			->assertViewIs('livewire.context-menus.photo-dropdown')
+			->assertStatus(200);
+	}
+
+	public function testRename(): void
+	{
+		Livewire::test(PhotoDropdown::class,
+			['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->photo1->id]])
+			->call('rename')
+			->assertDispatched('closeContextMenu')
+			->assertDispatched('openModal', 'forms.photo.rename');
+	}
+
+	public function testStarGuest(): void
+	{
+		Livewire::test(PhotoDropdown::class,
+			['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->photo1->id]])
+			->call('star')
+			->assertStatus(403);
+	}
+
+	public function testStar(): void
+	{
+		Livewire::actingAs($this->admin)->test(PhotoDropdown::class,
+			['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->photo1->id]])
+			->call('star')
+			->assertDispatched('closeContextMenu')
+			->assertDispatched('reloadPage');
+	}
+
+	public function testUnstarGuest(): void
+	{
+		Livewire::test(PhotoDropdown::class,
+			['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->photo1->id]])
+			->call('unstar')
+			->assertStatus(403);
+	}
+
+	public function testUnstar(): void
+	{
+		Livewire::actingAs($this->admin)->test(PhotoDropdown::class,
+			['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->photo1->id]])
+			->call('unstar')
+			->assertDispatched('closeContextMenu')
+			->assertDispatched('reloadPage');
+	}
+
+	public function testSetAsCoverGuest(): void
+	{
+		Livewire::test(PhotoDropdown::class,
+			['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->photo1->id]])
+			->call('setAsCover')
+			->assertStatus(403);
+	}
+
+	public function testSetAsCover(): void
+	{
+		Livewire::actingAs($this->admin)->test(PhotoDropdown::class,
+			['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->photo1->id]])
+			->call('setAsCover')
+			->assertDispatched('closeContextMenu')
+			->assertDispatched('reloadPage');
+	}
+
+	public function testTag(): void
+	{
+		Livewire::test(PhotoDropdown::class,
+			['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->photo1->id]])
+			->call('tag')
+			->assertDispatched('closeContextMenu')
+			->assertDispatched('openModal', 'forms.photo.tag');
+	}
+
+	public function testDelete(): void
+	{
+		Livewire::test(PhotoDropdown::class,
+			['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->photo1->id]])
+			->call('delete')
+			->assertDispatched('closeContextMenu')
+			->assertDispatched('openModal', 'forms.photo.delete');
+	}
+
+	public function testMove(): void
+	{
+		Livewire::test(PhotoDropdown::class,
+			['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->photo1->id]])
+			->call('move')
+			->assertDispatched('closeContextMenu')
+			->assertDispatched('openModal', 'forms.photo.move');
+	}
+
+	public function testCopyTo(): void
+	{
+		Livewire::test(PhotoDropdown::class,
+			['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->photo1->id]])
+			->call('copyTo')
+			->assertDispatched('closeContextMenu')
+			->assertDispatched('openModal', 'forms.photo.copy-to');
+	}
+
+	public function testDownload(): void
+	{
+		Livewire::test(PhotoDropdown::class,
+			['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_ID => $this->photo1->id]])
+			->call('download')
+			->assertDispatched('closeContextMenu')
+			->assertDispatched('openModal', 'forms.photo.download');
+		// ->assertRedirect(route('photo_download', ['kind' => DownloadVariantType::ORIGINAL->value, 'photoIDs' => $this->photo->id]));
+	}
+}
diff --git a/tests/Livewire/Menus/PhotosDropdownTest.php b/tests/Livewire/Menus/PhotosDropdownTest.php
new file mode 100644
index 00000000000..913bccfe664
--- /dev/null
+++ b/tests/Livewire/Menus/PhotosDropdownTest.php
@@ -0,0 +1,119 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Menus;
+
+use App\Contracts\Livewire\Params;
+use App\Livewire\Components\Menus\PhotosDropdown;
+use App\Models\Photo;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class PhotosDropdownTest extends BaseLivewireTest
+{
+	public function testMenu(): void
+	{
+		Livewire::test(PhotosDropdown::class,
+			['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_IDS => [$this->photo1->id, $this->photo1b->id]]])
+			->assertViewIs('livewire.context-menus.photos-dropdown')
+			->assertStatus(200);
+	}
+
+	public function testRename(): void
+	{
+		Livewire::test(PhotosDropdown::class,
+			['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_IDS => [$this->photo1->id, $this->photo1b->id]]])
+			->call('renameAll')
+			->assertDispatched('closeContextMenu')
+			->assertDispatched('openModal', 'forms.photo.rename');
+	}
+
+	public function testStarGuest(): void
+	{
+		Livewire::test(PhotosDropdown::class,
+			['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_IDS => [$this->photo1->id, $this->photo1b->id]]])
+			->call('starAll')
+			->assertStatus(403);
+	}
+
+	public function testStar(): void
+	{
+		Livewire::actingAs($this->admin)->test(PhotosDropdown::class,
+			['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_IDS => [$this->photo1->id, $this->photo1b->id]]])
+			->call('starAll')
+			->assertDispatched('closeContextMenu')
+			->assertDispatched('reloadPage');
+	}
+
+	public function testUnstarGuest(): void
+	{
+		Livewire::test(PhotosDropdown::class,
+			['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_IDS => [$this->photo1->id, $this->photo1b->id]]])
+			->call('unstarAll')
+			->assertStatus(403);
+	}
+
+	public function testUnstar(): void
+	{
+		Livewire::actingAs($this->admin)->test(PhotosDropdown::class,
+			['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_IDS => [$this->photo1->id, $this->photo1b->id]]])
+			->call('unstarAll')
+			->assertDispatched('closeContextMenu')
+			->assertDispatched('reloadPage');
+	}
+
+	public function testTag(): void
+	{
+		Livewire::test(PhotosDropdown::class,
+			['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_IDS => [$this->photo1->id, $this->photo1b->id]]])
+			->call('tagAll')
+			->assertDispatched('closeContextMenu')
+			->assertDispatched('openModal', 'forms.photo.tag');
+	}
+
+	public function testDelete(): void
+	{
+		Livewire::test(PhotosDropdown::class,
+			['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_IDS => [$this->photo1->id, $this->photo1b->id]]])
+			->call('deleteAll')
+			->assertDispatched('closeContextMenu')
+			->assertDispatched('openModal', 'forms.photo.delete');
+	}
+
+	public function testMove(): void
+	{
+		Livewire::test(PhotosDropdown::class,
+			['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_IDS => [$this->photo1->id, $this->photo1b->id]]])
+			->call('moveAll')
+			->assertDispatched('closeContextMenu')
+			->assertDispatched('openModal', 'forms.photo.move');
+	}
+
+	public function testCopyTo(): void
+	{
+		Livewire::test(PhotosDropdown::class,
+			['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_IDS => [$this->photo1->id, $this->photo1b->id]]])
+			->call('copyAllTo')
+			->assertDispatched('closeContextMenu')
+			->assertDispatched('openModal', 'forms.photo.copy-to');
+	}
+
+	public function testDownload(): void
+	{
+		Livewire::test(PhotosDropdown::class,
+			['params' => [Params::ALBUM_ID => $this->album1->id, Params::PHOTO_IDS => [$this->photo1->id, $this->photo1b->id]]])
+			->call('downloadAll')
+			->assertDispatched('closeContextMenu')
+			->assertDispatched('openModal', 'forms.photo.download');
+		// ->assertRedirect(route('photo_download', ['kind' => DownloadVariantType::ORIGINAL->value, Params::PHOTO_IDS => $this->photo->id]));
+	}
+}
diff --git a/tests/Livewire/Modals/AboutTest.php b/tests/Livewire/Modals/AboutTest.php
new file mode 100644
index 00000000000..ce361b48443
--- /dev/null
+++ b/tests/Livewire/Modals/AboutTest.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Modals;
+
+use App\Livewire\Components\Modals\About;
+use App\Metadata\Versions\InstalledVersion;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class AboutTest extends BaseLivewireTest
+{
+	public function testAbout(): void
+	{
+		Livewire::test(About::class)
+			->assertViewIs('livewire.modals.about')
+			->assertSet('is_new_release_available', false)
+			->assertSet('is_git_update_available', false)
+			->assertSet('version', resolve(InstalledVersion::class)->getVersion()->toString());
+	}
+}
diff --git a/tests/Livewire/Modals/LoginTest.php b/tests/Livewire/Modals/LoginTest.php
new file mode 100644
index 00000000000..63e992b4164
--- /dev/null
+++ b/tests/Livewire/Modals/LoginTest.php
@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Modals;
+
+use App\Livewire\Components\Modals\Login;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class LoginTest extends BaseLivewireTest
+{
+	public function testLogin(): void
+	{
+		Livewire::test(Login::class)
+			->assertViewIs('livewire.modals.login')
+			->call('submit')
+			->assertHasErrors('password', ['required'])
+			->assertHasErrors('username', ['required'])
+			->set('username', 'admin')
+			->call('submit')
+			->assertHasErrors('password', ['required'])
+			->set('password', '123456')
+			->call('submit')
+			->assertHasErrors('wrongLogin')
+			->set('password', 'password')
+			->call('submit')
+			->assertDispatched('login-close')
+			->assertDispatched('reloadPage');
+	}
+}
diff --git a/tests/Livewire/Modals/ModalTest.php b/tests/Livewire/Modals/ModalTest.php
new file mode 100644
index 00000000000..a4566077223
--- /dev/null
+++ b/tests/Livewire/Modals/ModalTest.php
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Modals;
+
+use App\Livewire\Components\Base\Modal;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class ModalTest extends BaseLivewireTest
+{
+	public function testOpenClose(): void
+	{
+		Livewire::test(Modal::class)
+			->assertSet('isOpen', false)
+			->dispatch('openModal', 'modals.about', __('lychee.CLOSE'))
+			->assertSet('isOpen', true)
+			->assertSet('type', 'modals.about')
+			->assertSet('close_text', __('lychee.CLOSE'))
+			->assertViewIs('livewire.components.modal')
+			->dispatch('closeModal')
+			->assertSet('isOpen', false);
+	}
+
+	public function testOpenClose2(): void
+	{
+		Livewire::test(Modal::class)
+			->assertSet('isOpen', false)
+			->call('openModal', 'modals.about', __('lychee.CLOSE'))
+			->assertSet('isOpen', true)
+			->assertSet('type', 'modals.about')
+			->assertSet('close_text', __('lychee.CLOSE'))
+			->assertViewIs('livewire.components.modal')
+			->dispatch('closeModal')
+			->assertSet('isOpen', false);
+	}
+}
diff --git a/tests/Livewire/Modules/ErrorsTest.php b/tests/Livewire/Modules/ErrorsTest.php
new file mode 100644
index 00000000000..c98bad6130c
--- /dev/null
+++ b/tests/Livewire/Modules/ErrorsTest.php
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Modules;
+
+use App\Livewire\Components\Modules\Diagnostics\Errors;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class ErrorsTest extends BaseLivewireTest
+{
+	private string $component = Errors::class;
+
+	public function setUp(): void
+	{
+		parent::setUp();
+	}
+
+	public function tearDown(): void
+	{
+		parent::tearDown();
+	}
+
+	public function testLoggedOut(): void
+	{
+		Livewire::test($this->component)
+			->assertViewIs('livewire.modules.diagnostics.pre-colored')
+			->assertOk();
+	}
+
+	public function testLoggedIn(): void
+	{
+		Livewire::actingAs($this->admin)->test($this->component, ['lazy' => false])
+			->assertViewIs('livewire.modules.diagnostics.pre-colored')
+			->assertOk()
+			->call('getDataProperty');
+	}
+}
diff --git a/tests/Livewire/Modules/SpaceTest.php b/tests/Livewire/Modules/SpaceTest.php
new file mode 100644
index 00000000000..4f278e2d35e
--- /dev/null
+++ b/tests/Livewire/Modules/SpaceTest.php
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Modules;
+
+use App\Livewire\Components\Modules\Diagnostics\Space;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class SpaceTest extends BaseLivewireTest
+{
+	private string $component = Space::class;
+
+	public function setUp(): void
+	{
+		parent::setUp();
+	}
+
+	public function tearDown(): void
+	{
+		parent::tearDown();
+	}
+
+	public function testLoggedOut(): void
+	{
+		Livewire::test($this->component)
+			->assertViewIs('livewire.modules.diagnostics.with-action-call')
+			->assertSee('Error: You must have administrator rights to see this.')
+			->assertOk();
+	}
+
+	public function testLoggedIn(): void
+	{
+		Livewire::actingAs($this->admin)->test($this->component)
+			->assertViewIs('livewire.modules.diagnostics.with-action-call')
+			->assertDontSee('Error: You must have administrator rights to see this.')
+			->assertOk()
+			->call('do')
+			->assertOk()
+			->assertDontSee('Error: You must have administrator rights to see this.');
+	}
+}
diff --git a/tests/Livewire/Modules/UserLineTest.php b/tests/Livewire/Modules/UserLineTest.php
new file mode 100644
index 00000000000..409d1897d19
--- /dev/null
+++ b/tests/Livewire/Modules/UserLineTest.php
@@ -0,0 +1,69 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Modules;
+
+use App\Livewire\Components\Modules\Users\UserLine;
+use App\Models\User;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class UserLineTest extends BaseLivewireTest
+{
+	private string $component = UserLine::class;
+
+	public function testLoggedOut(): void
+	{
+		$user = User::factory()->create();
+		Livewire::test($this->component, ['user' => $user])
+			->assertForbidden();
+	}
+
+	public function testLoggedIn(): void
+	{
+		/** @var User $user */
+		$user = User::factory()->create();
+
+		Livewire::actingAs($this->admin)->test($this->component, ['user' => $user])
+			->assertViewIs('livewire.modules.users.user-line')
+			->assertSet('username', $user->username)
+			->assertSet('password', '')
+			->assertSet('may_upload', false)
+			->assertSet('may_edit_own_settings', true)
+			->assertSet('id', $user->id);
+	}
+
+	public function testEdit(): void
+	{
+		$user = User::factory()->create();
+
+		Livewire::actingAs($this->admin)->test($this->component, ['user' => $user])
+			->assertViewIs('livewire.modules.users.user-line')
+			->set('username', 'user1')
+			->set('may_upload', true)
+			->set('may_edit_own_settings', false)
+			->call('save')
+			->assertSet('username', 'user1')
+			->assertSet('may_upload', true)
+			->assertSet('may_edit_own_settings', false);
+
+		Livewire::actingAs($this->admin)->test($this->component, ['user' => $user])
+			->set('username', '')
+			->call('save')
+			->assertDispatched('notify'); // notify only on failure.
+
+		Livewire::actingAs($this->admin)->test($this->component, ['user' => $user])
+			->set('username', 'admin') // cannot use an existing name.
+			->call('save')
+			->assertStatus(409);
+	}
+}
diff --git a/tests/Livewire/Pages/AlbumTest.php b/tests/Livewire/Pages/AlbumTest.php
new file mode 100644
index 00000000000..fe03ea201f2
--- /dev/null
+++ b/tests/Livewire/Pages/AlbumTest.php
@@ -0,0 +1,134 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Pages;
+
+use App\Enum\PhotoLayoutType;
+use App\Enum\SmartAlbumType;
+use App\Livewire\Components\Pages\Gallery\Album;
+use App\Models\Configs;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class AlbumTest extends BaseLivewireTest
+{
+	public function testUrlPageLogout(): void
+	{
+		// In this specific case we allow to find the album but we do not display it (tested later)
+		$response = $this->get(route('livewire-gallery-album', ['albumId' => $this->album1->id]));
+		$this->assertOk($response);
+
+		$response = $this->get(route('livewire-gallery-album', ['albumId' => '1234567890']));
+		$this->assertNotFound($response);
+	}
+
+	public function testPageLogout(): void
+	{
+		Livewire::test(Album::class, ['albumId' => $this->album1->id])
+			->assertViewIs('livewire.pages.gallery.album')
+			->assertSee($this->album1->id)
+			->assertOk()
+			->assertSet('flags.is_accessible', false)
+			->dispatch('reloadPage');
+	}
+
+	public function testPageUserNoAccess(): void
+	{
+		Livewire::actingAs($this->userMayUpload2)->test(Album::class, ['albumId' => $this->album1->id])
+			->assertRedirect(route('livewire-gallery'));
+
+		Livewire::actingAs($this->userNoUpload)->test(Album::class, ['albumId' => $this->album1->id])
+			->assertRedirect(route('livewire-gallery'));
+	}
+
+	public function testPageLoginAndBack(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(Album::class, ['albumId' => $this->album1->id])
+			->assertViewIs('livewire.pages.gallery.album')
+			->assertSee($this->album1->id)
+			->assertOk()
+			->assertSet('flags.is_accessible', true)
+			->call('silentUpdate')
+			->assertOk()
+			->assertSet('back', route('livewire-gallery'));
+	}
+
+	public function testPageLoginAndBackFromSubAlbum(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(Album::class, ['albumId' => $this->subAlbum1->id])
+			->assertViewIs('livewire.pages.gallery.album')
+			->assertSee($this->subAlbum1->id)
+			->assertOk()
+			->assertSet('flags.is_accessible', true)
+			->call('silentUpdate')
+			->assertOk()
+			->assertSet('back', route('livewire-gallery-album', ['albumId' => $this->album1->id]));
+	}
+
+	public function testMenus(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(Album::class, ['albumId' => $this->album1->id])
+			->assertViewIs('livewire.pages.gallery.album')
+			->assertSee($this->album1->id)
+			->assertSee($this->subAlbum1->id)
+			->assertSee($this->photo1->id)
+			->assertSee($this->subPhoto1->size_variants->getThumb()->url)
+			->assertOk()
+			->call('openContextMenu')
+			->assertOk()
+			->call('openAlbumDropdown', 0, 0, $this->subAlbum1->id)
+			->assertOk()
+			->call('openAlbumsDropdown', 0, 0, [$this->subAlbum1->id])
+			->assertOk()
+			->call('openPhotoDropdown', 0, 0, $this->photo1->id)
+			->assertOk()
+			->call('openPhotosDropdown', 0, 0, [$this->photo1->id])
+			->assertOk();
+	}
+
+	public function testActions(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(Album::class, ['albumId' => $this->album1->id])
+			->assertViewIs('livewire.pages.gallery.album')
+			->assertSee($this->album1->id)
+			->assertSee($this->subAlbum1->id)
+			->assertSee($this->photo1->id)
+			->assertSee($this->subPhoto1->size_variants->getThumb()->url)
+			->assertOk()
+			->call('setStar', [$this->photo1->id])
+			->assertOk()
+			->call('unsetStar', [$this->photo1->id])
+			->assertOk()
+			->call('setCover', $this->photo1->id)
+			->assertDispatched('notify', self::notifySuccess())
+			->assertOk();
+	}
+
+	public function testActionsUnsorted(): void
+	{
+		Configs::set('layout', PhotoLayoutType::SQUARE);
+
+		Livewire::actingAs($this->userMayUpload1)->test(Album::class, ['albumId' => SmartAlbumType::UNSORTED->value])
+			->assertViewIs('livewire.pages.gallery.album')
+			->assertSee($this->photoUnsorted->id)
+			->assertOk()
+			->call('setStar', [$this->photoUnsorted->id])
+			->assertOk()
+			->call('unsetStar', [$this->photoUnsorted->id])
+			->assertOk()
+			->call('setCover', $this->photoUnsorted->id)
+			->assertNotDispatched('notify')
+			->assertOk();
+
+		Configs::set('layout', PhotoLayoutType::JUSTIFIED);
+	}
+}
diff --git a/tests/Livewire/Pages/AllSettingsTest.php b/tests/Livewire/Pages/AllSettingsTest.php
new file mode 100644
index 00000000000..54542e16312
--- /dev/null
+++ b/tests/Livewire/Pages/AllSettingsTest.php
@@ -0,0 +1,59 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Pages;
+
+use App\Livewire\Components\Pages\AllSettings;
+use App\Models\Configs;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class AllSettingsTest extends BaseLivewireTest
+{
+	private string $component = AllSettings::class;
+
+	public function testLoggedOut(): void
+	{
+		Livewire::test($this->component)
+			->assertForbidden();
+	}
+
+	public function testLoggedIn(): void
+	{
+		Livewire::actingAs($this->admin)->test($this->component)
+			->assertViewIs('livewire.pages.all-settings')
+			->call('openConfirmSave')
+			->assertDispatched('openModal');
+
+		Livewire::actingAs($this->admin)->test($this->component)
+			->dispatch('saveAll')
+			->assertStatus(200);
+
+		Livewire::actingAs($this->admin)->test($this->component)
+			->call('back')
+			->assertDispatched('closeLeftMenu')
+			->assertRedirect(route('settings'));
+	}
+
+	public function testLoggedInWithErrors(): void
+	{
+		$comp = Livewire::actingAs($this->admin)->test($this->component);
+		/** @var array<int,Configs> $configs */
+		$configs = $comp->viewData('form')->configs;
+		$idx = collect($configs)->search(fn (Configs $conf) => $conf->key === 'check_for_updates');
+		$comp->set('form.values.' . $idx, '2')
+			->dispatch('saveAll')
+			->assertHasErrors('form.values.' . $idx);
+
+		$this->assertNotEquals(2, Configs::getValueAsInt('check_for_updates'));
+	}
+}
diff --git a/tests/Livewire/Pages/DiagnosticsTest.php b/tests/Livewire/Pages/DiagnosticsTest.php
new file mode 100644
index 00000000000..67c6924c114
--- /dev/null
+++ b/tests/Livewire/Pages/DiagnosticsTest.php
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Pages;
+
+use App\Livewire\Components\Modules\Diagnostics\Configurations;
+use App\Livewire\Components\Modules\Diagnostics\Errors;
+use App\Livewire\Components\Modules\Diagnostics\Infos;
+use App\Livewire\Components\Modules\Diagnostics\Space;
+use App\Livewire\Components\Pages\Diagnostics;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class DiagnosticsTest extends BaseLivewireTest
+{
+	public function testDiagnosticsLoggedOut(): void
+	{
+		Livewire::test(Diagnostics::class)
+			->assertViewIs('livewire.pages.diagnostics')
+			->assertSeeLivewire(Configurations::class)
+			->assertSeeLivewire(Space::class)
+			->assertSeeLivewire(Infos::class)
+			->assertSeeInOrder([
+				'Error: You must have administrator rights to see this.',
+				'Error: You must have administrator rights to see this.',
+				'Error: You must have administrator rights to see this.']);
+	}
+
+	public function testDiagnosticsLogged(): void
+	{
+		$diagnostics = Livewire::actingAs($this->admin)->test(Diagnostics::class, ['lazy' => false])
+			->assertViewIs('livewire.pages.diagnostics')
+			->assertSeeLivewire(Configurations::class)
+			->assertSeeLivewire(Errors::class)
+			->assertSeeLivewire(Space::class)
+			->assertSeeLivewire(Infos::class)
+			->assertDontSee('Error: You must have administrator rights to see this.');
+
+		$diagnostics->dispatch('reloadPage')
+			->assertStatus(200);
+
+		Livewire::actingAs($this->admin)->test(Diagnostics::class)
+			->call('back')
+			->assertDispatched('closeLeftMenu')
+			->assertRedirect(route('livewire-gallery'));
+	}
+}
diff --git a/tests/Livewire/Pages/FrameTest.php b/tests/Livewire/Pages/FrameTest.php
new file mode 100644
index 00000000000..4bdaf268d39
--- /dev/null
+++ b/tests/Livewire/Pages/FrameTest.php
@@ -0,0 +1,104 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Pages;
+
+use App\Livewire\Components\Forms\Album\Visibility;
+use App\Livewire\Components\Pages\Frame;
+use App\Livewire\Components\Pages\Gallery\Album;
+use App\Models\Configs;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class FrameTest extends BaseLivewireTest
+{
+	public function testFrameLoggedOutForbidden(): void
+	{
+		Configs::set('mod_frame_enabled', false);
+		Livewire::test(Frame::class)
+			->assertForbidden();
+	}
+
+	public function testFrameLoggedInDisabled(): void
+	{
+		Configs::set('mod_frame_enabled', false);
+		Livewire::actingAs($this->userMayUpload1)->test(Frame::class)
+			->assertForbidden();
+	}
+
+	public function testFrameLoggedOutEnabled(): void
+	{
+		// Set up visibiltiy
+		Livewire::actingAs($this->userMayUpload1)->test(Visibility::class, ['album' => $this->album1])
+			->assertOk()
+			->assertViewIs('livewire.forms.album.visibility')
+			->toggle('is_public')
+			->assertDispatched('notify', self::notifySuccess());
+
+		$this->album1->fresh();
+		$this->album1->base_class->load('access_permissions');
+		$this->assertNotNull($this->album1->public_permissions());
+
+		// Check guest can access
+		Livewire::test(Album::class, ['albumId' => $this->album1->id])
+			->assertStatus(200);
+
+		// By default we are showing starred.
+		Configs::set('mod_frame_enabled', true);
+		Livewire::test(Frame::class)
+			->assertStatus(500);
+
+		// Show all pictures
+		Configs::set('random_album_id', '');
+		Configs::set('mod_frame_enabled', true);
+		Livewire::test(Frame::class)
+			->assertOk()
+			->assertViewIs('livewire.pages.gallery.frame');
+
+		// Check frame on album
+		Livewire::test(Frame::class, ['albumId' => $this->album1->id])
+			->assertOk()
+			->assertViewIs('livewire.pages.gallery.frame');
+
+		Configs::set('mod_frame_enabled', false);
+		Configs::set('random_album_id', 'starred');
+	}
+
+	public function testFrameLoggedInEnabled(): void
+	{
+		Configs::set('mod_frame_enabled', true);
+		Configs::set('random_album_id', '');
+		Livewire::actingAs($this->userMayUpload1)->test(Frame::class)
+			->assertOk()
+			->assertViewIs('livewire.pages.gallery.frame');
+
+		Configs::set('mod_frame_enabled', false);
+		Configs::set('random_album_id', 'starred');
+	}
+
+	public function testFrameLoggedOutAlbum(): void
+	{
+		Configs::set('mod_frame_enabled', false);
+		Livewire::test(Frame::class, ['albumId' => $this->album1->id])
+			->assertForbidden();
+	}
+
+	public function testFrameLoggedInAlbum(): void
+	{
+		Configs::set('mod_frame_enabled', true);
+		Livewire::actingAs($this->userMayUpload1)->test(Frame::class, ['albumId' => $this->album1->id])
+			->assertOk()
+			->assertViewIs('livewire.pages.gallery.frame');
+
+		Configs::set('mod_frame_enabled', false);
+	}
+}
diff --git a/tests/Livewire/Pages/GalleryTest.php b/tests/Livewire/Pages/GalleryTest.php
new file mode 100644
index 00000000000..ef03a73e7d4
--- /dev/null
+++ b/tests/Livewire/Pages/GalleryTest.php
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Pages;
+
+use App\Livewire\Components\Pages\Gallery\Albums;
+use App\Models\Configs;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class GalleryTest extends BaseLivewireTest
+{
+	public function testGallery(): void
+	{
+		$title = Configs::getValueAsString('site_title');
+
+		Livewire::test(Albums::class)
+			->assertViewIs('livewire.pages.gallery.albums')
+			->assertSee($title)
+			->dispatch('reloadPage')
+			->assertStatus(200)
+			->call('silentUpdate')
+			->assertStatus(200);
+	}
+}
diff --git a/tests/Livewire/Pages/IndexTest.php b/tests/Livewire/Pages/IndexTest.php
new file mode 100644
index 00000000000..590dd688a03
--- /dev/null
+++ b/tests/Livewire/Pages/IndexTest.php
@@ -0,0 +1,69 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Pages;
+
+use App\Models\Configs;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class IndexTest extends BaseLivewireTest
+{
+	/**
+	 * Testing the Login interface.
+	 *
+	 * @return void
+	 */
+	public function testHome(): void
+	{
+		/**
+		 * check if we can actually get a nice answer.
+		 */
+		$response = $this->get(route('livewire-index'));
+		$this->assertRedirect($response);
+	}
+
+	public function testLandingPage(): void
+	{
+		$landing_on_off = Configs::getValue('landing_page_enable');
+		Configs::set('landing_page_enable', 1);
+
+		$response = $this->get(route('livewire-index'));
+		$this->assertRedirect($response);
+		$response->assertRedirect(route('landing'));
+
+		$response = $this->get(route('landing'));
+		$this->assertOk($response);
+
+		$response = $this->get(route('livewire-gallery'));
+		$this->assertOk($response);
+
+		Configs::set('landing_page_enable', $landing_on_off);
+	}
+
+	public function testGalleryPage(): void
+	{
+		$landing_on_off = Configs::getValue('landing_page_enable');
+		Configs::set('landing_page_enable', 0);
+
+		$response = $this->get(route('livewire-index'));
+		$this->assertRedirect($response);
+		$response->assertRedirect(route('livewire-gallery'));
+
+		$response = $this->get(route('livewire-gallery'));
+		$this->assertOk($response);
+
+		$response = $this->get(route('landing'));
+		$this->assertRedirect($response);
+
+		Configs::set('landing_page_enable', $landing_on_off);
+	}
+}
diff --git a/tests/Livewire/Pages/JobsTest.php b/tests/Livewire/Pages/JobsTest.php
new file mode 100644
index 00000000000..18863d54c30
--- /dev/null
+++ b/tests/Livewire/Pages/JobsTest.php
@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Pages;
+
+use App\Livewire\Components\Pages\Jobs;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class JobsTest extends BaseLivewireTest
+{
+	private string $component = Jobs::class;
+
+	public function testLoggedOut(): void
+	{
+		Livewire::test($this->component)
+			->assertForbidden();
+	}
+
+	public function testLoggedIn(): void
+	{
+		Livewire::actingAs($this->admin)->test($this->component)
+			->assertViewIs('livewire.pages.jobs');
+
+		Livewire::actingAs($this->admin)->test($this->component)
+			->call('back')
+			->assertDispatched('closeLeftMenu')
+			->assertRedirect(route('livewire-gallery'));
+	}
+}
diff --git a/tests/Livewire/Pages/LandingTest.php b/tests/Livewire/Pages/LandingTest.php
new file mode 100644
index 00000000000..2371ee23d05
--- /dev/null
+++ b/tests/Livewire/Pages/LandingTest.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Pages;
+
+use App\Livewire\Components\Pages\Landing;
+use App\Models\Configs;
+use Livewire\Livewire;
+use Tests\AbstractTestCase;
+
+class LandingTest extends AbstractTestCase
+{
+	private bool $landing_on_off;
+
+	protected function setUp(): void
+	{
+		parent::setUp();
+		$this->landing_on_off = Configs::getValueAsBool('landing_page_enable');
+		Configs::set('landing_page_enable', 1);
+	}
+
+	protected function tearDown(): void
+	{
+		Configs::set('landing_page_enable', $this->landing_on_off);
+		parent::tearDown();
+	}
+
+	public function testLandingPage(): void
+	{
+		$title = Configs::getValueAsString('landing_title');
+		$subtitle = Configs::getValueAsString('landing_subtitle');
+		$background = Configs::getValueAsString('landing_background');
+		Livewire::test(Landing::class)
+			->assertViewIs('livewire.pages.landing')
+			->assertSee($title)
+			->assertSee($subtitle)
+			->assertSee($background);
+	}
+}
diff --git a/tests/Livewire/Pages/MapTest.php b/tests/Livewire/Pages/MapTest.php
new file mode 100644
index 00000000000..e3d8344218a
--- /dev/null
+++ b/tests/Livewire/Pages/MapTest.php
@@ -0,0 +1,85 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Pages;
+
+use App\Livewire\Components\Pages\Map;
+use App\Models\Configs;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class MapTest extends BaseLivewireTest
+{
+	public function testMapLoggedOutForbidden(): void
+	{
+		Livewire::test(Map::class)
+			->assertForbidden();
+	}
+
+	public function testMapLoggedInDisabled(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(Map::class)
+			->assertForbidden();
+	}
+
+	public function testMapLoggedInEnabled(): void
+	{
+		Configs::set('map_display', true);
+		Livewire::actingAs($this->userMayUpload1)->test(Map::class)
+			->assertOk()
+			->assertViewIs('livewire.pages.gallery.map');
+
+		Configs::set('map_display', false);
+	}
+
+	public function testMapLoggedOutEnabled(): void
+	{
+		Configs::set('map_display', true);
+		Configs::set('map_display_public', true);
+
+		Livewire::test(Map::class)
+			->assertOk()
+			->assertViewIs('livewire.pages.gallery.map');
+
+		Configs::set('map_display', false);
+		Configs::set('map_display_public', false);
+	}
+
+	public function testMapLoggedOutAlbum(): void
+	{
+		Livewire::test(Map::class, ['albumId' => $this->album1->id])
+			->assertForbidden();
+
+		Configs::set('map_display', true);
+		Livewire::test(Map::class, ['albumId' => $this->album1->id])
+			->assertForbidden();
+
+		Configs::set('map_display_public', true);
+		Livewire::test(Map::class, ['albumId' => $this->album1->id])
+			->assertForbidden();
+
+		Configs::set('map_display', false);
+		Configs::set('map_display_public', false);
+	}
+
+	public function testMapLoggedInAlbum(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(Map::class)
+			->assertForbidden();
+
+		Configs::set('map_display', true);
+		Livewire::actingAs($this->userMayUpload1)->test(Map::class)
+			->assertOk()
+			->assertViewIs('livewire.pages.gallery.map');
+		Configs::set('map_display', false);
+	}
+}
diff --git a/tests/Livewire/Pages/ProfileTest.php b/tests/Livewire/Pages/ProfileTest.php
new file mode 100644
index 00000000000..2712d985da3
--- /dev/null
+++ b/tests/Livewire/Pages/ProfileTest.php
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Pages;
+
+use App\Livewire\Components\Pages\Profile;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class ProfileTest extends BaseLivewireTest
+{
+	private string $component = Profile::class;
+
+	public function testLoggedOut(): void
+	{
+		Livewire::test($this->component)
+			->assertForbidden();
+	}
+
+	public function testLoggedIn(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test($this->component)
+			->assertViewIs('livewire.pages.profile');
+
+		Livewire::actingAs($this->userMayUpload1)->test($this->component)
+			->call('back')
+			->assertDispatched('closeLeftMenu')
+			->assertRedirect(route('livewire-gallery'));
+	}
+
+	public function testLoggedInPowerless(): void
+	{
+		Livewire::actingAs($this->userLocked)->test($this->component)
+			->assertForbidden();
+	}
+}
diff --git a/tests/Livewire/Pages/SettingsTest.php b/tests/Livewire/Pages/SettingsTest.php
new file mode 100644
index 00000000000..6530a411a4b
--- /dev/null
+++ b/tests/Livewire/Pages/SettingsTest.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Pages;
+
+use App\Livewire\Components\Pages\Settings;
+use Livewire\Livewire;
+use Tests\Feature\Traits\RequiresEmptyUsers;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class SettingsTest extends BaseLivewireTest
+{
+	use RequiresEmptyUsers;
+
+	private string $component = Settings::class;
+
+	public function testLoggedOut(): void
+	{
+		Livewire::test($this->component)
+			->assertForbidden();
+	}
+
+	public function testLoggedIn(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test($this->component)
+			->assertForbidden();
+	}
+
+	public function testLoggedInAdmin(): void
+	{
+		Livewire::actingAs($this->admin)->test($this->component)
+			->assertViewIs('livewire.pages.settings');
+
+		Livewire::actingAs($this->admin)->test($this->component)
+			->call('back')
+			->assertDispatched('closeLeftMenu')
+			->assertRedirect(route('livewire-gallery'));
+	}
+}
diff --git a/tests/Livewire/Pages/SharingTest.php b/tests/Livewire/Pages/SharingTest.php
new file mode 100644
index 00000000000..f7acd15d16e
--- /dev/null
+++ b/tests/Livewire/Pages/SharingTest.php
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Pages;
+
+use App\Livewire\Components\Pages\Sharing;
+use Livewire\Livewire;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class SharingTest extends BaseLivewireTest
+{
+	private string $component = Sharing::class;
+
+	public function testLoggedOut(): void
+	{
+		Livewire::test($this->component)
+			->assertForbidden();
+	}
+
+	public function testLoggedInUserNoRights(): void
+	{
+		Livewire::actingAs($this->userNoUpload)->test($this->component)
+			->assertForbidden();
+	}
+
+	public function testLoggedInUser(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test($this->component)
+			->assertViewIs('livewire.pages.sharing');
+
+		Livewire::actingAs($this->userMayUpload1)->test($this->component)
+			->call('back')
+			->assertDispatched('closeLeftMenu')
+			->assertRedirect(route('livewire-gallery'));
+	}
+
+	public function testLoggedInAdmin(): void
+	{
+		Livewire::actingAs($this->admin)->test($this->component)
+			->assertViewIs('livewire.pages.sharing');
+
+		Livewire::actingAs($this->admin)->test($this->component)
+			->call('back')
+			->assertDispatched('closeLeftMenu')
+			->assertRedirect(route('livewire-gallery'));
+	}
+}
diff --git a/tests/Livewire/Pages/UsersTest.php b/tests/Livewire/Pages/UsersTest.php
new file mode 100644
index 00000000000..41e8a491e63
--- /dev/null
+++ b/tests/Livewire/Pages/UsersTest.php
@@ -0,0 +1,94 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Pages;
+
+use App\Livewire\Components\Pages\Users;
+use App\Models\User;
+use Livewire\Livewire;
+use Tests\AbstractTestCase;
+use Tests\Feature\Traits\RequiresEmptyUsers;
+
+class UsersTest extends AbstractTestCase
+{
+	use RequiresEmptyUsers;
+
+	private string $component = Users::class;
+
+	private User $admin;
+
+	public function setUp(): void
+	{
+		parent::setUp();
+		$this->admin = User::findOrFail(1);
+
+		$this->setUpRequiresEmptyUsers();
+		$this->withoutVite();
+	}
+
+	public function tearDown(): void
+	{
+		$this->tearDownRequiresEmptyUsers();
+		parent::tearDown();
+	}
+
+	public function testLoggedOut(): void
+	{
+		Livewire::test($this->component)
+			->assertForbidden();
+	}
+
+	public function testLoggedIn(): void
+	{
+		Livewire::actingAs($this->admin)->test($this->component)
+			->assertViewIs('livewire.pages.users')
+			->assertCount('users', 1);
+
+		Livewire::actingAs($this->admin)->test($this->component)
+			->call('back')
+			->assertDispatched('closeLeftMenu')
+			->assertRedirect(route('livewire-gallery'));
+	}
+
+	public function testCreate(): void
+	{
+		User::where('username', '=', 'user1')->delete();
+
+		$this->assertEquals(1, User::count());
+		$this->assertEquals(0, User::where('username', '=', 'user1')->count());
+
+		Livewire::actingAs($this->admin)->test(Users::class)
+			->set('username', 'user1')
+			->set('password', 'password')
+			->call('create')
+			->assertCount('users', 2);
+
+		$this->assertEquals(2, User::count());
+	}
+
+	public function testDelete(): void
+	{
+		/** @var User $user */
+		$user = User::factory()->create();
+
+		Livewire::actingAs($this->admin)->test(Users::class)
+			->call('delete', $user->id)
+			->assertCount('users', 1);
+	}
+
+	public function testForbiddenDelete(): void
+	{
+		Livewire::actingAs($this->admin)->test(Users::class)
+			->call('delete', $this->admin->id)
+			->assertStatus(403);
+	}
+}
diff --git a/tests/Livewire/WireableTest.php b/tests/Livewire/WireableTest.php
new file mode 100644
index 00000000000..9d49959b967
--- /dev/null
+++ b/tests/Livewire/WireableTest.php
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire;
+
+use App\Exceptions\Internal\LycheeLogicException;
+use App\Livewire\Traits\UseWireable;
+use Livewire\Wireable;
+use Tests\AbstractTestCase;
+
+class WireableTest extends AbstractTestCase
+{
+	public function testWirableDehydrate(): void
+	{
+		$trait = new class() implements Wireable {
+			use UseWireable;
+			public object $num;
+
+			public function __construct()
+			{
+				$this->num = new class() {};
+			}
+		};
+
+		$this->assertThrows(fn () => $trait->toLivewire(), LycheeLogicException::class);
+	}
+
+	public function testWirableHydrate(): void
+	{
+		$trait = new class() implements Wireable {
+			use UseWireable;
+		};
+
+		$this->assertThrows(fn () => $trait::fromLivewire(''), LycheeLogicException::class);
+	}
+}
\ No newline at end of file