diff --git a/.eslintrc.json b/.eslintrc.json
deleted file mode 100644
index cff4e85ef5ef77b0a99025fa1ff5016c1d5d7e74..0000000000000000000000000000000000000000
--- a/.eslintrc.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "env": {
-    "browser": true,
-    "es2020": true
-  },
-  "parser": "@typescript-eslint/parser",
-  "plugins": ["@typescript-eslint"],
-  "extends": [
-    "eslint:recommended",
-    "plugin:@typescript-eslint/recommended",
-    "plugin:prettier/recommended"
-  ],
-  "parserOptions": {
-    "ecmaVersion": 11,
-    "sourceType": "module"
-  },
-  "rules": {}
-}
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ee3acd7e0d074553b6b37c271cfd91f2c98e3044..fcae26a09b1acf5fc1e4697ef3b750f858a9fa13 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -69,10 +69,9 @@ lint-php:
 lint-js:
   stage: quality
   script:
-    - pnpm run prettier
+    - pnpm run format
     - pnpm run typecheck
     - pnpm run lint
-    - pnpm run lint:css
   dependencies:
     - js-dependencies
 
diff --git a/app/Common.php b/app/Common.php
index 6f720768acb7053f8312b65ba3d086d1b3aab598..89981c0ddf3cb900212b969d3546b2e1dda7b409 100644
--- a/app/Common.php
+++ b/app/Common.php
@@ -37,7 +37,7 @@ if (! function_exists('view')) {
         $renderer = single_service('renderer', $path);
 
         $saveData = config('View')
-->saveData;
+            ->saveData;
 
         if (array_key_exists('saveData', $options)) {
             $saveData = (bool) $options['saveData'];
diff --git a/app/Config/Events.php b/app/Config/Events.php
index 8da203d08d177b18d46d0fb240e8a5764819c268..ac4ed255e4bb54e85bcca04ccff7b37d580ee9f6 100644
--- a/app/Config/Events.php
+++ b/app/Config/Events.php
@@ -50,11 +50,12 @@ Events::on('pre_system', static function (): void {
      */
     if (CI_DEBUG && ! is_cli()) {
         Events::on('DBQuery', Database::class . '::collect');
-        Services::toolbar()->respond();
+        service('toolbar')
+            ->respond();
 
         // Hot Reload route - for framework use on the hot reloader.
         if (ENVIRONMENT === 'development') {
-            Services::routes()->get('__hot-reload', static function (): void {
+            service('routes')->get('__hot-reload', static function (): void {
                 (new HotReloader())->run();
             });
         }
diff --git a/app/Config/Filters.php b/app/Config/Filters.php
index 92125f42b64c1e118b7271af0823de92af5c9a84..1cf07e27141bf01b54da6b98d09b7bfa3eb4725e 100644
--- a/app/Config/Filters.php
+++ b/app/Config/Filters.php
@@ -67,7 +67,7 @@ class Filters extends BaseConfig
     /**
      * List of filter aliases that are always applied before and after every request.
      *
-     * @var array<string, array<string, array<string, string|array<string>>>>>|array<string, list<string>>
+     * @var array<string, array<string, array<string, string|array<string>>>>|array<string, list<string>>
      */
     public array $globals = [
         'before' => [
diff --git a/app/Config/Format.php b/app/Config/Format.php
index 2b72fc0e8eabc0fd8385f84b9e4067e8730140bd..86b7e2ddb16974ab2673c67f115b92ca3652450a 100644
--- a/app/Config/Format.php
+++ b/app/Config/Format.php
@@ -74,6 +74,6 @@ class Format extends BaseConfig
      */
     public function getFormatter(string $mime): FormatterInterface
     {
-        return Services::format()->getFormatter($mime);
+        return service('format')->getFormatter($mime);
     }
 }
diff --git a/app/Config/Generators.php b/app/Config/Generators.php
index 172b40815d617906d9ad4f032342fbeb67ec8cb6..76b82d6b04aa727db62965db40365f035a308a1e 100644
--- a/app/Config/Generators.php
+++ b/app/Config/Generators.php
@@ -25,7 +25,7 @@ class Generators extends BaseConfig
      *
      * YOU HAVE BEEN WARNED!
      *
-     * @var array<string, string>
+     * @var array<string, array<string, string>|string>
      */
     public array $views = [
         'make:cell' => [
diff --git a/app/Config/Paths.php b/app/Config/Paths.php
index 496590dc28f8867774fbede9f8e68134cb2d56f6..aa51ea9e7be7822d0585515527caa6f111b2548d 100644
--- a/app/Config/Paths.php
+++ b/app/Config/Paths.php
@@ -70,7 +70,7 @@ class Paths
      * This variable must contain the name of the directory that
      * contains the view files used by your application. By
      * default this is in `app/Views`. This value
-     * is used when no value is provided to `Services::renderer()`.
+     * is used when no value is provided to `service('renderer')`.
      */
     public string $viewDirectory = __DIR__ . '/../Views';
 }
diff --git a/app/Config/Tasks.php b/app/Config/Tasks.php
index e78ebfc3689937cf5b2629cfc7cac85b6afc1c62..084dbade5abffa9bffdeaf8b87fc145219aae80a 100644
--- a/app/Config/Tasks.php
+++ b/app/Config/Tasks.php
@@ -4,10 +4,10 @@ declare(strict_types=1);
 
 namespace Config;
 
-use CodeIgniter\Config\BaseConfig;
+use CodeIgniter\Tasks\Config\Tasks as BaseTasks;
 use CodeIgniter\Tasks\Scheduler;
 
-class Tasks extends BaseConfig
+class Tasks extends BaseTasks
 {
     /**
      * --------------------------------------------------------------------------
@@ -17,7 +17,7 @@ class Tasks extends BaseConfig
      * If true, will log the time it takes for each task to run.
      * Requires the settings table to have been created previously.
      */
-    public bool $logPerformance = false;
+    public bool $logPerformance = true;
 
     /**
      * --------------------------------------------------------------------------
diff --git a/app/Controllers/EpisodeAudioController.php b/app/Controllers/EpisodeAudioController.php
index 76487098d4e4af45b09ad395431441a7af08b2e1..2f2347698091b065b0e140e0a112d271a63cbc77 100644
--- a/app/Controllers/EpisodeAudioController.php
+++ b/app/Controllers/EpisodeAudioController.php
@@ -21,7 +21,6 @@ use CodeIgniter\HTTP\RedirectResponse;
 use CodeIgniter\HTTP\RequestInterface;
 use CodeIgniter\HTTP\ResponseInterface;
 use CodeIgniter\HTTP\URI;
-use Config\Services;
 use Modules\Analytics\Config\Analytics;
 use Modules\PremiumPodcasts\Entities\Subscription;
 use Modules\PremiumPodcasts\Models\SubscriptionModel;
@@ -130,7 +129,7 @@ class EpisodeAudioController extends Controller
             }
         }
 
-        $session = Services::session();
+        $session = service('session');
 
         $serviceName = '';
         if ($this->request->getGet('_from')) {
diff --git a/app/Controllers/EpisodeController.php b/app/Controllers/EpisodeController.php
index 335d96d882a3c30b673e13280f49283494dc6efe..498f2c2c57b838cfac35fe9cf4874521e3e938bd 100644
--- a/app/Controllers/EpisodeController.php
+++ b/app/Controllers/EpisodeController.php
@@ -21,7 +21,6 @@ use CodeIgniter\Exceptions\PageNotFoundException;
 use CodeIgniter\HTTP\Response;
 use CodeIgniter\HTTP\ResponseInterface;
 use Config\Embed;
-use Config\Services;
 use Modules\Analytics\AnalyticsTrait;
 use Modules\Fediverse\Objects\OrderedCollectionObject;
 use Modules\Fediverse\Objects\OrderedCollectionPage;
@@ -293,7 +292,7 @@ class EpisodeController extends BaseController
             $this->registerPodcastWebpageHit($this->episode->podcast_id);
         }
 
-        $session = Services::session();
+        $session = service('session');
 
         if (service('superglobals')->server('HTTP_REFERER') !== null) {
             $session->set('embed_domain', parse_url(service('superglobals')->server('HTTP_REFERER'), PHP_URL_HOST));
diff --git a/app/Controllers/PostController.php b/app/Controllers/PostController.php
index 6a8b24f28f583383569172f8d85ac48b2174bec0..f7c55b90a7f72c25211c51a9db930a672c72b787 100644
--- a/app/Controllers/PostController.php
+++ b/app/Controllers/PostController.php
@@ -52,16 +52,21 @@ class PostController extends FediversePostController
         $this->podcast = $podcast;
         $this->actor = $this->podcast->actor;
 
+        if (count($params) <= 1) {
+            throw PageNotFoundException::forPageNotFound();
+        }
+
         if (
-            count($params) > 1 &&
-            ($post = (new PostModel())->getPostById($params[1])) instanceof CastopodPost
+            ! ($post = (new PostModel())->getPostById($params[1])) instanceof CastopodPost
         ) {
-            $this->post = $post;
-
-            unset($params[0]);
-            unset($params[1]);
+            throw PageNotFoundException::forPageNotFound();
         }
 
+        $this->post = $post;
+
+        unset($params[0]);
+        unset($params[1]);
+
         return $this->{$method}(...$params);
     }
 
@@ -72,10 +77,6 @@ class PostController extends FediversePostController
             $this->registerPodcastWebpageHit($this->podcast->id);
         }
 
-        if (! $this->post instanceof CastopodPost) {
-            throw PageNotFoundException::forPageNotFound();
-        }
-
         $cacheName = implode(
             '_',
             array_filter([
diff --git a/app/Entities/Clip/BaseClip.php b/app/Entities/Clip/BaseClip.php
index d8eab7bc036c1db85bd0926c95d704c3f005a775..5279dc4b49e205f5be97efb69b9409c9e8c9389b 100644
--- a/app/Entities/Clip/BaseClip.php
+++ b/app/Entities/Clip/BaseClip.php
@@ -36,7 +36,7 @@ use Modules\Media\Models\MediaModel;
  * @property string $type
  * @property int|null $media_id
  * @property Video|Audio|null $media
- * @property array|null $metadata
+ * @property array<mixed>|null $metadata
  * @property string $status
  * @property string $logs
  * @property User $user
@@ -136,7 +136,7 @@ class BaseClip extends Entity
             $media = new Audio([
                 'file_key'      => $fileKey,
                 'language_code' => $this->getPodcast()
-->language_code,
+                    ->language_code,
                 'uploaded_by' => $this->attributes['updated_by'],
                 'updated_by'  => $this->attributes['updated_by'],
             ]);
diff --git a/app/Entities/Clip/VideoClip.php b/app/Entities/Clip/VideoClip.php
index e1eef2e4c4c9c9dc7d95fe32df51295e152417cd..810f3d58c10e518c4f5945e0f29d3295ca4ca38c 100644
--- a/app/Entities/Clip/VideoClip.php
+++ b/app/Entities/Clip/VideoClip.php
@@ -15,7 +15,7 @@ use Modules\Media\Entities\Video;
 use Modules\Media\Models\MediaModel;
 
 /**
- * @property array $theme
+ * @property array{name:string,preview:string} $theme
  * @property string $format
  */
 class VideoClip extends BaseClip
@@ -73,7 +73,7 @@ class VideoClip extends BaseClip
         $video = new Video([
             'file_key'      => $fileKey,
             'language_code' => $this->getPodcast()
-->language_code,
+                ->language_code,
             'uploaded_by' => $this->attributes['created_by'],
             'updated_by'  => $this->attributes['created_by'],
         ]);
diff --git a/app/Entities/Episode.php b/app/Entities/Episode.php
index 7fbdc1fba696a4cc2f0ed6c00b2ecef101346985..9c71e6433b41ca00df2b12c60f404fb6ec7b70c7 100644
--- a/app/Entities/Episode.php
+++ b/app/Entities/Episode.php
@@ -73,7 +73,7 @@ use SimpleXMLElement;
  * @property string|null $location_name
  * @property string|null $location_geo
  * @property string|null $location_osm
- * @property array|null $custom_rss
+ * @property array<string|int,mixed>|null $custom_rss
  * @property string $custom_rss_string
  * @property bool $is_published_on_hubs
  * @property int $downloads_count
@@ -200,7 +200,7 @@ class Episode extends Entity
             $cover = new Image([
                 'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $this->attributes['slug'] . '.' . $file->getExtension(),
                 'sizes'    => config('Images')
-->podcastCoverSizes,
+                    ->podcastCoverSizes,
                 'uploaded_by' => $this->attributes['updated_by'],
                 'updated_by'  => $this->attributes['updated_by'],
             ]);
@@ -283,7 +283,7 @@ class Episode extends Entity
             $transcript = new Transcript([
                 'file_key'      => 'podcasts/' . $this->getPodcast()->handle . '/' . $this->attributes['slug'] . '-transcript.' . $file->getExtension(),
                 'language_code' => $this->getPodcast()
-->language_code,
+                    ->language_code,
                 'uploaded_by' => $this->attributes['updated_by'],
                 'updated_by'  => $this->attributes['updated_by'],
             ]);
@@ -320,7 +320,7 @@ class Episode extends Entity
             $chapters = new Chapters([
                 'file_key'      => 'podcasts/' . $this->getPodcast()->handle . '/' . $this->attributes['slug'] . '-chapters' . '.' . $file->getExtension(),
                 'language_code' => $this->getPodcast()
-->language_code,
+                    ->language_code,
                 'uploaded_by' => $this->attributes['updated_by'],
                 'updated_by'  => $this->attributes['updated_by'],
             ]);
@@ -346,10 +346,10 @@ class Episode extends Entity
         $audioURL = url_to(
             'episode-audio',
             $this->getPodcast()
-->handle,
+                ->handle,
             $this->slug,
             $this->getAudio()
-->file_extension
+                ->file_extension
         );
 
         // Wrap episode url with OP3 if episode is public and OP3 is enabled on this podcast
@@ -534,7 +534,7 @@ class Episode extends Entity
 
         if ($this->getPodcast()->episode_description_footer_html) {
             $descriptionHtml .= "<footer>{$this->getPodcast()
-->episode_description_footer_html}</footer>";
+                ->episode_description_footer_html}</footer>";
         }
 
         return $descriptionHtml;
diff --git a/app/Entities/Location.php b/app/Entities/Location.php
index 90b326d67002ff239a0d13fab9ed179e79a902c0..81c33718ad8c8b31bd46a83ec17540a0b1b30ecc 100644
--- a/app/Entities/Location.php
+++ b/app/Entities/Location.php
@@ -11,7 +11,6 @@ declare(strict_types=1);
 namespace App\Entities;
 
 use CodeIgniter\Entity\Entity;
-use Config\Services;
 
 /**
  * @property string $url
@@ -85,7 +84,7 @@ class Location extends Entity
      */
     public function fetchOsmLocation(): static
     {
-        $client = Services::curlrequest();
+        $client = service('curlrequest');
 
         $response = $client->request(
             'GET',
diff --git a/app/Entities/Person.php b/app/Entities/Person.php
index 961f56037ceead6778485e7975afff9446d5566c..8da212d0f40334cee6e26140fc9b07c4f9468ff6 100644
--- a/app/Entities/Person.php
+++ b/app/Entities/Person.php
@@ -72,7 +72,7 @@ class Person extends Entity
             $avatar = new Image([
                 'file_key' => 'persons/' . $this->attributes['unique_name'] . '.' . $file->getExtension(),
                 'sizes'    => config('Images')
-->personAvatarSizes,
+                    ->personAvatarSizes,
                 'uploaded_by' => $this->attributes['updated_by'],
                 'updated_by'  => $this->attributes['updated_by'],
             ]);
diff --git a/app/Entities/Podcast.php b/app/Entities/Podcast.php
index db74d4097333f4a3c702e9126e514671606f599e..2c4d6cb56b89e381a5ad0d4e919f7189f652d4c8 100644
--- a/app/Entities/Podcast.php
+++ b/app/Entities/Podcast.php
@@ -78,7 +78,7 @@ use RuntimeException;
  * @property string|null $location_geo
  * @property string|null $location_osm
  * @property string|null $payment_pointer
- * @property array|null $custom_rss
+ * @property array<string|int,mixed>|null $custom_rss
  * @property bool $is_op3_enabled
  * @property string $op3_url
  * @property string $custom_rss_string
@@ -255,7 +255,7 @@ class Podcast extends Entity
             $cover = new Image([
                 'file_key' => 'podcasts/' . $this->attributes['handle'] . '/cover.' . $file->getExtension(),
                 'sizes'    => config('Images')
-->podcastCoverSizes,
+                    ->podcastCoverSizes,
                 'uploaded_by' => $this->attributes['updated_by'],
                 'updated_by'  => $this->attributes['updated_by'],
             ]);
@@ -298,7 +298,7 @@ class Podcast extends Entity
             $banner = new Image([
                 'file_key' => 'podcasts/' . $this->attributes['handle'] . '/banner.' . $file->getExtension(),
                 'sizes'    => config('Images')
-->podcastBannerSizes,
+                    ->podcastBannerSizes,
                 'uploaded_by' => $this->attributes['updated_by'],
                 'updated_by'  => $this->attributes['updated_by'],
             ]);
diff --git a/app/Helpers/breadcrumb_helper.php b/app/Helpers/breadcrumb_helper.php
index c600d2b37c6d6cfbc232391c8dbb7707966cffbf..223af8198a9c7cc090beccdef63b26fc409af616 100644
--- a/app/Helpers/breadcrumb_helper.php
+++ b/app/Helpers/breadcrumb_helper.php
@@ -8,8 +8,6 @@ declare(strict_types=1);
  * @link       https://castopod.org/
  */
 
-use Config\Services;
-
 if (! function_exists('render_breadcrumb')) {
     /**
      * Renders the breadcrumb navigation through the Breadcrumb service
@@ -19,7 +17,7 @@ if (! function_exists('render_breadcrumb')) {
      */
     function render_breadcrumb(string $class = null): string
     {
-        $breadcrumb = Services::breadcrumb();
+        $breadcrumb = service('breadcrumb');
         return $breadcrumb->render($class);
     }
 }
@@ -30,7 +28,7 @@ if (! function_exists('replace_breadcrumb_params')) {
      */
     function replace_breadcrumb_params(array $newParams): void
     {
-        $breadcrumb = Services::breadcrumb();
+        $breadcrumb = service('breadcrumb');
         $breadcrumb->replaceParams(esc($newParams));
     }
 }
diff --git a/app/Helpers/components_helper.php b/app/Helpers/components_helper.php
index f8c013295212aba7825a9d805620eb2e2a3e817b..4c81c21a8990564f794e4caa203408dcef80e97a 100644
--- a/app/Helpers/components_helper.php
+++ b/app/Helpers/components_helper.php
@@ -158,20 +158,20 @@ if (! function_exists('publication_button')) {
                 $label = lang('Episode.publish');
                 $route = route_to('episode-publish', $podcastId, $episodeId);
                 $variant = 'primary';
-                $iconLeft = 'upload-cloud-fill'; // @icon('upload-cloud-fill')
+                $iconLeft = 'upload-cloud-fill'; // @icon("upload-cloud-fill")
                 break;
             case 'with_podcast':
             case 'scheduled':
                 $label = lang('Episode.publish_edit');
                 $route = route_to('episode-publish_edit', $podcastId, $episodeId);
                 $variant = 'warning';
-                $iconLeft = 'upload-cloud-fill'; // @icon('upload-cloud-fill')
+                $iconLeft = 'upload-cloud-fill'; // @icon("upload-cloud-fill")
                 break;
             case 'published':
                 $label = lang('Episode.unpublish');
                 $route = route_to('episode-unpublish', $podcastId, $episodeId);
                 $variant = 'danger';
-                $iconLeft = 'cloud-off-fill'; // @icon('cloud-off-fill')
+                $iconLeft = 'cloud-off-fill'; // @icon("cloud-off-fill")
                 break;
             default:
                 $label = '';
diff --git a/app/Helpers/misc_helper.php b/app/Helpers/misc_helper.php
index b26fab00d0e8245262dbd35b41109a93ac2bbd12..a64807cdd33c98d57dff97329b6eae295dc18005 100644
--- a/app/Helpers/misc_helper.php
+++ b/app/Helpers/misc_helper.php
@@ -210,7 +210,7 @@ if (! function_exists('get_podcast_banner')) {
                 )->podcastBannerDefaultPaths['default'];
 
             $sizes = config('Images')
-->podcastBannerSizes;
+                ->podcastBannerSizes;
 
             $sizeConfig = $sizes[$size];
             helper('filesystem');
@@ -231,7 +231,7 @@ if (! function_exists('get_podcast_banner_mimetype')) {
     {
         if (! $podcast->banner instanceof Image) {
             $sizes = config('Images')
-->podcastBannerSizes;
+                ->podcastBannerSizes;
 
             $sizeConfig = $sizes[$size];
             helper('filesystem');
@@ -252,10 +252,10 @@ if (! function_exists('get_avatar_url')) {
     {
         if (! $person->avatar instanceof Image) {
             $defaultAvatarPath = config('Images')
-->avatarDefaultPath;
+                ->avatarDefaultPath;
 
             $sizes = config('Images')
-->personAvatarSizes;
+                ->personAvatarSizes;
 
             $sizeConfig = $sizes[$size];
 
diff --git a/app/Libraries/Router.php b/app/Libraries/Router.php
index 1f3abc5543a55a6d93ac9f065d53776aa2eac3fb..9146b57b72510758a6652e555d0779198d8ee0ae 100644
--- a/app/Libraries/Router.php
+++ b/app/Libraries/Router.php
@@ -18,7 +18,6 @@ use CodeIgniter\Exceptions\PageNotFoundException;
 use CodeIgniter\Router\Exceptions\RedirectException;
 use CodeIgniter\Router\Exceptions\RouterException;
 use CodeIgniter\Router\Router as CodeIgniterRouter;
-use Config\Services;
 
 class Router extends CodeIgniterRouter
 {
@@ -115,8 +114,8 @@ class Router extends CodeIgniterRouter
                     array_key_exists('alternate-content', $this->matchedRouteOptions) &&
                     is_array($this->matchedRouteOptions['alternate-content'])
                 ) {
-                    $request = Services::request();
-                    $negotiate = Services::negotiator();
+                    $request = service('request');
+                    $negotiate = service('negotiator');
 
                     // Accept header is mandatory
                     if ($request->header('Accept') === null) {
diff --git a/app/Models/EpisodeCommentModel.php b/app/Models/EpisodeCommentModel.php
index c999830bec736c3f80b75d269410281117d4b77c..f9954dc3276e5ed3bb87d56a87d987fa87a49952 100644
--- a/app/Models/EpisodeCommentModel.php
+++ b/app/Models/EpisodeCommentModel.php
@@ -229,8 +229,6 @@ class EpisodeCommentModel extends UuidModel
             $episodeComments . ' UNION ' . $episodePostsReplies . ' ORDER BY created_at ASC'
         );
 
-        // FIXME:?
-        // @phpstan-ignore-next-line
         return $this->convertUuidFieldsToStrings(
             $allEpisodeComments->getCustomResultObject($this->tempReturnType),
             $this->tempReturnType
diff --git a/app/Resources/icons/funding/_index.php b/app/Resources/icons/funding/_index.php
index e4e3444415530153f234fc0eac35ba8a3c43b8f7..f939dcca3b390ef644485dc0716c2ed7bf2d95ea 100644
--- a/app/Resources/icons/funding/_index.php
+++ b/app/Resources/icons/funding/_index.php
@@ -3,17 +3,17 @@
 declare(strict_types=1);
 
 /**
- * @icon('funding:buymeacoffee')
- * @icon('funding:donorbox')
- * @icon('funding:gofundme')
- * @icon('funding:helloasso')
- * @icon('funding:indiegogo')
- * @icon('funding:kickstarter')
- * @icon('funding:kisskissbankbank')
- * @icon('funding:kofi')
- * @icon('funding:liberapay')
- * @icon('funding:patreon')
- * @icon('funding:paypal')
- * @icon('funding:tipeee')
- * @icon('funding:ulule')
+ * @icon("funding:buymeacoffee")
+ * @icon("funding:donorbox")
+ * @icon("funding:gofundme")
+ * @icon("funding:helloasso")
+ * @icon("funding:indiegogo")
+ * @icon("funding:kickstarter")
+ * @icon("funding:kisskissbankbank")
+ * @icon("funding:kofi")
+ * @icon("funding:liberapay")
+ * @icon("funding:patreon")
+ * @icon("funding:paypal")
+ * @icon("funding:tipeee")
+ * @icon("funding:ulule")
  */
diff --git a/app/Resources/icons/podcasting/_index.php b/app/Resources/icons/podcasting/_index.php
index f6b7b176059dae283a5bdf50c167924aa55a1707..562854ecd9768799e7ea09a463917adfa1da1256 100644
--- a/app/Resources/icons/podcasting/_index.php
+++ b/app/Resources/icons/podcasting/_index.php
@@ -3,46 +3,46 @@
 declare(strict_types=1);
 
 /**
- * @icon('podcasting:amazon')
- * @icon('podcasting:antennapod')
- * @icon('podcasting:anytime')
- * @icon('podcasting:apple')
- * @icon('podcasting:blubrry')
- * @icon('podcasting:breez')
- * @icon('podcasting:castamatic')
- * @icon('podcasting:castbox')
- * @icon('podcasting:castopod')
- * @icon('podcasting:castro')
- * @icon('podcasting:deezer')
- * @icon('podcasting:episodes-fm')
- * @icon('podcasting:fountain')
- * @icon('podcasting:fyyd')
- * @icon('podcasting:gpodder')
- * @icon('podcasting:ivoox')
- * @icon('podcasting:listennotes')
- * @icon('podcasting:overcast')
- * @icon('podcasting:playerfm')
- * @icon('podcasting:plink')
- * @icon('podcasting:pocketcasts')
- * @icon('podcasting:podbean')
- * @icon('podcasting:podcastaddict')
- * @icon('podcasting:podcastguru')
- * @icon('podcasting:podcastindex')
- * @icon('podcasting:podchaser')
- * @icon('podcasting:podcloud')
- * @icon('podcasting:podfriend')
- * @icon('podcasting:podinstall')
- * @icon('podcasting:podlink')
- * @icon('podcasting:podlp')
- * @icon('podcasting:podnews')
- * @icon('podcasting:podtail')
- * @icon('podcasting:podverse')
- * @icon('podcasting:radiopublic')
- * @icon('podcasting:sphinxchat')
- * @icon('podcasting:spotify')
- * @icon('podcasting:spreaker')
- * @icon('podcasting:truefans')
- * @icon('podcasting:tsacdop')
- * @icon('podcasting:tunein')
- * @icon('podcasting:youtube-music')
+ * @icon("podcasting:amazon")
+ * @icon("podcasting:antennapod")
+ * @icon("podcasting:anytime")
+ * @icon("podcasting:apple")
+ * @icon("podcasting:blubrry")
+ * @icon("podcasting:breez")
+ * @icon("podcasting:castamatic")
+ * @icon("podcasting:castbox")
+ * @icon("podcasting:castopod")
+ * @icon("podcasting:castro")
+ * @icon("podcasting:deezer")
+ * @icon("podcasting:episodes-fm")
+ * @icon("podcasting:fountain")
+ * @icon("podcasting:fyyd")
+ * @icon("podcasting:gpodder")
+ * @icon("podcasting:ivoox")
+ * @icon("podcasting:listennotes")
+ * @icon("podcasting:overcast")
+ * @icon("podcasting:playerfm")
+ * @icon("podcasting:plink")
+ * @icon("podcasting:pocketcasts")
+ * @icon("podcasting:podbean")
+ * @icon("podcasting:podcastaddict")
+ * @icon("podcasting:podcastguru")
+ * @icon("podcasting:podcastindex")
+ * @icon("podcasting:podchaser")
+ * @icon("podcasting:podcloud")
+ * @icon("podcasting:podfriend")
+ * @icon("podcasting:podinstall")
+ * @icon("podcasting:podlink")
+ * @icon("podcasting:podlp")
+ * @icon("podcasting:podnews")
+ * @icon("podcasting:podtail")
+ * @icon("podcasting:podverse")
+ * @icon("podcasting:radiopublic")
+ * @icon("podcasting:sphinxchat")
+ * @icon("podcasting:spotify")
+ * @icon("podcasting:spreaker")
+ * @icon("podcasting:truefans")
+ * @icon("podcasting:tsacdop")
+ * @icon("podcasting:tunein")
+ * @icon("podcasting:youtube-music")
  */
diff --git a/app/Resources/icons/social/_index.php b/app/Resources/icons/social/_index.php
index 4e6a94ac1e7606c3fff1be83815dc49b38aded7a..571d8ab0aa6eaafe672e94b5efffe15a0484ec5c 100644
--- a/app/Resources/icons/social/_index.php
+++ b/app/Resources/icons/social/_index.php
@@ -3,26 +3,26 @@
 declare(strict_types=1);
 
 /**
- * @icon('social:bluesky')
- * @icon('social:discord')
- * @icon('social:facebook')
- * @icon('social:funkwhale')
- * @icon('social:instagram')
- * @icon('social:linkedin')
- * @icon('social:mastodon')
- * @icon('social:matrix')
- * @icon('social:misskey')
- * @icon('social:mobilizon')
- * @icon('social:peertube')
- * @icon('social:pixelfed')
- * @icon('social:pleroma')
- * @icon('social:plume')
- * @icon('social:slack')
- * @icon('social:telegram')
- * @icon('social:threads')
- * @icon('social:tiktok')
- * @icon('social:twitch')
- * @icon('social:writefreely')
- * @icon('social:x')
- * @icon('social:youtube')
+ * @icon("social:bluesky")
+ * @icon("social:discord")
+ * @icon("social:facebook")
+ * @icon("social:funkwhale")
+ * @icon("social:instagram")
+ * @icon("social:linkedin")
+ * @icon("social:mastodon")
+ * @icon("social:matrix")
+ * @icon("social:misskey")
+ * @icon("social:mobilizon")
+ * @icon("social:peertube")
+ * @icon("social:pixelfed")
+ * @icon("social:pleroma")
+ * @icon("social:plume")
+ * @icon("social:slack")
+ * @icon("social:telegram")
+ * @icon("social:threads")
+ * @icon("social:tiktok")
+ * @icon("social:twitch")
+ * @icon("social:writefreely")
+ * @icon("social:x")
+ * @icon("social:youtube")
  */
diff --git a/app/Views/Components/Alert.php b/app/Views/Components/Alert.php
index f328e6c8f5ea26ed7fe8c1a1e5557a6269785628..1bf21fbf16aaf5ba2a401210bf4f7fa4c5b8492e 100644
--- a/app/Views/Components/Alert.php
+++ b/app/Views/Components/Alert.php
@@ -22,19 +22,19 @@ class Alert extends Component
         $variants = [
             'success' => [
                 'class' => 'text-pine-900 bg-pine-100 border-pine-300',
-                'glyph' => 'check-fill', // @icon('check-fill')
+                'glyph' => 'check-fill', // @icon("check-fill")
             ],
             'danger' => [
                 'class' => 'text-red-900 bg-red-100 border-red-300',
-                'glyph' => 'close-fill', // @icon('close-fill')
+                'glyph' => 'close-fill', // @icon("close-fill")
             ],
             'warning' => [
                 'class' => 'text-yellow-900 bg-yellow-100 border-yellow-300',
-                'glyph' => 'alert-fill', // @icon('alert-fill')
+                'glyph' => 'alert-fill', // @icon("alert-fill")
             ],
             'default' => [
                 'class' => 'text-blue-900 bg-blue-100 border-blue-300',
-                'glyph' => 'error-warning-fill', // @icon('error-warning-fill')
+                'glyph' => 'error-warning-fill', // @icon("error-warning-fill")
             ],
         ];
 
diff --git a/app/Views/errors/cli/error_exception.php b/app/Views/errors/cli/error_exception.php
index 1ce53a5273d34ebe74832722319e54d46d088e06..7a7247fc6a0bd6dd261209cd830a328b8d1328c0 100644
--- a/app/Views/errors/cli/error_exception.php
+++ b/app/Views/errors/cli/error_exception.php
@@ -54,7 +54,7 @@ if (defined('SHOW_DEBUG_BACKTRACE') && SHOW_DEBUG_BACKTRACE) {
 
         $args = implode(', ', array_map(static fn ($value) => match (true) {
             is_object($value) => 'Object(' . $value::class . ')',
-            is_array($value)  => count($value) ? '[...]' : '[]',
+            is_array($value)  => $value !== [] ? '[...]' : '[]',
             $value === null   => 'null', // return the lowercased version
             default           => var_export($value, true),
         }, array_values($error['args'] ?? [])));
diff --git a/app/Views/errors/html/debug.js b/app/Views/errors/html/debug.js
index 3428750fba8efec03de800cd222bc95e4c1b49c0..65254785f3179bd10c447353b9f081ce7d3748c3 100644
--- a/app/Views/errors/html/debug.js
+++ b/app/Views/errors/html/debug.js
@@ -5,6 +5,7 @@
 var tabLinks = [];
 var contentDivs = [];
 
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
 function init() {
   // Grab the tab links and content divs from the page
   var tabListItems = document.getElementById("tabs").childNodes;
@@ -85,6 +86,7 @@ function getHash(url) {
 
 //--------------------------------------------------------------------
 
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
 function toggle(elem) {
   elem = document.getElementById(elem);
 
diff --git a/app/Views/errors/html/error_exception.php b/app/Views/errors/html/error_exception.php
index 6ccf08c8d5cad71b1865658d09f007294fbef0f7..9898ed5da71e8a1686755b17c466dc829fd235b8 100644
--- a/app/Views/errors/html/error_exception.php
+++ b/app/Views/errors/html/error_exception.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
 
 use CodeIgniter\CodeIgniter;
 use CodeIgniter\HTTP\Header;
-use Config\Services;
 
 $errorId = uniqid('error', true);
 ?>
@@ -228,7 +227,7 @@ while ($prevException = $last->getPrevious()) {
 
 			<!-- Request -->
 			<div class="content" id="request">
-				<?php $request = Services::request(); ?>
+				<?php $request = service('request'); ?>
 
 				<table>
 					<tbody>
@@ -346,7 +345,7 @@ while ($prevException = $last->getPrevious()) {
 
 			<!-- Response -->
 			<?php
-                $response = Services::response();
+                $response = service('response');
 $response->setStatusCode(http_response_code());
 ?>
 			<div class="content" id="response">
diff --git a/commitlint.config.cjs b/commitlint.config.cjs
index 723fa61ff0b68d056ef789806de9df5354a06b5a..5073c20db108a39520634648cb94f2926bfe4af9 100644
--- a/commitlint.config.cjs
+++ b/commitlint.config.cjs
@@ -1,3 +1 @@
-/* eslint-disable */
-
 module.exports = { extends: ["@commitlint/config-conventional"] };
diff --git a/composer.json b/composer.json
index 0a50a03aff153decab1457bd4fa2e2acdb2a27e7..f473665af1b3fcd891838a325b4d678c8d0e0bb9 100644
--- a/composer.json
+++ b/composer.json
@@ -9,37 +9,37 @@
     "php": "^8.1",
     "adaures/ipcat-php": "^v1.0.0",
     "adaures/podcast-persons-taxonomy": "^v1.0.1",
-    "aws/aws-sdk-php": "^3.325.2",
+    "aws/aws-sdk-php": "^3.336.10",
     "chrisjean/php-ico": "^1.0.4",
     "cocur/slugify": "^v4.6.0",
-    "codeigniter4/framework": "v4.5.5",
+    "codeigniter4/framework": "v4.5.7",
     "codeigniter4/settings": "v2.2.0",
     "codeigniter4/shield": "v1.1.0",
     "codeigniter4/tasks": "dev-develop",
-    "geoip2/geoip2": "v3.0.0",
+    "geoip2/geoip2": "v3.1.0",
     "james-heinrich/getid3": "^2.0.0-beta6",
-    "league/commonmark": "^2.5.3",
+    "league/commonmark": "^2.6.1",
     "league/html-to-markdown": "5.1.1",
     "melbahja/seo": "^v2.1.1",
     "michalsn/codeigniter4-uuid": "v1.1.0",
-    "mpratt/embera": "^2.0.41",
+    "mpratt/embera": "^2.0.42",
     "opawg/user-agents-v2-php": "dev-main",
-    "phpseclib/phpseclib": "~2.0.47",
+    "phpseclib/phpseclib": "~2.0.48",
     "vlucas/phpdotenv": "v5.6.1",
     "whichbrowser/parser": "^v2.1.8",
     "yassinedoghri/php-icons": "^v1.2.0",
     "yassinedoghri/podcast-feed": "dev-main"
   },
   "require-dev": {
-    "captainhook/captainhook": "^5.23.6",
-    "codeigniter/phpstan-codeigniter": "v1.4.3",
-    "mikey179/vfsstream": "^v1.6.12",
+    "captainhook/captainhook": "^5.24.1",
+    "codeigniter/phpstan-codeigniter": "v1.5.1",
+    "mikey179/vfsstream": "v1.6.12",
     "phpstan/extension-installer": "^1.4.3",
-    "phpstan/phpstan": "^1.12.7",
-    "phpunit/phpunit": "^10.5.38",
-    "rector/rector": "^1.2.9",
+    "phpstan/phpstan": "^2.1.1",
+    "phpunit/phpunit": "^10.5.40",
+    "rector/rector": "^2.0.6",
     "symplify/coding-standard": "^12.2.3",
-    "symplify/easy-coding-standard": "^12.3.6"
+    "symplify/easy-coding-standard": "^12.5.5"
   },
   "autoload": {
     "psr-4": {
diff --git a/composer.lock b/composer.lock
index ddbe83ee10336f484afcdef9382644678b7e3b03..7da7ad9a56fe95b72bfa76af773a29357fd2a933 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": "0e71b144adcc148d7a375b979139a6ab",
+  "content-hash": "eda6f02ae1a3871b00c7076da1f7c35d",
   "packages": [
     {
       "name": "adaures/ipcat-php",
@@ -75,16 +75,16 @@
     },
     {
       "name": "adhocore/cli",
-      "version": "v1.7.2",
+      "version": "v1.9.3",
       "source": {
         "type": "git",
         "url": "https://github.com/adhocore/php-cli.git",
-        "reference": "57834cbaa4fb68cda849417ab86577fba2b15298"
+        "reference": "86be16e3c3b42d76fcdb32529bcded0fedb925d3"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/adhocore/php-cli/zipball/57834cbaa4fb68cda849417ab86577fba2b15298",
-        "reference": "57834cbaa4fb68cda849417ab86577fba2b15298",
+        "url": "https://api.github.com/repos/adhocore/php-cli/zipball/86be16e3c3b42d76fcdb32529bcded0fedb925d3",
+        "reference": "86be16e3c3b42d76fcdb32529bcded0fedb925d3",
         "shasum": ""
       },
       "require": {
@@ -95,6 +95,7 @@
       },
       "type": "library",
       "autoload": {
+        "files": ["src/functions.php"],
         "psr-4": {
           "Ahc\\Cli\\": "src/"
         }
@@ -127,7 +128,7 @@
       ],
       "support": {
         "issues": "https://github.com/adhocore/php-cli/issues",
-        "source": "https://github.com/adhocore/php-cli/tree/v1.7.2"
+        "source": "https://github.com/adhocore/php-cli/tree/v1.9.3"
       },
       "funding": [
         {
@@ -139,7 +140,7 @@
           "type": "github"
         }
       ],
-      "time": "2024-09-05T00:08:47+00:00"
+      "time": "2024-12-04T03:40:29+00:00"
     },
     {
       "name": "aws/aws-crt-php",
@@ -188,16 +189,16 @@
     },
     {
       "name": "aws/aws-sdk-php",
-      "version": "3.325.2",
+      "version": "3.336.10",
       "source": {
         "type": "git",
         "url": "https://github.com/aws/aws-sdk-php.git",
-        "reference": "9e354a5e0cd1d563ec85245e3000e98e16a44fce"
+        "reference": "bb137145fdbcd4ca121446157d804b9653aff54c"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/9e354a5e0cd1d563ec85245e3000e98e16a44fce",
-        "reference": "9e354a5e0cd1d563ec85245e3000e98e16a44fce",
+        "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/bb137145fdbcd4ca121446157d804b9653aff54c",
+        "reference": "bb137145fdbcd4ca121446157d804b9653aff54c",
         "shasum": ""
       },
       "require": {
@@ -226,8 +227,8 @@
         "nette/neon": "^2.3",
         "paragonie/random_compat": ">= 2",
         "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5",
-        "psr/cache": "^1.0",
-        "psr/simple-cache": "^1.0",
+        "psr/cache": "^1.0 || ^2.0 || ^3.0",
+        "psr/simple-cache": "^1.0 || ^2.0 || ^3.0",
         "sebastian/comparator": "^1.2.3 || ^4.0",
         "yoast/phpunit-polyfills": "^1.0"
       },
@@ -274,9 +275,9 @@
       "support": {
         "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
         "issues": "https://github.com/aws/aws-sdk-php/issues",
-        "source": "https://github.com/aws/aws-sdk-php/tree/3.325.2"
+        "source": "https://github.com/aws/aws-sdk-php/tree/3.336.10"
       },
-      "time": "2024-11-01T18:08:38+00:00"
+      "time": "2025-01-07T19:05:48+00:00"
     },
     {
       "name": "brick/math",
@@ -447,16 +448,16 @@
     },
     {
       "name": "codeigniter4/framework",
-      "version": "v4.5.5",
+      "version": "v4.5.7",
       "source": {
         "type": "git",
         "url": "https://github.com/codeigniter4/framework.git",
-        "reference": "2849e7ff36b4c4aa1376d990a9a1e3f0c393b8d0"
+        "reference": "f253839c071abbef5262cbb8f49a6077dc5dd568"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/codeigniter4/framework/zipball/2849e7ff36b4c4aa1376d990a9a1e3f0c393b8d0",
-        "reference": "2849e7ff36b4c4aa1376d990a9a1e3f0c393b8d0",
+        "url": "https://api.github.com/repos/codeigniter4/framework/zipball/f253839c071abbef5262cbb8f49a6077dc5dd568",
+        "reference": "f253839c071abbef5262cbb8f49a6077dc5dd568",
         "shasum": ""
       },
       "require": {
@@ -513,7 +514,7 @@
         "slack": "https://codeigniterchat.slack.com",
         "source": "https://github.com/codeigniter4/CodeIgniter4"
       },
-      "time": "2024-09-07T08:49:38+00:00"
+      "time": "2024-12-31T12:13:44+00:00"
     },
     {
       "name": "codeigniter4/settings",
@@ -638,12 +639,12 @@
       "source": {
         "type": "git",
         "url": "https://github.com/codeigniter4/tasks.git",
-        "reference": "8767036adfef764f0623ba9cde2998320b948b3b"
+        "reference": "ec717c428c6f0e8e216e5dfbf18966a26a4f821f"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/codeigniter4/tasks/zipball/8767036adfef764f0623ba9cde2998320b948b3b",
-        "reference": "8767036adfef764f0623ba9cde2998320b948b3b",
+        "url": "https://api.github.com/repos/codeigniter4/tasks/zipball/ec717c428c6f0e8e216e5dfbf18966a26a4f821f",
+        "reference": "ec717c428c6f0e8e216e5dfbf18966a26a4f821f",
         "shasum": ""
       },
       "require": {
@@ -656,7 +657,7 @@
         "codeigniter4/devkit": "^1.0",
         "codeigniter4/framework": "^4.1",
         "phpunit/phpunit": "^9.6",
-        "rector/rector": "1.2.8"
+        "rector/rector": "1.2.10"
       },
       "default-branch": true,
       "type": "library",
@@ -714,20 +715,20 @@
         "source": "https://github.com/codeigniter4/tasks/tree/develop",
         "issues": "https://github.com/codeigniter4/tasks/issues"
       },
-      "time": "2024-10-21T18:02:22+00:00"
+      "time": "2024-11-11T12:05:47+00:00"
     },
     {
       "name": "composer/ca-bundle",
-      "version": "1.5.3",
+      "version": "1.5.4",
       "source": {
         "type": "git",
         "url": "https://github.com/composer/ca-bundle.git",
-        "reference": "3b1fc3f0be055baa7c6258b1467849c3e8204eb2"
+        "reference": "bc0593537a463e55cadf45fd938d23b75095b7e1"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/composer/ca-bundle/zipball/3b1fc3f0be055baa7c6258b1467849c3e8204eb2",
-        "reference": "3b1fc3f0be055baa7c6258b1467849c3e8204eb2",
+        "url": "https://api.github.com/repos/composer/ca-bundle/zipball/bc0593537a463e55cadf45fd938d23b75095b7e1",
+        "reference": "bc0593537a463e55cadf45fd938d23b75095b7e1",
         "shasum": ""
       },
       "require": {
@@ -766,7 +767,7 @@
       "support": {
         "irc": "irc://irc.freenode.org/composer",
         "issues": "https://github.com/composer/ca-bundle/issues",
-        "source": "https://github.com/composer/ca-bundle/tree/1.5.3"
+        "source": "https://github.com/composer/ca-bundle/tree/1.5.4"
       },
       "funding": [
         {
@@ -782,7 +783,7 @@
           "type": "tidelift"
         }
       ],
-      "time": "2024-11-04T10:15:26+00:00"
+      "time": "2024-11-27T15:35:25+00:00"
     },
     {
       "name": "dflydev/dot-access-data",
@@ -854,22 +855,22 @@
     },
     {
       "name": "geoip2/geoip2",
-      "version": "v3.0.0",
+      "version": "v3.1.0",
       "source": {
         "type": "git",
         "url": "https://github.com/maxmind/GeoIP2-php.git",
-        "reference": "1a802ce9356cdd1c6b681c030fd9563750e11e6a"
+        "reference": "c86fbeaa7e42279dd9e7af0b015384e721832b88"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/1a802ce9356cdd1c6b681c030fd9563750e11e6a",
-        "reference": "1a802ce9356cdd1c6b681c030fd9563750e11e6a",
+        "url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/c86fbeaa7e42279dd9e7af0b015384e721832b88",
+        "reference": "c86fbeaa7e42279dd9e7af0b015384e721832b88",
         "shasum": ""
       },
       "require": {
         "ext-json": "*",
-        "maxmind-db/reader": "^1.11.1",
-        "maxmind/web-service-common": "~0.8",
+        "maxmind-db/reader": "^1.12.0",
+        "maxmind/web-service-common": "~0.10",
         "php": ">=8.1"
       },
       "require-dev": {
@@ -898,9 +899,9 @@
       "keywords": ["IP", "geoip", "geoip2", "geolocation", "maxmind"],
       "support": {
         "issues": "https://github.com/maxmind/GeoIP2-php/issues",
-        "source": "https://github.com/maxmind/GeoIP2-php/tree/v3.0.0"
+        "source": "https://github.com/maxmind/GeoIP2-php/tree/v3.1.0"
       },
-      "time": "2023-12-04T17:16:34+00:00"
+      "time": "2024-11-15T16:33:31+00:00"
     },
     {
       "name": "graham-campbell/result-type",
@@ -1353,16 +1354,16 @@
     },
     {
       "name": "laminas/laminas-escaper",
-      "version": "2.14.0",
+      "version": "2.15.0",
       "source": {
         "type": "git",
         "url": "https://github.com/laminas/laminas-escaper.git",
-        "reference": "0f7cb975f4443cf22f33408925c231225cfba8cb"
+        "reference": "c612b0488ae486284c39885efca494c180f16351"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/0f7cb975f4443cf22f33408925c231225cfba8cb",
-        "reference": "0f7cb975f4443cf22f33408925c231225cfba8cb",
+        "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/c612b0488ae486284c39885efca494c180f16351",
+        "reference": "c612b0488ae486284c39885efca494c180f16351",
         "shasum": ""
       },
       "require": {
@@ -1374,12 +1375,12 @@
         "zendframework/zend-escaper": "*"
       },
       "require-dev": {
-        "infection/infection": "^0.27.9",
-        "laminas/laminas-coding-standard": "~3.0.0",
+        "infection/infection": "^0.27.11",
+        "laminas/laminas-coding-standard": "~3.0.1",
         "maglnet/composer-require-checker": "^3.8.0",
-        "phpunit/phpunit": "^9.6.16",
+        "phpunit/phpunit": "^9.6.22",
         "psalm/plugin-phpunit": "^0.19.0",
-        "vimeo/psalm": "^5.21.1"
+        "vimeo/psalm": "^5.26.1"
       },
       "type": "library",
       "autoload": {
@@ -1406,20 +1407,20 @@
           "type": "community_bridge"
         }
       ],
-      "time": "2024-10-24T10:12:53+00:00"
+      "time": "2024-12-17T19:39:54+00:00"
     },
     {
       "name": "league/commonmark",
-      "version": "2.5.3",
+      "version": "2.6.1",
       "source": {
         "type": "git",
         "url": "https://github.com/thephpleague/commonmark.git",
-        "reference": "b650144166dfa7703e62a22e493b853b58d874b0"
+        "reference": "d990688c91cedfb69753ffc2512727ec646df2ad"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/b650144166dfa7703e62a22e493b853b58d874b0",
-        "reference": "b650144166dfa7703e62a22e493b853b58d874b0",
+        "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d990688c91cedfb69753ffc2512727ec646df2ad",
+        "reference": "d990688c91cedfb69753ffc2512727ec646df2ad",
         "shasum": ""
       },
       "require": {
@@ -1444,8 +1445,9 @@
         "phpstan/phpstan": "^1.8.2",
         "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0",
         "scrutinizer/ocular": "^1.8.1",
-        "symfony/finder": "^5.3 | ^6.0 || ^7.0",
-        "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 || ^7.0",
+        "symfony/finder": "^5.3 | ^6.0 | ^7.0",
+        "symfony/process": "^5.4 | ^6.0 | ^7.0",
+        "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0",
         "unleashedtech/php-coding-standard": "^3.1.1",
         "vimeo/psalm": "^4.24.0 || ^5.0.0"
       },
@@ -1455,7 +1457,7 @@
       "type": "library",
       "extra": {
         "branch-alias": {
-          "dev-main": "2.6-dev"
+          "dev-main": "2.7-dev"
         }
       },
       "autoload": {
@@ -1510,7 +1512,7 @@
           "type": "tidelift"
         }
       ],
-      "time": "2024-08-16T11:46:16+00:00"
+      "time": "2024-12-29T14:10:59+00:00"
     },
     {
       "name": "league/config",
@@ -1676,29 +1678,27 @@
     },
     {
       "name": "maxmind-db/reader",
-      "version": "v1.11.1",
+      "version": "v1.12.0",
       "source": {
         "type": "git",
         "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
-        "reference": "1e66f73ffcf25e17c7a910a1317e9720a95497c7"
+        "reference": "5b2d7a721dedfaef9dc20822c5fe7d26f9f8eb90"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/1e66f73ffcf25e17c7a910a1317e9720a95497c7",
-        "reference": "1e66f73ffcf25e17c7a910a1317e9720a95497c7",
+        "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/5b2d7a721dedfaef9dc20822c5fe7d26f9f8eb90",
+        "reference": "5b2d7a721dedfaef9dc20822c5fe7d26f9f8eb90",
         "shasum": ""
       },
       "require": {
         "php": ">=7.2"
       },
       "conflict": {
-        "ext-maxminddb": "<1.11.1,>=2.0.0"
+        "ext-maxminddb": "<1.11.1 || >=2.0.0"
       },
       "require-dev": {
         "friendsofphp/php-cs-fixer": "3.*",
-        "php-coveralls/php-coveralls": "^2.1",
         "phpstan/phpstan": "*",
-        "phpunit/phpcov": ">=6.0.0",
         "phpunit/phpunit": ">=8.0.0,<10.0.0",
         "squizlabs/php_codesniffer": "3.*"
       },
@@ -1727,29 +1727,29 @@
       "keywords": ["database", "geoip", "geoip2", "geolocation", "maxmind"],
       "support": {
         "issues": "https://github.com/maxmind/MaxMind-DB-Reader-php/issues",
-        "source": "https://github.com/maxmind/MaxMind-DB-Reader-php/tree/v1.11.1"
+        "source": "https://github.com/maxmind/MaxMind-DB-Reader-php/tree/v1.12.0"
       },
-      "time": "2023-12-02T00:09:23+00:00"
+      "time": "2024-11-14T22:43:47+00:00"
     },
     {
       "name": "maxmind/web-service-common",
-      "version": "v0.9.0",
+      "version": "v0.10.0",
       "source": {
         "type": "git",
         "url": "https://github.com/maxmind/web-service-common-php.git",
-        "reference": "4dc5a3e8df38aea4ca3b1096cee3a038094e9b53"
+        "reference": "d7c7c42fc31bff26e0ded73a6e187bcfb193f9c4"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/4dc5a3e8df38aea4ca3b1096cee3a038094e9b53",
-        "reference": "4dc5a3e8df38aea4ca3b1096cee3a038094e9b53",
+        "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/d7c7c42fc31bff26e0ded73a6e187bcfb193f9c4",
+        "reference": "d7c7c42fc31bff26e0ded73a6e187bcfb193f9c4",
         "shasum": ""
       },
       "require": {
         "composer/ca-bundle": "^1.0.3",
         "ext-curl": "*",
         "ext-json": "*",
-        "php": ">=7.2"
+        "php": ">=8.1"
       },
       "require-dev": {
         "friendsofphp/php-cs-fixer": "3.*",
@@ -1776,9 +1776,9 @@
       "homepage": "https://github.com/maxmind/web-service-common-php",
       "support": {
         "issues": "https://github.com/maxmind/web-service-common-php/issues",
-        "source": "https://github.com/maxmind/web-service-common-php/tree/v0.9.0"
+        "source": "https://github.com/maxmind/web-service-common-php/tree/v0.10.0"
       },
-      "time": "2022-03-28T17:43:20+00:00"
+      "time": "2024-11-14T23:14:52+00:00"
     },
     {
       "name": "melbahja/seo",
@@ -1886,16 +1886,16 @@
     },
     {
       "name": "mpratt/embera",
-      "version": "2.0.41",
+      "version": "2.0.42",
       "source": {
         "type": "git",
         "url": "https://github.com/mpratt/Embera.git",
-        "reference": "069305b9252a428ba4ae6eb58d3dc8c6d9be5cd0"
+        "reference": "afa728339c6f078c803c9277a5054ca241b3c469"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/mpratt/Embera/zipball/069305b9252a428ba4ae6eb58d3dc8c6d9be5cd0",
-        "reference": "069305b9252a428ba4ae6eb58d3dc8c6d9be5cd0",
+        "url": "https://api.github.com/repos/mpratt/Embera/zipball/afa728339c6f078c803c9277a5054ca241b3c469",
+        "reference": "afa728339c6f078c803c9277a5054ca241b3c469",
         "shasum": ""
       },
       "require": {
@@ -1904,7 +1904,8 @@
       },
       "require-dev": {
         "phpstan/phpstan": "^1.4",
-        "phpunit/phpunit": "^9.0"
+        "phpunit/phpunit": "^9.0||^10.0",
+        "symfony/yaml": "^2.1"
       },
       "suggest": {
         "ext-curl": "Fetch data using curl instead of using file_get_contents"
@@ -1942,7 +1943,7 @@
       ],
       "support": {
         "issues": "https://github.com/mpratt/Embera/issues",
-        "source": "https://github.com/mpratt/Embera/tree/2.0.41"
+        "source": "https://github.com/mpratt/Embera/tree/2.0.42"
       },
       "funding": [
         {
@@ -1950,7 +1951,7 @@
           "type": "paypal"
         }
       ],
-      "time": "2024-08-17T04:27:29+00:00"
+      "time": "2025-01-04T06:07:59+00:00"
     },
     {
       "name": "mtdowling/jmespath.php",
@@ -2250,16 +2251,16 @@
     },
     {
       "name": "phpseclib/phpseclib",
-      "version": "2.0.47",
+      "version": "2.0.48",
       "source": {
         "type": "git",
         "url": "https://github.com/phpseclib/phpseclib.git",
-        "reference": "b7d7d90ee7df7f33a664b4aea32d50a305d35adb"
+        "reference": "eaa7be704b8b93a6913b69eb7f645a59d7731b61"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/b7d7d90ee7df7f33a664b4aea32d50a305d35adb",
-        "reference": "b7d7d90ee7df7f33a664b4aea32d50a305d35adb",
+        "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/eaa7be704b8b93a6913b69eb7f645a59d7731b61",
+        "reference": "eaa7be704b8b93a6913b69eb7f645a59d7731b61",
         "shasum": ""
       },
       "require": {
@@ -2336,7 +2337,7 @@
       ],
       "support": {
         "issues": "https://github.com/phpseclib/phpseclib/issues",
-        "source": "https://github.com/phpseclib/phpseclib/tree/2.0.47"
+        "source": "https://github.com/phpseclib/phpseclib/tree/2.0.48"
       },
       "funding": [
         {
@@ -2352,7 +2353,7 @@
           "type": "tidelift"
         }
       ],
-      "time": "2024-02-26T04:55:38+00:00"
+      "time": "2024-12-14T21:03:54+00:00"
     },
     {
       "name": "psr/cache",
@@ -2840,16 +2841,16 @@
     },
     {
       "name": "symfony/deprecation-contracts",
-      "version": "v3.5.0",
+      "version": "v3.5.1",
       "source": {
         "type": "git",
         "url": "https://github.com/symfony/deprecation-contracts.git",
-        "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1"
+        "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
-        "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
+        "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6",
+        "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6",
         "shasum": ""
       },
       "require": {
@@ -2857,12 +2858,12 @@
       },
       "type": "library",
       "extra": {
+        "thanks": {
+          "url": "https://github.com/symfony/contracts",
+          "name": "symfony/contracts"
+        },
         "branch-alias": {
           "dev-main": "3.5-dev"
-        },
-        "thanks": {
-          "name": "symfony/contracts",
-          "url": "https://github.com/symfony/contracts"
         }
       },
       "autoload": {
@@ -2883,7 +2884,7 @@
       "description": "A generic function and convention to trigger deprecation notices",
       "homepage": "https://symfony.com",
       "support": {
-        "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0"
+        "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1"
       },
       "funding": [
         {
@@ -2899,7 +2900,7 @@
           "type": "tidelift"
         }
       ],
-      "time": "2024-04-18T09:32:20+00:00"
+      "time": "2024-09-25T14:20:29+00:00"
     },
     {
       "name": "symfony/polyfill-ctype",
@@ -2927,8 +2928,8 @@
       "type": "library",
       "extra": {
         "thanks": {
-          "name": "symfony/polyfill",
-          "url": "https://github.com/symfony/polyfill"
+          "url": "https://github.com/symfony/polyfill",
+          "name": "symfony/polyfill"
         }
       },
       "autoload": {
@@ -2997,8 +2998,8 @@
       "type": "library",
       "extra": {
         "thanks": {
-          "name": "symfony/polyfill",
-          "url": "https://github.com/symfony/polyfill"
+          "url": "https://github.com/symfony/polyfill",
+          "name": "symfony/polyfill"
         }
       },
       "autoload": {
@@ -3061,8 +3062,8 @@
       "type": "library",
       "extra": {
         "thanks": {
-          "name": "symfony/polyfill",
-          "url": "https://github.com/symfony/polyfill"
+          "url": "https://github.com/symfony/polyfill",
+          "name": "symfony/polyfill"
         }
       },
       "autoload": {
@@ -3348,16 +3349,16 @@
   "packages-dev": [
     {
       "name": "captainhook/captainhook",
-      "version": "5.23.6",
+      "version": "5.24.1",
       "source": {
         "type": "git",
         "url": "https://github.com/captainhookphp/captainhook.git",
-        "reference": "6c9a60f5771581f3788f98d7b4aa9a61156cfebb"
+        "reference": "1e56452fd7a7e486e5955ab72dc9ea34bb52a184"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/captainhookphp/captainhook/zipball/6c9a60f5771581f3788f98d7b4aa9a61156cfebb",
-        "reference": "6c9a60f5771581f3788f98d7b4aa9a61156cfebb",
+        "url": "https://api.github.com/repos/captainhookphp/captainhook/zipball/1e56452fd7a7e486e5955ab72dc9ea34bb52a184",
+        "reference": "1e56452fd7a7e486e5955ab72dc9ea34bb52a184",
         "shasum": ""
       },
       "require": {
@@ -3383,11 +3384,11 @@
       "bin": ["bin/captainhook"],
       "type": "library",
       "extra": {
-        "branch-alias": {
-          "dev-main": "6.0.x-dev"
-        },
         "captainhook": {
           "config": "captainhook.json"
+        },
+        "branch-alias": {
+          "dev-main": "6.0.x-dev"
         }
       },
       "autoload": {
@@ -3416,7 +3417,7 @@
       ],
       "support": {
         "issues": "https://github.com/captainhookphp/captainhook/issues",
-        "source": "https://github.com/captainhookphp/captainhook/tree/5.23.6"
+        "source": "https://github.com/captainhookphp/captainhook/tree/5.24.1"
       },
       "funding": [
         {
@@ -3424,20 +3425,20 @@
           "type": "github"
         }
       ],
-      "time": "2024-10-30T14:15:58+00:00"
+      "time": "2024-11-26T18:42:37+00:00"
     },
     {
       "name": "captainhook/secrets",
-      "version": "0.9.5",
+      "version": "0.9.6",
       "source": {
         "type": "git",
         "url": "https://github.com/captainhookphp/secrets.git",
-        "reference": "8aa90d5b9b7892abd11b9da2fc172a7b32b90cbe"
+        "reference": "0232c67019e11c4bee4ee9bfec9575b67e0854e5"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/captainhookphp/secrets/zipball/8aa90d5b9b7892abd11b9da2fc172a7b32b90cbe",
-        "reference": "8aa90d5b9b7892abd11b9da2fc172a7b32b90cbe",
+        "url": "https://api.github.com/repos/captainhookphp/secrets/zipball/0232c67019e11c4bee4ee9bfec9575b67e0854e5",
+        "reference": "0232c67019e11c4bee4ee9bfec9575b67e0854e5",
         "shasum": ""
       },
       "require": {
@@ -3470,7 +3471,7 @@
       ],
       "support": {
         "issues": "https://github.com/captainhookphp/secrets/issues",
-        "source": "https://github.com/captainhookphp/secrets/tree/0.9.5"
+        "source": "https://github.com/captainhookphp/secrets/tree/0.9.6"
       },
       "funding": [
         {
@@ -3478,7 +3479,7 @@
           "type": "github"
         }
       ],
-      "time": "2023-11-30T18:10:18+00:00"
+      "time": "2024-11-26T09:24:19+00:00"
     },
     {
       "name": "clue/ndjson-react",
@@ -3544,38 +3545,36 @@
     },
     {
       "name": "codeigniter/phpstan-codeigniter",
-      "version": "v1.4.3",
+      "version": "v1.5.1",
       "source": {
         "type": "git",
         "url": "https://github.com/CodeIgniter/phpstan-codeigniter.git",
-        "reference": "bff4a7cfe251bb288223e95d6f588e956dfc0a93"
+        "reference": "4bfaba879007c7dfb9c3b687713bd5d45524f067"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/CodeIgniter/phpstan-codeigniter/zipball/bff4a7cfe251bb288223e95d6f588e956dfc0a93",
-        "reference": "bff4a7cfe251bb288223e95d6f588e956dfc0a93",
+        "url": "https://api.github.com/repos/CodeIgniter/phpstan-codeigniter/zipball/4bfaba879007c7dfb9c3b687713bd5d45524f067",
+        "reference": "4bfaba879007c7dfb9c3b687713bd5d45524f067",
         "shasum": ""
       },
       "require": {
-        "codeigniter4/framework": "^4.4",
+        "codeigniter4/framework": "^4.5",
         "php": "^8.1",
-        "phpstan/phpstan": "^1.10"
+        "phpstan/phpstan": "^2.0"
       },
       "conflict": {
         "codeigniter/framework": "*"
       },
       "require-dev": {
         "codeigniter/coding-standard": "^1.7",
-        "codeigniter4/shield": "^1.0@beta",
-        "friendsofphp/php-cs-fixer": "^3.20",
-        "nexusphp/cs-config": "^3.12",
-        "php-parallel-lint/php-parallel-lint": "^1.3",
+        "codeigniter4/shield": "^1.0",
+        "friendsofphp/php-cs-fixer": "^3.49",
+        "nexusphp/cs-config": "^3.21",
         "phpstan/extension-installer": "^1.3",
-        "phpstan/phpstan-deprecation-rules": "^1.1",
-        "phpstan/phpstan-phpunit": "^1.3",
-        "phpstan/phpstan-strict-rules": "^1.5",
-        "phpunit/phpunit": "^10.2",
-        "rector/rector": "^0.18.2"
+        "phpstan/phpstan-deprecation-rules": "^2.0",
+        "phpstan/phpstan-phpunit": "^2.0",
+        "phpstan/phpstan-strict-rules": "^2.0",
+        "phpunit/phpunit": "^10.5 || ^11.4"
       },
       "type": "phpstan-extension",
       "extra": {
@@ -3610,20 +3609,20 @@
         "slack": "https://codeigniterchat.slack.com",
         "source": "https://github.com/CodeIgniter/phpstan-codeigniter"
       },
-      "time": "2023-12-21T03:39:48+00:00"
+      "time": "2024-12-02T15:33:25+00:00"
     },
     {
       "name": "composer/pcre",
-      "version": "3.3.1",
+      "version": "3.3.2",
       "source": {
         "type": "git",
         "url": "https://github.com/composer/pcre.git",
-        "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4"
+        "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/composer/pcre/zipball/63aaeac21d7e775ff9bc9d45021e1745c97521c4",
-        "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4",
+        "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
+        "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
         "shasum": ""
       },
       "require": {
@@ -3633,17 +3632,17 @@
         "phpstan/phpstan": "<1.11.10"
       },
       "require-dev": {
-        "phpstan/phpstan": "^1.11.10",
-        "phpstan/phpstan-strict-rules": "^1.1",
+        "phpstan/phpstan": "^1.12 || ^2",
+        "phpstan/phpstan-strict-rules": "^1 || ^2",
         "phpunit/phpunit": "^8 || ^9"
       },
       "type": "library",
       "extra": {
-        "branch-alias": {
-          "dev-main": "3.x-dev"
-        },
         "phpstan": {
           "includes": ["extension.neon"]
+        },
+        "branch-alias": {
+          "dev-main": "3.x-dev"
         }
       },
       "autoload": {
@@ -3664,7 +3663,7 @@
       "keywords": ["PCRE", "preg", "regex", "regular expression"],
       "support": {
         "issues": "https://github.com/composer/pcre/issues",
-        "source": "https://github.com/composer/pcre/tree/3.3.1"
+        "source": "https://github.com/composer/pcre/tree/3.3.2"
       },
       "funding": [
         {
@@ -3680,7 +3679,7 @@
           "type": "tidelift"
         }
       ],
-      "time": "2024-08-27T18:44:43+00:00"
+      "time": "2024-11-12T16:29:46+00:00"
     },
     {
       "name": "composer/semver",
@@ -3917,16 +3916,16 @@
     },
     {
       "name": "friendsofphp/php-cs-fixer",
-      "version": "v3.64.0",
+      "version": "v3.66.2",
       "source": {
         "type": "git",
         "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
-        "reference": "58dd9c931c785a79739310aef5178928305ffa67"
+        "reference": "25addd3cb10e54cfd20b84d9c083c6625cd52218"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/58dd9c931c785a79739310aef5178928305ffa67",
-        "reference": "58dd9c931c785a79739310aef5178928305ffa67",
+        "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/25addd3cb10e54cfd20b84d9c083c6625cd52218",
+        "reference": "25addd3cb10e54cfd20b84d9c083c6625cd52218",
         "shasum": ""
       },
       "require": {
@@ -3936,38 +3935,38 @@
         "ext-filter": "*",
         "ext-json": "*",
         "ext-tokenizer": "*",
-        "fidry/cpu-core-counter": "^1.0",
+        "fidry/cpu-core-counter": "^1.2",
         "php": "^7.4 || ^8.0",
         "react/child-process": "^0.6.5",
         "react/event-loop": "^1.0",
         "react/promise": "^2.0 || ^3.0",
         "react/socket": "^1.0",
         "react/stream": "^1.0",
-        "sebastian/diff": "^4.0 || ^5.0 || ^6.0",
-        "symfony/console": "^5.4 || ^6.0 || ^7.0",
-        "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0",
-        "symfony/filesystem": "^5.4 || ^6.0 || ^7.0",
-        "symfony/finder": "^5.4 || ^6.0 || ^7.0",
-        "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0",
-        "symfony/polyfill-mbstring": "^1.28",
-        "symfony/polyfill-php80": "^1.28",
-        "symfony/polyfill-php81": "^1.28",
-        "symfony/process": "^5.4 || ^6.0 || ^7.0",
-        "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0"
+        "sebastian/diff": "^4.0 || ^5.1 || ^6.0",
+        "symfony/console": "^5.4 || ^6.4 || ^7.0",
+        "symfony/event-dispatcher": "^5.4 || ^6.4 || ^7.0",
+        "symfony/filesystem": "^5.4 || ^6.4 || ^7.0",
+        "symfony/finder": "^5.4 || ^6.4 || ^7.0",
+        "symfony/options-resolver": "^5.4 || ^6.4 || ^7.0",
+        "symfony/polyfill-mbstring": "^1.31",
+        "symfony/polyfill-php80": "^1.31",
+        "symfony/polyfill-php81": "^1.31",
+        "symfony/process": "^5.4 || ^6.4 || ^7.2",
+        "symfony/stopwatch": "^5.4 || ^6.4 || ^7.0"
       },
       "require-dev": {
-        "facile-it/paraunit": "^1.3 || ^2.3",
-        "infection/infection": "^0.29.5",
-        "justinrainbow/json-schema": "^5.2",
+        "facile-it/paraunit": "^1.3.1 || ^2.4",
+        "infection/infection": "^0.29.8",
+        "justinrainbow/json-schema": "^5.3 || ^6.0",
         "keradus/cli-executor": "^2.1",
-        "mikey179/vfsstream": "^1.6.11",
+        "mikey179/vfsstream": "^1.6.12",
         "php-coveralls/php-coveralls": "^2.7",
         "php-cs-fixer/accessible-object": "^1.1",
         "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.5",
         "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.5",
-        "phpunit/phpunit": "^9.6.19 || ^10.5.21 || ^11.2",
-        "symfony/var-dumper": "^5.4 || ^6.0 || ^7.0",
-        "symfony/yaml": "^5.4 || ^6.0 || ^7.0"
+        "phpunit/phpunit": "^9.6.22 || ^10.5.40 || ^11.5.2",
+        "symfony/var-dumper": "^5.4.48 || ^6.4.15 || ^7.2.0",
+        "symfony/yaml": "^5.4.45 || ^6.4.13 || ^7.2.0"
       },
       "suggest": {
         "ext-dom": "For handling output formats in XML",
@@ -4002,7 +4001,7 @@
       ],
       "support": {
         "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
-        "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.64.0"
+        "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.66.2"
       },
       "funding": [
         {
@@ -4010,7 +4009,7 @@
           "type": "github"
         }
       ],
-      "time": "2024-08-30T23:09:38+00:00"
+      "time": "2025-01-07T09:21:51+00:00"
     },
     {
       "name": "mikey179/vfsstream",
@@ -4064,16 +4063,16 @@
     },
     {
       "name": "myclabs/deep-copy",
-      "version": "1.12.0",
+      "version": "1.12.1",
       "source": {
         "type": "git",
         "url": "https://github.com/myclabs/DeepCopy.git",
-        "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c"
+        "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c",
-        "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c",
+        "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845",
+        "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845",
         "shasum": ""
       },
       "require": {
@@ -4102,7 +4101,7 @@
       "keywords": ["clone", "copy", "duplicate", "object", "object graph"],
       "support": {
         "issues": "https://github.com/myclabs/DeepCopy/issues",
-        "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0"
+        "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1"
       },
       "funding": [
         {
@@ -4110,20 +4109,20 @@
           "type": "tidelift"
         }
       ],
-      "time": "2024-06-12T14:39:25+00:00"
+      "time": "2024-11-08T17:47:46+00:00"
     },
     {
       "name": "nikic/php-parser",
-      "version": "v5.3.1",
+      "version": "v5.4.0",
       "source": {
         "type": "git",
         "url": "https://github.com/nikic/PHP-Parser.git",
-        "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b"
+        "reference": "447a020a1f875a434d62f2a401f53b82a396e494"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b",
-        "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b",
+        "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494",
+        "reference": "447a020a1f875a434d62f2a401f53b82a396e494",
         "shasum": ""
       },
       "require": {
@@ -4159,9 +4158,9 @@
       "keywords": ["parser", "php"],
       "support": {
         "issues": "https://github.com/nikic/PHP-Parser/issues",
-        "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1"
+        "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0"
       },
-      "time": "2024-10-08T18:51:32+00:00"
+      "time": "2024-12-30T11:07:19+00:00"
     },
     {
       "name": "phar-io/manifest",
@@ -4318,20 +4317,20 @@
     },
     {
       "name": "phpstan/phpstan",
-      "version": "1.12.7",
+      "version": "2.1.1",
       "source": {
         "type": "git",
         "url": "https://github.com/phpstan/phpstan.git",
-        "reference": "dc2b9976bd8b0f84ec9b0e50cc35378551de7af0"
+        "reference": "cd6e973e04b4c2b94c86e8612b5a65f0da0e08e7"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/phpstan/phpstan/zipball/dc2b9976bd8b0f84ec9b0e50cc35378551de7af0",
-        "reference": "dc2b9976bd8b0f84ec9b0e50cc35378551de7af0",
+        "url": "https://api.github.com/repos/phpstan/phpstan/zipball/cd6e973e04b4c2b94c86e8612b5a65f0da0e08e7",
+        "reference": "cd6e973e04b4c2b94c86e8612b5a65f0da0e08e7",
         "shasum": ""
       },
       "require": {
-        "php": "^7.2|^8.0"
+        "php": "^7.4|^8.0"
       },
       "conflict": {
         "phpstan/phpstan-shim": "*"
@@ -4362,7 +4361,7 @@
           "type": "github"
         }
       ],
-      "time": "2024-10-18T11:12:07+00:00"
+      "time": "2025-01-05T16:43:48+00:00"
     },
     {
       "name": "phpunit/php-code-coverage",
@@ -4654,16 +4653,16 @@
     },
     {
       "name": "phpunit/phpunit",
-      "version": "10.5.38",
+      "version": "10.5.40",
       "source": {
         "type": "git",
         "url": "https://github.com/sebastianbergmann/phpunit.git",
-        "reference": "a86773b9e887a67bc53efa9da9ad6e3f2498c132"
+        "reference": "e6ddda95af52f69c1e0c7b4f977cccb58048798c"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a86773b9e887a67bc53efa9da9ad6e3f2498c132",
-        "reference": "a86773b9e887a67bc53efa9da9ad6e3f2498c132",
+        "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e6ddda95af52f69c1e0c7b4f977cccb58048798c",
+        "reference": "e6ddda95af52f69c1e0c7b4f977cccb58048798c",
         "shasum": ""
       },
       "require": {
@@ -4673,7 +4672,7 @@
         "ext-mbstring": "*",
         "ext-xml": "*",
         "ext-xmlwriter": "*",
-        "myclabs/deep-copy": "^1.12.0",
+        "myclabs/deep-copy": "^1.12.1",
         "phar-io/manifest": "^2.0.4",
         "phar-io/version": "^3.2.1",
         "php": ">=8.1",
@@ -4723,7 +4722,7 @@
       "support": {
         "issues": "https://github.com/sebastianbergmann/phpunit/issues",
         "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
-        "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.38"
+        "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.40"
       },
       "funding": [
         {
@@ -4739,7 +4738,7 @@
           "type": "tidelift"
         }
       ],
-      "time": "2024-10-28T13:06:21+00:00"
+      "time": "2024-12-21T05:49:06+00:00"
     },
     {
       "name": "psr/container",
@@ -4859,33 +4858,33 @@
     },
     {
       "name": "react/child-process",
-      "version": "v0.6.5",
+      "version": "v0.6.6",
       "source": {
         "type": "git",
         "url": "https://github.com/reactphp/child-process.git",
-        "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43"
+        "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/reactphp/child-process/zipball/e71eb1aa55f057c7a4a0d08d06b0b0a484bead43",
-        "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43",
+        "url": "https://api.github.com/repos/reactphp/child-process/zipball/1721e2b93d89b745664353b9cfc8f155ba8a6159",
+        "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159",
         "shasum": ""
       },
       "require": {
         "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
         "php": ">=5.3.0",
         "react/event-loop": "^1.2",
-        "react/stream": "^1.2"
+        "react/stream": "^1.4"
       },
       "require-dev": {
-        "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35",
-        "react/socket": "^1.8",
+        "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
+        "react/socket": "^1.16",
         "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0"
       },
       "type": "library",
       "autoload": {
         "psr-4": {
-          "React\\ChildProcess\\": "src"
+          "React\\ChildProcess\\": "src/"
         }
       },
       "notification-url": "https://packagist.org/downloads/",
@@ -4916,19 +4915,15 @@
       "keywords": ["event-driven", "process", "reactphp"],
       "support": {
         "issues": "https://github.com/reactphp/child-process/issues",
-        "source": "https://github.com/reactphp/child-process/tree/v0.6.5"
+        "source": "https://github.com/reactphp/child-process/tree/v0.6.6"
       },
       "funding": [
         {
-          "url": "https://github.com/WyriHaximus",
-          "type": "github"
-        },
-        {
-          "url": "https://github.com/clue",
-          "type": "github"
+          "url": "https://opencollective.com/reactphp",
+          "type": "open_collective"
         }
       ],
-      "time": "2022-09-16T13:41:56+00:00"
+      "time": "2025-01-01T16:37:48+00:00"
     },
     {
       "name": "react/dns",
@@ -5282,21 +5277,21 @@
     },
     {
       "name": "rector/rector",
-      "version": "1.2.9",
+      "version": "2.0.6",
       "source": {
         "type": "git",
         "url": "https://github.com/rectorphp/rector.git",
-        "reference": "7923bd5e48f8c26a922df91f7174f5bca2b3671d"
+        "reference": "fa0cb009dc3df084bf549032ae4080a0481a2036"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/rectorphp/rector/zipball/7923bd5e48f8c26a922df91f7174f5bca2b3671d",
-        "reference": "7923bd5e48f8c26a922df91f7174f5bca2b3671d",
+        "url": "https://api.github.com/repos/rectorphp/rector/zipball/fa0cb009dc3df084bf549032ae4080a0481a2036",
+        "reference": "fa0cb009dc3df084bf549032ae4080a0481a2036",
         "shasum": ""
       },
       "require": {
-        "php": "^7.2|^8.0",
-        "phpstan/phpstan": "^1.12.5"
+        "php": "^7.4|^8.0",
+        "phpstan/phpstan": "^2.1.1"
       },
       "conflict": {
         "rector/rector-doctrine": "*",
@@ -5318,7 +5313,7 @@
       "keywords": ["automation", "dev", "migration", "refactoring"],
       "support": {
         "issues": "https://github.com/rectorphp/rector/issues",
-        "source": "https://github.com/rectorphp/rector/tree/1.2.9"
+        "source": "https://github.com/rectorphp/rector/tree/2.0.6"
       },
       "funding": [
         {
@@ -5326,7 +5321,7 @@
           "type": "github"
         }
       ],
-      "time": "2024-11-04T18:26:57+00:00"
+      "time": "2025-01-06T10:38:36+00:00"
     },
     {
       "name": "sebastian/cli-parser",
@@ -6219,16 +6214,16 @@
     },
     {
       "name": "sebastianfeldmann/cli",
-      "version": "3.4.1",
+      "version": "3.4.2",
       "source": {
         "type": "git",
         "url": "https://github.com/sebastianfeldmann/cli.git",
-        "reference": "8a932e99e9455981fb32fa6c085492462fe8f8cf"
+        "reference": "6fa122afd528dae7d7ec988a604aa6c600f5d9b5"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/sebastianfeldmann/cli/zipball/8a932e99e9455981fb32fa6c085492462fe8f8cf",
-        "reference": "8a932e99e9455981fb32fa6c085492462fe8f8cf",
+        "url": "https://api.github.com/repos/sebastianfeldmann/cli/zipball/6fa122afd528dae7d7ec988a604aa6c600f5d9b5",
+        "reference": "6fa122afd528dae7d7ec988a604aa6c600f5d9b5",
         "shasum": ""
       },
       "require": {
@@ -6261,7 +6256,7 @@
       "keywords": ["cli"],
       "support": {
         "issues": "https://github.com/sebastianfeldmann/cli/issues",
-        "source": "https://github.com/sebastianfeldmann/cli/tree/3.4.1"
+        "source": "https://github.com/sebastianfeldmann/cli/tree/3.4.2"
       },
       "funding": [
         {
@@ -6269,20 +6264,20 @@
           "type": "github"
         }
       ],
-      "time": "2021-12-20T14:59:49+00:00"
+      "time": "2024-11-26T10:19:01+00:00"
     },
     {
       "name": "sebastianfeldmann/git",
-      "version": "3.11.0",
+      "version": "3.11.1",
       "source": {
         "type": "git",
         "url": "https://github.com/sebastianfeldmann/git.git",
-        "reference": "5cb1ea94f65c7420419abe8f12c45cc7eb094790"
+        "reference": "96b9f384d45106f757df98a74c11b42b393ff18f"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/sebastianfeldmann/git/zipball/5cb1ea94f65c7420419abe8f12c45cc7eb094790",
-        "reference": "5cb1ea94f65c7420419abe8f12c45cc7eb094790",
+        "url": "https://api.github.com/repos/sebastianfeldmann/git/zipball/96b9f384d45106f757df98a74c11b42b393ff18f",
+        "reference": "96b9f384d45106f757df98a74c11b42b393ff18f",
         "shasum": ""
       },
       "require": {
@@ -6319,7 +6314,7 @@
       "keywords": ["git"],
       "support": {
         "issues": "https://github.com/sebastianfeldmann/git/issues",
-        "source": "https://github.com/sebastianfeldmann/git/tree/3.11.0"
+        "source": "https://github.com/sebastianfeldmann/git/tree/3.11.1"
       },
       "funding": [
         {
@@ -6327,20 +6322,20 @@
           "type": "github"
         }
       ],
-      "time": "2024-01-23T09:11:14+00:00"
+      "time": "2024-11-26T18:37:20+00:00"
     },
     {
       "name": "symfony/console",
-      "version": "v7.1.7",
+      "version": "v7.2.1",
       "source": {
         "type": "git",
         "url": "https://github.com/symfony/console.git",
-        "reference": "3284aafcac338b6e86fd955ee4d794cbe434151a"
+        "reference": "fefcc18c0f5d0efe3ab3152f15857298868dc2c3"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/symfony/console/zipball/3284aafcac338b6e86fd955ee4d794cbe434151a",
-        "reference": "3284aafcac338b6e86fd955ee4d794cbe434151a",
+        "url": "https://api.github.com/repos/symfony/console/zipball/fefcc18c0f5d0efe3ab3152f15857298868dc2c3",
+        "reference": "fefcc18c0f5d0efe3ab3152f15857298868dc2c3",
         "shasum": ""
       },
       "require": {
@@ -6395,7 +6390,7 @@
       "homepage": "https://symfony.com",
       "keywords": ["cli", "command-line", "console", "terminal"],
       "support": {
-        "source": "https://github.com/symfony/console/tree/v7.1.7"
+        "source": "https://github.com/symfony/console/tree/v7.2.1"
       },
       "funding": [
         {
@@ -6411,20 +6406,20 @@
           "type": "tidelift"
         }
       ],
-      "time": "2024-11-05T15:34:55+00:00"
+      "time": "2024-12-11T03:49:26+00:00"
     },
     {
       "name": "symfony/event-dispatcher",
-      "version": "v7.1.6",
+      "version": "v7.2.0",
       "source": {
         "type": "git",
         "url": "https://github.com/symfony/event-dispatcher.git",
-        "reference": "87254c78dd50721cfd015b62277a8281c5589702"
+        "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/87254c78dd50721cfd015b62277a8281c5589702",
-        "reference": "87254c78dd50721cfd015b62277a8281c5589702",
+        "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1",
+        "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1",
         "shasum": ""
       },
       "require": {
@@ -6471,7 +6466,7 @@
       "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
       "homepage": "https://symfony.com",
       "support": {
-        "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.6"
+        "source": "https://github.com/symfony/event-dispatcher/tree/v7.2.0"
       },
       "funding": [
         {
@@ -6487,20 +6482,20 @@
           "type": "tidelift"
         }
       ],
-      "time": "2024-09-25T14:20:29+00:00"
+      "time": "2024-09-25T14:21:43+00:00"
     },
     {
       "name": "symfony/event-dispatcher-contracts",
-      "version": "v3.5.0",
+      "version": "v3.5.1",
       "source": {
         "type": "git",
         "url": "https://github.com/symfony/event-dispatcher-contracts.git",
-        "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50"
+        "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50",
-        "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50",
+        "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f",
+        "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f",
         "shasum": ""
       },
       "require": {
@@ -6509,12 +6504,12 @@
       },
       "type": "library",
       "extra": {
+        "thanks": {
+          "url": "https://github.com/symfony/contracts",
+          "name": "symfony/contracts"
+        },
         "branch-alias": {
           "dev-main": "3.5-dev"
-        },
-        "thanks": {
-          "name": "symfony/contracts",
-          "url": "https://github.com/symfony/contracts"
         }
       },
       "autoload": {
@@ -6545,7 +6540,7 @@
         "standards"
       ],
       "support": {
-        "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0"
+        "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1"
       },
       "funding": [
         {
@@ -6561,20 +6556,20 @@
           "type": "tidelift"
         }
       ],
-      "time": "2024-04-18T09:32:20+00:00"
+      "time": "2024-09-25T14:20:29+00:00"
     },
     {
       "name": "symfony/filesystem",
-      "version": "v7.1.6",
+      "version": "v7.2.0",
       "source": {
         "type": "git",
         "url": "https://github.com/symfony/filesystem.git",
-        "reference": "c835867b3c62bb05c7fe3d637c871c7ae52024d4"
+        "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/symfony/filesystem/zipball/c835867b3c62bb05c7fe3d637c871c7ae52024d4",
-        "reference": "c835867b3c62bb05c7fe3d637c871c7ae52024d4",
+        "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb",
+        "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb",
         "shasum": ""
       },
       "require": {
@@ -6607,7 +6602,7 @@
       "description": "Provides basic utilities for the filesystem",
       "homepage": "https://symfony.com",
       "support": {
-        "source": "https://github.com/symfony/filesystem/tree/v7.1.6"
+        "source": "https://github.com/symfony/filesystem/tree/v7.2.0"
       },
       "funding": [
         {
@@ -6623,20 +6618,20 @@
           "type": "tidelift"
         }
       ],
-      "time": "2024-10-25T15:11:02+00:00"
+      "time": "2024-10-25T15:15:23+00:00"
     },
     {
       "name": "symfony/finder",
-      "version": "v7.1.6",
+      "version": "v7.2.2",
       "source": {
         "type": "git",
         "url": "https://github.com/symfony/finder.git",
-        "reference": "2cb89664897be33f78c65d3d2845954c8d7a43b8"
+        "reference": "87a71856f2f56e4100373e92529eed3171695cfb"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/symfony/finder/zipball/2cb89664897be33f78c65d3d2845954c8d7a43b8",
-        "reference": "2cb89664897be33f78c65d3d2845954c8d7a43b8",
+        "url": "https://api.github.com/repos/symfony/finder/zipball/87a71856f2f56e4100373e92529eed3171695cfb",
+        "reference": "87a71856f2f56e4100373e92529eed3171695cfb",
         "shasum": ""
       },
       "require": {
@@ -6667,7 +6662,7 @@
       "description": "Finds files and directories via an intuitive fluent interface",
       "homepage": "https://symfony.com",
       "support": {
-        "source": "https://github.com/symfony/finder/tree/v7.1.6"
+        "source": "https://github.com/symfony/finder/tree/v7.2.2"
       },
       "funding": [
         {
@@ -6683,20 +6678,20 @@
           "type": "tidelift"
         }
       ],
-      "time": "2024-10-01T08:31:23+00:00"
+      "time": "2024-12-30T19:00:17+00:00"
     },
     {
       "name": "symfony/options-resolver",
-      "version": "v7.1.6",
+      "version": "v7.2.0",
       "source": {
         "type": "git",
         "url": "https://github.com/symfony/options-resolver.git",
-        "reference": "85e95eeede2d41cd146146e98c9c81d9214cae85"
+        "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/symfony/options-resolver/zipball/85e95eeede2d41cd146146e98c9c81d9214cae85",
-        "reference": "85e95eeede2d41cd146146e98c9c81d9214cae85",
+        "url": "https://api.github.com/repos/symfony/options-resolver/zipball/7da8fbac9dcfef75ffc212235d76b2754ce0cf50",
+        "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50",
         "shasum": ""
       },
       "require": {
@@ -6726,7 +6721,7 @@
       "homepage": "https://symfony.com",
       "keywords": ["config", "configuration", "options"],
       "support": {
-        "source": "https://github.com/symfony/options-resolver/tree/v7.1.6"
+        "source": "https://github.com/symfony/options-resolver/tree/v7.2.0"
       },
       "funding": [
         {
@@ -6742,7 +6737,7 @@
           "type": "tidelift"
         }
       ],
-      "time": "2024-09-25T14:20:29+00:00"
+      "time": "2024-11-20T11:17:29+00:00"
     },
     {
       "name": "symfony/polyfill-intl-grapheme",
@@ -6767,8 +6762,8 @@
       "type": "library",
       "extra": {
         "thanks": {
-          "name": "symfony/polyfill",
-          "url": "https://github.com/symfony/polyfill"
+          "url": "https://github.com/symfony/polyfill",
+          "name": "symfony/polyfill"
         }
       },
       "autoload": {
@@ -6841,8 +6836,8 @@
       "type": "library",
       "extra": {
         "thanks": {
-          "name": "symfony/polyfill",
-          "url": "https://github.com/symfony/polyfill"
+          "url": "https://github.com/symfony/polyfill",
+          "name": "symfony/polyfill"
         }
       },
       "autoload": {
@@ -6913,8 +6908,8 @@
       "type": "library",
       "extra": {
         "thanks": {
-          "name": "symfony/polyfill",
-          "url": "https://github.com/symfony/polyfill"
+          "url": "https://github.com/symfony/polyfill",
+          "name": "symfony/polyfill"
         }
       },
       "autoload": {
@@ -6960,16 +6955,16 @@
     },
     {
       "name": "symfony/process",
-      "version": "v7.1.7",
+      "version": "v7.2.0",
       "source": {
         "type": "git",
         "url": "https://github.com/symfony/process.git",
-        "reference": "9b8a40b7289767aa7117e957573c2a535efe6585"
+        "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/symfony/process/zipball/9b8a40b7289767aa7117e957573c2a535efe6585",
-        "reference": "9b8a40b7289767aa7117e957573c2a535efe6585",
+        "url": "https://api.github.com/repos/symfony/process/zipball/d34b22ba9390ec19d2dd966c40aa9e8462f27a7e",
+        "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e",
         "shasum": ""
       },
       "require": {
@@ -6997,7 +6992,7 @@
       "description": "Executes commands in sub-processes",
       "homepage": "https://symfony.com",
       "support": {
-        "source": "https://github.com/symfony/process/tree/v7.1.7"
+        "source": "https://github.com/symfony/process/tree/v7.2.0"
       },
       "funding": [
         {
@@ -7013,20 +7008,20 @@
           "type": "tidelift"
         }
       ],
-      "time": "2024-11-06T09:25:12+00:00"
+      "time": "2024-11-06T14:24:19+00:00"
     },
     {
       "name": "symfony/service-contracts",
-      "version": "v3.5.0",
+      "version": "v3.5.1",
       "source": {
         "type": "git",
         "url": "https://github.com/symfony/service-contracts.git",
-        "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f"
+        "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f",
-        "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f",
+        "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0",
+        "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0",
         "shasum": ""
       },
       "require": {
@@ -7039,12 +7034,12 @@
       },
       "type": "library",
       "extra": {
+        "thanks": {
+          "url": "https://github.com/symfony/contracts",
+          "name": "symfony/contracts"
+        },
         "branch-alias": {
           "dev-main": "3.5-dev"
-        },
-        "thanks": {
-          "name": "symfony/contracts",
-          "url": "https://github.com/symfony/contracts"
         }
       },
       "autoload": {
@@ -7076,7 +7071,7 @@
         "standards"
       ],
       "support": {
-        "source": "https://github.com/symfony/service-contracts/tree/v3.5.0"
+        "source": "https://github.com/symfony/service-contracts/tree/v3.5.1"
       },
       "funding": [
         {
@@ -7092,20 +7087,20 @@
           "type": "tidelift"
         }
       ],
-      "time": "2024-04-18T09:32:20+00:00"
+      "time": "2024-09-25T14:20:29+00:00"
     },
     {
       "name": "symfony/stopwatch",
-      "version": "v7.1.6",
+      "version": "v7.2.2",
       "source": {
         "type": "git",
         "url": "https://github.com/symfony/stopwatch.git",
-        "reference": "8b4a434e6e7faf6adedffb48783a5c75409a1a05"
+        "reference": "e46690d5b9d7164a6d061cab1e8d46141b9f49df"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/symfony/stopwatch/zipball/8b4a434e6e7faf6adedffb48783a5c75409a1a05",
-        "reference": "8b4a434e6e7faf6adedffb48783a5c75409a1a05",
+        "url": "https://api.github.com/repos/symfony/stopwatch/zipball/e46690d5b9d7164a6d061cab1e8d46141b9f49df",
+        "reference": "e46690d5b9d7164a6d061cab1e8d46141b9f49df",
         "shasum": ""
       },
       "require": {
@@ -7134,7 +7129,7 @@
       "description": "Provides a way to profile code",
       "homepage": "https://symfony.com",
       "support": {
-        "source": "https://github.com/symfony/stopwatch/tree/v7.1.6"
+        "source": "https://github.com/symfony/stopwatch/tree/v7.2.2"
       },
       "funding": [
         {
@@ -7150,20 +7145,20 @@
           "type": "tidelift"
         }
       ],
-      "time": "2024-09-25T14:20:29+00:00"
+      "time": "2024-12-18T14:28:33+00:00"
     },
     {
       "name": "symfony/string",
-      "version": "v7.1.6",
+      "version": "v7.2.0",
       "source": {
         "type": "git",
         "url": "https://github.com/symfony/string.git",
-        "reference": "61b72d66bf96c360a727ae6232df5ac83c71f626"
+        "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/symfony/string/zipball/61b72d66bf96c360a727ae6232df5ac83c71f626",
-        "reference": "61b72d66bf96c360a727ae6232df5ac83c71f626",
+        "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82",
+        "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82",
         "shasum": ""
       },
       "require": {
@@ -7208,7 +7203,7 @@
       "homepage": "https://symfony.com",
       "keywords": ["grapheme", "i18n", "string", "unicode", "utf-8", "utf8"],
       "support": {
-        "source": "https://github.com/symfony/string/tree/v7.1.6"
+        "source": "https://github.com/symfony/string/tree/v7.2.0"
       },
       "funding": [
         {
@@ -7224,7 +7219,7 @@
           "type": "tidelift"
         }
       ],
-      "time": "2024-09-25T14:20:29+00:00"
+      "time": "2024-11-13T13:31:26+00:00"
     },
     {
       "name": "symplify/coding-standard",
@@ -7285,16 +7280,16 @@
     },
     {
       "name": "symplify/easy-coding-standard",
-      "version": "12.3.6",
+      "version": "12.5.5",
       "source": {
         "type": "git",
         "url": "https://github.com/easy-coding-standard/easy-coding-standard.git",
-        "reference": "c0f378782d06dfd21c66c3024e9d28f4e737645e"
+        "reference": "16a6ac7f452e230fdcc81f1b35b2366903fcecf3"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/c0f378782d06dfd21c66c3024e9d28f4e737645e",
-        "reference": "c0f378782d06dfd21c66c3024e9d28f4e737645e",
+        "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/16a6ac7f452e230fdcc81f1b35b2366903fcecf3",
+        "reference": "16a6ac7f452e230fdcc81f1b35b2366903fcecf3",
         "shasum": ""
       },
       "require": {
@@ -7319,7 +7314,7 @@
       "keywords": ["Code style", "automation", "fixer", "static analysis"],
       "support": {
         "issues": "https://github.com/easy-coding-standard/easy-coding-standard/issues",
-        "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.3.6"
+        "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.5.5"
       },
       "funding": [
         {
@@ -7331,7 +7326,7 @@
           "type": "github"
         }
       ],
-      "time": "2024-10-06T08:27:28+00:00"
+      "time": "2025-01-02T08:43:03+00:00"
     },
     {
       "name": "symplify/rule-doc-generator-contracts",
diff --git a/eslint.config.js b/eslint.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..c9d330e68bb377c3988eb3bbf308496bfa70cd42
--- /dev/null
+++ b/eslint.config.js
@@ -0,0 +1,23 @@
+import globals from "globals";
+import eslint from "@eslint/js";
+import tseslint from "typescript-eslint";
+import eslintPluginPrettierRecommended from "eslint-plugin-prettier/recommended";
+
+export default [
+  ...tseslint.config(
+    eslint.configs.recommended,
+    ...tseslint.configs.strict,
+    eslintPluginPrettierRecommended
+  ),
+  {
+    ignores: ["public/*", "docs/*", "vendor/*", "castopod/*"],
+  },
+  {
+    languageOptions: {
+      globals: {
+        ...globals.browser,
+        ...globals.node,
+      },
+    },
+  },
+];
diff --git a/modules/Admin/Config/Routes.php b/modules/Admin/Config/Routes.php
index 42bd42818b377376010fe3d22a6f6699b8400d65..55b3645f0dc1d733e66921926b523f1d39af2c9c 100644
--- a/modules/Admin/Config/Routes.php
+++ b/modules/Admin/Config/Routes.php
@@ -16,7 +16,7 @@ $routes->add('scheduled-video-clips', 'SchedulerController::generateVideoClips',
 // Admin area routes
 $routes->group(
     config('Admin')
-->gateway,
+        ->gateway,
     [
         'namespace' => 'Modules\Admin\Controllers',
     ],
diff --git a/modules/Admin/Controllers/AboutController.php b/modules/Admin/Controllers/AboutController.php
index 4b69352c6f8b77aa51aa8d28b378ba13fe392217..a11ffc8958238de00b8861da9bcfc61b539ce36c 100644
--- a/modules/Admin/Controllers/AboutController.php
+++ b/modules/Admin/Controllers/AboutController.php
@@ -11,7 +11,6 @@ declare(strict_types=1);
 namespace Modules\Admin\Controllers;
 
 use CodeIgniter\HTTP\RedirectResponse;
-use Config\Services;
 
 class AboutController extends BaseController
 {
@@ -42,7 +41,7 @@ class AboutController extends BaseController
 
     public function migrateDatabase(): RedirectResponse
     {
-        $migrate = Services::migrations();
+        $migrate = service('migrations');
 
         $migrate->setNamespace(null)
             ->latest();
diff --git a/modules/Analytics/AnalyticsTrait.php b/modules/Analytics/AnalyticsTrait.php
index 53aa13ef88ee59b7c8c6664d8082e1cc27f4d445..3b2b32bc51730af358ea391a3ba6047ebf07843d 100644
--- a/modules/Analytics/AnalyticsTrait.php
+++ b/modules/Analytics/AnalyticsTrait.php
@@ -10,8 +10,6 @@ declare(strict_types=1);
 
 namespace Modules\Analytics;
 
-use Config\Services;
-
 trait AnalyticsTrait
 {
     protected function registerPodcastWebpageHit(int $podcastId): void
@@ -23,7 +21,7 @@ trait AnalyticsTrait
         set_user_session_referer();
         set_user_session_entry_page();
 
-        $session = Services::session();
+        $session = service('session');
 
         if (! $session->get('denyListIp')) {
             $db = db_connect();
diff --git a/modules/Analytics/Config/Routes.php b/modules/Analytics/Config/Routes.php
index d24e716fddebf3a4f86c78a1661115b45fd361e5..9097151ce8ed64e417c69ad84d2e673957304d6e 100644
--- a/modules/Analytics/Config/Routes.php
+++ b/modules/Analytics/Config/Routes.php
@@ -2,15 +2,13 @@
 
 declare(strict_types=1);
 
-use CodeIgniter\Router\RouteCollection;
-
 /**
  * @copyright  2021 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
  * @link       https://castopod.org/
  */
 
-/** @var RouteCollection $routes */
+/** @var \CodeIgniter\Router\RouteCollection $routes */
 
 /**
  * Analytics routes file
diff --git a/modules/Analytics/Entities/AnalyticsPodcasts.php b/modules/Analytics/Entities/AnalyticsPodcasts.php
index 3ff2b58ec79a86c70ef7cea6e8ece3a5092b3081..45d4b62476839b4801a61a136f056a1cb7172857 100644
--- a/modules/Analytics/Entities/AnalyticsPodcasts.php
+++ b/modules/Analytics/Entities/AnalyticsPodcasts.php
@@ -13,6 +13,7 @@ declare(strict_types=1);
 namespace Modules\Analytics\Entities;
 
 use CodeIgniter\Entity\Entity;
+use CodeIgniter\I18n\Time;
 
 /**
  * @property int $podcast_id
diff --git a/modules/Analytics/Entities/AnalyticsPodcastsByCountry.php b/modules/Analytics/Entities/AnalyticsPodcastsByCountry.php
index d9dd478ad6e8883a3b5e4577076bc9f843bea474..59ca02eb71d4d924fafab63bd837df05bc46dc74 100644
--- a/modules/Analytics/Entities/AnalyticsPodcastsByCountry.php
+++ b/modules/Analytics/Entities/AnalyticsPodcastsByCountry.php
@@ -13,6 +13,7 @@ declare(strict_types=1);
 namespace Modules\Analytics\Entities;
 
 use CodeIgniter\Entity\Entity;
+use CodeIgniter\I18n\Time;
 
 /**
  * @property int $podcast_id
diff --git a/modules/Analytics/Entities/AnalyticsPodcastsByEpisode.php b/modules/Analytics/Entities/AnalyticsPodcastsByEpisode.php
index 354d98ec53901b540ca95ea1912cefb83ab2cf22..1aa5959ae27fba7352f362c5c8f96e316a01753f 100644
--- a/modules/Analytics/Entities/AnalyticsPodcastsByEpisode.php
+++ b/modules/Analytics/Entities/AnalyticsPodcastsByEpisode.php
@@ -13,6 +13,7 @@ declare(strict_types=1);
 namespace Modules\Analytics\Entities;
 
 use CodeIgniter\Entity\Entity;
+use CodeIgniter\I18n\Time;
 
 /**
  * @property int $podcast_id
diff --git a/modules/Analytics/Entities/AnalyticsPodcastsByHour.php b/modules/Analytics/Entities/AnalyticsPodcastsByHour.php
index e74ef64af337e3a07c40653120e01b2912c4830b..bfc33b044028ae03467f0cac5f6877b78538b379 100644
--- a/modules/Analytics/Entities/AnalyticsPodcastsByHour.php
+++ b/modules/Analytics/Entities/AnalyticsPodcastsByHour.php
@@ -13,6 +13,7 @@ declare(strict_types=1);
 namespace Modules\Analytics\Entities;
 
 use CodeIgniter\Entity\Entity;
+use CodeIgniter\I18n\Time;
 
 /**
  * @property int $podcast_id
diff --git a/modules/Analytics/Entities/AnalyticsPodcastsByPlayer.php b/modules/Analytics/Entities/AnalyticsPodcastsByPlayer.php
index 6f2b50441127c4fad36f0111960359a0d4a368fb..8fb0acf7e0c7ecaffdc35057e65b9cce8dbad7c2 100644
--- a/modules/Analytics/Entities/AnalyticsPodcastsByPlayer.php
+++ b/modules/Analytics/Entities/AnalyticsPodcastsByPlayer.php
@@ -13,6 +13,7 @@ declare(strict_types=1);
 namespace Modules\Analytics\Entities;
 
 use CodeIgniter\Entity\Entity;
+use CodeIgniter\I18n\Time;
 
 /**
  * @property int $podcast_id
diff --git a/modules/Analytics/Entities/AnalyticsPodcastsByRegion.php b/modules/Analytics/Entities/AnalyticsPodcastsByRegion.php
index 777c41486730c005e1a6d1238dbfe6a377b84abb..684667f3f5607849d98f4514c6d449406f1df132 100644
--- a/modules/Analytics/Entities/AnalyticsPodcastsByRegion.php
+++ b/modules/Analytics/Entities/AnalyticsPodcastsByRegion.php
@@ -13,6 +13,7 @@ declare(strict_types=1);
 namespace Modules\Analytics\Entities;
 
 use CodeIgniter\Entity\Entity;
+use CodeIgniter\I18n\Time;
 
 /**
  * @property int $podcast_id
diff --git a/modules/Analytics/Entities/AnalyticsPodcastsByService.php b/modules/Analytics/Entities/AnalyticsPodcastsByService.php
index f86d6db60f05fe12da818c863cd0c5be7c0acdb3..fb8a03666752e527e690b2891d216cf0978db65b 100644
--- a/modules/Analytics/Entities/AnalyticsPodcastsByService.php
+++ b/modules/Analytics/Entities/AnalyticsPodcastsByService.php
@@ -13,6 +13,7 @@ declare(strict_types=1);
 namespace Modules\Analytics\Entities;
 
 use CodeIgniter\Entity\Entity;
+use CodeIgniter\I18n\Time;
 use Opawg\UserAgentsV2Php\UserAgentsRSS;
 
 /**
diff --git a/modules/Analytics/Entities/AnalyticsPodcastsBySubscription.php b/modules/Analytics/Entities/AnalyticsPodcastsBySubscription.php
index f048fea0015674cdf328b45302f5793ec24aa7bf..09974b76936ddc446b60fd89ba86329b4b74511e 100644
--- a/modules/Analytics/Entities/AnalyticsPodcastsBySubscription.php
+++ b/modules/Analytics/Entities/AnalyticsPodcastsBySubscription.php
@@ -11,6 +11,7 @@ declare(strict_types=1);
 namespace Modules\Analytics\Entities;
 
 use CodeIgniter\Entity\Entity;
+use CodeIgniter\I18n\Time;
 
 /**
  * @property int $podcast_id
diff --git a/modules/Analytics/Entities/AnalyticsUnknownUserAgent.php b/modules/Analytics/Entities/AnalyticsUnknownUserAgent.php
index 1c897d7ca6aef3a661c6d5f7d76e6a2df13d6944..016a3d0a57362a3f72b6c5602bc87e15b332badb 100644
--- a/modules/Analytics/Entities/AnalyticsUnknownUserAgent.php
+++ b/modules/Analytics/Entities/AnalyticsUnknownUserAgent.php
@@ -13,6 +13,7 @@ declare(strict_types=1);
 namespace Modules\Analytics\Entities;
 
 use CodeIgniter\Entity\Entity;
+use CodeIgniter\I18n\Time;
 
 /**
  * @property int $id
diff --git a/modules/Analytics/Entities/AnalyticsWebsiteByBrowser.php b/modules/Analytics/Entities/AnalyticsWebsiteByBrowser.php
index 80c568c8b248be0d4d8c2a53d5917615b3506e60..9d764f7e96309c6286580931ad314e3c8ff295ad 100644
--- a/modules/Analytics/Entities/AnalyticsWebsiteByBrowser.php
+++ b/modules/Analytics/Entities/AnalyticsWebsiteByBrowser.php
@@ -13,6 +13,7 @@ declare(strict_types=1);
 namespace Modules\Analytics\Entities;
 
 use CodeIgniter\Entity\Entity;
+use CodeIgniter\I18n\Time;
 
 /**
  * @property int $podcast_id
diff --git a/modules/Analytics/Entities/AnalyticsWebsiteByEntryPage.php b/modules/Analytics/Entities/AnalyticsWebsiteByEntryPage.php
index 51d436b6270711a26f5b3c4b0d089197182195bc..7e8294c2201b216e3ec6f6be56357fa89efc6dae 100644
--- a/modules/Analytics/Entities/AnalyticsWebsiteByEntryPage.php
+++ b/modules/Analytics/Entities/AnalyticsWebsiteByEntryPage.php
@@ -13,6 +13,7 @@ declare(strict_types=1);
 namespace Modules\Analytics\Entities;
 
 use CodeIgniter\Entity\Entity;
+use CodeIgniter\I18n\Time;
 
 /**
  * @property int $podcast_id
diff --git a/modules/Analytics/Entities/AnalyticsWebsiteByReferer.php b/modules/Analytics/Entities/AnalyticsWebsiteByReferer.php
index 15819f739a2f2524789eec6c09aeaf36ed7645a6..c0edf9c8512ef8389699069f3cb7028c56fe6e02 100644
--- a/modules/Analytics/Entities/AnalyticsWebsiteByReferer.php
+++ b/modules/Analytics/Entities/AnalyticsWebsiteByReferer.php
@@ -13,6 +13,7 @@ declare(strict_types=1);
 namespace Modules\Analytics\Entities;
 
 use CodeIgniter\Entity\Entity;
+use CodeIgniter\I18n\Time;
 
 /**
  * @property int $podcast_id
diff --git a/modules/Analytics/Helpers/analytics_helper.php b/modules/Analytics/Helpers/analytics_helper.php
index 99a21ed9ca5fabc9334f9c3f40dfd9f9a18765c1..df7181bf3f805de8f62926349697f8b06f8d05f3 100644
--- a/modules/Analytics/Helpers/analytics_helper.php
+++ b/modules/Analytics/Helpers/analytics_helper.php
@@ -9,7 +9,6 @@ declare(strict_types=1);
  */
 
 use AdAures\Ipcat\IpDb;
-use Config\Services;
 use GeoIp2\Database\Reader;
 use Opawg\UserAgentsV2Php\UserAgents;
 use WhichBrowser\Parser;
@@ -55,7 +54,7 @@ if (! function_exists('set_user_session_deny_list_ip')) {
      */
     function set_user_session_deny_list_ip(): void
     {
-        $session = Services::session();
+        $session = service('session');
 
         if (! $session->has('denyListIp')) {
             $session->set('denyListIp', IpDb::find(client_ip()) !== null);
@@ -69,7 +68,7 @@ if (! function_exists('set_user_session_location')) {
      */
     function set_user_session_location(): void
     {
-        $session = Services::session();
+        $session = service('session');
 
         $location = [
             'countryCode' => 'N/A',
@@ -105,7 +104,7 @@ if (! function_exists('set_user_session_player')) {
      */
     function set_user_session_player(): void
     {
-        $session = Services::session();
+        $session = service('session');
 
         if (! $session->has('player')) {
             $playerFound = null;
@@ -148,7 +147,7 @@ if (! function_exists('set_user_session_browser')) {
      */
     function set_user_session_browser(): void
     {
-        $session = Services::session();
+        $session = service('session');
 
         if (! $session->has('browser')) {
             $browserName = '- Other -';
@@ -174,7 +173,7 @@ if (! function_exists('set_user_session_referer')) {
      */
     function set_user_session_referer(): void
     {
-        $session = Services::session();
+        $session = service('session');
 
         $newreferer = service('superglobals')
             ->server('HTTP_REFERER') ?? '- Direct -';
@@ -195,7 +194,7 @@ if (! function_exists('set_user_session_entry_page')) {
      */
     function set_user_session_entry_page(): void
     {
-        $session = Services::session();
+        $session = service('session');
 
         $entryPage = service('superglobals')
             ->server('REQUEST_URI');
@@ -235,7 +234,7 @@ if (! function_exists('podcast_hit')) {
         string $serviceName,
         ?int $subscriptionId,
     ): void {
-        $session = Services::session();
+        $session = service('session');
 
         $clientIp = client_ip();
 
@@ -286,8 +285,7 @@ if (! function_exists('podcast_hit')) {
                         $parts = explode('-', $range);
                         $downloadedBytes += array_key_exists(1, $parts)
                             ? $fileSize
-                            : (int) $parts[1] -
-                                (array_key_exists(0, $parts) ? 0 : (int) $parts[0]);
+                            : (int) $parts[1] - (int) $parts[0];
                     }
                 }
 
diff --git a/modules/Api/Rest/V1/Controllers/EpisodeController.php b/modules/Api/Rest/V1/Controllers/EpisodeController.php
index df47af02c05fd1b5b0c4c58cfa9611d1334a5d34..ec4a9968570e6c7bcef6a60ff02363b9542a0763 100644
--- a/modules/Api/Rest/V1/Controllers/EpisodeController.php
+++ b/modules/Api/Rest/V1/Controllers/EpisodeController.php
@@ -15,7 +15,6 @@ use CodeIgniter\API\ResponseTrait;
 use CodeIgniter\Controller;
 use CodeIgniter\HTTP\ResponseInterface;
 use CodeIgniter\I18n\Time;
-use Modules\Api\Rest\V1\Config\Services;
 use Modules\Auth\Models\UserModel;
 
 class EpisodeController extends Controller
@@ -24,7 +23,7 @@ class EpisodeController extends Controller
 
     public function __construct()
     {
-        Services::restApiExceptions()->initialize();
+        service('restApiExceptions')->initialize();
     }
 
     public function list(): ResponseInterface
@@ -296,7 +295,7 @@ class EpisodeController extends Controller
     protected static function mapEpisode(Episode $episode): Episode
     {
         $episode->cover_url = $episode->getCover()
-->file_url;
+            ->file_url;
         $episode->audio_url = $episode->getAudioUrl();
         $episode->duration = round($episode->audio->duration);
 
diff --git a/modules/Api/Rest/V1/Controllers/PodcastController.php b/modules/Api/Rest/V1/Controllers/PodcastController.php
index 98fa68b8bf98116b4167db48d23806ef7ee01b4a..7e45b2e0b5f9fc5b441019e6669bf52f3788e272 100644
--- a/modules/Api/Rest/V1/Controllers/PodcastController.php
+++ b/modules/Api/Rest/V1/Controllers/PodcastController.php
@@ -9,7 +9,6 @@ use App\Models\PodcastModel;
 use CodeIgniter\API\ResponseTrait;
 use CodeIgniter\Controller;
 use CodeIgniter\HTTP\ResponseInterface;
-use Modules\Api\Rest\V1\Config\Services;
 
 class PodcastController extends Controller
 {
@@ -17,7 +16,7 @@ class PodcastController extends Controller
 
     public function __construct()
     {
-        Services::restApiExceptions()->initialize();
+        service('restApiExceptions')->initialize();
     }
 
     public function list(): ResponseInterface
@@ -44,9 +43,9 @@ class PodcastController extends Controller
     {
         $podcast->feed_url = $podcast->getFeedUrl();
         $podcast->actor_display_name = $podcast->getActor()
-->display_name;
+            ->display_name;
         $podcast->cover_url = $podcast->getCover()
-->file_url;
+            ->file_url;
 
         $categories = [$podcast->getCategory(), ...$podcast->getOtherCategories()];
 
diff --git a/modules/Auth/Commands/RolesDoc.php b/modules/Auth/Commands/RolesDoc.php
index 6e78d9b0494cbf4a73299d99cf117354603293e8..0677722ab424ac0b382aff143d28117edce02ae4 100644
--- a/modules/Auth/Commands/RolesDoc.php
+++ b/modules/Auth/Commands/RolesDoc.php
@@ -8,7 +8,6 @@ use Closure;
 use CodeIgniter\CLI\BaseCommand;
 use CodeIgniter\CLI\CLI;
 use CodeIgniter\View\Table;
-use Config\Services;
 use League\HTMLToMarkdown\Converter\TableConverter;
 use League\HTMLToMarkdown\HtmlConverter;
 use Modules\Auth\Config\AuthGroups;
@@ -57,7 +56,7 @@ class RolesDoc extends BaseCommand
 
         foreach ($files as $file) {
             $locale = $this->detectLocaleFromPath($file);
-            $language = Services::language();
+            $language = service('language');
             $language->setLocale($locale);
 
             $authGroups = new AuthGroups();
diff --git a/modules/Auth/Filters/PermissionFilter.php b/modules/Auth/Filters/PermissionFilter.php
index f223789b403d4e89fb85e73b5ce5e0f35cb73027..02ee304f3fd6de36dd11c28abd34e722204705dc 100644
--- a/modules/Auth/Filters/PermissionFilter.php
+++ b/modules/Auth/Filters/PermissionFilter.php
@@ -9,7 +9,6 @@ use App\Models\PodcastModel;
 use CodeIgniter\Filters\FilterInterface;
 use CodeIgniter\HTTP\RequestInterface;
 use CodeIgniter\HTTP\ResponseInterface;
-use Config\Services;
 use RuntimeException;
 
 /**
@@ -59,7 +58,7 @@ class PermissionFilter implements FilterInterface
         foreach ($arguments as $permission) {
             // is permission specific to a podcast?
             if (str_contains($permission, '#')) {
-                $router = Services::router();
+                $router = service('router');
                 $routerParams = $router->params();
 
                 // get podcast id
diff --git a/modules/Fediverse/ActivityRequest.php b/modules/Fediverse/ActivityRequest.php
index 5334f1dadaea41a5976425519f7bcf4555b11d03..f5b56a2957c608b33195a666ea99c5673d635b38 100644
--- a/modules/Fediverse/ActivityRequest.php
+++ b/modules/Fediverse/ActivityRequest.php
@@ -14,7 +14,6 @@ use CodeIgniter\HTTP\CURLRequest;
 use CodeIgniter\HTTP\ResponseInterface;
 use CodeIgniter\HTTP\URI;
 use CodeIgniter\I18n\Time;
-use Config\Services;
 use Modules\Fediverse\Core\Activity;
 use phpseclib\Crypt\RSA;
 
@@ -33,7 +32,7 @@ class ActivityRequest
 
     public function __construct(string $uri, ?string $activityPayload = null)
     {
-        $this->request = Services::curlrequest();
+        $this->request = service('curlrequest');
 
         if ($activityPayload !== null) {
             $this->request->setBody($activityPayload);
diff --git a/modules/Fediverse/Entities/Activity.php b/modules/Fediverse/Entities/Activity.php
index ba017f16f3cec1be5601e6593ad569f8773746cc..0865ff45c3b37140aff857ed48ec12b61d2c8e43 100644
--- a/modules/Fediverse/Entities/Activity.php
+++ b/modules/Fediverse/Entities/Activity.php
@@ -10,6 +10,7 @@ declare(strict_types=1);
 
 namespace Modules\Fediverse\Entities;
 
+use CodeIgniter\I18n\Time;
 use Michalsn\Uuid\UuidEntity;
 use RuntimeException;
 
diff --git a/modules/Fediverse/Filters/FediverseFilter.php b/modules/Fediverse/Filters/FediverseFilter.php
index 355bfa3a38fefb03aca53491b10d035a0d82d511..44222073828bd07fb4d0102cdcb5aa523aa435f5 100644
--- a/modules/Fediverse/Filters/FediverseFilter.php
+++ b/modules/Fediverse/Filters/FediverseFilter.php
@@ -9,7 +9,6 @@ use CodeIgniter\Filters\FilterInterface;
 use CodeIgniter\HTTP\RequestInterface;
 use CodeIgniter\HTTP\ResponseInterface;
 use CodeIgniter\HTTP\URI;
-use Config\Services;
 use Exception;
 use Modules\Fediverse\HttpSignature;
 
@@ -31,7 +30,7 @@ class FediverseFilter implements FilterInterface
         }
 
         if (in_array('verify-activitystream', $params, true)) {
-            $negotiate = Services::negotiator();
+            $negotiate = service('negotiator');
 
             $allowedContentTypes = [
                 'application/ld+json; profile="https://www.w3.org/ns/activitystreams',
diff --git a/modules/Fediverse/Helpers/fediverse_helper.php b/modules/Fediverse/Helpers/fediverse_helper.php
index 8877afd576197b9e5a52a5f2e743410f9248ff0e..d73bbe14e0ce28f9e23872f6bff6317ed6dfb361 100644
--- a/modules/Fediverse/Helpers/fediverse_helper.php
+++ b/modules/Fediverse/Helpers/fediverse_helper.php
@@ -41,7 +41,7 @@ if (! function_exists('split_handle')) {
     /**
      * Splits handle into its parts (username, host and port)
      *
-     * @return array<string, string>|false
+     * @return array{0:string,username:non-empty-string,1:non-empty-string,domain:non-empty-string,2:non-empty-string,port?:non-falsy-string,3?:non-falsy-string}
      */
     function split_handle(string $handle): array | false
     {
diff --git a/modules/Fediverse/HttpSignature.php b/modules/Fediverse/HttpSignature.php
index d03990383be06fc20aaecbf77d232f98c7ebc196..ac0791e4a409549a303eff68dc457cb31b8ac2e2 100644
--- a/modules/Fediverse/HttpSignature.php
+++ b/modules/Fediverse/HttpSignature.php
@@ -16,7 +16,6 @@ namespace Modules\Fediverse;
 
 use CodeIgniter\HTTP\IncomingRequest;
 use CodeIgniter\I18n\Time;
-use Config\Services;
 use Exception;
 use phpseclib\Crypt\RSA;
 
@@ -40,7 +39,7 @@ class HttpSignature
     public function __construct(IncomingRequest $request = null)
     {
         if (! $request instanceof IncomingRequest) {
-            $request = Services::request();
+            $request = service('request');
         }
 
         $this->request = $request;
diff --git a/modules/Fediverse/WebFinger.php b/modules/Fediverse/WebFinger.php
index c66886ec72fedc0e5616933296cd409971762024..d93a48b99dd3453306309393310bafff56d26ca2 100644
--- a/modules/Fediverse/WebFinger.php
+++ b/modules/Fediverse/WebFinger.php
@@ -101,7 +101,7 @@ class WebFinger
     /**
      * Split resource into its parts (username, domain)
      *
-     * @return array<string, string>|false
+     * @return array{0:string,username:non-empty-string,1:non-empty-string,2:non-empty-string,domain:non-falsy-string,3:non-falsy-string,4:non-falsy-string,5?:non-falsy-string}
      */
     private function splitResource(string $resource): bool|array
     {
diff --git a/modules/Install/Commands/InitDatabase.php b/modules/Install/Commands/InitDatabase.php
index 7f433487ba5499f610b95bfb65c79ff7cb360442..07cb87c807a5431b1384f7febc3db311172fc9b9 100644
--- a/modules/Install/Commands/InitDatabase.php
+++ b/modules/Install/Commands/InitDatabase.php
@@ -6,7 +6,6 @@ namespace Modules\Install\Commands;
 
 use CodeIgniter\CLI\BaseCommand;
 use Config\Database;
-use Config\Services;
 
 class InitDatabase extends BaseCommand
 {
@@ -28,7 +27,7 @@ class InitDatabase extends BaseCommand
     public function run(array $params): void
     {
         // Run all migrations
-        $migrate = Services::migrations();
+        $migrate = service('migrations');
         $migrate->setNamespace(null)
             ->latest();
 
diff --git a/modules/Install/Controllers/InstallController.php b/modules/Install/Controllers/InstallController.php
index 9e7bf06fe31cc8028a564efa5eb6bd0e6df15a2b..89edd6ef7f3e513c5aa4fbbb43078ff385cef2af 100644
--- a/modules/Install/Controllers/InstallController.php
+++ b/modules/Install/Controllers/InstallController.php
@@ -19,7 +19,6 @@ use CodeIgniter\HTTP\ResponseInterface;
 use CodeIgniter\Shield\Entities\User;
 use CodeIgniter\Shield\Exceptions\ValidationException as ShieldValidationException;
 use Config\Database;
-use Config\Services;
 use Dotenv\Dotenv;
 use Dotenv\Exception\ValidationException;
 use Modules\Auth\Models\UserModel;
@@ -245,7 +244,7 @@ class InstallController extends Controller
      */
     public function migrate(): void
     {
-        $migrate = Services::migrations();
+        $migrate = service('migrations');
 
         $migrate->setNamespace(null)
             ->latest();
diff --git a/modules/Media/Entities/BaseMedia.php b/modules/Media/Entities/BaseMedia.php
index f7566ab7fe9d14edc4b8d7e5ff3ccb013b53942a..4bd783a94f144c7e9c92ea3369ed5019fe0cd2c2 100644
--- a/modules/Media/Entities/BaseMedia.php
+++ b/modules/Media/Entities/BaseMedia.php
@@ -24,7 +24,7 @@ use RuntimeException;
  * @property string $file_extension
  * @property int $file_size
  * @property string $file_mimetype
- * @property array|null $file_metadata
+ * @property array<mixed>|null $file_metadata
  * @property 'image'|'audio'|'video'|'document' $type
  * @property string|null $description
  * @property string|null $language_code
diff --git a/modules/Media/Entities/Image.php b/modules/Media/Entities/Image.php
index a5c265d9f9c1379f186235a64db16be189f07e2b..5a56c2a81630efc2afcd194e8c53525fedb09000 100644
--- a/modules/Media/Entities/Image.php
+++ b/modules/Media/Entities/Image.php
@@ -11,11 +11,10 @@ declare(strict_types=1);
 namespace Modules\Media\Entities;
 
 use CodeIgniter\Files\File;
-use Config\Services;
 use GdImage;
 
 /**
- * @property array $sizes
+ * @property array<string, array<string, int|string>> $sizes
  */
 class Image extends BaseMedia
 {
@@ -130,7 +129,7 @@ class Image extends BaseMedia
         }
 
         // save derived sizes
-        $imageService = Services::image();
+        $imageService = service('image');
 
         foreach ($this->sizes as $name => $size) {
             $tempFilePath = tempnam(WRITEPATH . 'temp', 'img_');
diff --git a/modules/Media/FileManagers/FS.php b/modules/Media/FileManagers/FS.php
index dfca7ed03d33562d343a13700a03b8fac1febbe8..2d38f75ec747510c09c9d3217f16f99ee8ebcdec 100644
--- a/modules/Media/FileManagers/FS.php
+++ b/modules/Media/FileManagers/FS.php
@@ -13,7 +13,6 @@ class FS implements FileManagerInterface
     public function __construct(
         protected MediaConfig $config
     ) {
-        $this->config = $config;
     }
 
     /**
diff --git a/modules/Media/Helpers/media_helper.php b/modules/Media/Helpers/media_helper.php
index 6ace28c49b38983eec52a6aa6bd1330a31490f36..85bad2534da82a4e391a9afa91e76e42714e68f8 100644
--- a/modules/Media/Helpers/media_helper.php
+++ b/modules/Media/Helpers/media_helper.php
@@ -34,7 +34,7 @@ if (! function_exists('download_file')) {
         curl_setopt($ch, CURLOPT_HTTPHEADER, ['User-Agent: Castopod/' . CP_VERSION]);
 
         // follow redirects up to 20, like Apple Podcasts
-        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
+        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
         curl_setopt($ch, CURLOPT_MAXREDIRS, 20);
 
         curl_exec($ch);
diff --git a/modules/Platforms/Controllers/PlatformController.php b/modules/Platforms/Controllers/PlatformController.php
index ce4cd42e1620c662ff3275e8af2d3374050940a1..3d6b9939877c15758e82072da6169e186857c3fb 100644
--- a/modules/Platforms/Controllers/PlatformController.php
+++ b/modules/Platforms/Controllers/PlatformController.php
@@ -14,7 +14,6 @@ use App\Entities\Podcast;
 use App\Models\PodcastModel;
 use CodeIgniter\Exceptions\PageNotFoundException;
 use CodeIgniter\HTTP\RedirectResponse;
-use Config\Services;
 use Modules\Admin\Controllers\BaseController;
 use Modules\Platforms\Models\PlatformModel;
 
@@ -65,7 +64,7 @@ class PlatformController extends BaseController
     public function attemptPlatformsUpdate(string $platformType): RedirectResponse
     {
         $platformModel = new PlatformModel();
-        $validation = Services::validation();
+        $validation = service('validation');
 
         $platformsData = [];
         foreach (
diff --git a/modules/Platforms/Models/PlatformModel.php b/modules/Platforms/Models/PlatformModel.php
index 290a90f813e5a88d82ec62cad502f3f9f1c89245..634255c61e81194b148f93fd646deb8eab9681b6 100644
--- a/modules/Platforms/Models/PlatformModel.php
+++ b/modules/Platforms/Models/PlatformModel.php
@@ -127,7 +127,7 @@ class PlatformModel extends Model
     }
 
     /**
-     * @param array<array<string, string|int>> $data
+     * @param array<array<string, bool|int|string|null>> $data
      *
      * @return int|false Number of rows inserted or FALSE on failure
      */
diff --git a/modules/Platforms/Platforms.php b/modules/Platforms/Platforms.php
index d5cd26e232af603e0925c45fa520123b9cad43cf..019f6847fcdce197974bc5f8e4732bb0940746ac 100644
--- a/modules/Platforms/Platforms.php
+++ b/modules/Platforms/Platforms.php
@@ -458,7 +458,7 @@ class Platforms
     }
 
     /**
-     * @return null|array{label:string,home_url:string,submit_url:?string}>
+     * @return null|array{label:string,home_url:string,submit_url:?string}
      */
     public function findPlatformBySlug(string $type, string $slug): ?array
     {
diff --git a/modules/PodcastImport/Commands/PodcastImport.php b/modules/PodcastImport/Commands/PodcastImport.php
index 3a07724c601107cb52f0988988223e6b6f11eadd..001a4b4f77d4e89be67174c89a0d47ad56d97d56 100644
--- a/modules/PodcastImport/Commands/PodcastImport.php
+++ b/modules/PodcastImport/Commands/PodcastImport.php
@@ -16,7 +16,6 @@ use CodeIgniter\CLI\BaseCommand;
 use CodeIgniter\CLI\CLI;
 use CodeIgniter\I18n\Time;
 use CodeIgniter\Shield\Entities\User;
-use Config\Services;
 use Exception;
 use League\HTMLToMarkdown\HtmlConverter;
 use Modules\Auth\Models\UserModel;
@@ -44,7 +43,7 @@ class PodcastImport extends BaseCommand
 
     protected ?Podcast $podcast = null;
 
-    public function init(): void
+    public function init(): bool
     {
         helper('podcast_import');
 
@@ -70,8 +69,8 @@ class PodcastImport extends BaseCommand
         $nextImport = end($queuedImports);
 
         if (! $nextImport instanceof PodcastImportTask) {
-            // no queued import task, stop process.
-            exit(0);
+            // no queued import task, nothing to init
+            return false;
         }
 
         $this->importTask = $nextImport;
@@ -89,15 +88,20 @@ class PodcastImport extends BaseCommand
 
         ini_set('user_agent', 'Castopod/' . CP_VERSION);
         $this->podcastFeed = new PodcastFeed($this->importTask->feed_url);
+
+        return true;
     }
 
     public function run(array $params): void
     {
         // FIXME: getting named routes doesn't work from v4.3 anymore, so loading all routes before importing
-        Services::routes()->loadRoutes();
+        service('routes')
+            ->loadRoutes();
 
         try {
-            $this->init();
+            if (! $this->init()) {
+                return;
+            }
 
             CLI::write('All good! Feed was parsed successfully!');
 
@@ -158,7 +162,7 @@ class PodcastImport extends BaseCommand
 
             $podcastModel = new PodcastModel();
             if (! $podcastModel->update($this->podcast->id, $this->podcast)) {
-                throw new Exception((string) print_r($podcastModel->errors()));
+                throw new Exception(print_r($podcastModel->errors(), true));
             }
 
             CLI::showProgress(false);
@@ -258,7 +262,7 @@ class PodcastImport extends BaseCommand
         $podcastModel = new PodcastModel();
         if (! ($podcastId = $podcastModel->insert($podcast, true))) {
             $db->transRollback();
-            throw new Exception((string) print_r($podcastModel->errors()));
+            throw new Exception(print_r($podcastModel->errors(), true));
         }
 
         $podcast->id = $podcastId;
@@ -324,7 +328,7 @@ class PodcastImport extends BaseCommand
                 ]);
 
                 if (! $newPersonId = $personModel->insert($newPodcastPerson)) {
-                    throw new Exception((string) print_r($personModel->errors()));
+                    throw new Exception(print_r($personModel->errors(), true));
                 }
             }
 
@@ -351,7 +355,7 @@ class PodcastImport extends BaseCommand
                 $personGroupSlug,
                 $personRoleSlug
             )) {
-                throw new Exception((string) print_r($podcastPersonModel->errors()));
+                throw new Exception(print_r($podcastPersonModel->errors(), true));
             }
         }
 
@@ -496,7 +500,7 @@ class PodcastImport extends BaseCommand
 
             if (! ($episodeId = $episodeModel->insert($episode, true))) {
                 $db->transRollback();
-                throw new Exception((string) print_r($episodeModel->errors()));
+                throw new Exception(print_r($episodeModel->errors(), true));
             }
 
             $this->importEpisodePersons($episodeId, $item->podcast_persons);
@@ -544,7 +548,7 @@ class PodcastImport extends BaseCommand
                 ]);
 
                 if (! ($newPersonId = $personModel->insert($newPerson))) {
-                    throw new Exception((string) print_r($personModel->errors()));
+                    throw new Exception(print_r($personModel->errors(), true));
                 }
             }
 
@@ -572,7 +576,7 @@ class PodcastImport extends BaseCommand
                 $personGroupSlug,
                 $personRoleSlug
             )) {
-                throw new Exception((string) print_r($episodePersonModel->errors()));
+                throw new Exception(print_r($episodePersonModel->errors(), true));
             }
         }
     }
diff --git a/modules/PodcastImport/Helpers/podcast_import_helper.php b/modules/PodcastImport/Helpers/podcast_import_helper.php
index 29c3acbb30a5432b145ccac97e4dc5a86a9183f9..46133a92eaa40faa138f370047b0202e444ad58a 100644
--- a/modules/PodcastImport/Helpers/podcast_import_helper.php
+++ b/modules/PodcastImport/Helpers/podcast_import_helper.php
@@ -21,7 +21,7 @@ if (! function_exists('get_import_tasks')) {
         $podcastImportsQueue = service('settings')
             ->get('Import.queue') ?? [];
 
-        if (! is_array($podcastImportsQueue)) {
+        if ($podcastImportsQueue === []) {
             return [];
         }
 
@@ -48,6 +48,6 @@ if (! function_exists('get_import_tasks')) {
             return $a->created_at->isAfter($b->created_at) ? -1 : 1;
         });
 
-        return array_values($podcastImportsQueue);
+        return $podcastImportsQueue;
     }
 }
diff --git a/modules/PremiumPodcasts/Entities/Subscription.php b/modules/PremiumPodcasts/Entities/Subscription.php
index edca9bd4cb959c89f970a2fb47b4cc5f88bf900b..a198e46e290fcb2342a9f8d59ad13185eb19e104 100644
--- a/modules/PremiumPodcasts/Entities/Subscription.php
+++ b/modules/PremiumPodcasts/Entities/Subscription.php
@@ -25,7 +25,7 @@ use RuntimeException;
  * @property string $token
  * @property string $status
  * @property string|null $status_message
- * @property Time $expires_at
+ * @property Time|null $expires_at
  * @property int $downloads_last_3_months
  *
  * @property int $created_by
diff --git a/modules/Update/Commands/DatabaseUpdate.php b/modules/Update/Commands/DatabaseUpdate.php
index 1b7b6b398fd8c153199626ec210750a8634a9355..85bc78bccf5b7ba4e28c7b5f0d48114220544bc2 100644
--- a/modules/Update/Commands/DatabaseUpdate.php
+++ b/modules/Update/Commands/DatabaseUpdate.php
@@ -5,7 +5,6 @@ declare(strict_types=1);
 namespace Modules\Update\Commands;
 
 use CodeIgniter\CLI\BaseCommand;
-use Config\Services;
 
 class DatabaseUpdate extends BaseCommand
 {
@@ -26,7 +25,7 @@ class DatabaseUpdate extends BaseCommand
 
     public function run(array $params): void
     {
-        $migrate = Services::migrations();
+        $migrate = service('migrations');
 
         $migrate->setNamespace(null)
             ->latest();
diff --git a/package.json b/package.json
index 8754993e22c3e7c9f204de3cfae5d4d6f3b673a5..6030fbbb6e6ff483cec75707a14be91c18c5d653 100644
--- a/package.json
+++ b/package.json
@@ -11,17 +11,15 @@
   },
   "scripts": {
     "dev": "vite",
-    "build": "tsc && vite build",
+    "build": "tsc && vite build && pnpm run build:static",
     "serve": "vite preview",
     "build:static": "pnpm run build:icons && pnpm run build:svg",
     "build:icons": "svgo -f app/Resources/icons -o app/Resources/icons -r --config=./.svgo.icons.cjs",
     "build:svg": "svgo -f app/Resources/images -o public/assets/images -r --config=./.svgo.cjs",
-    "lint": "eslint --ext js,ts app/Resources",
-    "lint:fix": "eslint --ext js,ts app/Resources --fix",
-    "lint:css": "stylelint -f verbose \"app/Resources/**/*.css\"",
-    "lint:css:fix": "stylelint -f verbose --fix \"app/Resources/**/*.css\"",
-    "prettier": "prettier --check .",
-    "prettier:fix": "prettier --write .",
+    "lint": "stylelint -f verbose --fix \"app/Resources/**/*.css\" && eslint",
+    "lint:fix": "stylelint -f verbose --fix \"app/Resources/**/*.css\" && eslint --fix",
+    "format": "prettier --check .",
+    "format:fix": "prettier --write .",
     "typecheck": "tsc",
     "commit": "cz",
     "release": "semantic-release",
@@ -30,16 +28,16 @@
   "dependencies": {
     "@amcharts/amcharts4": "^4.10.39",
     "@amcharts/amcharts4-geodata": "^4.1.30",
-    "@codemirror/commands": "^6.6.2",
+    "@codemirror/commands": "^6.7.1",
     "@codemirror/lang-xml": "^6.1.0",
-    "@codemirror/language": "^6.10.3",
-    "@codemirror/state": "^6.4.1",
-    "@codemirror/view": "^6.33.0",
-    "@floating-ui/dom": "^1.6.11",
+    "@codemirror/language": "^6.10.8",
+    "@codemirror/state": "^6.5.0",
+    "@codemirror/view": "^6.36.1",
+    "@floating-ui/dom": "^1.6.13",
     "@github/clipboard-copy-element": "^1.3.0",
     "@github/hotkey": "^3.1.1",
     "@github/markdown-toolbar-element": "^2.2.3",
-    "@github/relative-time-element": "^4.4.3",
+    "@github/relative-time-element": "^4.4.4",
     "@tailwindcss/nesting": "0.0.0-insiders.565cd3e",
     "@vime/core": "^5.4.1",
     "choices.js": "^10.2.0",
@@ -47,59 +45,69 @@
     "flatpickr": "^4.6.13",
     "leaflet": "^1.9.4",
     "leaflet.markercluster": "^1.5.3",
-    "lit": "^3.2.0",
-    "marked": "^13.0.3",
-    "wavesurfer.js": "^7.8.6",
+    "lit": "^3.2.1",
+    "marked": "^15.0.6",
+    "wavesurfer.js": "^7.8.15",
     "xml-formatter": "^3.6.3"
   },
   "devDependencies": {
-    "@commitlint/cli": "^19.5.0",
-    "@commitlint/config-conventional": "^19.5.0",
-    "@csstools/css-tokenizer": "^3.0.1",
+    "@commitlint/cli": "^19.6.1",
+    "@commitlint/config-conventional": "^19.6.0",
+    "@csstools/css-tokenizer": "^3.0.3",
     "@semantic-release/changelog": "^6.0.3",
     "@semantic-release/exec": "^6.0.3",
     "@semantic-release/git": "^10.0.1",
-    "@semantic-release/gitlab": "^13.2.1",
-    "@tailwindcss/forms": "^0.5.9",
-    "@tailwindcss/typography": "^0.5.15",
-    "@types/leaflet": "^1.9.12",
-    "@typescript-eslint/eslint-plugin": "^8.7.0",
-    "@typescript-eslint/parser": "^8.7.0",
+    "@semantic-release/gitlab": "^13.2.3",
+    "@tailwindcss/forms": "^0.5.10",
+    "@tailwindcss/typography": "^0.5.16",
+    "@types/leaflet": "^1.9.16",
+    "@typescript-eslint/eslint-plugin": "^8.19.1",
+    "@typescript-eslint/parser": "^8.19.1",
     "all-contributors-cli": "^6.26.1",
-    "commitizen": "^4.3.0",
+    "commitizen": "^4.3.1",
     "cross-env": "^7.0.3",
     "cssnano": "^7.0.6",
     "cz-conventional-changelog": "^3.3.0",
-    "eslint": "^8.57.1",
+    "eslint": "^9.17.0",
     "eslint-config-prettier": "^9.1.0",
     "eslint-plugin-prettier": "^5.2.1",
-    "husky": "^9.1.6",
-    "is-ci": "^3.0.1",
-    "lint-staged": "^15.2.10",
-    "postcss": "^8.4.47",
+    "globals": "^15.14.0",
+    "husky": "^9.1.7",
+    "is-ci": "^4.1.0",
+    "lint-staged": "^15.3.0",
+    "postcss": "^8.4.49",
     "postcss-import": "^16.1.0",
-    "postcss-nesting": "^13.0.0",
-    "postcss-preset-env": "^10.0.5",
+    "postcss-nesting": "^13.0.1",
+    "postcss-preset-env": "^10.1.3",
     "postcss-reporter": "^7.1.0",
-    "prettier": "3.3.3",
+    "prettier": "3.4.2",
     "prettier-plugin-organize-imports": "^4.1.0",
-    "semantic-release": "^24.1.1",
-    "stylelint": "^16.9.0",
+    "semantic-release": "^24.2.1",
+    "stylelint": "^16.12.0",
     "stylelint-config-standard": "^36.0.1",
     "svgo": "^3.3.2",
-    "tailwindcss": "^3.4.13",
-    "typescript": "~5.5.4",
-    "vite": "^5.4.7",
-    "vite-plugin-pwa": "^0.20.5",
-    "workbox-build": "^7.1.1",
-    "workbox-core": "^7.1.0",
-    "workbox-routing": "^7.1.0",
-    "workbox-strategies": "^7.1.0"
+    "tailwindcss": "^3.4.17",
+    "typescript": "~5.7.2",
+    "typescript-eslint": "^8.19.1",
+    "vite": "^6.0.7",
+    "vite-plugin-pwa": "^0.21.1",
+    "workbox-build": "^7.3.0",
+    "workbox-core": "^7.3.0",
+    "workbox-routing": "^7.3.0",
+    "workbox-strategies": "^7.3.0"
   },
   "lint-staged": {
-    "*.{js,ts,css,md,json}": "prettier --write",
-    "*.{ts,js}": "eslint --ext js,ts,tsx app/Resources --fix",
-    "*.css": "stylelint --fix"
+    "*.{ts,js}": [
+      "eslint --fix",
+      "prettier --write"
+    ],
+    "*.css": [
+      "stylelint --fix",
+      "prettier --write"
+    ],
+    "!(*.css|*.js|*.ts|*.php|*.neon|*.sh)": [
+      "prettier --write"
+    ]
   },
   "config": {
     "commitizen": {
diff --git a/phpstan.neon b/phpstan.neon
index 43888a1aedd81cd8b6c531b3bb0ee5cef8dbe9c3..0ca1bd054a51dc23fb16ea20b1c1182d8e0c0237 100644
--- a/phpstan.neon
+++ b/phpstan.neon
@@ -45,6 +45,8 @@ parameters:
             - Modules\Media\Config\Services
             - Modules\Platforms\Config\Services
             - Modules\PremiumPodcasts\Config\Services
+            - Modules\Api\Rest\V1\Config\Services
     ignoreErrors:
         - '#^Call to an undefined method CodeIgniter\\Cache\\CacheInterface\:\:deleteMatching\(\)#'
-        - identifier: missingType.generics
\ No newline at end of file
+        - identifier: missingType.generics
+        - identifier: property.readOnlyByPhpDocDefaultValue
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f85da2e232df05b8c20b3ca53cfd10d800c3ebb7..c493570058282a2de90bf38fbe4abb5441343605 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -14,23 +14,23 @@ importers:
         specifier: ^4.1.30
         version: 4.1.30
       "@codemirror/commands":
-        specifier: ^6.6.2
-        version: 6.6.2
+        specifier: ^6.7.1
+        version: 6.7.1
       "@codemirror/lang-xml":
         specifier: ^6.1.0
         version: 6.1.0
       "@codemirror/language":
-        specifier: ^6.10.3
-        version: 6.10.3
+        specifier: ^6.10.8
+        version: 6.10.8
       "@codemirror/state":
-        specifier: ^6.4.1
-        version: 6.4.1
+        specifier: ^6.5.0
+        version: 6.5.0
       "@codemirror/view":
-        specifier: ^6.33.0
-        version: 6.33.0
+        specifier: ^6.36.1
+        version: 6.36.1
       "@floating-ui/dom":
-        specifier: ^1.6.11
-        version: 1.6.11
+        specifier: ^1.6.13
+        version: 1.6.13
       "@github/clipboard-copy-element":
         specifier: ^1.3.0
         version: 1.3.0
@@ -41,11 +41,11 @@ importers:
         specifier: ^2.2.3
         version: 2.2.3
       "@github/relative-time-element":
-        specifier: ^4.4.3
-        version: 4.4.3
+        specifier: ^4.4.4
+        version: 4.4.4
       "@tailwindcss/nesting":
         specifier: 0.0.0-insiders.565cd3e
-        version: 0.0.0-insiders.565cd3e(postcss@8.4.47)
+        version: 0.0.0-insiders.565cd3e(postcss@8.4.49)
       "@vime/core":
         specifier: ^5.4.1
         version: 5.4.1
@@ -65,144 +65,150 @@ importers:
         specifier: ^1.5.3
         version: 1.5.3(leaflet@1.9.4)
       lit:
-        specifier: ^3.2.0
-        version: 3.2.0
+        specifier: ^3.2.1
+        version: 3.2.1
       marked:
-        specifier: ^13.0.3
-        version: 13.0.3
+        specifier: ^15.0.6
+        version: 15.0.6
       wavesurfer.js:
-        specifier: ^7.8.6
-        version: 7.8.6
+        specifier: ^7.8.15
+        version: 7.8.15
       xml-formatter:
         specifier: ^3.6.3
         version: 3.6.3
     devDependencies:
       "@commitlint/cli":
-        specifier: ^19.5.0
-        version: 19.5.0(@types/node@20.10.5)(typescript@5.5.4)
+        specifier: ^19.6.1
+        version: 19.6.1(@types/node@20.10.5)(typescript@5.7.2)
       "@commitlint/config-conventional":
-        specifier: ^19.5.0
-        version: 19.5.0
+        specifier: ^19.6.0
+        version: 19.6.0
       "@csstools/css-tokenizer":
-        specifier: ^3.0.1
-        version: 3.0.1
+        specifier: ^3.0.3
+        version: 3.0.3
       "@semantic-release/changelog":
         specifier: ^6.0.3
-        version: 6.0.3(semantic-release@24.1.1(typescript@5.5.4))
+        version: 6.0.3(semantic-release@24.2.1(typescript@5.7.2))
       "@semantic-release/exec":
         specifier: ^6.0.3
-        version: 6.0.3(semantic-release@24.1.1(typescript@5.5.4))
+        version: 6.0.3(semantic-release@24.2.1(typescript@5.7.2))
       "@semantic-release/git":
         specifier: ^10.0.1
-        version: 10.0.1(semantic-release@24.1.1(typescript@5.5.4))
+        version: 10.0.1(semantic-release@24.2.1(typescript@5.7.2))
       "@semantic-release/gitlab":
-        specifier: ^13.2.1
-        version: 13.2.1(semantic-release@24.1.1(typescript@5.5.4))
+        specifier: ^13.2.3
+        version: 13.2.3(semantic-release@24.2.1(typescript@5.7.2))
       "@tailwindcss/forms":
-        specifier: ^0.5.9
-        version: 0.5.9(tailwindcss@3.4.13)
+        specifier: ^0.5.10
+        version: 0.5.10(tailwindcss@3.4.17)
       "@tailwindcss/typography":
-        specifier: ^0.5.15
-        version: 0.5.15(tailwindcss@3.4.13)
+        specifier: ^0.5.16
+        version: 0.5.16(tailwindcss@3.4.17)
       "@types/leaflet":
-        specifier: ^1.9.12
-        version: 1.9.12
+        specifier: ^1.9.16
+        version: 1.9.16
       "@typescript-eslint/eslint-plugin":
-        specifier: ^8.7.0
-        version: 8.7.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4)
+        specifier: ^8.19.1
+        version: 8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2)
       "@typescript-eslint/parser":
-        specifier: ^8.7.0
-        version: 8.7.0(eslint@8.57.1)(typescript@5.5.4)
+        specifier: ^8.19.1
+        version: 8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2)
       all-contributors-cli:
         specifier: ^6.26.1
         version: 6.26.1
       commitizen:
-        specifier: ^4.3.0
-        version: 4.3.0(@types/node@20.10.5)(typescript@5.5.4)
+        specifier: ^4.3.1
+        version: 4.3.1(@types/node@20.10.5)(typescript@5.7.2)
       cross-env:
         specifier: ^7.0.3
         version: 7.0.3
       cssnano:
         specifier: ^7.0.6
-        version: 7.0.6(postcss@8.4.47)
+        version: 7.0.6(postcss@8.4.49)
       cz-conventional-changelog:
         specifier: ^3.3.0
-        version: 3.3.0(@types/node@20.10.5)(typescript@5.5.4)
+        version: 3.3.0(@types/node@20.10.5)(typescript@5.7.2)
       eslint:
-        specifier: ^8.57.1
-        version: 8.57.1
+        specifier: ^9.17.0
+        version: 9.17.0(jiti@2.4.2)
       eslint-config-prettier:
         specifier: ^9.1.0
-        version: 9.1.0(eslint@8.57.1)
+        version: 9.1.0(eslint@9.17.0(jiti@2.4.2))
       eslint-plugin-prettier:
         specifier: ^5.2.1
-        version: 5.2.1(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.3.3)
+        version: 5.2.1(eslint-config-prettier@9.1.0(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2))(prettier@3.4.2)
+      globals:
+        specifier: ^15.14.0
+        version: 15.14.0
       husky:
-        specifier: ^9.1.6
-        version: 9.1.6
+        specifier: ^9.1.7
+        version: 9.1.7
       is-ci:
-        specifier: ^3.0.1
-        version: 3.0.1
+        specifier: ^4.1.0
+        version: 4.1.0
       lint-staged:
-        specifier: ^15.2.10
-        version: 15.2.10
+        specifier: ^15.3.0
+        version: 15.3.0
       postcss:
-        specifier: ^8.4.47
-        version: 8.4.47
+        specifier: ^8.4.49
+        version: 8.4.49
       postcss-import:
         specifier: ^16.1.0
-        version: 16.1.0(postcss@8.4.47)
+        version: 16.1.0(postcss@8.4.49)
       postcss-nesting:
-        specifier: ^13.0.0
-        version: 13.0.0(postcss@8.4.47)
+        specifier: ^13.0.1
+        version: 13.0.1(postcss@8.4.49)
       postcss-preset-env:
-        specifier: ^10.0.5
-        version: 10.0.5(postcss@8.4.47)
+        specifier: ^10.1.3
+        version: 10.1.3(postcss@8.4.49)
       postcss-reporter:
         specifier: ^7.1.0
-        version: 7.1.0(postcss@8.4.47)
+        version: 7.1.0(postcss@8.4.49)
       prettier:
-        specifier: 3.3.3
-        version: 3.3.3
+        specifier: 3.4.2
+        version: 3.4.2
       prettier-plugin-organize-imports:
         specifier: ^4.1.0
-        version: 4.1.0(prettier@3.3.3)(typescript@5.5.4)
+        version: 4.1.0(prettier@3.4.2)(typescript@5.7.2)
       semantic-release:
-        specifier: ^24.1.1
-        version: 24.1.1(typescript@5.5.4)
+        specifier: ^24.2.1
+        version: 24.2.1(typescript@5.7.2)
       stylelint:
-        specifier: ^16.9.0
-        version: 16.9.0(typescript@5.5.4)
+        specifier: ^16.12.0
+        version: 16.12.0(typescript@5.7.2)
       stylelint-config-standard:
         specifier: ^36.0.1
-        version: 36.0.1(stylelint@16.9.0(typescript@5.5.4))
+        version: 36.0.1(stylelint@16.12.0(typescript@5.7.2))
       svgo:
         specifier: ^3.3.2
         version: 3.3.2
       tailwindcss:
-        specifier: ^3.4.13
-        version: 3.4.13
+        specifier: ^3.4.17
+        version: 3.4.17
       typescript:
-        specifier: ~5.5.4
-        version: 5.5.4
+        specifier: ~5.7.2
+        version: 5.7.2
+      typescript-eslint:
+        specifier: ^8.19.1
+        version: 8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2)
       vite:
-        specifier: ^5.4.7
-        version: 5.4.7(@types/node@20.10.5)(terser@5.26.0)
+        specifier: ^6.0.7
+        version: 6.0.7(@types/node@20.10.5)(jiti@2.4.2)(terser@5.26.0)(yaml@2.6.1)
       vite-plugin-pwa:
-        specifier: ^0.20.5
-        version: 0.20.5(vite@5.4.7(@types/node@20.10.5)(terser@5.26.0))(workbox-build@7.1.1)(workbox-window@7.1.0)
+        specifier: ^0.21.1
+        version: 0.21.1(vite@6.0.7(@types/node@20.10.5)(jiti@2.4.2)(terser@5.26.0)(yaml@2.6.1))(workbox-build@7.3.0)(workbox-window@7.3.0)
       workbox-build:
-        specifier: ^7.1.1
-        version: 7.1.1
+        specifier: ^7.3.0
+        version: 7.3.0
       workbox-core:
-        specifier: ^7.1.0
-        version: 7.1.0
+        specifier: ^7.3.0
+        version: 7.3.0
       workbox-routing:
-        specifier: ^7.1.0
-        version: 7.1.0
+        specifier: ^7.3.0
+        version: 7.3.0
       workbox-strategies:
-        specifier: ^7.1.0
-        version: 7.1.0
+        specifier: ^7.3.0
+        version: 7.3.0
 
 packages:
   "@aashutoshrathi/word-wrap@1.2.6":
@@ -1163,10 +1169,10 @@ packages:
       "@codemirror/view": ^6.0.0
       "@lezer/common": ^1.0.0
 
-  "@codemirror/commands@6.6.2":
+  "@codemirror/commands@6.7.1":
     resolution:
       {
-        integrity: sha512-Fq7eWOl1Rcbrfn6jD8FPCj9Auaxdm5nIK5RYOeW7ughnd/rY5AmPg6b+CfsG39ZHdwiwe8lde3q8uR7CF5S0yQ==,
+        integrity: sha512-llTrboQYw5H4THfhN4U3qCnSZ1SOJ60ohhz+SzU0ADGtwlc533DtklQP0vSFaQuCPDn3BPpOd1GbbnUtwNjsrw==,
       }
 
   "@codemirror/lang-xml@6.1.0":
@@ -1175,10 +1181,10 @@ packages:
         integrity: sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==,
       }
 
-  "@codemirror/language@6.10.3":
+  "@codemirror/language@6.10.8":
     resolution:
       {
-        integrity: sha512-kDqEU5sCP55Oabl6E7m5N+vZRoc0iWqgDVhEKifcHzPzjqCegcO4amfrYVL9PmPZpl4G0yjkpTpUO/Ui8CzO8A==,
+        integrity: sha512-wcP8XPPhDH2vTqf181U8MbZnW+tDyPYy0UzVOa+oHORjyT+mhhom9vBd7dApJwoDz9Nb/a8kHjJIsuA/t8vNFw==,
       }
 
   "@codemirror/lint@6.4.2":
@@ -1193,16 +1199,16 @@ packages:
         integrity: sha512-PIEN3Ke1buPod2EHbJsoQwlbpkz30qGZKcnmH1eihq9+bPQx8gelauUwLYaY4vBOuBAuEhmpDLii4rj/uO0yMA==,
       }
 
-  "@codemirror/state@6.4.1":
+  "@codemirror/state@6.5.0":
     resolution:
       {
-        integrity: sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==,
+        integrity: sha512-MwBHVK60IiIHDcoMet78lxt6iw5gJOGSbNbOIVBHWVXIH4/Nq1+GQgLLGgI1KlnN86WDXsPudVaqYHKBIx7Eyw==,
       }
 
-  "@codemirror/view@6.33.0":
+  "@codemirror/view@6.36.1":
     resolution:
       {
-        integrity: sha512-AroaR3BvnjRW8fiZBalAaK+ZzB5usGgI014YKElYZvQdNH5ZIidHlO+cyf/2rWzyBFRkvG6VhiXeAEbC53P2YQ==,
+        integrity: sha512-miD1nyT4m4uopZaDdO2uXU/LLHliKNYL9kB1C1wJHrunHLm/rpkb5QVSokqgw9hFqEZakrdlb/VGWX8aYZTslQ==,
       }
 
   "@colors/colors@1.5.0":
@@ -1212,18 +1218,18 @@ packages:
       }
     engines: { node: ">=0.1.90" }
 
-  "@commitlint/cli@19.5.0":
+  "@commitlint/cli@19.6.1":
     resolution:
       {
-        integrity: sha512-gaGqSliGwB86MDmAAKAtV9SV1SHdmN8pnGq4EJU4+hLisQ7IFfx4jvU4s+pk6tl0+9bv6yT+CaZkufOinkSJIQ==,
+        integrity: sha512-8hcyA6ZoHwWXC76BoC8qVOSr8xHy00LZhZpauiD0iO0VYbVhMnED0da85lTfIULxl7Lj4c6vZgF0Wu/ed1+jlQ==,
       }
     engines: { node: ">=v18" }
     hasBin: true
 
-  "@commitlint/config-conventional@19.5.0":
+  "@commitlint/config-conventional@19.6.0":
     resolution:
       {
-        integrity: sha512-OBhdtJyHNPryZKg0fFpZNOBM1ZDbntMvqMuSmpfyP86XSfwzGw4CaoYRG4RutUPg0BTK07VMRIkNJT6wi2zthg==,
+        integrity: sha512-DJT40iMnTYtBtUfw9ApbsLZFke1zKh6llITVJ+x9mtpHD08gsNXaIRqHTmwTZL3dNX5+WoyK7pCN/5zswvkBCQ==,
       }
     engines: { node: ">=v18" }
 
@@ -1269,17 +1275,17 @@ packages:
       }
     engines: { node: ">=v18" }
 
-  "@commitlint/is-ignored@19.5.0":
+  "@commitlint/is-ignored@19.6.0":
     resolution:
       {
-        integrity: sha512-0XQ7Llsf9iL/ANtwyZ6G0NGp5Y3EQ8eDQSxv/SRcfJ0awlBY4tHFAvwWbw66FVUaWICH7iE5en+FD9TQsokZ5w==,
+        integrity: sha512-Ov6iBgxJQFR9koOupDPHvcHU9keFupDgtB3lObdEZDroiG4jj1rzky60fbQozFKVYRTUdrBGICHG0YVmRuAJmw==,
       }
     engines: { node: ">=v18" }
 
-  "@commitlint/lint@19.5.0":
+  "@commitlint/lint@19.6.0":
     resolution:
       {
-        integrity: sha512-cAAQwJcRtiBxQWO0eprrAbOurtJz8U6MgYqLz+p9kLElirzSCc0vGMcyCaA1O7AqBuxo11l1XsY3FhOFowLAAg==,
+        integrity: sha512-LRo7zDkXtcIrpco9RnfhOKeg8PAnE3oDDoalnrVU/EVaKHYBWYL1DlRR7+3AWn0JiBqD8yKOfetVxJGdEtZ0tg==,
       }
     engines: { node: ">=v18" }
 
@@ -1290,10 +1296,10 @@ packages:
       }
     engines: { node: ">=v18" }
 
-  "@commitlint/load@19.5.0":
+  "@commitlint/load@19.6.1":
     resolution:
       {
-        integrity: sha512-INOUhkL/qaKqwcTUvCE8iIUf5XHsEPCLY9looJ/ipzi7jtGhgmtH7OOFiNvwYgH7mA8osUWOUDV8t4E2HAi4xA==,
+        integrity: sha512-kE4mRKWWNju2QpsCWt428XBvUH55OET2N4QKQ0bF85qS/XbsRGG1MiTByDNlEVpEPceMkDr46LNH95DtRwcsfA==,
       }
     engines: { node: ">=v18" }
 
@@ -1332,10 +1338,10 @@ packages:
       }
     engines: { node: ">=v18" }
 
-  "@commitlint/rules@19.5.0":
+  "@commitlint/rules@19.6.0":
     resolution:
       {
-        integrity: sha512-hDW5TPyf/h1/EufSHEKSp6Hs+YVsDMHazfJ2azIk9tHPXS6UqSz1dIRs1gpqS3eMXgtkT7JH6TW4IShdqOwhAw==,
+        integrity: sha512-1f2reW7lbrI0X0ozZMesS/WZxgPa4/wi56vFuJENBmed6mWq5KsheN/nxqnl/C23ioxpPO/PL6tXpiiFy5Bhjw==,
       }
     engines: { node: ">=v18" }
 
@@ -1367,15 +1373,15 @@ packages:
       }
     engines: { node: ">=v18" }
 
-  "@csstools/cascade-layer-name-parser@2.0.1":
+  "@csstools/cascade-layer-name-parser@2.0.4":
     resolution:
       {
-        integrity: sha512-G9ZYN5+yr/E6xYSiy1BwOEFP5p88ZtWo8sL4NztKBkRRAwRkzVGa70M+D+fYHugMID5jkLeNt5X9jYd5EaVuyg==,
+        integrity: sha512-7DFHlPuIxviKYZrOiwVU/PiHLm3lLUR23OMuEEtfEOQTOp9hzQ2JjdY6X5H18RVuUPJqSCI+qNnD5iOLMVE0bA==,
       }
     engines: { node: ">=18" }
     peerDependencies:
-      "@csstools/css-parser-algorithms": ^3.0.1
-      "@csstools/css-tokenizer": ^3.0.1
+      "@csstools/css-parser-algorithms": ^3.0.4
+      "@csstools/css-tokenizer": ^3.0.3
 
   "@csstools/color-helpers@5.0.1":
     resolution:
@@ -1384,92 +1390,92 @@ packages:
       }
     engines: { node: ">=18" }
 
-  "@csstools/css-calc@2.0.1":
+  "@csstools/css-calc@2.1.1":
     resolution:
       {
-        integrity: sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==,
+        integrity: sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==,
       }
     engines: { node: ">=18" }
     peerDependencies:
-      "@csstools/css-parser-algorithms": ^3.0.1
-      "@csstools/css-tokenizer": ^3.0.1
+      "@csstools/css-parser-algorithms": ^3.0.4
+      "@csstools/css-tokenizer": ^3.0.3
 
-  "@csstools/css-color-parser@3.0.2":
+  "@csstools/css-color-parser@3.0.7":
     resolution:
       {
-        integrity: sha512-mNg7A6HnNjlm0we/pDS9dUafOuBxcanN0TBhEGeIk6zZincuk0+mAbnBqfVs29NlvWHZ8diwTG6g5FeU8246sA==,
+        integrity: sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==,
       }
     engines: { node: ">=18" }
     peerDependencies:
-      "@csstools/css-parser-algorithms": ^3.0.1
-      "@csstools/css-tokenizer": ^3.0.1
+      "@csstools/css-parser-algorithms": ^3.0.4
+      "@csstools/css-tokenizer": ^3.0.3
 
-  "@csstools/css-parser-algorithms@3.0.1":
+  "@csstools/css-parser-algorithms@3.0.4":
     resolution:
       {
-        integrity: sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==,
+        integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==,
       }
     engines: { node: ">=18" }
     peerDependencies:
-      "@csstools/css-tokenizer": ^3.0.1
+      "@csstools/css-tokenizer": ^3.0.3
 
-  "@csstools/css-tokenizer@3.0.1":
+  "@csstools/css-tokenizer@3.0.3":
     resolution:
       {
-        integrity: sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==,
+        integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==,
       }
     engines: { node: ">=18" }
 
-  "@csstools/media-query-list-parser@3.0.1":
+  "@csstools/media-query-list-parser@4.0.2":
     resolution:
       {
-        integrity: sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==,
+        integrity: sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==,
       }
     engines: { node: ">=18" }
     peerDependencies:
-      "@csstools/css-parser-algorithms": ^3.0.1
-      "@csstools/css-tokenizer": ^3.0.1
+      "@csstools/css-parser-algorithms": ^3.0.4
+      "@csstools/css-tokenizer": ^3.0.3
 
-  "@csstools/postcss-cascade-layers@5.0.0":
+  "@csstools/postcss-cascade-layers@5.0.1":
     resolution:
       {
-        integrity: sha512-h+VunB3KXaoWTWEPBcdVk8Kz1eZ/CtDD+HXgKw5JLdbsViLEQdKUtFYH73VIQigdodng8s5DCrrwNQY7pnuWBA==,
+        integrity: sha512-XOfhI7GShVcKiKwmPAnWSqd2tBR0uxt+runAxttbSp/LY2U16yAVPmAf7e9q4JJ0d+xMNmpwNDLBXnmRCl3HMQ==,
       }
     engines: { node: ">=18" }
     peerDependencies:
       postcss: ^8.4
 
-  "@csstools/postcss-color-function@4.0.2":
+  "@csstools/postcss-color-function@4.0.7":
     resolution:
       {
-        integrity: sha512-q/W3RXh66SM7WqxW3/KU6koL8nOgqyB/wrcU3+ThXnNtXY2+k8UgdE301ISJpMt6PDyYgC7eMaIBo535RvFIgw==,
+        integrity: sha512-aDHYmhNIHR6iLw4ElWhf+tRqqaXwKnMl0YsQ/X105Zc4dQwe6yJpMrTN6BwOoESrkDjOYMOfORviSSLeDTJkdQ==,
       }
     engines: { node: ">=18" }
     peerDependencies:
       postcss: ^8.4
 
-  "@csstools/postcss-color-mix-function@3.0.2":
+  "@csstools/postcss-color-mix-function@3.0.7":
     resolution:
       {
-        integrity: sha512-zG9PHNzZVCRk6eprm+T/ybrnuiwLdO+RR7+GCtNut+NZJGtPJj6bfPOEX23aOlMslLcRAlN6QOpxH3tovn+WpA==,
+        integrity: sha512-e68Nev4CxZYCLcrfWhHH4u/N1YocOfTmw67/kVX5Rb7rnguqqLyxPjhHWjSBX8o4bmyuukmNf3wrUSU3//kT7g==,
       }
     engines: { node: ">=18" }
     peerDependencies:
       postcss: ^8.4
 
-  "@csstools/postcss-content-alt-text@2.0.1":
+  "@csstools/postcss-content-alt-text@2.0.4":
     resolution:
       {
-        integrity: sha512-TWjjewVZqdkjavsi8a2THuXgkhUum1k/m4QJpZpzOv72q6WnaoQZGSj5t5uCs7ymJr0H3qj6JcXMwMApSWUOGQ==,
+        integrity: sha512-YItlZUOuZJCBlRaCf8Aucc1lgN41qYGALMly0qQllrxYJhiyzlI6RxOTMUvtWk+KhS8GphMDsDhKQ7KTPfEMSw==,
       }
     engines: { node: ">=18" }
     peerDependencies:
       postcss: ^8.4
 
-  "@csstools/postcss-exponential-functions@2.0.1":
+  "@csstools/postcss-exponential-functions@2.0.6":
     resolution:
       {
-        integrity: sha512-A/MG8es3ylFzZ30oYIQUyJcMOfTfCs0dqqBMzeuzaPRlx4q/72WG+BbKe/pL9BUNIWsM0Q8jn3e3la8enjHJJA==,
+        integrity: sha512-IgJA5DQsQLu/upA3HcdvC6xEMR051ufebBTIXZ5E9/9iiaA7juXWz1ceYj814lnDYP/7eWjZnw0grRJlX4eI6g==,
       }
     engines: { node: ">=18" }
     peerDependencies:
@@ -1484,28 +1490,28 @@ packages:
     peerDependencies:
       postcss: ^8.4
 
-  "@csstools/postcss-gamut-mapping@2.0.2":
+  "@csstools/postcss-gamut-mapping@2.0.7":
     resolution:
       {
-        integrity: sha512-/1ur3ca9RWg/KnbLlxaDswyjLSGoaHNDruAzrVhkn5axgd7LOH6JHCBRhrKDafdMw9bf4MQrYFoaLfHAPekLFg==,
+        integrity: sha512-gzFEZPoOkY0HqGdyeBXR3JP218Owr683u7KOZazTK7tQZBE8s2yhg06W1tshOqk7R7SWvw9gkw2TQogKpIW8Xw==,
       }
     engines: { node: ">=18" }
     peerDependencies:
       postcss: ^8.4
 
-  "@csstools/postcss-gradients-interpolation-method@5.0.2":
+  "@csstools/postcss-gradients-interpolation-method@5.0.7":
     resolution:
       {
-        integrity: sha512-qRpvA4sduAfiV9yZG4OM7q/h2Qhr3lg+GrHe9NZwuzWnfSDLGh+Dh4Ea6fQ+1++jdKXW/Cb4/vHRp0ssQYra4w==,
+        integrity: sha512-WgEyBeg6glUeTdS2XT7qeTFBthTJuXlS9GFro/DVomj7W7WMTamAwpoP4oQCq/0Ki2gvfRYFi/uZtmRE14/DFA==,
       }
     engines: { node: ">=18" }
     peerDependencies:
       postcss: ^8.4
 
-  "@csstools/postcss-hwb-function@4.0.2":
+  "@csstools/postcss-hwb-function@4.0.7":
     resolution:
       {
-        integrity: sha512-RUBVCyJE1hTsf9vGp3zrALeMollkAlHRFKm+T36y67nLfOOf+6GNQsdTGFAyLrY65skcm8ddC26Jp1n9ZIauEA==,
+        integrity: sha512-LKYqjO+wGwDCfNIEllessCBWfR4MS/sS1WXO+j00KKyOjm7jDW2L6jzUmqASEiv/kkJO39GcoIOvTTfB3yeBUA==,
       }
     engines: { node: ">=18" }
     peerDependencies:
@@ -1529,19 +1535,19 @@ packages:
     peerDependencies:
       postcss: ^8.4
 
-  "@csstools/postcss-is-pseudo-class@5.0.0":
+  "@csstools/postcss-is-pseudo-class@5.0.1":
     resolution:
       {
-        integrity: sha512-E/CjrT03BL06WmrjupnrT0VUBTvxJdoW1hRVeXFa9qatWtvcLLw0j8hP372G4A9PpSGEMXi3/AoHzPf7DNryCQ==,
+        integrity: sha512-JLp3POui4S1auhDR0n8wHd/zTOWmMsmK3nQd3hhL6FhWPaox5W7j1se6zXOG/aP07wV2ww0lxbKYGwbBszOtfQ==,
       }
     engines: { node: ">=18" }
     peerDependencies:
       postcss: ^8.4
 
-  "@csstools/postcss-light-dark-function@2.0.4":
+  "@csstools/postcss-light-dark-function@2.0.7":
     resolution:
       {
-        integrity: sha512-yHUt5DZ61Irvp72notmAl3Zt4Me50EWToWNocazyIFTVYFwwo/EucmV3hWi9zJehu3rOSvMclL7DzvRDfbak/A==,
+        integrity: sha512-ZZ0rwlanYKOHekyIPaU+sVm3BEHCe+Ha0/px+bmHe62n0Uc1lL34vbwrLYn6ote8PHlsqzKeTQdIejQCJ05tfw==,
       }
     engines: { node: ">=18" }
     peerDependencies:
@@ -1583,28 +1589,28 @@ packages:
     peerDependencies:
       postcss: ^8.4
 
-  "@csstools/postcss-logical-viewport-units@3.0.1":
+  "@csstools/postcss-logical-viewport-units@3.0.3":
     resolution:
       {
-        integrity: sha512-JsfaoTiBqIuRE+CYL4ZpYKOqJ965GyiMH4b8UrY0Z7i5GfMiHZrK7xtTB29piuyKQzrW+Z8w3PAExhwND9cuAQ==,
+        integrity: sha512-OC1IlG/yoGJdi0Y+7duz/kU/beCwO+Gua01sD6GtOtLi7ByQUpcIqs7UE/xuRPay4cHgOMatWdnDdsIDjnWpPw==,
       }
     engines: { node: ">=18" }
     peerDependencies:
       postcss: ^8.4
 
-  "@csstools/postcss-media-minmax@2.0.1":
+  "@csstools/postcss-media-minmax@2.0.6":
     resolution:
       {
-        integrity: sha512-EMa3IgUip+F/MwH4r2KfIA9ym9hQkT2PpR9MOukdomfGGCFuw9V3n/iIOBKziN1qfeddsYoOvtYOKQcHU2yIjg==,
+        integrity: sha512-J1+4Fr2W3pLZsfxkFazK+9kr96LhEYqoeBszLmFjb6AjYs+g9oDAw3J5oQignLKk3rC9XHW+ebPTZ9FaW5u5pg==,
       }
     engines: { node: ">=18" }
     peerDependencies:
       postcss: ^8.4
 
-  "@csstools/postcss-media-queries-aspect-ratio-number-values@3.0.1":
+  "@csstools/postcss-media-queries-aspect-ratio-number-values@3.0.4":
     resolution:
       {
-        integrity: sha512-JTzMQz//INahTALkvXnC5lC2fJKzwb5PY443T2zaM9hAzM7nzHMLIlEfFgdtBahVIBtBSalMefdxNr99LGW1lQ==,
+        integrity: sha512-AnGjVslHMm5xw9keusQYvjVWvuS7KWK+OJagaG0+m9QnIjZsrysD2kJP/tr/UJIyYtMCtu8OkUd+Rajb4DqtIQ==,
       }
     engines: { node: ">=18" }
     peerDependencies:
@@ -1628,10 +1634,10 @@ packages:
     peerDependencies:
       postcss: ^8.4
 
-  "@csstools/postcss-oklab-function@4.0.2":
+  "@csstools/postcss-oklab-function@4.0.7":
     resolution:
       {
-        integrity: sha512-2iSK/T77PHMeorakBAk/WLxSodfIJ/lmi6nxEkuruXfhGH7fByZim4Fw6ZJf4B73SVieRSH2ep8zvYkA2ZfRtA==,
+        integrity: sha512-I6WFQIbEKG2IO3vhaMGZDkucbCaUSXMxvHNzDdnfsTCF5tc0UlV3Oe2AhamatQoKFjBi75dSEMrgWq3+RegsOQ==,
       }
     engines: { node: ">=18" }
     peerDependencies:
@@ -1646,28 +1652,46 @@ packages:
     peerDependencies:
       postcss: ^8.4
 
-  "@csstools/postcss-relative-color-syntax@3.0.2":
+  "@csstools/postcss-random-function@1.0.2":
+    resolution:
+      {
+        integrity: sha512-vBCT6JvgdEkvRc91NFoNrLjgGtkLWt47GKT6E2UDn3nd8ZkMBiziQ1Md1OiKoSsgzxsSnGKG3RVdhlbdZEkHjA==,
+      }
+    engines: { node: ">=18" }
+    peerDependencies:
+      postcss: ^8.4
+
+  "@csstools/postcss-relative-color-syntax@3.0.7":
+    resolution:
+      {
+        integrity: sha512-apbT31vsJVd18MabfPOnE977xgct5B1I+Jpf+Munw3n6kKb1MMuUmGGH+PT9Hm/fFs6fe61Q/EWnkrb4bNoNQw==,
+      }
+    engines: { node: ">=18" }
+    peerDependencies:
+      postcss: ^8.4
+
+  "@csstools/postcss-scope-pseudo-class@4.0.1":
     resolution:
       {
-        integrity: sha512-aBpuUdpJBswNGfw6lOkhown2cZ0YXrMjASye56nkoRpgRe9yDF4BM1fvEuakrCDiaeoUzVaI4SF6+344BflXfQ==,
+        integrity: sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==,
       }
     engines: { node: ">=18" }
     peerDependencies:
       postcss: ^8.4
 
-  "@csstools/postcss-scope-pseudo-class@4.0.0":
+  "@csstools/postcss-sign-functions@1.1.1":
     resolution:
       {
-        integrity: sha512-+ZUOBtVMDcmHZcZqsP/jcNRriEILfWQflTI3tCTA+/RheXAg57VkFGyPDAilpQSqlCpxWLWG8VUFKFtZJPwuOg==,
+        integrity: sha512-MslYkZCeMQDxetNkfmmQYgKCy4c+w9pPDfgOBCJOo/RI1RveEUdZQYtOfrC6cIZB7sD7/PHr2VGOcMXlZawrnA==,
       }
     engines: { node: ">=18" }
     peerDependencies:
       postcss: ^8.4
 
-  "@csstools/postcss-stepped-value-functions@4.0.1":
+  "@csstools/postcss-stepped-value-functions@4.0.6":
     resolution:
       {
-        integrity: sha512-dk3KqVcIEYzy9Mvx8amoBbk123BWgd5DfjXDiPrEqxGma37PG7m/MoMmHQhuVHIjvPDHoJwyIZi2yy7j0RA5fw==,
+        integrity: sha512-/dwlO9w8vfKgiADxpxUbZOWlL5zKoRIsCymYoh1IPuBsXODKanKnfuZRr32DEqT0//3Av1VjfNZU9yhxtEfIeA==,
       }
     engines: { node: ">=18" }
     peerDependencies:
@@ -1682,10 +1706,10 @@ packages:
     peerDependencies:
       postcss: ^8.4
 
-  "@csstools/postcss-trigonometric-functions@4.0.1":
+  "@csstools/postcss-trigonometric-functions@4.0.6":
     resolution:
       {
-        integrity: sha512-QHOYuN3bzS/rcpAygFhJxJUtD8GuJEWF6f9Zm518Tq/cSMlcTgU+v0geyi5EqbmYxKMig2oKCKUSGqOj9gehkg==,
+        integrity: sha512-c4Y1D2Why/PeccaSouXnTt6WcNHJkoJRidV2VW9s5gJ97cNxnLgQ4Qj8qOqkIR9VmTQKJyNcbF4hy79ZQnWD7A==,
       }
     engines: { node: ">=18" }
     peerDependencies:
@@ -1700,23 +1724,23 @@ packages:
     peerDependencies:
       postcss: ^8.4
 
-  "@csstools/selector-resolve-nested@2.0.0":
+  "@csstools/selector-resolve-nested@3.0.0":
     resolution:
       {
-        integrity: sha512-oklSrRvOxNeeOW1yARd4WNCs/D09cQjunGZUgSq6vM8GpzFswN+8rBZyJA29YFZhOTQ6GFzxgLDNtVbt9wPZMA==,
+        integrity: sha512-ZoK24Yku6VJU1gS79a5PFmC8yn3wIapiKmPgun0hZgEI5AOqgH2kiPRsPz1qkGv4HL+wuDLH83yQyk6inMYrJQ==,
       }
     engines: { node: ">=18" }
     peerDependencies:
-      postcss-selector-parser: ^6.1.0
+      postcss-selector-parser: ^7.0.0
 
-  "@csstools/selector-specificity@4.0.0":
+  "@csstools/selector-specificity@5.0.0":
     resolution:
       {
-        integrity: sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==,
+        integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==,
       }
     engines: { node: ">=18" }
     peerDependencies:
-      postcss-selector-parser: ^6.1.0
+      postcss-selector-parser: ^7.0.0
 
   "@csstools/utilities@2.0.0":
     resolution:
@@ -1733,210 +1757,228 @@ packages:
         integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==,
       }
 
-  "@esbuild/aix-ppc64@0.21.5":
+  "@esbuild/aix-ppc64@0.24.2":
     resolution:
       {
-        integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==,
+        integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==,
       }
-    engines: { node: ">=12" }
+    engines: { node: ">=18" }
     cpu: [ppc64]
     os: [aix]
 
-  "@esbuild/android-arm64@0.21.5":
+  "@esbuild/android-arm64@0.24.2":
     resolution:
       {
-        integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==,
+        integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==,
       }
-    engines: { node: ">=12" }
+    engines: { node: ">=18" }
     cpu: [arm64]
     os: [android]
 
-  "@esbuild/android-arm@0.21.5":
+  "@esbuild/android-arm@0.24.2":
     resolution:
       {
-        integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==,
+        integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==,
       }
-    engines: { node: ">=12" }
+    engines: { node: ">=18" }
     cpu: [arm]
     os: [android]
 
-  "@esbuild/android-x64@0.21.5":
+  "@esbuild/android-x64@0.24.2":
     resolution:
       {
-        integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==,
+        integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==,
       }
-    engines: { node: ">=12" }
+    engines: { node: ">=18" }
     cpu: [x64]
     os: [android]
 
-  "@esbuild/darwin-arm64@0.21.5":
+  "@esbuild/darwin-arm64@0.24.2":
     resolution:
       {
-        integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==,
+        integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==,
       }
-    engines: { node: ">=12" }
+    engines: { node: ">=18" }
     cpu: [arm64]
     os: [darwin]
 
-  "@esbuild/darwin-x64@0.21.5":
+  "@esbuild/darwin-x64@0.24.2":
     resolution:
       {
-        integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==,
+        integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==,
       }
-    engines: { node: ">=12" }
+    engines: { node: ">=18" }
     cpu: [x64]
     os: [darwin]
 
-  "@esbuild/freebsd-arm64@0.21.5":
+  "@esbuild/freebsd-arm64@0.24.2":
     resolution:
       {
-        integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==,
+        integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==,
       }
-    engines: { node: ">=12" }
+    engines: { node: ">=18" }
     cpu: [arm64]
     os: [freebsd]
 
-  "@esbuild/freebsd-x64@0.21.5":
+  "@esbuild/freebsd-x64@0.24.2":
     resolution:
       {
-        integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==,
+        integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==,
       }
-    engines: { node: ">=12" }
+    engines: { node: ">=18" }
     cpu: [x64]
     os: [freebsd]
 
-  "@esbuild/linux-arm64@0.21.5":
+  "@esbuild/linux-arm64@0.24.2":
     resolution:
       {
-        integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==,
+        integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==,
       }
-    engines: { node: ">=12" }
+    engines: { node: ">=18" }
     cpu: [arm64]
     os: [linux]
 
-  "@esbuild/linux-arm@0.21.5":
+  "@esbuild/linux-arm@0.24.2":
     resolution:
       {
-        integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==,
+        integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==,
       }
-    engines: { node: ">=12" }
+    engines: { node: ">=18" }
     cpu: [arm]
     os: [linux]
 
-  "@esbuild/linux-ia32@0.21.5":
+  "@esbuild/linux-ia32@0.24.2":
     resolution:
       {
-        integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==,
+        integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==,
       }
-    engines: { node: ">=12" }
+    engines: { node: ">=18" }
     cpu: [ia32]
     os: [linux]
 
-  "@esbuild/linux-loong64@0.21.5":
+  "@esbuild/linux-loong64@0.24.2":
     resolution:
       {
-        integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==,
+        integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==,
       }
-    engines: { node: ">=12" }
+    engines: { node: ">=18" }
     cpu: [loong64]
     os: [linux]
 
-  "@esbuild/linux-mips64el@0.21.5":
+  "@esbuild/linux-mips64el@0.24.2":
     resolution:
       {
-        integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==,
+        integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==,
       }
-    engines: { node: ">=12" }
+    engines: { node: ">=18" }
     cpu: [mips64el]
     os: [linux]
 
-  "@esbuild/linux-ppc64@0.21.5":
+  "@esbuild/linux-ppc64@0.24.2":
     resolution:
       {
-        integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==,
+        integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==,
       }
-    engines: { node: ">=12" }
+    engines: { node: ">=18" }
     cpu: [ppc64]
     os: [linux]
 
-  "@esbuild/linux-riscv64@0.21.5":
+  "@esbuild/linux-riscv64@0.24.2":
     resolution:
       {
-        integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==,
+        integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==,
       }
-    engines: { node: ">=12" }
+    engines: { node: ">=18" }
     cpu: [riscv64]
     os: [linux]
 
-  "@esbuild/linux-s390x@0.21.5":
+  "@esbuild/linux-s390x@0.24.2":
     resolution:
       {
-        integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==,
+        integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==,
       }
-    engines: { node: ">=12" }
+    engines: { node: ">=18" }
     cpu: [s390x]
     os: [linux]
 
-  "@esbuild/linux-x64@0.21.5":
+  "@esbuild/linux-x64@0.24.2":
     resolution:
       {
-        integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==,
+        integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==,
       }
-    engines: { node: ">=12" }
+    engines: { node: ">=18" }
     cpu: [x64]
     os: [linux]
 
-  "@esbuild/netbsd-x64@0.21.5":
+  "@esbuild/netbsd-arm64@0.24.2":
     resolution:
       {
-        integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==,
+        integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==,
       }
-    engines: { node: ">=12" }
+    engines: { node: ">=18" }
+    cpu: [arm64]
+    os: [netbsd]
+
+  "@esbuild/netbsd-x64@0.24.2":
+    resolution:
+      {
+        integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==,
+      }
+    engines: { node: ">=18" }
     cpu: [x64]
     os: [netbsd]
 
-  "@esbuild/openbsd-x64@0.21.5":
+  "@esbuild/openbsd-arm64@0.24.2":
     resolution:
       {
-        integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==,
+        integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==,
       }
-    engines: { node: ">=12" }
+    engines: { node: ">=18" }
+    cpu: [arm64]
+    os: [openbsd]
+
+  "@esbuild/openbsd-x64@0.24.2":
+    resolution:
+      {
+        integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==,
+      }
+    engines: { node: ">=18" }
     cpu: [x64]
     os: [openbsd]
 
-  "@esbuild/sunos-x64@0.21.5":
+  "@esbuild/sunos-x64@0.24.2":
     resolution:
       {
-        integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==,
+        integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==,
       }
-    engines: { node: ">=12" }
+    engines: { node: ">=18" }
     cpu: [x64]
     os: [sunos]
 
-  "@esbuild/win32-arm64@0.21.5":
+  "@esbuild/win32-arm64@0.24.2":
     resolution:
       {
-        integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==,
+        integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==,
       }
-    engines: { node: ">=12" }
+    engines: { node: ">=18" }
     cpu: [arm64]
     os: [win32]
 
-  "@esbuild/win32-ia32@0.21.5":
+  "@esbuild/win32-ia32@0.24.2":
     resolution:
       {
-        integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==,
+        integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==,
       }
-    engines: { node: ">=12" }
+    engines: { node: ">=18" }
     cpu: [ia32]
     os: [win32]
 
-  "@esbuild/win32-x64@0.21.5":
+  "@esbuild/win32-x64@0.24.2":
     resolution:
       {
-        integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==,
+        integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==,
       }
-    engines: { node: ">=12" }
+    engines: { node: ">=18" }
     cpu: [x64]
     os: [win32]
 
@@ -1956,19 +1998,54 @@ packages:
       }
     engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 }
 
-  "@eslint/eslintrc@2.1.4":
+  "@eslint-community/regexpp@4.12.1":
     resolution:
       {
-        integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==,
+        integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==,
       }
-    engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 }
+    engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 }
 
-  "@eslint/js@8.57.1":
+  "@eslint/config-array@0.19.1":
     resolution:
       {
-        integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==,
+        integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==,
       }
-    engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 }
+    engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
+
+  "@eslint/core@0.9.1":
+    resolution:
+      {
+        integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==,
+      }
+    engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
+
+  "@eslint/eslintrc@3.2.0":
+    resolution:
+      {
+        integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==,
+      }
+    engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
+
+  "@eslint/js@9.17.0":
+    resolution:
+      {
+        integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==,
+      }
+    engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
+
+  "@eslint/object-schema@2.1.5":
+    resolution:
+      {
+        integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==,
+      }
+    engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
+
+  "@eslint/plugin-kit@0.2.4":
+    resolution:
+      {
+        integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==,
+      }
+    engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
 
   "@floating-ui/core@1.6.4":
     resolution:
@@ -1976,16 +2053,16 @@ packages:
         integrity: sha512-a4IowK4QkXl4SCWTGUR0INAfEOX3wtsYw3rKK5InQEHMGObkR8Xk44qYQD9P4r6HHw0iIfK6GUKECmY8sTkqRA==,
       }
 
-  "@floating-ui/dom@1.6.11":
+  "@floating-ui/dom@1.6.13":
     resolution:
       {
-        integrity: sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==,
+        integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==,
       }
 
-  "@floating-ui/utils@0.2.8":
+  "@floating-ui/utils@0.2.9":
     resolution:
       {
-        integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==,
+        integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==,
       }
 
   "@foliojs-fork/fontkit@1.9.1":
@@ -2030,19 +2107,25 @@ packages:
         integrity: sha512-AlquKGee+IWiAMYVB0xyHFZRMnu4n3X4HTvJHu79GiVJ1ojTukCWyxMlF5NMsecoLcBKsuBhx3QPv2vkE/zQ0A==,
       }
 
-  "@github/relative-time-element@4.4.3":
+  "@github/relative-time-element@4.4.4":
+    resolution:
+      {
+        integrity: sha512-Oi8uOL8O+ZWLD7dHRWCkm2cudcTYtB3VyOYf9BtzCgDGm+OKomyOREtItNMtWl1dxvec62BTKErq36uy+RYxQg==,
+      }
+
+  "@humanfs/core@0.19.1":
     resolution:
       {
-        integrity: sha512-EVKokqx9/DdUAZ2l9WVyY51EtRCO2gQWWMvsRIn7r4glJ91q9CXcnILVHZVCpfD52ucXUhUvtYsAjNJ4qP4uIg==,
+        integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==,
       }
+    engines: { node: ">=18.18.0" }
 
-  "@humanwhocodes/config-array@0.13.0":
+  "@humanfs/node@0.16.6":
     resolution:
       {
-        integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==,
+        integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==,
       }
-    engines: { node: ">=10.10.0" }
-    deprecated: Use @eslint/config-array instead
+    engines: { node: ">=18.18.0" }
 
   "@humanwhocodes/module-importer@1.0.1":
     resolution:
@@ -2051,12 +2134,19 @@ packages:
       }
     engines: { node: ">=12.22" }
 
-  "@humanwhocodes/object-schema@2.0.3":
+  "@humanwhocodes/retry@0.3.1":
+    resolution:
+      {
+        integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==,
+      }
+    engines: { node: ">=18.18" }
+
+  "@humanwhocodes/retry@0.4.1":
     resolution:
       {
-        integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==,
+        integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==,
       }
-    deprecated: Use @eslint/object-schema instead
+    engines: { node: ">=18.18" }
 
   "@isaacs/cliui@8.0.2":
     resolution:
@@ -2140,6 +2230,12 @@ packages:
         integrity: sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==,
       }
 
+  "@marijn/find-cluster-break@1.0.2":
+    resolution:
+      {
+        integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==,
+      }
+
   "@nodelib/fs.scandir@2.1.5":
     resolution:
       {
@@ -2344,130 +2440,154 @@ packages:
       rollup:
         optional: true
 
-  "@rollup/rollup-android-arm-eabi@4.22.4":
+  "@rollup/rollup-android-arm-eabi@4.30.1":
     resolution:
       {
-        integrity: sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==,
+        integrity: sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==,
       }
     cpu: [arm]
     os: [android]
 
-  "@rollup/rollup-android-arm64@4.22.4":
+  "@rollup/rollup-android-arm64@4.30.1":
     resolution:
       {
-        integrity: sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==,
+        integrity: sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==,
       }
     cpu: [arm64]
     os: [android]
 
-  "@rollup/rollup-darwin-arm64@4.22.4":
+  "@rollup/rollup-darwin-arm64@4.30.1":
     resolution:
       {
-        integrity: sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==,
+        integrity: sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==,
       }
     cpu: [arm64]
     os: [darwin]
 
-  "@rollup/rollup-darwin-x64@4.22.4":
+  "@rollup/rollup-darwin-x64@4.30.1":
     resolution:
       {
-        integrity: sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==,
+        integrity: sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==,
       }
     cpu: [x64]
     os: [darwin]
 
-  "@rollup/rollup-linux-arm-gnueabihf@4.22.4":
+  "@rollup/rollup-freebsd-arm64@4.30.1":
+    resolution:
+      {
+        integrity: sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==,
+      }
+    cpu: [arm64]
+    os: [freebsd]
+
+  "@rollup/rollup-freebsd-x64@4.30.1":
     resolution:
       {
-        integrity: sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==,
+        integrity: sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==,
+      }
+    cpu: [x64]
+    os: [freebsd]
+
+  "@rollup/rollup-linux-arm-gnueabihf@4.30.1":
+    resolution:
+      {
+        integrity: sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==,
       }
     cpu: [arm]
     os: [linux]
 
-  "@rollup/rollup-linux-arm-musleabihf@4.22.4":
+  "@rollup/rollup-linux-arm-musleabihf@4.30.1":
     resolution:
       {
-        integrity: sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==,
+        integrity: sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==,
       }
     cpu: [arm]
     os: [linux]
 
-  "@rollup/rollup-linux-arm64-gnu@4.22.4":
+  "@rollup/rollup-linux-arm64-gnu@4.30.1":
     resolution:
       {
-        integrity: sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==,
+        integrity: sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==,
       }
     cpu: [arm64]
     os: [linux]
 
-  "@rollup/rollup-linux-arm64-musl@4.22.4":
+  "@rollup/rollup-linux-arm64-musl@4.30.1":
     resolution:
       {
-        integrity: sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==,
+        integrity: sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==,
       }
     cpu: [arm64]
     os: [linux]
 
-  "@rollup/rollup-linux-powerpc64le-gnu@4.22.4":
+  "@rollup/rollup-linux-loongarch64-gnu@4.30.1":
+    resolution:
+      {
+        integrity: sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==,
+      }
+    cpu: [loong64]
+    os: [linux]
+
+  "@rollup/rollup-linux-powerpc64le-gnu@4.30.1":
     resolution:
       {
-        integrity: sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==,
+        integrity: sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==,
       }
     cpu: [ppc64]
     os: [linux]
 
-  "@rollup/rollup-linux-riscv64-gnu@4.22.4":
+  "@rollup/rollup-linux-riscv64-gnu@4.30.1":
     resolution:
       {
-        integrity: sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==,
+        integrity: sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==,
       }
     cpu: [riscv64]
     os: [linux]
 
-  "@rollup/rollup-linux-s390x-gnu@4.22.4":
+  "@rollup/rollup-linux-s390x-gnu@4.30.1":
     resolution:
       {
-        integrity: sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==,
+        integrity: sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==,
       }
     cpu: [s390x]
     os: [linux]
 
-  "@rollup/rollup-linux-x64-gnu@4.22.4":
+  "@rollup/rollup-linux-x64-gnu@4.30.1":
     resolution:
       {
-        integrity: sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==,
+        integrity: sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==,
       }
     cpu: [x64]
     os: [linux]
 
-  "@rollup/rollup-linux-x64-musl@4.22.4":
+  "@rollup/rollup-linux-x64-musl@4.30.1":
     resolution:
       {
-        integrity: sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==,
+        integrity: sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==,
       }
     cpu: [x64]
     os: [linux]
 
-  "@rollup/rollup-win32-arm64-msvc@4.22.4":
+  "@rollup/rollup-win32-arm64-msvc@4.30.1":
     resolution:
       {
-        integrity: sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==,
+        integrity: sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==,
       }
     cpu: [arm64]
     os: [win32]
 
-  "@rollup/rollup-win32-ia32-msvc@4.22.4":
+  "@rollup/rollup-win32-ia32-msvc@4.30.1":
     resolution:
       {
-        integrity: sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==,
+        integrity: sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==,
       }
     cpu: [ia32]
     os: [win32]
 
-  "@rollup/rollup-win32-x64-msvc@4.22.4":
+  "@rollup/rollup-win32-x64-msvc@4.30.1":
     resolution:
       {
-        integrity: sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==,
+        integrity: sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==,
       }
     cpu: [x64]
     os: [win32]
@@ -2528,19 +2648,19 @@ packages:
     peerDependencies:
       semantic-release: ">=18.0.0"
 
-  "@semantic-release/github@10.0.3":
+  "@semantic-release/github@11.0.1":
     resolution:
       {
-        integrity: sha512-nSJQboKrG4xBn7hHpRMrK8lt5DgqJg50ZMz9UbrsfTxuRk55XVoQEadbGZ2L9M0xZAC6hkuwkDhQJKqfPU35Fw==,
+        integrity: sha512-Z9cr0LgU/zgucbT9cksH0/pX9zmVda9hkDPcgIE0uvjMQ8w/mElDivGjx1w1pEQ+MuQJ5CBq3VCF16S6G4VH3A==,
       }
     engines: { node: ">=20.8.1" }
     peerDependencies:
-      semantic-release: ">=20.1.0"
+      semantic-release: ">=24.1.0"
 
-  "@semantic-release/gitlab@13.2.1":
+  "@semantic-release/gitlab@13.2.3":
     resolution:
       {
-        integrity: sha512-uvajKL3RbvouunvF6rWCEWmvYFW5tCq8irXvb2tW40cdI5rK22q9Uma1m/PxPtUTjggqfap86G0gst1hgeFuow==,
+        integrity: sha512-AzH/s7r8CLDN8dnbkrXnC+Gy9NYG/qRIIKMalaqNFAorgR+goGcqMb/6vIY9aVvwaoT1bo8xr1A+eeuuL4dGEQ==,
       }
     engines: { node: ">=20.8.1" }
     peerDependencies:
@@ -2613,13 +2733,13 @@ packages:
       }
     engines: { node: ">=14.16" }
 
-  "@tailwindcss/forms@0.5.9":
+  "@tailwindcss/forms@0.5.10":
     resolution:
       {
-        integrity: sha512-tM4XVr2+UVTxXJzey9Twx48c1gcxFStqn1pQz0tRsX8o3DvxhN5oY5pvyAbUx7VTaZxpej4Zzvc6h+1RJBzpIg==,
+        integrity: sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==,
       }
     peerDependencies:
-      tailwindcss: ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20"
+      tailwindcss: ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1"
 
   "@tailwindcss/nesting@0.0.0-insiders.565cd3e":
     resolution:
@@ -2629,13 +2749,13 @@ packages:
     peerDependencies:
       postcss: ^8.2.15
 
-  "@tailwindcss/typography@0.5.15":
+  "@tailwindcss/typography@0.5.16":
     resolution:
       {
-        integrity: sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==,
+        integrity: sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==,
       }
     peerDependencies:
-      tailwindcss: ">=3.0.0 || insiders || >=4.0.0-alpha.20"
+      tailwindcss: ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1"
 
   "@trysound/sax@0.2.0":
     resolution:
@@ -2662,6 +2782,12 @@ packages:
         integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==,
       }
 
+  "@types/estree@1.0.6":
+    resolution:
+      {
+        integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==,
+      }
+
   "@types/fscreen@1.0.4":
     resolution:
       {
@@ -2680,10 +2806,16 @@ packages:
         integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==,
       }
 
-  "@types/leaflet@1.9.12":
+  "@types/json-schema@7.0.15":
     resolution:
       {
-        integrity: sha512-BK7XS+NyRI291HIo0HCfE18Lp8oA30H1gpi1tf0mF3TgiCEzanQjOqNZ4x126SXzzi2oNSZhZ5axJp1k0iM6jg==,
+        integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==,
+      }
+
+  "@types/leaflet@1.9.16":
+    resolution:
+      {
+        integrity: sha512-wzZoyySUxkgMZ0ihJ7IaUIblG8Rdc8AbbZKLneyn+QjYsj5q1QU7TEKYqwTr10BGSzY5LI7tJk9Ifo+mEjdFRw==,
       }
 
   "@types/node@20.10.5":
@@ -2722,93 +2854,77 @@ packages:
         integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==,
       }
 
-  "@typescript-eslint/eslint-plugin@8.7.0":
+  "@typescript-eslint/eslint-plugin@8.19.1":
     resolution:
       {
-        integrity: sha512-RIHOoznhA3CCfSTFiB6kBGLQtB/sox+pJ6jeFu6FxJvqL8qRxq/FfGO/UhsGgQM9oGdXkV4xUgli+dt26biB6A==,
+        integrity: sha512-tJzcVyvvb9h/PB96g30MpxACd9IrunT7GF9wfA9/0TJ1LxGOJx1TdPzSbBBnNED7K9Ka8ybJsnEpiXPktolTLg==,
       }
     engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
     peerDependencies:
       "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0
       eslint: ^8.57.0 || ^9.0.0
-      typescript: "*"
-    peerDependenciesMeta:
-      typescript:
-        optional: true
+      typescript: ">=4.8.4 <5.8.0"
 
-  "@typescript-eslint/parser@8.7.0":
+  "@typescript-eslint/parser@8.19.1":
     resolution:
       {
-        integrity: sha512-lN0btVpj2unxHlNYLI//BQ7nzbMJYBVQX5+pbNXvGYazdlgYonMn4AhhHifQ+J4fGRYA/m1DjaQjx+fDetqBOQ==,
+        integrity: sha512-67gbfv8rAwawjYx3fYArwldTQKoYfezNUT4D5ioWetr/xCrxXxvleo3uuiFuKfejipvq+og7mjz3b0G2bVyUCw==,
       }
     engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
     peerDependencies:
       eslint: ^8.57.0 || ^9.0.0
-      typescript: "*"
-    peerDependenciesMeta:
-      typescript:
-        optional: true
+      typescript: ">=4.8.4 <5.8.0"
 
-  "@typescript-eslint/scope-manager@8.7.0":
+  "@typescript-eslint/scope-manager@8.19.1":
     resolution:
       {
-        integrity: sha512-87rC0k3ZlDOuz82zzXRtQ7Akv3GKhHs0ti4YcbAJtaomllXoSO8hi7Ix3ccEvCd824dy9aIX+j3d2UMAfCtVpg==,
+        integrity: sha512-60L9KIuN/xgmsINzonOcMDSB8p82h95hoBfSBtXuO4jlR1R9L1xSkmVZKgCPVfavDlXihh4ARNjXhh1gGnLC7Q==,
       }
     engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
 
-  "@typescript-eslint/type-utils@8.7.0":
+  "@typescript-eslint/type-utils@8.19.1":
     resolution:
       {
-        integrity: sha512-tl0N0Mj3hMSkEYhLkjREp54OSb/FI6qyCzfiiclvJvOqre6hsZTGSnHtmFLDU8TIM62G7ygEa1bI08lcuRwEnQ==,
+        integrity: sha512-Rp7k9lhDKBMRJB/nM9Ksp1zs4796wVNyihG9/TU9R6KCJDNkQbc2EOKjrBtLYh3396ZdpXLtr/MkaSEmNMtykw==,
       }
     engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
     peerDependencies:
-      typescript: "*"
-    peerDependenciesMeta:
-      typescript:
-        optional: true
+      eslint: ^8.57.0 || ^9.0.0
+      typescript: ">=4.8.4 <5.8.0"
 
-  "@typescript-eslint/types@8.7.0":
+  "@typescript-eslint/types@8.19.1":
     resolution:
       {
-        integrity: sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w==,
+        integrity: sha512-JBVHMLj7B1K1v1051ZaMMgLW4Q/jre5qGK0Ew6UgXz1Rqh+/xPzV1aW581OM00X6iOfyr1be+QyW8LOUf19BbA==,
       }
     engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
 
-  "@typescript-eslint/typescript-estree@8.7.0":
+  "@typescript-eslint/typescript-estree@8.19.1":
     resolution:
       {
-        integrity: sha512-MC8nmcGHsmfAKxwnluTQpNqceniT8SteVwd2voYlmiSWGOtjvGXdPl17dYu2797GVscK30Z04WRM28CrKS9WOg==,
+        integrity: sha512-jk/TZwSMJlxlNnqhy0Eod1PNEvCkpY6MXOXE/WLlblZ6ibb32i2We4uByoKPv1d0OD2xebDv4hbs3fm11SMw8Q==,
       }
     engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
     peerDependencies:
-      typescript: "*"
-    peerDependenciesMeta:
-      typescript:
-        optional: true
+      typescript: ">=4.8.4 <5.8.0"
 
-  "@typescript-eslint/utils@8.7.0":
+  "@typescript-eslint/utils@8.19.1":
     resolution:
       {
-        integrity: sha512-ZbdUdwsl2X/s3CiyAu3gOlfQzpbuG3nTWKPoIvAu1pu5r8viiJvv2NPN2AqArL35NCYtw/lrPPfM4gxrMLNLPw==,
+        integrity: sha512-IxG5gLO0Ne+KaUc8iW1A+XuKLd63o4wlbI1Zp692n1xojCl/THvgIKXJXBZixTh5dd5+yTJ/VXH7GJaaw21qXA==,
       }
     engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
     peerDependencies:
       eslint: ^8.57.0 || ^9.0.0
+      typescript: ">=4.8.4 <5.8.0"
 
-  "@typescript-eslint/visitor-keys@8.7.0":
+  "@typescript-eslint/visitor-keys@8.19.1":
     resolution:
       {
-        integrity: sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ==,
+        integrity: sha512-fzmjU8CHK853V/avYZAvuVut3ZTfwN5YtMaoi+X9Y9MA9keaWNHC3zEQ9zvyX/7Hj+5JkNyK1l7TOR2hevHB6Q==,
       }
     engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
 
-  "@ungap/structured-clone@1.2.0":
-    resolution:
-      {
-        integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==,
-      }
-
   "@vime/core@5.4.1":
     resolution:
       {
@@ -2851,18 +2967,18 @@ packages:
     engines: { node: ">=0.4.0" }
     hasBin: true
 
-  acorn@8.11.3:
+  acorn@8.12.0:
     resolution:
       {
-        integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==,
+        integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==,
       }
     engines: { node: ">=0.4.0" }
     hasBin: true
 
-  acorn@8.12.0:
+  acorn@8.14.0:
     resolution:
       {
-        integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==,
+        integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==,
       }
     engines: { node: ">=0.4.0" }
     hasBin: true
@@ -3214,22 +3330,6 @@ packages:
         integrity: sha512-VrhjbZ+Ba5mDiSYEuPelekQMfTbhcA2DhLk2VQWqdcCROWeFqlTcXZ7yfRkXCIl8E+g4gINJYJiRB7WEtfomAQ==,
       }
 
-  browserslist@4.23.0:
-    resolution:
-      {
-        integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==,
-      }
-    engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 }
-    hasBin: true
-
-  browserslist@4.23.1:
-    resolution:
-      {
-        integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==,
-      }
-    engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 }
-    hasBin: true
-
   browserslist@4.23.3:
     resolution:
       {
@@ -3318,12 +3418,6 @@ packages:
         integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==,
       }
 
-  caniuse-lite@1.0.30001612:
-    resolution:
-      {
-        integrity: sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==,
-      }
-
   caniuse-lite@1.0.30001639:
     resolution:
       {
@@ -3357,6 +3451,13 @@ packages:
       }
     engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 }
 
+  chalk@5.4.1:
+    resolution:
+      {
+        integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==,
+      }
+    engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 }
+
   char-regex@1.0.2:
     resolution:
       {
@@ -3376,17 +3477,17 @@ packages:
         integrity: sha512-8PKy6wq7BMjNwDTZwr3+Zry6G2+opJaAJDDA/j3yxvqSCnvkKe7ZIFfIyOhoc7htIWFhsfzF9tJpGUATcpUtPg==,
       }
 
-  chokidar@3.5.3:
+  chokidar@3.6.0:
     resolution:
       {
-        integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==,
+        integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==,
       }
     engines: { node: ">= 8.10.0" }
 
-  ci-info@3.9.0:
+  ci-info@4.1.0:
     resolution:
       {
-        integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==,
+        integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==,
       }
     engines: { node: ">=8" }
 
@@ -3550,10 +3651,10 @@ packages:
       }
     engines: { node: ">= 10" }
 
-  commitizen@4.3.0:
+  commitizen@4.3.1:
     resolution:
       {
-        integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==,
+        integrity: sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==,
       }
     engines: { node: ">= 12" }
     hasBin: true
@@ -3696,6 +3797,17 @@ packages:
       cosmiconfig: ">=8.2"
       typescript: ">=4"
 
+  cosmiconfig-typescript-loader@6.1.0:
+    resolution:
+      {
+        integrity: sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==,
+      }
+    engines: { node: ">=v18" }
+    peerDependencies:
+      "@types/node": "*"
+      cosmiconfig: ">=9"
+      typescript: ">=5"
+
   cosmiconfig@8.3.6:
     resolution:
       {
@@ -3741,6 +3853,13 @@ packages:
       }
     engines: { node: ">= 8" }
 
+  cross-spawn@7.0.6:
+    resolution:
+      {
+        integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==,
+      }
+    engines: { node: ">= 8" }
+
   crypto-js@4.2.0:
     resolution:
       {
@@ -3761,10 +3880,10 @@ packages:
       }
     engines: { node: ">=12" }
 
-  css-blank-pseudo@7.0.0:
+  css-blank-pseudo@7.0.1:
     resolution:
       {
-        integrity: sha512-v9xXYGdm6LIn4iHEfu3egk/PM1g/yJr8uwTIj6E44kurv5dE/4y3QW7WdVmZ0PVnqfTuK+C0ClZcEEiaKWBL9Q==,
+        integrity: sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==,
       }
     engines: { node: ">=18" }
     peerDependencies:
@@ -3779,17 +3898,17 @@ packages:
     peerDependencies:
       postcss: ^8.0.9
 
-  css-functions-list@3.2.2:
+  css-functions-list@3.2.3:
     resolution:
       {
-        integrity: sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==,
+        integrity: sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==,
       }
     engines: { node: ">=12 || >=16" }
 
-  css-has-pseudo@7.0.0:
+  css-has-pseudo@7.0.2:
     resolution:
       {
-        integrity: sha512-vO6k9bBt4/eEZ2PeHmS2VXjJga5SBy6O1ESyaOkse5/lvp6piFqg8Sh5KTU7X33M7Uh/oqo+M3EeMktQrZoTCQ==,
+        integrity: sha512-nzol/h+E0bId46Kn2dQH5VElaknX2Sr0hFuB/1EomdC7j+OISt2ZzK7EHX9DZDY53WbIVAR7FYKSO2XnSf07MQ==,
       }
     engines: { node: ">=18" }
     peerDependencies:
@@ -3824,6 +3943,13 @@ packages:
       }
     engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0 }
 
+  css-tree@3.1.0:
+    resolution:
+      {
+        integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==,
+      }
+    engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0 }
+
   css-what@6.1.0:
     resolution:
       {
@@ -3831,10 +3957,10 @@ packages:
       }
     engines: { node: ">= 6" }
 
-  cssdb@8.1.1:
+  cssdb@8.2.3:
     resolution:
       {
-        integrity: sha512-kRbSRgZoxtZNl5snb3nOzBkFOt5AwnephcUTIEFc2DebKG9PN50/cHarlwOooTxYQ/gxsnKs3BxykhNLmfvyLg==,
+        integrity: sha512-9BDG5XmJrJQQnJ51VFxXCAtpZ5ebDlAREmO8sxMOVU0aSxN/gocbctjIG5LMh3WBUq+xTlb/jw2LoljBEqraTA==,
       }
 
   cssesc@3.0.0:
@@ -4016,6 +4142,18 @@ packages:
       supports-color:
         optional: true
 
+  debug@4.4.0:
+    resolution:
+      {
+        integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==,
+      }
+    engines: { node: ">=6.0" }
+    peerDependencies:
+      supports-color: "*"
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+
   decamelize@1.2.0:
     resolution:
       {
@@ -4129,13 +4267,6 @@ packages:
         integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==,
       }
 
-  doctrine@3.0.0:
-    resolution:
-      {
-        integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==,
-      }
-    engines: { node: ">=6.0.0" }
-
   dom-serializer@2.0.0:
     resolution:
       {
@@ -4188,18 +4319,6 @@ packages:
     engines: { node: ">=0.10.0" }
     hasBin: true
 
-  electron-to-chromium@1.4.689:
-    resolution:
-      {
-        integrity: sha512-GatzRKnGPS1go29ep25reM94xxd1Wj8ritU0yRhCJ/tr1Bg8gKnm6R9O/yPOhGQBoLMZ9ezfrpghNaTw97C/PQ==,
-      }
-
-  electron-to-chromium@1.4.815:
-    resolution:
-      {
-        integrity: sha512-OvpTT2ItpOXJL7IGcYakRjHCt8L5GrrN/wHCQsRB4PQa1X9fe+X9oen245mIId7s14xvArCGSTIq644yPUKKLg==,
-      }
-
   electron-to-chromium@1.5.28:
     resolution:
       {
@@ -4317,21 +4436,14 @@ packages:
         integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==,
       }
 
-  esbuild@0.21.5:
+  esbuild@0.24.2:
     resolution:
       {
-        integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==,
+        integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==,
       }
-    engines: { node: ">=12" }
+    engines: { node: ">=18" }
     hasBin: true
 
-  escalade@3.1.1:
-    resolution:
-      {
-        integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==,
-      }
-    engines: { node: ">=6" }
-
   escalade@3.1.2:
     resolution:
       {
@@ -4402,12 +4514,12 @@ packages:
       eslint-config-prettier:
         optional: true
 
-  eslint-scope@7.2.2:
+  eslint-scope@8.2.0:
     resolution:
       {
-        integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==,
+        integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==,
       }
-    engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 }
+    engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
 
   eslint-visitor-keys@3.4.3:
     resolution:
@@ -4416,20 +4528,32 @@ packages:
       }
     engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 }
 
-  eslint@8.57.1:
+  eslint-visitor-keys@4.2.0:
     resolution:
       {
-        integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==,
+        integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==,
       }
-    engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 }
+    engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
+
+  eslint@9.17.0:
+    resolution:
+      {
+        integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==,
+      }
+    engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
     hasBin: true
+    peerDependencies:
+      jiti: "*"
+    peerDependenciesMeta:
+      jiti:
+        optional: true
 
-  espree@9.6.1:
+  espree@10.3.0:
     resolution:
       {
-        integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==,
+        integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==,
       }
-    engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 }
+    engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
 
   esprima@1.0.4:
     resolution:
@@ -4611,10 +4735,10 @@ packages:
         integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==,
       }
 
-  fdir@6.2.0:
+  fdir@6.4.2:
     resolution:
       {
-        integrity: sha512-9XaWcDl0riOX5j2kYfy0kKdg7skw3IY6kA4LFT8Tk2yF9UdrADUy8D6AJuBLtf7ISm/MksumwAHE3WVbMRyCLw==,
+        integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==,
       }
     peerDependencies:
       picomatch: ^3 || ^4
@@ -4643,17 +4767,17 @@ packages:
       }
     engines: { node: ">=18" }
 
-  file-entry-cache@6.0.1:
+  file-entry-cache@8.0.0:
     resolution:
       {
-        integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==,
+        integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==,
       }
-    engines: { node: ^10.12.0 || >=12.0.0 }
+    engines: { node: ">=16.0.0" }
 
-  file-entry-cache@9.0.0:
+  file-entry-cache@9.1.0:
     resolution:
       {
-        integrity: sha512-6MgEugi8p2tiUhqO7GnPsmbCCzj0YRCwwaTbpGRyKZesjRSzkqkAE9fPp7V2yMs5hwfgbQLgdvSSkGNg1s5Uvw==,
+        integrity: sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==,
       }
     engines: { node: ">=18" }
 
@@ -4738,12 +4862,12 @@ packages:
       }
     engines: { node: ">= 8" }
 
-  flat-cache@3.2.0:
+  flat-cache@4.0.1:
     resolution:
       {
-        integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==,
+        integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==,
       }
-    engines: { node: ^10.12.0 || >=12.0.0 }
+    engines: { node: ">=16" }
 
   flat-cache@5.0.0:
     resolution:
@@ -4985,6 +5109,7 @@ packages:
       {
         integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==,
       }
+    deprecated: Glob versions prior to v9 are no longer supported
 
   global-directory@4.0.1:
     resolution:
@@ -5035,12 +5160,19 @@ packages:
       }
     engines: { node: ">=4" }
 
-  globals@13.24.0:
+  globals@14.0.0:
     resolution:
       {
-        integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==,
+        integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==,
       }
-    engines: { node: ">=8" }
+    engines: { node: ">=18" }
+
+  globals@15.14.0:
+    resolution:
+      {
+        integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==,
+      }
+    engines: { node: ">=18" }
 
   globalthis@1.0.3:
     resolution:
@@ -5265,10 +5397,10 @@ packages:
       }
     engines: { node: ">=18.18.0" }
 
-  husky@9.1.6:
+  husky@9.1.7:
     resolution:
       {
-        integrity: sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==,
+        integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==,
       }
     engines: { node: ">=18" }
     hasBin: true
@@ -5299,17 +5431,17 @@ packages:
         integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==,
       }
 
-  ignore@5.3.1:
+  ignore@5.3.2:
     resolution:
       {
-        integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==,
+        integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==,
       }
     engines: { node: ">= 4" }
 
-  ignore@5.3.2:
+  ignore@6.0.2:
     resolution:
       {
-        integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==,
+        integrity: sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==,
       }
     engines: { node: ">= 4" }
 
@@ -5327,6 +5459,13 @@ packages:
       }
     engines: { node: ">=16.20" }
 
+  import-from-esm@2.0.0:
+    resolution:
+      {
+        integrity: sha512-YVt14UZCgsX1vZQ3gKjkWVdBdHQ6eu3MPU1TBgL1H5orXe2+jWD006WCPPtOuwlQm10NuzOW5WawiF1Q9veW8g==,
+      }
+    engines: { node: ">=18.20" }
+
   import-meta-resolve@4.0.0:
     resolution:
       {
@@ -5366,6 +5505,7 @@ packages:
       {
         integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==,
       }
+    deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
 
   inherits@2.0.4:
     resolution:
@@ -5474,10 +5614,10 @@ packages:
       }
     engines: { node: ">= 0.4" }
 
-  is-ci@3.0.1:
+  is-ci@4.1.0:
     resolution:
       {
-        integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==,
+        integrity: sha512-Ab9bQDQ11lWootZUI5qxgN2ZXwxNI5hTwnsvOc1wyxQ7zQ8OkEDw79mI0+9jI3x432NfwbVRru+3noJfXF6lSQ==,
       }
     hasBin: true
 
@@ -5577,13 +5717,6 @@ packages:
       }
     engines: { node: ">=8" }
 
-  is-path-inside@3.0.3:
-    resolution:
-      {
-        integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==,
-      }
-    engines: { node: ">=8" }
-
   is-plain-obj@4.1.0:
     resolution:
       {
@@ -5754,6 +5887,20 @@ packages:
       }
     hasBin: true
 
+  jiti@1.21.7:
+    resolution:
+      {
+        integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==,
+      }
+    hasBin: true
+
+  jiti@2.4.2:
+    resolution:
+      {
+        integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==,
+      }
+    hasBin: true
+
   js-tokens@4.0.0:
     resolution:
       {
@@ -5872,10 +6019,10 @@ packages:
       }
     engines: { node: ">=0.10.0" }
 
-  known-css-properties@0.34.0:
+  known-css-properties@0.35.0:
     resolution:
       {
-        integrity: sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==,
+        integrity: sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==,
       }
 
   leaflet.markercluster@1.5.3:
@@ -5913,17 +6060,17 @@ packages:
       }
     engines: { node: ">= 0.8.0" }
 
-  lilconfig@2.1.0:
+  lilconfig@3.1.2:
     resolution:
       {
-        integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==,
+        integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==,
       }
-    engines: { node: ">=10" }
+    engines: { node: ">=14" }
 
-  lilconfig@3.1.2:
+  lilconfig@3.1.3:
     resolution:
       {
-        integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==,
+        integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==,
       }
     engines: { node: ">=14" }
 
@@ -5933,18 +6080,18 @@ packages:
         integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==,
       }
 
-  lint-staged@15.2.10:
+  lint-staged@15.3.0:
     resolution:
       {
-        integrity: sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==,
+        integrity: sha512-vHFahytLoF2enJklgtOtCtIjZrKD/LoxlaUusd5nh7dWv/dkKQJY74ndFSzxCdv7g0ueGg1ORgTSt4Y9LPZn9A==,
       }
     engines: { node: ">=18.12.0" }
     hasBin: true
 
-  listr2@8.2.4:
+  listr2@8.2.5:
     resolution:
       {
-        integrity: sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==,
+        integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==,
       }
     engines: { node: ">=18.0.0" }
 
@@ -5960,10 +6107,10 @@ packages:
         integrity: sha512-pwT/HwoxqI9FggTrYVarkBKFN9MlTUpLrDHubTmW4SrkL3kkqW5gxwbxMMUnbbRHBC0WTZnYHcjDSCM559VyfA==,
       }
 
-  lit@3.2.0:
+  lit@3.2.1:
     resolution:
       {
-        integrity: sha512-s6tI33Lf6VpDu7u4YqsSX78D28bYQulM+VAzsGch4fx2H0eLZnJsUBsPWmGYSGoKDNbjtRv02rio1o+UdPVwvw==,
+        integrity: sha512-1BBa1E/z0O9ye5fZprPtdqnc0BFzxIxTTOO/tQFmyC/hj1O3jL4TfmLBw0WEwjAokdLwpclkvGgDJwTIh0/22w==,
       }
 
   load-json-file@4.0.0:
@@ -6204,10 +6351,10 @@ packages:
     engines: { node: ">= 18" }
     hasBin: true
 
-  marked@13.0.3:
+  marked@15.0.6:
     resolution:
       {
-        integrity: sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==,
+        integrity: sha512-Y07CUOE+HQXbVDCGl3LXggqJDbXDP2pArc2C1N1RRMN0ONiShoSsIInMd5Gsxupe7fKLpgimTV+HOJ9r7bA+pg==,
       }
     engines: { node: ">= 18" }
     hasBin: true
@@ -6230,6 +6377,12 @@ packages:
         integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==,
       }
 
+  mdn-data@2.12.2:
+    resolution:
+      {
+        integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==,
+      }
+
   meow@12.1.1:
     resolution:
       {
@@ -6276,13 +6429,6 @@ packages:
       }
     engines: { node: ">=8.6" }
 
-  micromatch@4.0.7:
-    resolution:
-      {
-        integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==,
-      }
-    engines: { node: ">=8.6" }
-
   micromatch@4.0.8:
     resolution:
       {
@@ -6391,6 +6537,12 @@ packages:
         integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==,
       }
 
+  ms@2.1.3:
+    resolution:
+      {
+        integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==,
+      }
+
   mute-stream@0.0.8:
     resolution:
       {
@@ -6454,12 +6606,6 @@ packages:
       encoding:
         optional: true
 
-  node-releases@2.0.14:
-    resolution:
-      {
-        integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==,
-      }
-
   node-releases@2.0.18:
     resolution:
       {
@@ -6996,6 +7142,12 @@ packages:
         integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==,
       }
 
+  picocolors@1.1.1:
+    resolution:
+      {
+        integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==,
+      }
+
   picomatch@2.3.1:
     resolution:
       {
@@ -7065,10 +7217,10 @@ packages:
         integrity: sha512-bxaGcA40sL3d6M4hH72Z4NdLqxpXRsCFk8AITYg6x1rn1Ei3izf00UMLklerBZTO49aPA3CYrIwVulx2Bce2pA==,
       }
 
-  postcss-attribute-case-insensitive@7.0.0:
+  postcss-attribute-case-insensitive@7.0.1:
     resolution:
       {
-        integrity: sha512-ETMUHIw67Kyv9Q81nden/NuJbRh+4/S963giXpfSLd5eaKK8kd1UdAHMVRV/NG/w/N6Cq8B0qZIZbZZWU/67+A==,
+        integrity: sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==,
       }
     engines: { node: ">=18" }
     peerDependencies:
@@ -7092,10 +7244,10 @@ packages:
     peerDependencies:
       postcss: ^8.4.6
 
-  postcss-color-functional-notation@7.0.2:
+  postcss-color-functional-notation@7.0.7:
     resolution:
       {
-        integrity: sha512-c2WkR0MS73s+P5SgY1KBaSEE61Rj+miW095rkWDnMQxbTCQkp6y/jft8U0QMxEsI4k1Pd4PdV+TP9/1zIDR6XQ==,
+        integrity: sha512-EZvAHsvyASX63vXnyXOIynkxhaHRSsdb7z6yiXKIovGXAolW4cMZ3qoh7k3VdTsLBS6VGdksGfIo3r6+waLoOw==,
       }
     engines: { node: ">=18" }
     peerDependencies:
@@ -7137,37 +7289,37 @@ packages:
     peerDependencies:
       postcss: ^8.4.31
 
-  postcss-custom-media@11.0.1:
+  postcss-custom-media@11.0.5:
     resolution:
       {
-        integrity: sha512-vfBliYVgEEJUFXCRPQ7jYt1wlD322u+/5GT0tZqMVYFInkpDHfjhU3nk2quTRW4uFc/umOOqLlxvrEOZRvloMw==,
+        integrity: sha512-SQHhayVNgDvSAdX9NQ/ygcDQGEY+aSF4b/96z7QUX6mqL5yl/JgG/DywcF6fW9XbnCRE+aVYk+9/nqGuzOPWeQ==,
       }
     engines: { node: ">=18" }
     peerDependencies:
       postcss: ^8.4
 
-  postcss-custom-properties@14.0.1:
+  postcss-custom-properties@14.0.4:
     resolution:
       {
-        integrity: sha512-SB4GjuZjIq5GQFNbxFrirQPbkdbJooyNy8bh+fcJ8ZG0oasJTflTTtR4geb56h+FBVDIb9Hx4v/NiG2caOj8nQ==,
+        integrity: sha512-QnW8FCCK6q+4ierwjnmXF9Y9KF8q0JkbgVfvQEMa93x1GT8FvOiUevWCN2YLaOWyByeDX8S6VFbZEeWoAoXs2A==,
       }
     engines: { node: ">=18" }
     peerDependencies:
       postcss: ^8.4
 
-  postcss-custom-selectors@8.0.1:
+  postcss-custom-selectors@8.0.4:
     resolution:
       {
-        integrity: sha512-2McIpyhAeKhUzVqrP4ZyMBpK5FuD+Y9tpQwhcof49652s7gez8057cSaOg/epYcKlztSYxb0GHfi7W5h3JoGUg==,
+        integrity: sha512-ASOXqNvDCE0dAJ/5qixxPeL1aOVGHGW2JwSy7HyjWNbnWTQCl+fDc968HY1jCmZI0+BaYT5CxsOiUhavpG/7eg==,
       }
     engines: { node: ">=18" }
     peerDependencies:
       postcss: ^8.4
 
-  postcss-dir-pseudo-class@9.0.0:
+  postcss-dir-pseudo-class@9.0.1:
     resolution:
       {
-        integrity: sha512-T59BG9lURiXmhcJMyKbyjNAK3KCyEQYEhaz9GAETHXfIy9XbGQeyz+H0zIwRJlrP4KKRPJolNYe3QjQPemMjBA==,
+        integrity: sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==,
       }
     engines: { node: ">=18" }
     peerDependencies:
@@ -7218,19 +7370,19 @@ packages:
     peerDependencies:
       postcss: ^8.4
 
-  postcss-focus-visible@10.0.0:
+  postcss-focus-visible@10.0.1:
     resolution:
       {
-        integrity: sha512-GJjzvTj7JY+zN7wVBQ4osdKX53QLUdr6r2rSEkBUqrEMDKu3fHMHKOY9rirdirbHCx3IETnK25EtpPARR2KWNw==,
+        integrity: sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==,
       }
     engines: { node: ">=18" }
     peerDependencies:
       postcss: ^8.4
 
-  postcss-focus-within@9.0.0:
+  postcss-focus-within@9.0.1:
     resolution:
       {
-        integrity: sha512-QwflAWUToNZvQLGbc4qJhrQO8yZ5617L6hSNzNWDoqRX4FoIh9fbJbEjy0nvFPciaaOoCaeqcxBwYPbFU0HvBw==,
+        integrity: sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==,
       }
     engines: { node: ">=18" }
     peerDependencies:
@@ -7289,10 +7441,10 @@ packages:
     peerDependencies:
       postcss: ^8.4.21
 
-  postcss-lab-function@7.0.2:
+  postcss-lab-function@7.0.7:
     resolution:
       {
-        integrity: sha512-h4ARGLIBtC1PmCHsLgTWWj8j1i1CXoaht4A5RlITDX2z9AeFBak0YlY6sdF4oJGljrep+Dg2SSccIj4QnFbRDg==,
+        integrity: sha512-+ONj2bpOQfsCKZE2T9VGMyVVdGcGUpr7u3SVfvkJlvhTRmDCfY25k4Jc8fubB9DclAPR4+w8uVtDZmdRgdAHig==,
       }
     engines: { node: ">=18" }
     peerDependencies:
@@ -7385,19 +7537,19 @@ packages:
     peerDependencies:
       postcss: ^8.2.14
 
-  postcss-nested@6.0.1:
+  postcss-nested@6.2.0:
     resolution:
       {
-        integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==,
+        integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==,
       }
     engines: { node: ">=12.0" }
     peerDependencies:
       postcss: ^8.2.14
 
-  postcss-nesting@13.0.0:
+  postcss-nesting@13.0.1:
     resolution:
       {
-        integrity: sha512-TCGQOizyqvEkdeTPM+t6NYwJ3EJszYE/8t8ILxw/YoeUvz2rz7aM8XTAmBWh9/DJjfaaabL88fWrsVHSPF2zgA==,
+        integrity: sha512-VbqqHkOBOt4Uu3G8Dm8n6lU5+9cJFxiuty9+4rcoyRPO9zZS1JIs6td49VIoix3qYqELHlJIn46Oih9SAKo+yQ==,
       }
     engines: { node: ">=18" }
     peerDependencies:
@@ -7528,19 +7680,19 @@ packages:
     peerDependencies:
       postcss: ^8.4
 
-  postcss-preset-env@10.0.5:
+  postcss-preset-env@10.1.3:
     resolution:
       {
-        integrity: sha512-ipPOgr3RY0utgJDbNoCX2dxKoQ4e4WO1pC21QhDlxCAX8+qC8O2Ezkzb54fd+8XtZ1UveA5gLjBsVo6dJDoWIg==,
+        integrity: sha512-9qzVhcMFU/MnwYHyYpJz4JhGku/4+xEiPTmhn0hj3IxnUYlEF9vbh7OC1KoLAnenS6Fgg43TKNp9xcuMeAi4Zw==,
       }
     engines: { node: ">=18" }
     peerDependencies:
       postcss: ^8.4
 
-  postcss-pseudo-class-any-link@10.0.0:
+  postcss-pseudo-class-any-link@10.0.1:
     resolution:
       {
-        integrity: sha512-bde8VE08Gq3ekKDq2BQ0ESOjNX54lrFDK3U9zABPINaqHblbZL/4Wfo5Y2vk6U64yVd/sjDwTzuiisFBpGNNIQ==,
+        integrity: sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==,
       }
     engines: { node: ">=18" }
     peerDependencies:
@@ -7587,19 +7739,19 @@ packages:
         integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==,
       }
 
-  postcss-safe-parser@7.0.0:
+  postcss-safe-parser@7.0.1:
     resolution:
       {
-        integrity: sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==,
+        integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==,
       }
     engines: { node: ">=18.0" }
     peerDependencies:
       postcss: ^8.4.31
 
-  postcss-selector-not@8.0.0:
+  postcss-selector-not@8.0.1:
     resolution:
       {
-        integrity: sha512-g/juh7A83GWc3+kWL8BiS3YUIJb3XNqIVKz1kGvgN3OhoGCsPncy1qo/+q61tjy5r87OxBhSY1+hcH3yOhEW+g==,
+        integrity: sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==,
       }
     engines: { node: ">=18" }
     peerDependencies:
@@ -7619,17 +7771,17 @@ packages:
       }
     engines: { node: ">=4" }
 
-  postcss-selector-parser@6.1.1:
+  postcss-selector-parser@6.1.2:
     resolution:
       {
-        integrity: sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==,
+        integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==,
       }
     engines: { node: ">=4" }
 
-  postcss-selector-parser@6.1.2:
+  postcss-selector-parser@7.0.0:
     resolution:
       {
-        integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==,
+        integrity: sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==,
       }
     engines: { node: ">=4" }
 
@@ -7657,10 +7809,10 @@ packages:
         integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==,
       }
 
-  postcss@8.4.47:
+  postcss@8.4.49:
     resolution:
       {
-        integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==,
+        integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==,
       }
     engines: { node: ^10 || ^12 || >=14 }
 
@@ -7706,10 +7858,10 @@ packages:
     engines: { node: ">=10.13.0" }
     hasBin: true
 
-  prettier@3.3.3:
+  prettier@3.4.2:
     resolution:
       {
-        integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==,
+        integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==,
       }
     engines: { node: ">=14" }
     hasBin: true
@@ -8012,14 +8164,6 @@ packages:
       }
     engines: { node: ">= 0.8.15" }
 
-  rimraf@3.0.2:
-    resolution:
-      {
-        integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==,
-      }
-    deprecated: Rimraf versions prior to v4 are no longer supported
-    hasBin: true
-
   rollup@2.79.1:
     resolution:
       {
@@ -8028,10 +8172,10 @@ packages:
     engines: { node: ">=10.0.0" }
     hasBin: true
 
-  rollup@4.22.4:
+  rollup@4.30.1:
     resolution:
       {
-        integrity: sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==,
+        integrity: sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==,
       }
     engines: { node: ">=18.0.0", npm: ">=8.0.0" }
     hasBin: true
@@ -8105,10 +8249,10 @@ packages:
         integrity: sha512-5cfCmsTYV/wPaRIItNxatw02ua/MThdIUNnUOCYp+3LSEJvnG804ANw2VLaavNILIfWXF1D1G2KNANkBBvInwQ==,
       }
 
-  semantic-release@24.1.1:
+  semantic-release@24.2.1:
     resolution:
       {
-        integrity: sha512-4Ax2GxD411jUe9IdhOjMLuN+6wAj+aKjvOGngByrpD/iKL+UKN/2puQglhyI4gxNyy9XzEBMzBwbqpnEwbXGEg==,
+        integrity: sha512-z0/3cutKNkLQ4Oy0HTi3lubnjTsdjjgOqmxdPjeYWe6lhFqUPfwslZxRHv3HDZlN4MhnZitb9SLihDkZNxOXfQ==,
       }
     engines: { node: ">=20.8.1" }
     hasBin: true
@@ -8566,10 +8710,10 @@ packages:
     peerDependencies:
       stylelint: ^16.1.0
 
-  stylelint@16.9.0:
+  stylelint@16.12.0:
     resolution:
       {
-        integrity: sha512-31Nm3WjxGOBGpQqF43o3wO9L5AC36TPIe6030Lnm13H3vDMTcS21DrLh69bMX+DBilKqMMVLian4iG6ybBoNRQ==,
+        integrity: sha512-F8zZ3L/rBpuoBZRvI4JVT20ZanPLXfQLzMOZg1tzPflRVh9mKpOZ8qcSIhh1my3FjAjZWG4T2POwGnmn6a6hbg==,
       }
     engines: { node: ">=18.12.0" }
     hasBin: true
@@ -8603,13 +8747,6 @@ packages:
       }
     engines: { node: ">=8" }
 
-  supports-hyperlinks@3.0.0:
-    resolution:
-      {
-        integrity: sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==,
-      }
-    engines: { node: ">=14.18" }
-
   supports-hyperlinks@3.1.0:
     resolution:
       {
@@ -8645,17 +8782,17 @@ packages:
       }
     engines: { node: ^14.18.0 || >=16.0.0 }
 
-  table@6.8.2:
+  table@6.9.0:
     resolution:
       {
-        integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==,
+        integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==,
       }
     engines: { node: ">=10.0.0" }
 
-  tailwindcss@3.4.13:
+  tailwindcss@3.4.17:
     resolution:
       {
-        integrity: sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==,
+        integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==,
       }
     engines: { node: ">=14.0.0" }
     hasBin: true
@@ -8703,12 +8840,6 @@ packages:
       }
     engines: { node: ">=8" }
 
-  text-table@0.2.0:
-    resolution:
-      {
-        integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==,
-      }
-
   thenby@1.3.4:
     resolution:
       {
@@ -8759,10 +8890,10 @@ packages:
         integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==,
       }
 
-  tinyglobby@0.2.0:
+  tinyglobby@0.2.10:
     resolution:
       {
-        integrity: sha512-+clyYQfAnNlt5a1x7CCQ6RLuTIztDfDAl6mAANvqRUlz6sVy5znCzJOhais8G6oyUyoeeaorLopO3HptVP8niA==,
+        integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==,
       }
     engines: { node: ">=12.0.0" }
 
@@ -8812,14 +8943,14 @@ packages:
       }
     engines: { node: ">= 0.4" }
 
-  ts-api-utils@1.3.0:
+  ts-api-utils@2.0.0:
     resolution:
       {
-        integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==,
+        integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==,
       }
-    engines: { node: ">=16" }
+    engines: { node: ">=18.12" }
     peerDependencies:
-      typescript: ">=4.2.0"
+      typescript: ">=4.8.4"
 
   ts-interface-checker@0.1.13:
     resolution:
@@ -8860,13 +8991,6 @@ packages:
       }
     engines: { node: ">=10" }
 
-  type-fest@0.20.2:
-    resolution:
-      {
-        integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==,
-      }
-    engines: { node: ">=10" }
-
   type-fest@0.21.3:
     resolution:
       {
@@ -8947,10 +9071,20 @@ packages:
         integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==,
       }
 
-  typescript@5.5.4:
+  typescript-eslint@8.19.1:
+    resolution:
+      {
+        integrity: sha512-LKPUQpdEMVOeKluHi8md7rwLcoXHhwvWp3x+sJkMuq3gGm9yaYJtPo8sRZSblMFJ5pcOGCAak/scKf1mvZDlQw==,
+      }
+    engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+      typescript: ">=4.8.4 <5.8.0"
+
+  typescript@5.7.2:
     resolution:
       {
-        integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==,
+        integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==,
       }
     engines: { node: ">=14.17" }
     hasBin: true
@@ -9063,24 +9197,6 @@ packages:
       }
     engines: { node: ">=4" }
 
-  update-browserslist-db@1.0.13:
-    resolution:
-      {
-        integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==,
-      }
-    hasBin: true
-    peerDependencies:
-      browserslist: ">= 4.21.0"
-
-  update-browserslist-db@1.0.16:
-    resolution:
-      {
-        integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==,
-      }
-    hasBin: true
-    peerDependencies:
-      browserslist: ">= 4.21.0"
-
   update-browserslist-db@1.1.0:
     resolution:
       {
@@ -9121,40 +9237,45 @@ packages:
         integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==,
       }
 
-  vite-plugin-pwa@0.20.5:
+  vite-plugin-pwa@0.21.1:
     resolution:
       {
-        integrity: sha512-aweuI/6G6n4C5Inn0vwHumElU/UEpNuO+9iZzwPZGTCH87TeZ6YFMrEY6ZUBQdIHHlhTsbMDryFARcSuOdsz9Q==,
+        integrity: sha512-rkTbKFbd232WdiRJ9R3u+hZmf5SfQljX1b45NF6oLA6DSktEKpYllgTo1l2lkiZWMWV78pABJtFjNXfBef3/3Q==,
       }
     engines: { node: ">=16.0.0" }
     peerDependencies:
       "@vite-pwa/assets-generator": ^0.2.6
-      vite: ^3.1.0 || ^4.0.0 || ^5.0.0
-      workbox-build: ^7.1.0
-      workbox-window: ^7.1.0
+      vite: ^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0
+      workbox-build: ^7.3.0
+      workbox-window: ^7.3.0
     peerDependenciesMeta:
       "@vite-pwa/assets-generator":
         optional: true
 
-  vite@5.4.7:
+  vite@6.0.7:
     resolution:
       {
-        integrity: sha512-5l2zxqMEPVENgvzTuBpHer2awaetimj2BGkhBPdnwKbPNOlHsODU+oiazEZzLK7KhAnOrO+XGYJYn4ZlUhDtDQ==,
+        integrity: sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==,
       }
-    engines: { node: ^18.0.0 || >=20.0.0 }
+    engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 }
     hasBin: true
     peerDependencies:
-      "@types/node": ^18.0.0 || >=20.0.0
+      "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0
+      jiti: ">=1.21.0"
       less: "*"
       lightningcss: ^1.21.0
       sass: "*"
       sass-embedded: "*"
       stylus: "*"
       sugarss: "*"
-      terser: ^5.4.0
+      terser: ^5.16.0
+      tsx: ^4.8.1
+      yaml: ^2.4.2
     peerDependenciesMeta:
       "@types/node":
         optional: true
+      jiti:
+        optional: true
       less:
         optional: true
       lightningcss:
@@ -9169,6 +9290,10 @@ packages:
         optional: true
       terser:
         optional: true
+      tsx:
+        optional: true
+      yaml:
+        optional: true
 
   w3c-keyname@2.2.8:
     resolution:
@@ -9176,10 +9301,10 @@ packages:
         integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==,
       }
 
-  wavesurfer.js@7.8.6:
+  wavesurfer.js@7.8.15:
     resolution:
       {
-        integrity: sha512-EDexkMwkkQBTWruhfWQRkTtvRggtKFTPuJX/oZ5wbIZEfyww9EBeLr2mtkxzA1S8TlWPx6adY5WyjOlNYNyHSg==,
+        integrity: sha512-fWNnQt5BEGzuoJ7HRxfvpT1rOEI1AmCGPZ/+7QDkDVN/m2vIBeLVQ+5vENRMz1YwvZ/u1No0UV492/o8G++KXQ==,
       }
 
   wcwidth@1.0.1:
@@ -9259,101 +9384,101 @@ packages:
         integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==,
       }
 
-  workbox-background-sync@7.1.0:
+  workbox-background-sync@7.3.0:
     resolution:
       {
-        integrity: sha512-rMbgrzueVWDFcEq1610YyDW71z0oAXLfdRHRQcKw4SGihkfOK0JUEvqWHFwA6rJ+6TClnMIn7KQI5PNN1XQXwQ==,
+        integrity: sha512-PCSk3eK7Mxeuyatb22pcSx9dlgWNv3+M8PqPaYDokks8Y5/FX4soaOqj3yhAZr5k6Q5JWTOMYgaJBpbw11G9Eg==,
       }
 
-  workbox-broadcast-update@7.1.0:
+  workbox-broadcast-update@7.3.0:
     resolution:
       {
-        integrity: sha512-O36hIfhjej/c5ar95pO67k1GQw0/bw5tKP7CERNgK+JdxBANQhDmIuOXZTNvwb2IHBx9hj2kxvcDyRIh5nzOgQ==,
+        integrity: sha512-T9/F5VEdJVhwmrIAE+E/kq5at2OY6+OXXgOWQevnubal6sO92Gjo24v6dCVwQiclAF5NS3hlmsifRrpQzZCdUA==,
       }
 
-  workbox-build@7.1.1:
+  workbox-build@7.3.0:
     resolution:
       {
-        integrity: sha512-WdkVdC70VMpf5NBCtNbiwdSZeKVuhTEd5PV3mAwpTQCGAB5XbOny1P9egEgNdetv4srAMmMKjvBk4RD58LpooA==,
+        integrity: sha512-JGL6vZTPlxnlqZRhR/K/msqg3wKP+m0wfEUVosK7gsYzSgeIxvZLi1ViJJzVL7CEeI8r7rGFV973RiEqkP3lWQ==,
       }
     engines: { node: ">=16.0.0" }
 
-  workbox-cacheable-response@7.1.0:
+  workbox-cacheable-response@7.3.0:
     resolution:
       {
-        integrity: sha512-iwsLBll8Hvua3xCuBB9h92+/e0wdsmSVgR2ZlvcfjepZWwhd3osumQB3x9o7flj+FehtWM2VHbZn8UJeBXXo6Q==,
+        integrity: sha512-eAFERIg6J2LuyELhLlmeRcJFa5e16Mj8kL2yCDbhWE+HUun9skRQrGIFVUagqWj4DMaaPSMWfAolM7XZZxNmxA==,
       }
 
-  workbox-core@7.1.0:
+  workbox-core@7.3.0:
     resolution:
       {
-        integrity: sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q==,
+        integrity: sha512-Z+mYrErfh4t3zi7NVTvOuACB0A/jA3bgxUN3PwtAVHvfEsZxV9Iju580VEETug3zYJRc0Dmii/aixI/Uxj8fmw==,
       }
 
-  workbox-expiration@7.1.0:
+  workbox-expiration@7.3.0:
     resolution:
       {
-        integrity: sha512-m5DcMY+A63rJlPTbbBNtpJ20i3enkyOtSgYfv/l8h+D6YbbNiA0zKEkCUaMsdDlxggla1oOfRkyqTvl5Ni5KQQ==,
+        integrity: sha512-lpnSSLp2BM+K6bgFCWc5bS1LR5pAwDWbcKt1iL87/eTSJRdLdAwGQznZE+1czLgn/X05YChsrEegTNxjM067vQ==,
       }
 
-  workbox-google-analytics@7.1.0:
+  workbox-google-analytics@7.3.0:
     resolution:
       {
-        integrity: sha512-FvE53kBQHfVTcZyczeBVRexhh7JTkyQ8HAvbVY6mXd2n2A7Oyz/9fIwnY406ZcDhvE4NFfKGjW56N4gBiqkrew==,
+        integrity: sha512-ii/tSfFdhjLHZ2BrYgFNTrb/yk04pw2hasgbM70jpZfLk0vdJAXgaiMAWsoE+wfJDNWoZmBYY0hMVI0v5wWDbg==,
       }
 
-  workbox-navigation-preload@7.1.0:
+  workbox-navigation-preload@7.3.0:
     resolution:
       {
-        integrity: sha512-4wyAbo0vNI/X0uWNJhCMKxnPanNyhybsReMGN9QUpaePLTiDpKxPqFxl4oUmBNddPwIXug01eTSLVIFXimRG/A==,
+        integrity: sha512-fTJzogmFaTv4bShZ6aA7Bfj4Cewaq5rp30qcxl2iYM45YD79rKIhvzNHiFj1P+u5ZZldroqhASXwwoyusnr2cg==,
       }
 
-  workbox-precaching@7.1.0:
+  workbox-precaching@7.3.0:
     resolution:
       {
-        integrity: sha512-LyxzQts+UEpgtmfnolo0hHdNjoB7EoRWcF7EDslt+lQGd0lW4iTvvSe3v5JiIckQSB5KTW5xiCqjFviRKPj1zA==,
+        integrity: sha512-ckp/3t0msgXclVAYaNndAGeAoWQUv7Rwc4fdhWL69CCAb2UHo3Cef0KIUctqfQj1p8h6aGyz3w8Cy3Ihq9OmIw==,
       }
 
-  workbox-range-requests@7.1.0:
+  workbox-range-requests@7.3.0:
     resolution:
       {
-        integrity: sha512-m7+O4EHolNs5yb/79CrnwPR/g/PRzMFYEdo01LqwixVnc/sbzNSvKz0d04OE3aMRel1CwAAZQheRsqGDwATgPQ==,
+        integrity: sha512-EyFmM1KpDzzAouNF3+EWa15yDEenwxoeXu9bgxOEYnFfCxns7eAxA9WSSaVd8kujFFt3eIbShNqa4hLQNFvmVQ==,
       }
 
-  workbox-recipes@7.1.0:
+  workbox-recipes@7.3.0:
     resolution:
       {
-        integrity: sha512-NRrk4ycFN9BHXJB6WrKiRX3W3w75YNrNrzSX9cEZgFB5ubeGoO8s/SDmOYVrFYp9HMw6sh1Pm3eAY/1gVS8YLg==,
+        integrity: sha512-BJro/MpuW35I/zjZQBcoxsctgeB+kyb2JAP5EB3EYzePg8wDGoQuUdyYQS+CheTb+GhqJeWmVs3QxLI8EBP1sg==,
       }
 
-  workbox-routing@7.1.0:
+  workbox-routing@7.3.0:
     resolution:
       {
-        integrity: sha512-oOYk+kLriUY2QyHkIilxUlVcFqwduLJB7oRZIENbqPGeBP/3TWHYNNdmGNhz1dvKuw7aqvJ7CQxn27/jprlTdg==,
+        integrity: sha512-ZUlysUVn5ZUzMOmQN3bqu+gK98vNfgX/gSTZ127izJg/pMMy4LryAthnYtjuqcjkN4HEAx1mdgxNiKJMZQM76A==,
       }
 
-  workbox-strategies@7.1.0:
+  workbox-strategies@7.3.0:
     resolution:
       {
-        integrity: sha512-/UracPiGhUNehGjRm/tLUQ+9PtWmCbRufWtV0tNrALuf+HZ4F7cmObSEK+E4/Bx1p8Syx2tM+pkIrvtyetdlew==,
+        integrity: sha512-tmZydug+qzDFATwX7QiEL5Hdf7FrkhjaF9db1CbB39sDmEZJg3l9ayDvPxy8Y18C3Y66Nrr9kkN1f/RlkDgllg==,
       }
 
-  workbox-streams@7.1.0:
+  workbox-streams@7.3.0:
     resolution:
       {
-        integrity: sha512-WyHAVxRXBMfysM8ORwiZnI98wvGWTVAq/lOyBjf00pXFvG0mNaVz4Ji+u+fKa/mf1i2SnTfikoYKto4ihHeS6w==,
+        integrity: sha512-SZnXucyg8x2Y61VGtDjKPO5EgPUG5NDn/v86WYHX+9ZqvAsGOytP0Jxp1bl663YUuMoXSAtsGLL+byHzEuMRpw==,
       }
 
-  workbox-sw@7.1.0:
+  workbox-sw@7.3.0:
     resolution:
       {
-        integrity: sha512-Hml/9+/njUXBglv3dtZ9WBKHI235AQJyLBV1G7EFmh4/mUdSQuXui80RtjDeVRrXnm/6QWgRUEHG3/YBVbxtsA==,
+        integrity: sha512-aCUyoAZU9IZtH05mn0ACUpyHzPs0lMeJimAYkQkBsOWiqaJLgusfDCR+yllkPkFRxWpZKF8vSvgHYeG7LwhlmA==,
       }
 
-  workbox-window@7.1.0:
+  workbox-window@7.3.0:
     resolution:
       {
-        integrity: sha512-ZHeROyqR+AS5UPzholQRDttLFqGMwP0Np8MKWAdyxsDETxq3qOAyXvqessc3GniohG6e0mAqSQyKOHmT8zPF7g==,
+        integrity: sha512-qW8PDy16OV1UBaUNGlTVcepzrlzyzNW/ZJvFQQs2j2TzGsg6IKjcpZC1RSquqQnTOafl5pCj5bGfAHlCjOOjdA==,
       }
 
   wrap-ansi@6.2.0:
@@ -9449,18 +9574,18 @@ packages:
         integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==,
       }
 
-  yaml@2.4.5:
+  yaml@2.5.1:
     resolution:
       {
-        integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==,
+        integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==,
       }
     engines: { node: ">= 14" }
     hasBin: true
 
-  yaml@2.5.1:
+  yaml@2.6.1:
     resolution:
       {
-        integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==,
+        integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==,
       }
     engines: { node: ">= 14" }
     hasBin: true
@@ -9572,7 +9697,7 @@ snapshots:
   "@babel/code-frame@7.24.2":
     dependencies:
       "@babel/highlight": 7.24.2
-      picocolors: 1.0.0
+      picocolors: 1.1.0
 
   "@babel/compat-data@7.23.5": {}
 
@@ -9589,7 +9714,7 @@ snapshots:
       "@babel/traverse": 7.24.1
       "@babel/types": 7.24.0
       convert-source-map: 2.0.0
-      debug: 4.3.4
+      debug: 4.3.6
       gensync: 1.0.0-beta.2
       json5: 2.2.3
       semver: 6.3.1
@@ -9615,7 +9740,7 @@ snapshots:
     dependencies:
       "@babel/compat-data": 7.23.5
       "@babel/helper-validator-option": 7.23.5
-      browserslist: 4.23.0
+      browserslist: 4.23.3
       lru-cache: 5.1.1
       semver: 6.3.1
 
@@ -9644,7 +9769,7 @@ snapshots:
       "@babel/core": 7.24.4
       "@babel/helper-compilation-targets": 7.23.6
       "@babel/helper-plugin-utils": 7.22.5
-      debug: 4.3.4
+      debug: 4.3.6
       lodash.debounce: 4.0.8
       resolve: 1.22.8
     transitivePeerDependencies:
@@ -9741,7 +9866,7 @@ snapshots:
       "@babel/helper-validator-identifier": 7.22.20
       chalk: 2.4.2
       js-tokens: 4.0.0
-      picocolors: 1.0.0
+      picocolors: 1.1.0
 
   "@babel/parser@7.24.4":
     dependencies:
@@ -10268,7 +10393,7 @@ snapshots:
       "@babel/helper-split-export-declaration": 7.22.6
       "@babel/parser": 7.24.4
       "@babel/types": 7.24.0
-      debug: 4.3.4
+      debug: 4.3.6
       globals: 11.12.0
     transitivePeerDependencies:
       - supports-color
@@ -10279,33 +10404,33 @@ snapshots:
       "@babel/helper-validator-identifier": 7.22.20
       to-fast-properties: 2.0.0
 
-  "@codemirror/autocomplete@6.11.1(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0)(@lezer/common@1.2.0)":
+  "@codemirror/autocomplete@6.11.1(@codemirror/language@6.10.8)(@codemirror/state@6.5.0)(@codemirror/view@6.36.1)(@lezer/common@1.2.0)":
     dependencies:
-      "@codemirror/language": 6.10.3
-      "@codemirror/state": 6.4.1
-      "@codemirror/view": 6.33.0
+      "@codemirror/language": 6.10.8
+      "@codemirror/state": 6.5.0
+      "@codemirror/view": 6.36.1
       "@lezer/common": 1.2.0
 
-  "@codemirror/commands@6.6.2":
+  "@codemirror/commands@6.7.1":
     dependencies:
-      "@codemirror/language": 6.10.3
-      "@codemirror/state": 6.4.1
-      "@codemirror/view": 6.33.0
+      "@codemirror/language": 6.10.8
+      "@codemirror/state": 6.5.0
+      "@codemirror/view": 6.36.1
       "@lezer/common": 1.2.0
 
   "@codemirror/lang-xml@6.1.0":
     dependencies:
-      "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0)(@lezer/common@1.2.0)
-      "@codemirror/language": 6.10.3
-      "@codemirror/state": 6.4.1
-      "@codemirror/view": 6.33.0
+      "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.10.8)(@codemirror/state@6.5.0)(@codemirror/view@6.36.1)(@lezer/common@1.2.0)
+      "@codemirror/language": 6.10.8
+      "@codemirror/state": 6.5.0
+      "@codemirror/view": 6.36.1
       "@lezer/common": 1.2.0
       "@lezer/xml": 1.0.4
 
-  "@codemirror/language@6.10.3":
+  "@codemirror/language@6.10.8":
     dependencies:
-      "@codemirror/state": 6.4.1
-      "@codemirror/view": 6.33.0
+      "@codemirror/state": 6.5.0
+      "@codemirror/view": 6.36.1
       "@lezer/common": 1.2.0
       "@lezer/highlight": 1.2.0
       "@lezer/lr": 1.3.14
@@ -10313,32 +10438,34 @@ snapshots:
 
   "@codemirror/lint@6.4.2":
     dependencies:
-      "@codemirror/state": 6.4.1
-      "@codemirror/view": 6.33.0
+      "@codemirror/state": 6.5.0
+      "@codemirror/view": 6.36.1
       crelt: 1.0.6
 
   "@codemirror/search@6.5.5":
     dependencies:
-      "@codemirror/state": 6.4.1
-      "@codemirror/view": 6.33.0
+      "@codemirror/state": 6.5.0
+      "@codemirror/view": 6.36.1
       crelt: 1.0.6
 
-  "@codemirror/state@6.4.1": {}
+  "@codemirror/state@6.5.0":
+    dependencies:
+      "@marijn/find-cluster-break": 1.0.2
 
-  "@codemirror/view@6.33.0":
+  "@codemirror/view@6.36.1":
     dependencies:
-      "@codemirror/state": 6.4.1
+      "@codemirror/state": 6.5.0
       style-mod: 4.1.0
       w3c-keyname: 2.2.8
 
   "@colors/colors@1.5.0":
     optional: true
 
-  "@commitlint/cli@19.5.0(@types/node@20.10.5)(typescript@5.5.4)":
+  "@commitlint/cli@19.6.1(@types/node@20.10.5)(typescript@5.7.2)":
     dependencies:
       "@commitlint/format": 19.5.0
-      "@commitlint/lint": 19.5.0
-      "@commitlint/load": 19.5.0(@types/node@20.10.5)(typescript@5.5.4)
+      "@commitlint/lint": 19.6.0
+      "@commitlint/load": 19.6.1(@types/node@20.10.5)(typescript@5.7.2)
       "@commitlint/read": 19.5.0
       "@commitlint/types": 19.5.0
       tinyexec: 0.3.0
@@ -10347,7 +10474,7 @@ snapshots:
       - "@types/node"
       - typescript
 
-  "@commitlint/config-conventional@19.5.0":
+  "@commitlint/config-conventional@19.6.0":
     dependencies:
       "@commitlint/types": 19.5.0
       conventional-changelog-conventionalcommits: 7.0.2
@@ -10382,27 +10509,27 @@ snapshots:
       "@commitlint/types": 19.5.0
       chalk: 5.3.0
 
-  "@commitlint/is-ignored@19.5.0":
+  "@commitlint/is-ignored@19.6.0":
     dependencies:
       "@commitlint/types": 19.5.0
       semver: 7.6.0
 
-  "@commitlint/lint@19.5.0":
+  "@commitlint/lint@19.6.0":
     dependencies:
-      "@commitlint/is-ignored": 19.5.0
+      "@commitlint/is-ignored": 19.6.0
       "@commitlint/parse": 19.5.0
-      "@commitlint/rules": 19.5.0
+      "@commitlint/rules": 19.6.0
       "@commitlint/types": 19.5.0
 
-  "@commitlint/load@18.6.1(@types/node@20.10.5)(typescript@5.5.4)":
+  "@commitlint/load@18.6.1(@types/node@20.10.5)(typescript@5.7.2)":
     dependencies:
       "@commitlint/config-validator": 18.6.1
       "@commitlint/execute-rule": 18.6.1
       "@commitlint/resolve-extends": 18.6.1
       "@commitlint/types": 18.6.1
       chalk: 4.1.2
-      cosmiconfig: 8.3.6(typescript@5.5.4)
-      cosmiconfig-typescript-loader: 5.0.0(@types/node@20.10.5)(cosmiconfig@8.3.6(typescript@5.5.4))(typescript@5.5.4)
+      cosmiconfig: 8.3.6(typescript@5.7.2)
+      cosmiconfig-typescript-loader: 5.0.0(@types/node@20.10.5)(cosmiconfig@8.3.6(typescript@5.7.2))(typescript@5.7.2)
       lodash.isplainobject: 4.0.6
       lodash.merge: 4.6.2
       lodash.uniq: 4.5.0
@@ -10412,15 +10539,15 @@ snapshots:
       - typescript
     optional: true
 
-  "@commitlint/load@19.5.0(@types/node@20.10.5)(typescript@5.5.4)":
+  "@commitlint/load@19.6.1(@types/node@20.10.5)(typescript@5.7.2)":
     dependencies:
       "@commitlint/config-validator": 19.5.0
       "@commitlint/execute-rule": 19.5.0
       "@commitlint/resolve-extends": 19.5.0
       "@commitlint/types": 19.5.0
       chalk: 5.3.0
-      cosmiconfig: 9.0.0(typescript@5.5.4)
-      cosmiconfig-typescript-loader: 5.0.0(@types/node@20.10.5)(cosmiconfig@9.0.0(typescript@5.5.4))(typescript@5.5.4)
+      cosmiconfig: 9.0.0(typescript@5.7.2)
+      cosmiconfig-typescript-loader: 6.1.0(@types/node@20.10.5)(cosmiconfig@9.0.0(typescript@5.7.2))(typescript@5.7.2)
       lodash.isplainobject: 4.0.6
       lodash.merge: 4.6.2
       lodash.uniq: 4.5.0
@@ -10463,7 +10590,7 @@ snapshots:
       lodash.mergewith: 4.6.2
       resolve-from: 5.0.0
 
-  "@commitlint/rules@19.5.0":
+  "@commitlint/rules@19.6.0":
     dependencies:
       "@commitlint/ensure": 19.5.0
       "@commitlint/message": 19.5.0
@@ -10486,333 +10613,363 @@ snapshots:
       "@types/conventional-commits-parser": 5.0.0
       chalk: 5.3.0
 
-  "@csstools/cascade-layer-name-parser@2.0.1(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)":
+  "@csstools/cascade-layer-name-parser@2.0.4(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)":
     dependencies:
-      "@csstools/css-parser-algorithms": 3.0.1(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-tokenizer": 3.0.1
+      "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-tokenizer": 3.0.3
 
   "@csstools/color-helpers@5.0.1": {}
 
-  "@csstools/css-calc@2.0.1(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)":
+  "@csstools/css-calc@2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)":
     dependencies:
-      "@csstools/css-parser-algorithms": 3.0.1(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-tokenizer": 3.0.1
+      "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-tokenizer": 3.0.3
 
-  "@csstools/css-color-parser@3.0.2(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)":
+  "@csstools/css-color-parser@3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)":
     dependencies:
       "@csstools/color-helpers": 5.0.1
-      "@csstools/css-calc": 2.0.1(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-parser-algorithms": 3.0.1(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-tokenizer": 3.0.1
+      "@csstools/css-calc": 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-tokenizer": 3.0.3
 
-  "@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1)":
+  "@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3)":
     dependencies:
-      "@csstools/css-tokenizer": 3.0.1
+      "@csstools/css-tokenizer": 3.0.3
 
-  "@csstools/css-tokenizer@3.0.1": {}
+  "@csstools/css-tokenizer@3.0.3": {}
 
-  "@csstools/media-query-list-parser@3.0.1(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)":
+  "@csstools/media-query-list-parser@4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)":
     dependencies:
-      "@csstools/css-parser-algorithms": 3.0.1(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-tokenizer": 3.0.1
+      "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-tokenizer": 3.0.3
 
-  "@csstools/postcss-cascade-layers@5.0.0(postcss@8.4.47)":
+  "@csstools/postcss-cascade-layers@5.0.1(postcss@8.4.49)":
     dependencies:
-      "@csstools/selector-specificity": 4.0.0(postcss-selector-parser@6.1.1)
-      postcss: 8.4.47
-      postcss-selector-parser: 6.1.1
+      "@csstools/selector-specificity": 5.0.0(postcss-selector-parser@7.0.0)
+      postcss: 8.4.49
+      postcss-selector-parser: 7.0.0
 
-  "@csstools/postcss-color-function@4.0.2(postcss@8.4.47)":
+  "@csstools/postcss-color-function@4.0.7(postcss@8.4.49)":
     dependencies:
-      "@csstools/css-color-parser": 3.0.2(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-parser-algorithms": 3.0.1(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-tokenizer": 3.0.1
-      "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.47)
-      "@csstools/utilities": 2.0.0(postcss@8.4.47)
-      postcss: 8.4.47
+      "@csstools/css-color-parser": 3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-tokenizer": 3.0.3
+      "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.49)
+      "@csstools/utilities": 2.0.0(postcss@8.4.49)
+      postcss: 8.4.49
 
-  "@csstools/postcss-color-mix-function@3.0.2(postcss@8.4.47)":
+  "@csstools/postcss-color-mix-function@3.0.7(postcss@8.4.49)":
     dependencies:
-      "@csstools/css-color-parser": 3.0.2(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-parser-algorithms": 3.0.1(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-tokenizer": 3.0.1
-      "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.47)
-      "@csstools/utilities": 2.0.0(postcss@8.4.47)
-      postcss: 8.4.47
+      "@csstools/css-color-parser": 3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-tokenizer": 3.0.3
+      "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.49)
+      "@csstools/utilities": 2.0.0(postcss@8.4.49)
+      postcss: 8.4.49
 
-  "@csstools/postcss-content-alt-text@2.0.1(postcss@8.4.47)":
+  "@csstools/postcss-content-alt-text@2.0.4(postcss@8.4.49)":
     dependencies:
-      "@csstools/css-parser-algorithms": 3.0.1(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-tokenizer": 3.0.1
-      "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.47)
-      "@csstools/utilities": 2.0.0(postcss@8.4.47)
-      postcss: 8.4.47
+      "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-tokenizer": 3.0.3
+      "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.49)
+      "@csstools/utilities": 2.0.0(postcss@8.4.49)
+      postcss: 8.4.49
 
-  "@csstools/postcss-exponential-functions@2.0.1(postcss@8.4.47)":
+  "@csstools/postcss-exponential-functions@2.0.6(postcss@8.4.49)":
     dependencies:
-      "@csstools/css-calc": 2.0.1(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-parser-algorithms": 3.0.1(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-tokenizer": 3.0.1
-      postcss: 8.4.47
+      "@csstools/css-calc": 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-tokenizer": 3.0.3
+      postcss: 8.4.49
 
-  "@csstools/postcss-font-format-keywords@4.0.0(postcss@8.4.47)":
+  "@csstools/postcss-font-format-keywords@4.0.0(postcss@8.4.49)":
     dependencies:
-      "@csstools/utilities": 2.0.0(postcss@8.4.47)
-      postcss: 8.4.47
+      "@csstools/utilities": 2.0.0(postcss@8.4.49)
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  "@csstools/postcss-gamut-mapping@2.0.2(postcss@8.4.47)":
+  "@csstools/postcss-gamut-mapping@2.0.7(postcss@8.4.49)":
     dependencies:
-      "@csstools/css-color-parser": 3.0.2(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-parser-algorithms": 3.0.1(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-tokenizer": 3.0.1
-      postcss: 8.4.47
+      "@csstools/css-color-parser": 3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-tokenizer": 3.0.3
+      postcss: 8.4.49
 
-  "@csstools/postcss-gradients-interpolation-method@5.0.2(postcss@8.4.47)":
+  "@csstools/postcss-gradients-interpolation-method@5.0.7(postcss@8.4.49)":
     dependencies:
-      "@csstools/css-color-parser": 3.0.2(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-parser-algorithms": 3.0.1(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-tokenizer": 3.0.1
-      "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.47)
-      "@csstools/utilities": 2.0.0(postcss@8.4.47)
-      postcss: 8.4.47
+      "@csstools/css-color-parser": 3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-tokenizer": 3.0.3
+      "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.49)
+      "@csstools/utilities": 2.0.0(postcss@8.4.49)
+      postcss: 8.4.49
 
-  "@csstools/postcss-hwb-function@4.0.2(postcss@8.4.47)":
+  "@csstools/postcss-hwb-function@4.0.7(postcss@8.4.49)":
     dependencies:
-      "@csstools/css-color-parser": 3.0.2(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-parser-algorithms": 3.0.1(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-tokenizer": 3.0.1
-      "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.47)
-      "@csstools/utilities": 2.0.0(postcss@8.4.47)
-      postcss: 8.4.47
+      "@csstools/css-color-parser": 3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-tokenizer": 3.0.3
+      "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.49)
+      "@csstools/utilities": 2.0.0(postcss@8.4.49)
+      postcss: 8.4.49
 
-  "@csstools/postcss-ic-unit@4.0.0(postcss@8.4.47)":
+  "@csstools/postcss-ic-unit@4.0.0(postcss@8.4.49)":
     dependencies:
-      "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.47)
-      "@csstools/utilities": 2.0.0(postcss@8.4.47)
-      postcss: 8.4.47
+      "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.49)
+      "@csstools/utilities": 2.0.0(postcss@8.4.49)
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  "@csstools/postcss-initial@2.0.0(postcss@8.4.47)":
+  "@csstools/postcss-initial@2.0.0(postcss@8.4.49)":
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
 
-  "@csstools/postcss-is-pseudo-class@5.0.0(postcss@8.4.47)":
+  "@csstools/postcss-is-pseudo-class@5.0.1(postcss@8.4.49)":
     dependencies:
-      "@csstools/selector-specificity": 4.0.0(postcss-selector-parser@6.1.1)
-      postcss: 8.4.47
-      postcss-selector-parser: 6.1.1
+      "@csstools/selector-specificity": 5.0.0(postcss-selector-parser@7.0.0)
+      postcss: 8.4.49
+      postcss-selector-parser: 7.0.0
 
-  "@csstools/postcss-light-dark-function@2.0.4(postcss@8.4.47)":
+  "@csstools/postcss-light-dark-function@2.0.7(postcss@8.4.49)":
     dependencies:
-      "@csstools/css-parser-algorithms": 3.0.1(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-tokenizer": 3.0.1
-      "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.47)
-      "@csstools/utilities": 2.0.0(postcss@8.4.47)
-      postcss: 8.4.47
+      "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-tokenizer": 3.0.3
+      "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.49)
+      "@csstools/utilities": 2.0.0(postcss@8.4.49)
+      postcss: 8.4.49
 
-  "@csstools/postcss-logical-float-and-clear@3.0.0(postcss@8.4.47)":
+  "@csstools/postcss-logical-float-and-clear@3.0.0(postcss@8.4.49)":
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
 
-  "@csstools/postcss-logical-overflow@2.0.0(postcss@8.4.47)":
+  "@csstools/postcss-logical-overflow@2.0.0(postcss@8.4.49)":
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
 
-  "@csstools/postcss-logical-overscroll-behavior@2.0.0(postcss@8.4.47)":
+  "@csstools/postcss-logical-overscroll-behavior@2.0.0(postcss@8.4.49)":
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
 
-  "@csstools/postcss-logical-resize@3.0.0(postcss@8.4.47)":
+  "@csstools/postcss-logical-resize@3.0.0(postcss@8.4.49)":
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  "@csstools/postcss-logical-viewport-units@3.0.1(postcss@8.4.47)":
+  "@csstools/postcss-logical-viewport-units@3.0.3(postcss@8.4.49)":
     dependencies:
-      "@csstools/css-tokenizer": 3.0.1
-      "@csstools/utilities": 2.0.0(postcss@8.4.47)
-      postcss: 8.4.47
+      "@csstools/css-tokenizer": 3.0.3
+      "@csstools/utilities": 2.0.0(postcss@8.4.49)
+      postcss: 8.4.49
 
-  "@csstools/postcss-media-minmax@2.0.1(postcss@8.4.47)":
+  "@csstools/postcss-media-minmax@2.0.6(postcss@8.4.49)":
     dependencies:
-      "@csstools/css-calc": 2.0.1(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-parser-algorithms": 3.0.1(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-tokenizer": 3.0.1
-      "@csstools/media-query-list-parser": 3.0.1(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)
-      postcss: 8.4.47
+      "@csstools/css-calc": 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-tokenizer": 3.0.3
+      "@csstools/media-query-list-parser": 4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+      postcss: 8.4.49
 
-  "@csstools/postcss-media-queries-aspect-ratio-number-values@3.0.1(postcss@8.4.47)":
+  "@csstools/postcss-media-queries-aspect-ratio-number-values@3.0.4(postcss@8.4.49)":
     dependencies:
-      "@csstools/css-parser-algorithms": 3.0.1(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-tokenizer": 3.0.1
-      "@csstools/media-query-list-parser": 3.0.1(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)
-      postcss: 8.4.47
+      "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-tokenizer": 3.0.3
+      "@csstools/media-query-list-parser": 4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+      postcss: 8.4.49
 
-  "@csstools/postcss-nested-calc@4.0.0(postcss@8.4.47)":
+  "@csstools/postcss-nested-calc@4.0.0(postcss@8.4.49)":
     dependencies:
-      "@csstools/utilities": 2.0.0(postcss@8.4.47)
-      postcss: 8.4.47
+      "@csstools/utilities": 2.0.0(postcss@8.4.49)
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  "@csstools/postcss-normalize-display-values@4.0.0(postcss@8.4.47)":
+  "@csstools/postcss-normalize-display-values@4.0.0(postcss@8.4.49)":
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  "@csstools/postcss-oklab-function@4.0.2(postcss@8.4.47)":
+  "@csstools/postcss-oklab-function@4.0.7(postcss@8.4.49)":
     dependencies:
-      "@csstools/css-color-parser": 3.0.2(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-parser-algorithms": 3.0.1(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-tokenizer": 3.0.1
-      "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.47)
-      "@csstools/utilities": 2.0.0(postcss@8.4.47)
-      postcss: 8.4.47
+      "@csstools/css-color-parser": 3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-tokenizer": 3.0.3
+      "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.49)
+      "@csstools/utilities": 2.0.0(postcss@8.4.49)
+      postcss: 8.4.49
 
-  "@csstools/postcss-progressive-custom-properties@4.0.0(postcss@8.4.47)":
+  "@csstools/postcss-progressive-custom-properties@4.0.0(postcss@8.4.49)":
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  "@csstools/postcss-relative-color-syntax@3.0.2(postcss@8.4.47)":
+  "@csstools/postcss-random-function@1.0.2(postcss@8.4.49)":
     dependencies:
-      "@csstools/css-color-parser": 3.0.2(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-parser-algorithms": 3.0.1(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-tokenizer": 3.0.1
-      "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.47)
-      "@csstools/utilities": 2.0.0(postcss@8.4.47)
-      postcss: 8.4.47
+      "@csstools/css-calc": 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-tokenizer": 3.0.3
+      postcss: 8.4.49
 
-  "@csstools/postcss-scope-pseudo-class@4.0.0(postcss@8.4.47)":
+  "@csstools/postcss-relative-color-syntax@3.0.7(postcss@8.4.49)":
     dependencies:
-      postcss: 8.4.47
-      postcss-selector-parser: 6.1.1
+      "@csstools/css-color-parser": 3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-tokenizer": 3.0.3
+      "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.49)
+      "@csstools/utilities": 2.0.0(postcss@8.4.49)
+      postcss: 8.4.49
 
-  "@csstools/postcss-stepped-value-functions@4.0.1(postcss@8.4.47)":
+  "@csstools/postcss-scope-pseudo-class@4.0.1(postcss@8.4.49)":
     dependencies:
-      "@csstools/css-calc": 2.0.1(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-parser-algorithms": 3.0.1(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-tokenizer": 3.0.1
-      postcss: 8.4.47
+      postcss: 8.4.49
+      postcss-selector-parser: 7.0.0
 
-  "@csstools/postcss-text-decoration-shorthand@4.0.1(postcss@8.4.47)":
+  "@csstools/postcss-sign-functions@1.1.1(postcss@8.4.49)":
     dependencies:
-      "@csstools/color-helpers": 5.0.1
-      postcss: 8.4.47
-      postcss-value-parser: 4.2.0
+      "@csstools/css-calc": 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-tokenizer": 3.0.3
+      postcss: 8.4.49
 
-  "@csstools/postcss-trigonometric-functions@4.0.1(postcss@8.4.47)":
+  "@csstools/postcss-stepped-value-functions@4.0.6(postcss@8.4.49)":
     dependencies:
-      "@csstools/css-calc": 2.0.1(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-parser-algorithms": 3.0.1(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-tokenizer": 3.0.1
-      postcss: 8.4.47
+      "@csstools/css-calc": 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-tokenizer": 3.0.3
+      postcss: 8.4.49
 
-  "@csstools/postcss-unset-value@4.0.0(postcss@8.4.47)":
+  "@csstools/postcss-text-decoration-shorthand@4.0.1(postcss@8.4.49)":
     dependencies:
-      postcss: 8.4.47
+      "@csstools/color-helpers": 5.0.1
+      postcss: 8.4.49
+      postcss-value-parser: 4.2.0
 
-  "@csstools/selector-resolve-nested@2.0.0(postcss-selector-parser@6.1.1)":
+  "@csstools/postcss-trigonometric-functions@4.0.6(postcss@8.4.49)":
     dependencies:
-      postcss-selector-parser: 6.1.1
+      "@csstools/css-calc": 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-tokenizer": 3.0.3
+      postcss: 8.4.49
 
-  "@csstools/selector-specificity@4.0.0(postcss-selector-parser@6.1.1)":
+  "@csstools/postcss-unset-value@4.0.0(postcss@8.4.49)":
     dependencies:
-      postcss-selector-parser: 6.1.1
+      postcss: 8.4.49
 
-  "@csstools/selector-specificity@4.0.0(postcss-selector-parser@6.1.2)":
+  "@csstools/selector-resolve-nested@3.0.0(postcss-selector-parser@7.0.0)":
     dependencies:
-      postcss-selector-parser: 6.1.2
+      postcss-selector-parser: 7.0.0
+
+  "@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.0.0)":
+    dependencies:
+      postcss-selector-parser: 7.0.0
 
-  "@csstools/utilities@2.0.0(postcss@8.4.47)":
+  "@csstools/utilities@2.0.0(postcss@8.4.49)":
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
 
   "@dual-bundle/import-meta-resolve@4.1.0": {}
 
-  "@esbuild/aix-ppc64@0.21.5":
+  "@esbuild/aix-ppc64@0.24.2":
+    optional: true
+
+  "@esbuild/android-arm64@0.24.2":
+    optional: true
+
+  "@esbuild/android-arm@0.24.2":
     optional: true
 
-  "@esbuild/android-arm64@0.21.5":
+  "@esbuild/android-x64@0.24.2":
     optional: true
 
-  "@esbuild/android-arm@0.21.5":
+  "@esbuild/darwin-arm64@0.24.2":
     optional: true
 
-  "@esbuild/android-x64@0.21.5":
+  "@esbuild/darwin-x64@0.24.2":
     optional: true
 
-  "@esbuild/darwin-arm64@0.21.5":
+  "@esbuild/freebsd-arm64@0.24.2":
     optional: true
 
-  "@esbuild/darwin-x64@0.21.5":
+  "@esbuild/freebsd-x64@0.24.2":
     optional: true
 
-  "@esbuild/freebsd-arm64@0.21.5":
+  "@esbuild/linux-arm64@0.24.2":
     optional: true
 
-  "@esbuild/freebsd-x64@0.21.5":
+  "@esbuild/linux-arm@0.24.2":
     optional: true
 
-  "@esbuild/linux-arm64@0.21.5":
+  "@esbuild/linux-ia32@0.24.2":
     optional: true
 
-  "@esbuild/linux-arm@0.21.5":
+  "@esbuild/linux-loong64@0.24.2":
     optional: true
 
-  "@esbuild/linux-ia32@0.21.5":
+  "@esbuild/linux-mips64el@0.24.2":
     optional: true
 
-  "@esbuild/linux-loong64@0.21.5":
+  "@esbuild/linux-ppc64@0.24.2":
     optional: true
 
-  "@esbuild/linux-mips64el@0.21.5":
+  "@esbuild/linux-riscv64@0.24.2":
     optional: true
 
-  "@esbuild/linux-ppc64@0.21.5":
+  "@esbuild/linux-s390x@0.24.2":
     optional: true
 
-  "@esbuild/linux-riscv64@0.21.5":
+  "@esbuild/linux-x64@0.24.2":
     optional: true
 
-  "@esbuild/linux-s390x@0.21.5":
+  "@esbuild/netbsd-arm64@0.24.2":
     optional: true
 
-  "@esbuild/linux-x64@0.21.5":
+  "@esbuild/netbsd-x64@0.24.2":
     optional: true
 
-  "@esbuild/netbsd-x64@0.21.5":
+  "@esbuild/openbsd-arm64@0.24.2":
     optional: true
 
-  "@esbuild/openbsd-x64@0.21.5":
+  "@esbuild/openbsd-x64@0.24.2":
     optional: true
 
-  "@esbuild/sunos-x64@0.21.5":
+  "@esbuild/sunos-x64@0.24.2":
     optional: true
 
-  "@esbuild/win32-arm64@0.21.5":
+  "@esbuild/win32-arm64@0.24.2":
     optional: true
 
-  "@esbuild/win32-ia32@0.21.5":
+  "@esbuild/win32-ia32@0.24.2":
     optional: true
 
-  "@esbuild/win32-x64@0.21.5":
+  "@esbuild/win32-x64@0.24.2":
     optional: true
 
-  "@eslint-community/eslint-utils@4.4.0(eslint@8.57.1)":
+  "@eslint-community/eslint-utils@4.4.0(eslint@9.17.0(jiti@2.4.2))":
     dependencies:
-      eslint: 8.57.1
+      eslint: 9.17.0(jiti@2.4.2)
       eslint-visitor-keys: 3.4.3
 
   "@eslint-community/regexpp@4.10.0": {}
 
-  "@eslint/eslintrc@2.1.4":
+  "@eslint-community/regexpp@4.12.1": {}
+
+  "@eslint/config-array@0.19.1":
+    dependencies:
+      "@eslint/object-schema": 2.1.5
+      debug: 4.3.6
+      minimatch: 3.1.2
+    transitivePeerDependencies:
+      - supports-color
+
+  "@eslint/core@0.9.1":
+    dependencies:
+      "@types/json-schema": 7.0.15
+
+  "@eslint/eslintrc@3.2.0":
     dependencies:
       ajv: 6.12.6
       debug: 4.3.6
-      espree: 9.6.1
-      globals: 13.24.0
-      ignore: 5.3.1
+      espree: 10.3.0
+      globals: 14.0.0
+      ignore: 5.3.2
       import-fresh: 3.3.0
       js-yaml: 4.1.0
       minimatch: 3.1.2
@@ -10820,18 +10977,24 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  "@eslint/js@8.57.1": {}
+  "@eslint/js@9.17.0": {}
+
+  "@eslint/object-schema@2.1.5": {}
+
+  "@eslint/plugin-kit@0.2.4":
+    dependencies:
+      levn: 0.4.1
 
   "@floating-ui/core@1.6.4":
     dependencies:
-      "@floating-ui/utils": 0.2.8
+      "@floating-ui/utils": 0.2.9
 
-  "@floating-ui/dom@1.6.11":
+  "@floating-ui/dom@1.6.13":
     dependencies:
       "@floating-ui/core": 1.6.4
-      "@floating-ui/utils": 0.2.8
+      "@floating-ui/utils": 0.2.9
 
-  "@floating-ui/utils@0.2.8": {}
+  "@floating-ui/utils@0.2.9": {}
 
   "@foliojs-fork/fontkit@1.9.1":
     dependencies:
@@ -10867,19 +11030,20 @@ snapshots:
 
   "@github/markdown-toolbar-element@2.2.3": {}
 
-  "@github/relative-time-element@4.4.3": {}
+  "@github/relative-time-element@4.4.4": {}
+
+  "@humanfs/core@0.19.1": {}
 
-  "@humanwhocodes/config-array@0.13.0":
+  "@humanfs/node@0.16.6":
     dependencies:
-      "@humanwhocodes/object-schema": 2.0.3
-      debug: 4.3.6
-      minimatch: 3.1.2
-    transitivePeerDependencies:
-      - supports-color
+      "@humanfs/core": 0.19.1
+      "@humanwhocodes/retry": 0.3.1
 
   "@humanwhocodes/module-importer@1.0.1": {}
 
-  "@humanwhocodes/object-schema@2.0.3": {}
+  "@humanwhocodes/retry@0.3.1": {}
+
+  "@humanwhocodes/retry@0.4.1": {}
 
   "@isaacs/cliui@8.0.2":
     dependencies:
@@ -10934,6 +11098,8 @@ snapshots:
     dependencies:
       "@lit-labs/ssr-dom-shim": 1.2.0
 
+  "@marijn/find-cluster-break@1.0.2": {}
+
   "@nodelib/fs.scandir@2.1.5":
     dependencies:
       "@nodelib/fs.stat": 2.0.5
@@ -11068,65 +11234,74 @@ snapshots:
     optionalDependencies:
       rollup: 2.79.1
 
-  "@rollup/rollup-android-arm-eabi@4.22.4":
+  "@rollup/rollup-android-arm-eabi@4.30.1":
+    optional: true
+
+  "@rollup/rollup-android-arm64@4.30.1":
     optional: true
 
-  "@rollup/rollup-android-arm64@4.22.4":
+  "@rollup/rollup-darwin-arm64@4.30.1":
     optional: true
 
-  "@rollup/rollup-darwin-arm64@4.22.4":
+  "@rollup/rollup-darwin-x64@4.30.1":
     optional: true
 
-  "@rollup/rollup-darwin-x64@4.22.4":
+  "@rollup/rollup-freebsd-arm64@4.30.1":
     optional: true
 
-  "@rollup/rollup-linux-arm-gnueabihf@4.22.4":
+  "@rollup/rollup-freebsd-x64@4.30.1":
     optional: true
 
-  "@rollup/rollup-linux-arm-musleabihf@4.22.4":
+  "@rollup/rollup-linux-arm-gnueabihf@4.30.1":
     optional: true
 
-  "@rollup/rollup-linux-arm64-gnu@4.22.4":
+  "@rollup/rollup-linux-arm-musleabihf@4.30.1":
     optional: true
 
-  "@rollup/rollup-linux-arm64-musl@4.22.4":
+  "@rollup/rollup-linux-arm64-gnu@4.30.1":
     optional: true
 
-  "@rollup/rollup-linux-powerpc64le-gnu@4.22.4":
+  "@rollup/rollup-linux-arm64-musl@4.30.1":
     optional: true
 
-  "@rollup/rollup-linux-riscv64-gnu@4.22.4":
+  "@rollup/rollup-linux-loongarch64-gnu@4.30.1":
     optional: true
 
-  "@rollup/rollup-linux-s390x-gnu@4.22.4":
+  "@rollup/rollup-linux-powerpc64le-gnu@4.30.1":
     optional: true
 
-  "@rollup/rollup-linux-x64-gnu@4.22.4":
+  "@rollup/rollup-linux-riscv64-gnu@4.30.1":
     optional: true
 
-  "@rollup/rollup-linux-x64-musl@4.22.4":
+  "@rollup/rollup-linux-s390x-gnu@4.30.1":
     optional: true
 
-  "@rollup/rollup-win32-arm64-msvc@4.22.4":
+  "@rollup/rollup-linux-x64-gnu@4.30.1":
     optional: true
 
-  "@rollup/rollup-win32-ia32-msvc@4.22.4":
+  "@rollup/rollup-linux-x64-musl@4.30.1":
     optional: true
 
-  "@rollup/rollup-win32-x64-msvc@4.22.4":
+  "@rollup/rollup-win32-arm64-msvc@4.30.1":
+    optional: true
+
+  "@rollup/rollup-win32-ia32-msvc@4.30.1":
+    optional: true
+
+  "@rollup/rollup-win32-x64-msvc@4.30.1":
     optional: true
 
   "@sec-ant/readable-stream@0.4.1": {}
 
-  "@semantic-release/changelog@6.0.3(semantic-release@24.1.1(typescript@5.5.4))":
+  "@semantic-release/changelog@6.0.3(semantic-release@24.2.1(typescript@5.7.2))":
     dependencies:
       "@semantic-release/error": 3.0.0
       aggregate-error: 3.1.0
       fs-extra: 11.2.0
       lodash: 4.17.21
-      semantic-release: 24.1.1(typescript@5.5.4)
+      semantic-release: 24.2.1(typescript@5.7.2)
 
-  "@semantic-release/commit-analyzer@13.0.0(semantic-release@24.1.1(typescript@5.5.4))":
+  "@semantic-release/commit-analyzer@13.0.0(semantic-release@24.2.1(typescript@5.7.2))":
     dependencies:
       conventional-changelog-angular: 8.0.0
       conventional-changelog-writer: 8.0.0
@@ -11135,8 +11310,8 @@ snapshots:
       debug: 4.3.6
       import-from-esm: 1.3.3
       lodash-es: 4.17.21
-      micromatch: 4.0.7
-      semantic-release: 24.1.1(typescript@5.5.4)
+      micromatch: 4.0.8
+      semantic-release: 24.2.1(typescript@5.7.2)
     transitivePeerDependencies:
       - supports-color
 
@@ -11144,7 +11319,7 @@ snapshots:
 
   "@semantic-release/error@4.0.0": {}
 
-  "@semantic-release/exec@6.0.3(semantic-release@24.1.1(typescript@5.5.4))":
+  "@semantic-release/exec@6.0.3(semantic-release@24.2.1(typescript@5.7.2))":
     dependencies:
       "@semantic-release/error": 3.0.0
       aggregate-error: 3.1.0
@@ -11152,11 +11327,11 @@ snapshots:
       execa: 5.1.1
       lodash: 4.17.21
       parse-json: 5.2.0
-      semantic-release: 24.1.1(typescript@5.5.4)
+      semantic-release: 24.2.1(typescript@5.7.2)
     transitivePeerDependencies:
       - supports-color
 
-  "@semantic-release/git@10.0.1(semantic-release@24.1.1(typescript@5.5.4))":
+  "@semantic-release/git@10.0.1(semantic-release@24.2.1(typescript@5.7.2))":
     dependencies:
       "@semantic-release/error": 3.0.0
       aggregate-error: 3.1.0
@@ -11166,11 +11341,11 @@ snapshots:
       lodash: 4.17.21
       micromatch: 4.0.5
       p-reduce: 2.1.0
-      semantic-release: 24.1.1(typescript@5.5.4)
+      semantic-release: 24.2.1(typescript@5.7.2)
     transitivePeerDependencies:
       - supports-color
 
-  "@semantic-release/github@10.0.3(semantic-release@24.1.1(typescript@5.5.4))":
+  "@semantic-release/github@11.0.1(semantic-release@24.2.1(typescript@5.7.2))":
     dependencies:
       "@octokit/core": 6.1.2
       "@octokit/plugin-paginate-rest": 11.2.0(@octokit/core@6.1.2)
@@ -11187,12 +11362,12 @@ snapshots:
       lodash-es: 4.17.21
       mime: 4.0.1
       p-filter: 4.1.0
-      semantic-release: 24.1.1(typescript@5.5.4)
+      semantic-release: 24.2.1(typescript@5.7.2)
       url-join: 5.0.0
     transitivePeerDependencies:
       - supports-color
 
-  "@semantic-release/gitlab@13.2.1(semantic-release@24.1.1(typescript@5.5.4))":
+  "@semantic-release/gitlab@13.2.3(semantic-release@24.2.1(typescript@5.7.2))":
     dependencies:
       "@semantic-release/error": 4.0.0
       aggregate-error: 5.0.0
@@ -11206,12 +11381,12 @@ snapshots:
       hpagent: 1.2.0
       lodash-es: 4.17.21
       parse-url: 9.0.1
-      semantic-release: 24.1.1(typescript@5.5.4)
+      semantic-release: 24.2.1(typescript@5.7.2)
       url-join: 4.0.1
     transitivePeerDependencies:
       - supports-color
 
-  "@semantic-release/npm@12.0.0(semantic-release@24.1.1(typescript@5.5.4))":
+  "@semantic-release/npm@12.0.0(semantic-release@24.2.1(typescript@5.7.2))":
     dependencies:
       "@semantic-release/error": 4.0.0
       aggregate-error: 5.0.0
@@ -11224,11 +11399,11 @@ snapshots:
       rc: 1.2.8
       read-pkg: 9.0.1
       registry-auth-token: 5.0.2
-      semantic-release: 24.1.1(typescript@5.5.4)
+      semantic-release: 24.2.1(typescript@5.7.2)
       semver: 7.6.0
       tempy: 3.1.0
 
-  "@semantic-release/release-notes-generator@14.0.1(semantic-release@24.1.1(typescript@5.5.4))":
+  "@semantic-release/release-notes-generator@14.0.1(semantic-release@24.2.1(typescript@5.7.2))":
     dependencies:
       conventional-changelog-angular: 8.0.0
       conventional-changelog-writer: 8.0.0
@@ -11240,7 +11415,7 @@ snapshots:
       into-stream: 7.0.0
       lodash-es: 4.17.21
       read-package-up: 11.0.0
-      semantic-release: 24.1.1(typescript@5.5.4)
+      semantic-release: 24.2.1(typescript@5.7.2)
     transitivePeerDependencies:
       - supports-color
 
@@ -11265,23 +11440,23 @@ snapshots:
     dependencies:
       defer-to-connect: 2.0.1
 
-  "@tailwindcss/forms@0.5.9(tailwindcss@3.4.13)":
+  "@tailwindcss/forms@0.5.10(tailwindcss@3.4.17)":
     dependencies:
       mini-svg-data-uri: 1.4.4
-      tailwindcss: 3.4.13
+      tailwindcss: 3.4.17
 
-  "@tailwindcss/nesting@0.0.0-insiders.565cd3e(postcss@8.4.47)":
+  "@tailwindcss/nesting@0.0.0-insiders.565cd3e(postcss@8.4.49)":
     dependencies:
-      postcss: 8.4.47
-      postcss-nested: 5.0.6(postcss@8.4.47)
+      postcss: 8.4.49
+      postcss-nested: 5.0.6(postcss@8.4.49)
 
-  "@tailwindcss/typography@0.5.15(tailwindcss@3.4.13)":
+  "@tailwindcss/typography@0.5.16(tailwindcss@3.4.17)":
     dependencies:
       lodash.castarray: 4.4.0
       lodash.isplainobject: 4.0.6
       lodash.merge: 4.6.2
       postcss-selector-parser: 6.0.10
-      tailwindcss: 3.4.13
+      tailwindcss: 3.4.17
 
   "@trysound/sax@0.2.0": {}
 
@@ -11293,13 +11468,17 @@ snapshots:
 
   "@types/estree@1.0.5": {}
 
+  "@types/estree@1.0.6": {}
+
   "@types/fscreen@1.0.4": {}
 
   "@types/geojson@7946.0.13": {}
 
   "@types/http-cache-semantics@4.0.4": {}
 
-  "@types/leaflet@1.9.12":
+  "@types/json-schema@7.0.15": {}
+
+  "@types/leaflet@1.9.16":
     dependencies:
       "@types/geojson": 7946.0.13
 
@@ -11317,88 +11496,82 @@ snapshots:
 
   "@types/trusted-types@2.0.7": {}
 
-  "@typescript-eslint/eslint-plugin@8.7.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4)":
+  "@typescript-eslint/eslint-plugin@8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2)":
     dependencies:
       "@eslint-community/regexpp": 4.10.0
-      "@typescript-eslint/parser": 8.7.0(eslint@8.57.1)(typescript@5.5.4)
-      "@typescript-eslint/scope-manager": 8.7.0
-      "@typescript-eslint/type-utils": 8.7.0(eslint@8.57.1)(typescript@5.5.4)
-      "@typescript-eslint/utils": 8.7.0(eslint@8.57.1)(typescript@5.5.4)
-      "@typescript-eslint/visitor-keys": 8.7.0
-      eslint: 8.57.1
+      "@typescript-eslint/parser": 8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2)
+      "@typescript-eslint/scope-manager": 8.19.1
+      "@typescript-eslint/type-utils": 8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2)
+      "@typescript-eslint/utils": 8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2)
+      "@typescript-eslint/visitor-keys": 8.19.1
+      eslint: 9.17.0(jiti@2.4.2)
       graphemer: 1.4.0
-      ignore: 5.3.1
+      ignore: 5.3.2
       natural-compare: 1.4.0
-      ts-api-utils: 1.3.0(typescript@5.5.4)
-    optionalDependencies:
-      typescript: 5.5.4
+      ts-api-utils: 2.0.0(typescript@5.7.2)
+      typescript: 5.7.2
     transitivePeerDependencies:
       - supports-color
 
-  "@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.5.4)":
+  "@typescript-eslint/parser@8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2)":
     dependencies:
-      "@typescript-eslint/scope-manager": 8.7.0
-      "@typescript-eslint/types": 8.7.0
-      "@typescript-eslint/typescript-estree": 8.7.0(typescript@5.5.4)
-      "@typescript-eslint/visitor-keys": 8.7.0
+      "@typescript-eslint/scope-manager": 8.19.1
+      "@typescript-eslint/types": 8.19.1
+      "@typescript-eslint/typescript-estree": 8.19.1(typescript@5.7.2)
+      "@typescript-eslint/visitor-keys": 8.19.1
       debug: 4.3.6
-      eslint: 8.57.1
-    optionalDependencies:
-      typescript: 5.5.4
+      eslint: 9.17.0(jiti@2.4.2)
+      typescript: 5.7.2
     transitivePeerDependencies:
       - supports-color
 
-  "@typescript-eslint/scope-manager@8.7.0":
+  "@typescript-eslint/scope-manager@8.19.1":
     dependencies:
-      "@typescript-eslint/types": 8.7.0
-      "@typescript-eslint/visitor-keys": 8.7.0
+      "@typescript-eslint/types": 8.19.1
+      "@typescript-eslint/visitor-keys": 8.19.1
 
-  "@typescript-eslint/type-utils@8.7.0(eslint@8.57.1)(typescript@5.5.4)":
+  "@typescript-eslint/type-utils@8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2)":
     dependencies:
-      "@typescript-eslint/typescript-estree": 8.7.0(typescript@5.5.4)
-      "@typescript-eslint/utils": 8.7.0(eslint@8.57.1)(typescript@5.5.4)
+      "@typescript-eslint/typescript-estree": 8.19.1(typescript@5.7.2)
+      "@typescript-eslint/utils": 8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2)
       debug: 4.3.6
-      ts-api-utils: 1.3.0(typescript@5.5.4)
-    optionalDependencies:
-      typescript: 5.5.4
+      eslint: 9.17.0(jiti@2.4.2)
+      ts-api-utils: 2.0.0(typescript@5.7.2)
+      typescript: 5.7.2
     transitivePeerDependencies:
-      - eslint
       - supports-color
 
-  "@typescript-eslint/types@8.7.0": {}
+  "@typescript-eslint/types@8.19.1": {}
 
-  "@typescript-eslint/typescript-estree@8.7.0(typescript@5.5.4)":
+  "@typescript-eslint/typescript-estree@8.19.1(typescript@5.7.2)":
     dependencies:
-      "@typescript-eslint/types": 8.7.0
-      "@typescript-eslint/visitor-keys": 8.7.0
+      "@typescript-eslint/types": 8.19.1
+      "@typescript-eslint/visitor-keys": 8.19.1
       debug: 4.3.6
       fast-glob: 3.3.2
       is-glob: 4.0.3
       minimatch: 9.0.4
       semver: 7.6.0
-      ts-api-utils: 1.3.0(typescript@5.5.4)
-    optionalDependencies:
-      typescript: 5.5.4
+      ts-api-utils: 2.0.0(typescript@5.7.2)
+      typescript: 5.7.2
     transitivePeerDependencies:
       - supports-color
 
-  "@typescript-eslint/utils@8.7.0(eslint@8.57.1)(typescript@5.5.4)":
+  "@typescript-eslint/utils@8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2)":
     dependencies:
-      "@eslint-community/eslint-utils": 4.4.0(eslint@8.57.1)
-      "@typescript-eslint/scope-manager": 8.7.0
-      "@typescript-eslint/types": 8.7.0
-      "@typescript-eslint/typescript-estree": 8.7.0(typescript@5.5.4)
-      eslint: 8.57.1
+      "@eslint-community/eslint-utils": 4.4.0(eslint@9.17.0(jiti@2.4.2))
+      "@typescript-eslint/scope-manager": 8.19.1
+      "@typescript-eslint/types": 8.19.1
+      "@typescript-eslint/typescript-estree": 8.19.1(typescript@5.7.2)
+      eslint: 9.17.0(jiti@2.4.2)
+      typescript: 5.7.2
     transitivePeerDependencies:
       - supports-color
-      - typescript
 
-  "@typescript-eslint/visitor-keys@8.7.0":
+  "@typescript-eslint/visitor-keys@8.19.1":
     dependencies:
-      "@typescript-eslint/types": 8.7.0
-      eslint-visitor-keys: 3.4.3
-
-  "@ungap/structured-clone@1.2.0": {}
+      "@typescript-eslint/types": 8.19.1
+      eslint-visitor-keys: 4.2.0
 
   "@vime/core@5.4.1":
     dependencies:
@@ -11413,9 +11586,9 @@ snapshots:
       jsonparse: 1.3.1
       through: 2.3.8
 
-  acorn-jsx@5.3.2(acorn@8.12.0):
+  acorn-jsx@5.3.2(acorn@8.14.0):
     dependencies:
-      acorn: 8.12.0
+      acorn: 8.14.0
 
   acorn-node@1.8.2:
     dependencies:
@@ -11427,10 +11600,10 @@ snapshots:
 
   acorn@7.4.1: {}
 
-  acorn@8.11.3: {}
-
   acorn@8.12.0: {}
 
+  acorn@8.14.0: {}
+
   agent-base@7.1.0:
     dependencies:
       debug: 4.3.6
@@ -11555,14 +11728,14 @@ snapshots:
 
   at-least-node@1.0.0: {}
 
-  autoprefixer@10.4.19(postcss@8.4.47):
+  autoprefixer@10.4.19(postcss@8.4.49):
     dependencies:
-      browserslist: 4.23.1
-      caniuse-lite: 1.0.30001639
+      browserslist: 4.23.3
+      caniuse-lite: 1.0.30001663
       fraction.js: 4.3.7
       normalize-range: 0.1.2
-      picocolors: 1.0.1
-      postcss: 8.4.47
+      picocolors: 1.1.0
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
   available-typed-arrays@1.0.5: {}
@@ -11651,20 +11824,6 @@ snapshots:
       ast-types: 0.7.8
       browser-resolve: 1.11.3
 
-  browserslist@4.23.0:
-    dependencies:
-      caniuse-lite: 1.0.30001612
-      electron-to-chromium: 1.4.689
-      node-releases: 2.0.14
-      update-browserslist-db: 1.0.13(browserslist@4.23.0)
-
-  browserslist@4.23.1:
-    dependencies:
-      caniuse-lite: 1.0.30001639
-      electron-to-chromium: 1.4.815
-      node-releases: 2.0.14
-      update-browserslist-db: 1.0.16(browserslist@4.23.1)
-
   browserslist@4.23.3:
     dependencies:
       caniuse-lite: 1.0.30001663
@@ -11716,8 +11875,6 @@ snapshots:
       lodash.memoize: 4.1.2
       lodash.uniq: 4.5.0
 
-  caniuse-lite@1.0.30001612: {}
-
   caniuse-lite@1.0.30001639: {}
 
   caniuse-lite@1.0.30001663: {}
@@ -11735,6 +11892,8 @@ snapshots:
 
   chalk@5.3.0: {}
 
+  chalk@5.4.1: {}
+
   char-regex@1.0.2: {}
 
   chardet@0.7.0: {}
@@ -11745,7 +11904,7 @@ snapshots:
       fuse.js: 6.6.2
       redux: 4.2.1
 
-  chokidar@3.5.3:
+  chokidar@3.6.0:
     dependencies:
       anymatch: 3.1.3
       braces: 3.0.3
@@ -11757,7 +11916,7 @@ snapshots:
     optionalDependencies:
       fsevents: 2.3.3
 
-  ci-info@3.9.0: {}
+  ci-info@4.1.0: {}
 
   clean-stack@2.2.0: {}
 
@@ -11819,13 +11978,13 @@ snapshots:
 
   codemirror@6.0.1(@lezer/common@1.2.0):
     dependencies:
-      "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0)(@lezer/common@1.2.0)
-      "@codemirror/commands": 6.6.2
-      "@codemirror/language": 6.10.3
+      "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.10.8)(@codemirror/state@6.5.0)(@codemirror/view@6.36.1)(@lezer/common@1.2.0)
+      "@codemirror/commands": 6.7.1
+      "@codemirror/language": 6.10.8
       "@codemirror/lint": 6.4.2
       "@codemirror/search": 6.5.5
-      "@codemirror/state": 6.4.1
-      "@codemirror/view": 6.33.0
+      "@codemirror/state": 6.5.0
+      "@codemirror/view": 6.36.1
     transitivePeerDependencies:
       - "@lezer/common"
 
@@ -11853,10 +12012,10 @@ snapshots:
 
   commander@7.2.0: {}
 
-  commitizen@4.3.0(@types/node@20.10.5)(typescript@5.5.4):
+  commitizen@4.3.1(@types/node@20.10.5)(typescript@5.7.2):
     dependencies:
       cachedir: 2.3.0
-      cz-conventional-changelog: 3.3.0(@types/node@20.10.5)(typescript@5.5.4)
+      cz-conventional-changelog: 3.3.0(@types/node@20.10.5)(typescript@5.7.2)
       dedent: 0.7.0
       detect-indent: 6.1.0
       find-node-modules: 2.1.3
@@ -11937,45 +12096,45 @@ snapshots:
 
   core-js-compat@3.35.0:
     dependencies:
-      browserslist: 4.23.0
+      browserslist: 4.23.3
 
   core-js@3.35.0: {}
 
   core-util-is@1.0.3: {}
 
-  cosmiconfig-typescript-loader@5.0.0(@types/node@20.10.5)(cosmiconfig@8.3.6(typescript@5.5.4))(typescript@5.5.4):
+  cosmiconfig-typescript-loader@5.0.0(@types/node@20.10.5)(cosmiconfig@8.3.6(typescript@5.7.2))(typescript@5.7.2):
     dependencies:
       "@types/node": 20.10.5
-      cosmiconfig: 8.3.6(typescript@5.5.4)
+      cosmiconfig: 8.3.6(typescript@5.7.2)
       jiti: 1.21.0
-      typescript: 5.5.4
+      typescript: 5.7.2
     optional: true
 
-  cosmiconfig-typescript-loader@5.0.0(@types/node@20.10.5)(cosmiconfig@9.0.0(typescript@5.5.4))(typescript@5.5.4):
+  cosmiconfig-typescript-loader@6.1.0(@types/node@20.10.5)(cosmiconfig@9.0.0(typescript@5.7.2))(typescript@5.7.2):
     dependencies:
       "@types/node": 20.10.5
-      cosmiconfig: 9.0.0(typescript@5.5.4)
-      jiti: 1.21.0
-      typescript: 5.5.4
+      cosmiconfig: 9.0.0(typescript@5.7.2)
+      jiti: 2.4.2
+      typescript: 5.7.2
 
-  cosmiconfig@8.3.6(typescript@5.5.4):
+  cosmiconfig@8.3.6(typescript@5.7.2):
     dependencies:
       import-fresh: 3.3.0
       js-yaml: 4.1.0
       parse-json: 5.2.0
       path-type: 4.0.0
     optionalDependencies:
-      typescript: 5.5.4
+      typescript: 5.7.2
     optional: true
 
-  cosmiconfig@9.0.0(typescript@5.5.4):
+  cosmiconfig@9.0.0(typescript@5.7.2):
     dependencies:
       env-paths: 2.2.1
       import-fresh: 3.3.0
       js-yaml: 4.1.0
       parse-json: 5.2.0
     optionalDependencies:
-      typescript: 5.5.4
+      typescript: 5.7.2
 
   crelt@1.0.6: {}
 
@@ -11989,6 +12148,12 @@ snapshots:
       shebang-command: 2.0.0
       which: 2.0.2
 
+  cross-spawn@7.0.6:
+    dependencies:
+      path-key: 3.1.1
+      shebang-command: 2.0.0
+      which: 2.0.2
+
   crypto-js@4.2.0: {}
 
   crypto-random-string@2.0.0: {}
@@ -11997,27 +12162,27 @@ snapshots:
     dependencies:
       type-fest: 1.4.0
 
-  css-blank-pseudo@7.0.0(postcss@8.4.47):
+  css-blank-pseudo@7.0.1(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
-      postcss-selector-parser: 6.1.1
+      postcss: 8.4.49
+      postcss-selector-parser: 7.0.0
 
-  css-declaration-sorter@7.2.0(postcss@8.4.47):
+  css-declaration-sorter@7.2.0(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
 
-  css-functions-list@3.2.2: {}
+  css-functions-list@3.2.3: {}
 
-  css-has-pseudo@7.0.0(postcss@8.4.47):
+  css-has-pseudo@7.0.2(postcss@8.4.49):
     dependencies:
-      "@csstools/selector-specificity": 4.0.0(postcss-selector-parser@6.1.1)
-      postcss: 8.4.47
-      postcss-selector-parser: 6.1.1
+      "@csstools/selector-specificity": 5.0.0(postcss-selector-parser@7.0.0)
+      postcss: 8.4.49
+      postcss-selector-parser: 7.0.0
       postcss-value-parser: 4.2.0
 
-  css-prefers-color-scheme@10.0.0(postcss@8.4.47):
+  css-prefers-color-scheme@10.0.0(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
 
   css-select@5.1.0:
     dependencies:
@@ -12037,70 +12202,75 @@ snapshots:
       mdn-data: 2.0.30
       source-map-js: 1.2.0
 
+  css-tree@3.1.0:
+    dependencies:
+      mdn-data: 2.12.2
+      source-map-js: 1.2.1
+
   css-what@6.1.0: {}
 
-  cssdb@8.1.1: {}
+  cssdb@8.2.3: {}
 
   cssesc@3.0.0: {}
 
-  cssnano-preset-default@7.0.6(postcss@8.4.47):
+  cssnano-preset-default@7.0.6(postcss@8.4.49):
     dependencies:
       browserslist: 4.23.3
-      css-declaration-sorter: 7.2.0(postcss@8.4.47)
-      cssnano-utils: 5.0.0(postcss@8.4.47)
-      postcss: 8.4.47
-      postcss-calc: 10.0.2(postcss@8.4.47)
-      postcss-colormin: 7.0.2(postcss@8.4.47)
-      postcss-convert-values: 7.0.4(postcss@8.4.47)
-      postcss-discard-comments: 7.0.3(postcss@8.4.47)
-      postcss-discard-duplicates: 7.0.1(postcss@8.4.47)
-      postcss-discard-empty: 7.0.0(postcss@8.4.47)
-      postcss-discard-overridden: 7.0.0(postcss@8.4.47)
-      postcss-merge-longhand: 7.0.4(postcss@8.4.47)
-      postcss-merge-rules: 7.0.4(postcss@8.4.47)
-      postcss-minify-font-values: 7.0.0(postcss@8.4.47)
-      postcss-minify-gradients: 7.0.0(postcss@8.4.47)
-      postcss-minify-params: 7.0.2(postcss@8.4.47)
-      postcss-minify-selectors: 7.0.4(postcss@8.4.47)
-      postcss-normalize-charset: 7.0.0(postcss@8.4.47)
-      postcss-normalize-display-values: 7.0.0(postcss@8.4.47)
-      postcss-normalize-positions: 7.0.0(postcss@8.4.47)
-      postcss-normalize-repeat-style: 7.0.0(postcss@8.4.47)
-      postcss-normalize-string: 7.0.0(postcss@8.4.47)
-      postcss-normalize-timing-functions: 7.0.0(postcss@8.4.47)
-      postcss-normalize-unicode: 7.0.2(postcss@8.4.47)
-      postcss-normalize-url: 7.0.0(postcss@8.4.47)
-      postcss-normalize-whitespace: 7.0.0(postcss@8.4.47)
-      postcss-ordered-values: 7.0.1(postcss@8.4.47)
-      postcss-reduce-initial: 7.0.2(postcss@8.4.47)
-      postcss-reduce-transforms: 7.0.0(postcss@8.4.47)
-      postcss-svgo: 7.0.1(postcss@8.4.47)
-      postcss-unique-selectors: 7.0.3(postcss@8.4.47)
-
-  cssnano-utils@5.0.0(postcss@8.4.47):
-    dependencies:
-      postcss: 8.4.47
-
-  cssnano@7.0.6(postcss@8.4.47):
-    dependencies:
-      cssnano-preset-default: 7.0.6(postcss@8.4.47)
+      css-declaration-sorter: 7.2.0(postcss@8.4.49)
+      cssnano-utils: 5.0.0(postcss@8.4.49)
+      postcss: 8.4.49
+      postcss-calc: 10.0.2(postcss@8.4.49)
+      postcss-colormin: 7.0.2(postcss@8.4.49)
+      postcss-convert-values: 7.0.4(postcss@8.4.49)
+      postcss-discard-comments: 7.0.3(postcss@8.4.49)
+      postcss-discard-duplicates: 7.0.1(postcss@8.4.49)
+      postcss-discard-empty: 7.0.0(postcss@8.4.49)
+      postcss-discard-overridden: 7.0.0(postcss@8.4.49)
+      postcss-merge-longhand: 7.0.4(postcss@8.4.49)
+      postcss-merge-rules: 7.0.4(postcss@8.4.49)
+      postcss-minify-font-values: 7.0.0(postcss@8.4.49)
+      postcss-minify-gradients: 7.0.0(postcss@8.4.49)
+      postcss-minify-params: 7.0.2(postcss@8.4.49)
+      postcss-minify-selectors: 7.0.4(postcss@8.4.49)
+      postcss-normalize-charset: 7.0.0(postcss@8.4.49)
+      postcss-normalize-display-values: 7.0.0(postcss@8.4.49)
+      postcss-normalize-positions: 7.0.0(postcss@8.4.49)
+      postcss-normalize-repeat-style: 7.0.0(postcss@8.4.49)
+      postcss-normalize-string: 7.0.0(postcss@8.4.49)
+      postcss-normalize-timing-functions: 7.0.0(postcss@8.4.49)
+      postcss-normalize-unicode: 7.0.2(postcss@8.4.49)
+      postcss-normalize-url: 7.0.0(postcss@8.4.49)
+      postcss-normalize-whitespace: 7.0.0(postcss@8.4.49)
+      postcss-ordered-values: 7.0.1(postcss@8.4.49)
+      postcss-reduce-initial: 7.0.2(postcss@8.4.49)
+      postcss-reduce-transforms: 7.0.0(postcss@8.4.49)
+      postcss-svgo: 7.0.1(postcss@8.4.49)
+      postcss-unique-selectors: 7.0.3(postcss@8.4.49)
+
+  cssnano-utils@5.0.0(postcss@8.4.49):
+    dependencies:
+      postcss: 8.4.49
+
+  cssnano@7.0.6(postcss@8.4.49):
+    dependencies:
+      cssnano-preset-default: 7.0.6(postcss@8.4.49)
       lilconfig: 3.1.2
-      postcss: 8.4.47
+      postcss: 8.4.49
 
   csso@5.0.5:
     dependencies:
       css-tree: 2.2.1
 
-  cz-conventional-changelog@3.3.0(@types/node@20.10.5)(typescript@5.5.4):
+  cz-conventional-changelog@3.3.0(@types/node@20.10.5)(typescript@5.7.2):
     dependencies:
       chalk: 2.4.2
-      commitizen: 4.3.0(@types/node@20.10.5)(typescript@5.5.4)
+      commitizen: 4.3.1(@types/node@20.10.5)(typescript@5.7.2)
       conventional-commit-types: 3.0.0
       lodash.map: 4.6.0
       longest: 2.0.1
       word-wrap: 1.2.5
     optionalDependencies:
-      "@commitlint/load": 18.6.1(@types/node@20.10.5)(typescript@5.5.4)
+      "@commitlint/load": 18.6.1(@types/node@20.10.5)(typescript@5.7.2)
     transitivePeerDependencies:
       - "@types/node"
       - typescript
@@ -12167,6 +12337,10 @@ snapshots:
     dependencies:
       ms: 2.1.2
 
+  debug@4.4.0:
+    dependencies:
+      ms: 2.1.3
+
   decamelize@1.2.0: {}
 
   decompress-response@6.0.0:
@@ -12222,10 +12396,6 @@ snapshots:
 
   dlv@1.1.3: {}
 
-  doctrine@3.0.0:
-    dependencies:
-      esutils: 2.0.3
-
   dom-serializer@2.0.0:
     dependencies:
       domelementtype: 2.3.0
@@ -12258,10 +12428,6 @@ snapshots:
     dependencies:
       jake: 10.8.7
 
-  electron-to-chromium@1.4.689: {}
-
-  electron-to-chromium@1.4.815: {}
-
   electron-to-chromium@1.5.28: {}
 
   emoji-regex@10.3.0: {}
@@ -12376,33 +12542,33 @@ snapshots:
       d: 1.0.1
       ext: 1.7.0
 
-  esbuild@0.21.5:
+  esbuild@0.24.2:
     optionalDependencies:
-      "@esbuild/aix-ppc64": 0.21.5
-      "@esbuild/android-arm": 0.21.5
-      "@esbuild/android-arm64": 0.21.5
-      "@esbuild/android-x64": 0.21.5
-      "@esbuild/darwin-arm64": 0.21.5
-      "@esbuild/darwin-x64": 0.21.5
-      "@esbuild/freebsd-arm64": 0.21.5
-      "@esbuild/freebsd-x64": 0.21.5
-      "@esbuild/linux-arm": 0.21.5
-      "@esbuild/linux-arm64": 0.21.5
-      "@esbuild/linux-ia32": 0.21.5
-      "@esbuild/linux-loong64": 0.21.5
-      "@esbuild/linux-mips64el": 0.21.5
-      "@esbuild/linux-ppc64": 0.21.5
-      "@esbuild/linux-riscv64": 0.21.5
-      "@esbuild/linux-s390x": 0.21.5
-      "@esbuild/linux-x64": 0.21.5
-      "@esbuild/netbsd-x64": 0.21.5
-      "@esbuild/openbsd-x64": 0.21.5
-      "@esbuild/sunos-x64": 0.21.5
-      "@esbuild/win32-arm64": 0.21.5
-      "@esbuild/win32-ia32": 0.21.5
-      "@esbuild/win32-x64": 0.21.5
-
-  escalade@3.1.1: {}
+      "@esbuild/aix-ppc64": 0.24.2
+      "@esbuild/android-arm": 0.24.2
+      "@esbuild/android-arm64": 0.24.2
+      "@esbuild/android-x64": 0.24.2
+      "@esbuild/darwin-arm64": 0.24.2
+      "@esbuild/darwin-x64": 0.24.2
+      "@esbuild/freebsd-arm64": 0.24.2
+      "@esbuild/freebsd-x64": 0.24.2
+      "@esbuild/linux-arm": 0.24.2
+      "@esbuild/linux-arm64": 0.24.2
+      "@esbuild/linux-ia32": 0.24.2
+      "@esbuild/linux-loong64": 0.24.2
+      "@esbuild/linux-mips64el": 0.24.2
+      "@esbuild/linux-ppc64": 0.24.2
+      "@esbuild/linux-riscv64": 0.24.2
+      "@esbuild/linux-s390x": 0.24.2
+      "@esbuild/linux-x64": 0.24.2
+      "@esbuild/netbsd-arm64": 0.24.2
+      "@esbuild/netbsd-x64": 0.24.2
+      "@esbuild/openbsd-arm64": 0.24.2
+      "@esbuild/openbsd-x64": 0.24.2
+      "@esbuild/sunos-x64": 0.24.2
+      "@esbuild/win32-arm64": 0.24.2
+      "@esbuild/win32-ia32": 0.24.2
+      "@esbuild/win32-x64": 0.24.2
 
   escalade@3.1.2: {}
 
@@ -12429,74 +12595,74 @@ snapshots:
     optionalDependencies:
       source-map: 0.1.43
 
-  eslint-config-prettier@9.1.0(eslint@8.57.1):
+  eslint-config-prettier@9.1.0(eslint@9.17.0(jiti@2.4.2)):
     dependencies:
-      eslint: 8.57.1
+      eslint: 9.17.0(jiti@2.4.2)
 
-  eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.3.3):
+  eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2))(prettier@3.4.2):
     dependencies:
-      eslint: 8.57.1
-      prettier: 3.3.3
+      eslint: 9.17.0(jiti@2.4.2)
+      prettier: 3.4.2
       prettier-linter-helpers: 1.0.0
       synckit: 0.9.1
     optionalDependencies:
-      eslint-config-prettier: 9.1.0(eslint@8.57.1)
+      eslint-config-prettier: 9.1.0(eslint@9.17.0(jiti@2.4.2))
 
-  eslint-scope@7.2.2:
+  eslint-scope@8.2.0:
     dependencies:
       esrecurse: 4.3.0
       estraverse: 5.3.0
 
   eslint-visitor-keys@3.4.3: {}
 
-  eslint@8.57.1:
+  eslint-visitor-keys@4.2.0: {}
+
+  eslint@9.17.0(jiti@2.4.2):
     dependencies:
-      "@eslint-community/eslint-utils": 4.4.0(eslint@8.57.1)
-      "@eslint-community/regexpp": 4.10.0
-      "@eslint/eslintrc": 2.1.4
-      "@eslint/js": 8.57.1
-      "@humanwhocodes/config-array": 0.13.0
+      "@eslint-community/eslint-utils": 4.4.0(eslint@9.17.0(jiti@2.4.2))
+      "@eslint-community/regexpp": 4.12.1
+      "@eslint/config-array": 0.19.1
+      "@eslint/core": 0.9.1
+      "@eslint/eslintrc": 3.2.0
+      "@eslint/js": 9.17.0
+      "@eslint/plugin-kit": 0.2.4
+      "@humanfs/node": 0.16.6
       "@humanwhocodes/module-importer": 1.0.1
-      "@nodelib/fs.walk": 1.2.8
-      "@ungap/structured-clone": 1.2.0
+      "@humanwhocodes/retry": 0.4.1
+      "@types/estree": 1.0.6
+      "@types/json-schema": 7.0.15
       ajv: 6.12.6
       chalk: 4.1.2
-      cross-spawn: 7.0.3
+      cross-spawn: 7.0.6
       debug: 4.3.6
-      doctrine: 3.0.0
       escape-string-regexp: 4.0.0
-      eslint-scope: 7.2.2
-      eslint-visitor-keys: 3.4.3
-      espree: 9.6.1
+      eslint-scope: 8.2.0
+      eslint-visitor-keys: 4.2.0
+      espree: 10.3.0
       esquery: 1.5.0
       esutils: 2.0.3
       fast-deep-equal: 3.1.3
-      file-entry-cache: 6.0.1
+      file-entry-cache: 8.0.0
       find-up: 5.0.0
       glob-parent: 6.0.2
-      globals: 13.24.0
-      graphemer: 1.4.0
-      ignore: 5.3.1
+      ignore: 5.3.2
       imurmurhash: 0.1.4
       is-glob: 4.0.3
-      is-path-inside: 3.0.3
-      js-yaml: 4.1.0
       json-stable-stringify-without-jsonify: 1.0.1
-      levn: 0.4.1
       lodash.merge: 4.6.2
       minimatch: 3.1.2
       natural-compare: 1.4.0
       optionator: 0.9.3
-      strip-ansi: 6.0.1
-      text-table: 0.2.0
+    optionalDependencies:
+      jiti: 2.4.2
     transitivePeerDependencies:
       - supports-color
 
-  espree@9.6.1:
+  espree@10.3.0:
     dependencies:
-      acorn: 8.12.0
-      acorn-jsx: 5.3.2(acorn@8.12.0)
-      eslint-visitor-keys: 3.4.3
+      acorn: 8.14.0
+      acorn-jsx: 5.3.2(acorn@8.14.0)
+      eslint-visitor-keys: 4.2.0
 
   esprima@1.0.4: {}
 
@@ -12608,7 +12774,7 @@ snapshots:
     dependencies:
       reusify: 1.0.4
 
-  fdir@6.2.0(picomatch@4.0.2):
+  fdir@6.4.2(picomatch@4.0.2):
     optionalDependencies:
       picomatch: 4.0.2
 
@@ -12624,11 +12790,11 @@ snapshots:
     dependencies:
       is-unicode-supported: 2.0.0
 
-  file-entry-cache@6.0.1:
+  file-entry-cache@8.0.0:
     dependencies:
-      flat-cache: 3.2.0
+      flat-cache: 4.0.1
 
-  file-entry-cache@9.0.0:
+  file-entry-cache@9.1.0:
     dependencies:
       flat-cache: 5.0.0
 
@@ -12682,14 +12848,13 @@ snapshots:
     dependencies:
       detect-file: 1.0.0
       is-glob: 4.0.3
-      micromatch: 4.0.5
+      micromatch: 4.0.8
       resolve-dir: 1.0.1
 
-  flat-cache@3.2.0:
+  flat-cache@4.0.1:
     dependencies:
       flatted: 3.3.1
       keyv: 4.5.4
-      rimraf: 3.0.2
 
   flat-cache@5.0.0:
     dependencies:
@@ -12863,9 +13028,9 @@ snapshots:
 
   globals@11.12.0: {}
 
-  globals@13.24.0:
-    dependencies:
-      type-fest: 0.20.2
+  globals@14.0.0: {}
+
+  globals@15.14.0: {}
 
   globalthis@1.0.3:
     dependencies:
@@ -12884,7 +13049,7 @@ snapshots:
     dependencies:
       "@sindresorhus/merge-streams": 1.0.0
       fast-glob: 3.3.2
-      ignore: 5.3.1
+      ignore: 5.3.2
       path-type: 5.0.0
       slash: 5.1.0
       unicorn-magic: 0.1.0
@@ -12995,7 +13160,7 @@ snapshots:
 
   human-signals@7.0.0: {}
 
-  husky@9.1.6: {}
+  husky@9.1.7: {}
 
   iconv-lite@0.4.24:
     dependencies:
@@ -13009,10 +13174,10 @@ snapshots:
 
   ieee754@1.2.1: {}
 
-  ignore@5.3.1: {}
-
   ignore@5.3.2: {}
 
+  ignore@6.0.2: {}
+
   import-fresh@3.3.0:
     dependencies:
       parent-module: 1.0.1
@@ -13025,6 +13190,13 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
+  import-from-esm@2.0.0:
+    dependencies:
+      debug: 4.3.6
+      import-meta-resolve: 4.0.0
+    transitivePeerDependencies:
+      - supports-color
+
   import-meta-resolve@4.0.0: {}
 
   imurmurhash@0.1.4: {}
@@ -13125,9 +13297,9 @@ snapshots:
 
   is-callable@1.2.7: {}
 
-  is-ci@3.0.1:
+  is-ci@4.1.0:
     dependencies:
-      ci-info: 3.9.0
+      ci-info: 4.1.0
 
   is-core-module@2.13.1:
     dependencies:
@@ -13167,8 +13339,6 @@ snapshots:
 
   is-obj@2.0.0: {}
 
-  is-path-inside@3.0.3: {}
-
   is-plain-obj@4.1.0: {}
 
   is-plain-object@5.0.0: {}
@@ -13247,7 +13417,12 @@ snapshots:
 
   java-properties@1.0.2: {}
 
-  jiti@1.21.0: {}
+  jiti@1.21.0:
+    optional: true
+
+  jiti@1.21.7: {}
+
+  jiti@2.4.2: {}
 
   js-tokens@4.0.0: {}
 
@@ -13297,7 +13472,7 @@ snapshots:
 
   kind-of@6.0.3: {}
 
-  known-css-properties@0.34.0: {}
+  known-css-properties@0.35.0: {}
 
   leaflet.markercluster@1.5.3(leaflet@1.9.4):
     dependencies:
@@ -13317,28 +13492,28 @@ snapshots:
       prelude-ls: 1.2.1
       type-check: 0.4.0
 
-  lilconfig@2.1.0: {}
-
   lilconfig@3.1.2: {}
 
+  lilconfig@3.1.3: {}
+
   lines-and-columns@1.2.4: {}
 
-  lint-staged@15.2.10:
+  lint-staged@15.3.0:
     dependencies:
-      chalk: 5.3.0
+      chalk: 5.4.1
       commander: 12.1.0
-      debug: 4.3.6
+      debug: 4.4.0
       execa: 8.0.1
-      lilconfig: 3.1.2
-      listr2: 8.2.4
+      lilconfig: 3.1.3
+      listr2: 8.2.5
       micromatch: 4.0.8
       pidtree: 0.6.0
       string-argv: 0.3.2
-      yaml: 2.5.1
+      yaml: 2.6.1
     transitivePeerDependencies:
       - supports-color
 
-  listr2@8.2.4:
+  listr2@8.2.5:
     dependencies:
       cli-truncate: 4.0.0
       colorette: 2.0.20
@@ -13357,7 +13532,7 @@ snapshots:
     dependencies:
       "@types/trusted-types": 2.0.7
 
-  lit@3.2.0:
+  lit@3.2.1:
     dependencies:
       "@lit/reactive-element": 2.0.4
       lit-element: 4.1.0
@@ -13472,11 +13647,11 @@ snapshots:
       cli-table3: 0.6.3
       marked: 12.0.2
       node-emoji: 2.1.3
-      supports-hyperlinks: 3.0.0
+      supports-hyperlinks: 3.1.0
 
   marked@12.0.2: {}
 
-  marked@13.0.3: {}
+  marked@15.0.6: {}
 
   mathml-tag-names@2.1.3: {}
 
@@ -13484,6 +13659,8 @@ snapshots:
 
   mdn-data@2.0.30: {}
 
+  mdn-data@2.12.2: {}
+
   meow@12.1.1: {}
 
   meow@13.2.0: {}
@@ -13503,11 +13680,6 @@ snapshots:
       braces: 3.0.2
       picomatch: 2.3.1
 
-  micromatch@4.0.7:
-    dependencies:
-      braces: 3.0.3
-      picomatch: 2.3.1
-
   micromatch@4.0.8:
     dependencies:
       braces: 3.0.3
@@ -13549,6 +13721,8 @@ snapshots:
 
   ms@2.1.2: {}
 
+  ms@2.1.3: {}
+
   mute-stream@0.0.8: {}
 
   mz@2.7.0:
@@ -13578,8 +13752,6 @@ snapshots:
     dependencies:
       whatwg-url: 5.0.0
 
-  node-releases@2.0.14: {}
-
   node-releases@2.0.18: {}
 
   normalize-package-data@6.0.0:
@@ -13814,6 +13986,8 @@ snapshots:
 
   picocolors@1.1.0: {}
 
+  picocolors@1.1.1: {}
+
   picomatch@2.3.1: {}
 
   picomatch@4.0.2: {}
@@ -13839,401 +14013,403 @@ snapshots:
     dependencies:
       tinyqueue: 2.0.3
 
-  postcss-attribute-case-insensitive@7.0.0(postcss@8.4.47):
+  postcss-attribute-case-insensitive@7.0.1(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
-      postcss-selector-parser: 6.1.1
+      postcss: 8.4.49
+      postcss-selector-parser: 7.0.0
 
-  postcss-calc@10.0.2(postcss@8.4.47):
+  postcss-calc@10.0.2(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-selector-parser: 6.1.2
       postcss-value-parser: 4.2.0
 
-  postcss-clamp@4.1.0(postcss@8.4.47):
+  postcss-clamp@4.1.0(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  postcss-color-functional-notation@7.0.2(postcss@8.4.47):
+  postcss-color-functional-notation@7.0.7(postcss@8.4.49):
     dependencies:
-      "@csstools/css-color-parser": 3.0.2(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-parser-algorithms": 3.0.1(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-tokenizer": 3.0.1
-      "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.47)
-      "@csstools/utilities": 2.0.0(postcss@8.4.47)
-      postcss: 8.4.47
+      "@csstools/css-color-parser": 3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-tokenizer": 3.0.3
+      "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.49)
+      "@csstools/utilities": 2.0.0(postcss@8.4.49)
+      postcss: 8.4.49
 
-  postcss-color-hex-alpha@10.0.0(postcss@8.4.47):
+  postcss-color-hex-alpha@10.0.0(postcss@8.4.49):
     dependencies:
-      "@csstools/utilities": 2.0.0(postcss@8.4.47)
-      postcss: 8.4.47
+      "@csstools/utilities": 2.0.0(postcss@8.4.49)
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  postcss-color-rebeccapurple@10.0.0(postcss@8.4.47):
+  postcss-color-rebeccapurple@10.0.0(postcss@8.4.49):
     dependencies:
-      "@csstools/utilities": 2.0.0(postcss@8.4.47)
-      postcss: 8.4.47
+      "@csstools/utilities": 2.0.0(postcss@8.4.49)
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  postcss-colormin@7.0.2(postcss@8.4.47):
+  postcss-colormin@7.0.2(postcss@8.4.49):
     dependencies:
       browserslist: 4.23.3
       caniuse-api: 3.0.0
       colord: 2.9.3
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  postcss-convert-values@7.0.4(postcss@8.4.47):
+  postcss-convert-values@7.0.4(postcss@8.4.49):
     dependencies:
       browserslist: 4.23.3
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  postcss-custom-media@11.0.1(postcss@8.4.47):
+  postcss-custom-media@11.0.5(postcss@8.4.49):
     dependencies:
-      "@csstools/cascade-layer-name-parser": 2.0.1(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-parser-algorithms": 3.0.1(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-tokenizer": 3.0.1
-      "@csstools/media-query-list-parser": 3.0.1(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)
-      postcss: 8.4.47
+      "@csstools/cascade-layer-name-parser": 2.0.4(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-tokenizer": 3.0.3
+      "@csstools/media-query-list-parser": 4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+      postcss: 8.4.49
 
-  postcss-custom-properties@14.0.1(postcss@8.4.47):
+  postcss-custom-properties@14.0.4(postcss@8.4.49):
     dependencies:
-      "@csstools/cascade-layer-name-parser": 2.0.1(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-parser-algorithms": 3.0.1(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-tokenizer": 3.0.1
-      "@csstools/utilities": 2.0.0(postcss@8.4.47)
-      postcss: 8.4.47
+      "@csstools/cascade-layer-name-parser": 2.0.4(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-tokenizer": 3.0.3
+      "@csstools/utilities": 2.0.0(postcss@8.4.49)
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  postcss-custom-selectors@8.0.1(postcss@8.4.47):
+  postcss-custom-selectors@8.0.4(postcss@8.4.49):
     dependencies:
-      "@csstools/cascade-layer-name-parser": 2.0.1(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-parser-algorithms": 3.0.1(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-tokenizer": 3.0.1
-      postcss: 8.4.47
-      postcss-selector-parser: 6.1.1
+      "@csstools/cascade-layer-name-parser": 2.0.4(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-tokenizer": 3.0.3
+      postcss: 8.4.49
+      postcss-selector-parser: 7.0.0
 
-  postcss-dir-pseudo-class@9.0.0(postcss@8.4.47):
+  postcss-dir-pseudo-class@9.0.1(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
-      postcss-selector-parser: 6.1.1
+      postcss: 8.4.49
+      postcss-selector-parser: 7.0.0
 
-  postcss-discard-comments@7.0.3(postcss@8.4.47):
+  postcss-discard-comments@7.0.3(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-selector-parser: 6.1.2
 
-  postcss-discard-duplicates@7.0.1(postcss@8.4.47):
+  postcss-discard-duplicates@7.0.1(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
 
-  postcss-discard-empty@7.0.0(postcss@8.4.47):
+  postcss-discard-empty@7.0.0(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
 
-  postcss-discard-overridden@7.0.0(postcss@8.4.47):
+  postcss-discard-overridden@7.0.0(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
 
-  postcss-double-position-gradients@6.0.0(postcss@8.4.47):
+  postcss-double-position-gradients@6.0.0(postcss@8.4.49):
     dependencies:
-      "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.47)
-      "@csstools/utilities": 2.0.0(postcss@8.4.47)
-      postcss: 8.4.47
+      "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.49)
+      "@csstools/utilities": 2.0.0(postcss@8.4.49)
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  postcss-focus-visible@10.0.0(postcss@8.4.47):
+  postcss-focus-visible@10.0.1(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
-      postcss-selector-parser: 6.1.1
+      postcss: 8.4.49
+      postcss-selector-parser: 7.0.0
 
-  postcss-focus-within@9.0.0(postcss@8.4.47):
+  postcss-focus-within@9.0.1(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
-      postcss-selector-parser: 6.1.1
+      postcss: 8.4.49
+      postcss-selector-parser: 7.0.0
 
-  postcss-font-variant@5.0.0(postcss@8.4.47):
+  postcss-font-variant@5.0.0(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
 
-  postcss-gap-properties@6.0.0(postcss@8.4.47):
+  postcss-gap-properties@6.0.0(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
 
-  postcss-image-set-function@7.0.0(postcss@8.4.47):
+  postcss-image-set-function@7.0.0(postcss@8.4.49):
     dependencies:
-      "@csstools/utilities": 2.0.0(postcss@8.4.47)
-      postcss: 8.4.47
+      "@csstools/utilities": 2.0.0(postcss@8.4.49)
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  postcss-import@15.1.0(postcss@8.4.47):
+  postcss-import@15.1.0(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
       read-cache: 1.0.0
       resolve: 1.22.8
 
-  postcss-import@16.1.0(postcss@8.4.47):
+  postcss-import@16.1.0(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
       read-cache: 1.0.0
       resolve: 1.22.8
 
-  postcss-js@4.0.1(postcss@8.4.47):
+  postcss-js@4.0.1(postcss@8.4.49):
     dependencies:
       camelcase-css: 2.0.1
-      postcss: 8.4.47
+      postcss: 8.4.49
 
-  postcss-lab-function@7.0.2(postcss@8.4.47):
+  postcss-lab-function@7.0.7(postcss@8.4.49):
     dependencies:
-      "@csstools/css-color-parser": 3.0.2(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-parser-algorithms": 3.0.1(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-tokenizer": 3.0.1
-      "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.47)
-      "@csstools/utilities": 2.0.0(postcss@8.4.47)
-      postcss: 8.4.47
+      "@csstools/css-color-parser": 3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-tokenizer": 3.0.3
+      "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.49)
+      "@csstools/utilities": 2.0.0(postcss@8.4.49)
+      postcss: 8.4.49
 
-  postcss-load-config@4.0.2(postcss@8.4.47):
+  postcss-load-config@4.0.2(postcss@8.4.49):
     dependencies:
-      lilconfig: 3.1.2
-      yaml: 2.4.5
+      lilconfig: 3.1.3
+      yaml: 2.5.1
     optionalDependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
 
-  postcss-logical@8.0.0(postcss@8.4.47):
+  postcss-logical@8.0.0(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  postcss-merge-longhand@7.0.4(postcss@8.4.47):
+  postcss-merge-longhand@7.0.4(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
-      stylehacks: 7.0.4(postcss@8.4.47)
+      stylehacks: 7.0.4(postcss@8.4.49)
 
-  postcss-merge-rules@7.0.4(postcss@8.4.47):
+  postcss-merge-rules@7.0.4(postcss@8.4.49):
     dependencies:
       browserslist: 4.23.3
       caniuse-api: 3.0.0
-      cssnano-utils: 5.0.0(postcss@8.4.47)
-      postcss: 8.4.47
+      cssnano-utils: 5.0.0(postcss@8.4.49)
+      postcss: 8.4.49
       postcss-selector-parser: 6.1.2
 
-  postcss-minify-font-values@7.0.0(postcss@8.4.47):
+  postcss-minify-font-values@7.0.0(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  postcss-minify-gradients@7.0.0(postcss@8.4.47):
+  postcss-minify-gradients@7.0.0(postcss@8.4.49):
     dependencies:
       colord: 2.9.3
-      cssnano-utils: 5.0.0(postcss@8.4.47)
-      postcss: 8.4.47
+      cssnano-utils: 5.0.0(postcss@8.4.49)
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  postcss-minify-params@7.0.2(postcss@8.4.47):
+  postcss-minify-params@7.0.2(postcss@8.4.49):
     dependencies:
       browserslist: 4.23.3
-      cssnano-utils: 5.0.0(postcss@8.4.47)
-      postcss: 8.4.47
+      cssnano-utils: 5.0.0(postcss@8.4.49)
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  postcss-minify-selectors@7.0.4(postcss@8.4.47):
+  postcss-minify-selectors@7.0.4(postcss@8.4.49):
     dependencies:
       cssesc: 3.0.0
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-selector-parser: 6.1.2
 
-  postcss-nested@5.0.6(postcss@8.4.47):
+  postcss-nested@5.0.6(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-selector-parser: 6.0.14
 
-  postcss-nested@6.0.1(postcss@8.4.47):
+  postcss-nested@6.2.0(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
-      postcss-selector-parser: 6.1.1
+      postcss: 8.4.49
+      postcss-selector-parser: 6.1.2
 
-  postcss-nesting@13.0.0(postcss@8.4.47):
+  postcss-nesting@13.0.1(postcss@8.4.49):
     dependencies:
-      "@csstools/selector-resolve-nested": 2.0.0(postcss-selector-parser@6.1.1)
-      "@csstools/selector-specificity": 4.0.0(postcss-selector-parser@6.1.1)
-      postcss: 8.4.47
-      postcss-selector-parser: 6.1.1
+      "@csstools/selector-resolve-nested": 3.0.0(postcss-selector-parser@7.0.0)
+      "@csstools/selector-specificity": 5.0.0(postcss-selector-parser@7.0.0)
+      postcss: 8.4.49
+      postcss-selector-parser: 7.0.0
 
-  postcss-normalize-charset@7.0.0(postcss@8.4.47):
+  postcss-normalize-charset@7.0.0(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
 
-  postcss-normalize-display-values@7.0.0(postcss@8.4.47):
+  postcss-normalize-display-values@7.0.0(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  postcss-normalize-positions@7.0.0(postcss@8.4.47):
+  postcss-normalize-positions@7.0.0(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  postcss-normalize-repeat-style@7.0.0(postcss@8.4.47):
+  postcss-normalize-repeat-style@7.0.0(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  postcss-normalize-string@7.0.0(postcss@8.4.47):
+  postcss-normalize-string@7.0.0(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  postcss-normalize-timing-functions@7.0.0(postcss@8.4.47):
+  postcss-normalize-timing-functions@7.0.0(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  postcss-normalize-unicode@7.0.2(postcss@8.4.47):
+  postcss-normalize-unicode@7.0.2(postcss@8.4.49):
     dependencies:
       browserslist: 4.23.3
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  postcss-normalize-url@7.0.0(postcss@8.4.47):
+  postcss-normalize-url@7.0.0(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  postcss-normalize-whitespace@7.0.0(postcss@8.4.47):
+  postcss-normalize-whitespace@7.0.0(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  postcss-opacity-percentage@3.0.0(postcss@8.4.47):
+  postcss-opacity-percentage@3.0.0(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
 
-  postcss-ordered-values@7.0.1(postcss@8.4.47):
+  postcss-ordered-values@7.0.1(postcss@8.4.49):
     dependencies:
-      cssnano-utils: 5.0.0(postcss@8.4.47)
-      postcss: 8.4.47
+      cssnano-utils: 5.0.0(postcss@8.4.49)
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  postcss-overflow-shorthand@6.0.0(postcss@8.4.47):
+  postcss-overflow-shorthand@6.0.0(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  postcss-page-break@3.0.4(postcss@8.4.47):
+  postcss-page-break@3.0.4(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
 
-  postcss-place@10.0.0(postcss@8.4.47):
+  postcss-place@10.0.0(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  postcss-preset-env@10.0.5(postcss@8.4.47):
-    dependencies:
-      "@csstools/postcss-cascade-layers": 5.0.0(postcss@8.4.47)
-      "@csstools/postcss-color-function": 4.0.2(postcss@8.4.47)
-      "@csstools/postcss-color-mix-function": 3.0.2(postcss@8.4.47)
-      "@csstools/postcss-content-alt-text": 2.0.1(postcss@8.4.47)
-      "@csstools/postcss-exponential-functions": 2.0.1(postcss@8.4.47)
-      "@csstools/postcss-font-format-keywords": 4.0.0(postcss@8.4.47)
-      "@csstools/postcss-gamut-mapping": 2.0.2(postcss@8.4.47)
-      "@csstools/postcss-gradients-interpolation-method": 5.0.2(postcss@8.4.47)
-      "@csstools/postcss-hwb-function": 4.0.2(postcss@8.4.47)
-      "@csstools/postcss-ic-unit": 4.0.0(postcss@8.4.47)
-      "@csstools/postcss-initial": 2.0.0(postcss@8.4.47)
-      "@csstools/postcss-is-pseudo-class": 5.0.0(postcss@8.4.47)
-      "@csstools/postcss-light-dark-function": 2.0.4(postcss@8.4.47)
-      "@csstools/postcss-logical-float-and-clear": 3.0.0(postcss@8.4.47)
-      "@csstools/postcss-logical-overflow": 2.0.0(postcss@8.4.47)
-      "@csstools/postcss-logical-overscroll-behavior": 2.0.0(postcss@8.4.47)
-      "@csstools/postcss-logical-resize": 3.0.0(postcss@8.4.47)
-      "@csstools/postcss-logical-viewport-units": 3.0.1(postcss@8.4.47)
-      "@csstools/postcss-media-minmax": 2.0.1(postcss@8.4.47)
-      "@csstools/postcss-media-queries-aspect-ratio-number-values": 3.0.1(postcss@8.4.47)
-      "@csstools/postcss-nested-calc": 4.0.0(postcss@8.4.47)
-      "@csstools/postcss-normalize-display-values": 4.0.0(postcss@8.4.47)
-      "@csstools/postcss-oklab-function": 4.0.2(postcss@8.4.47)
-      "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.47)
-      "@csstools/postcss-relative-color-syntax": 3.0.2(postcss@8.4.47)
-      "@csstools/postcss-scope-pseudo-class": 4.0.0(postcss@8.4.47)
-      "@csstools/postcss-stepped-value-functions": 4.0.1(postcss@8.4.47)
-      "@csstools/postcss-text-decoration-shorthand": 4.0.1(postcss@8.4.47)
-      "@csstools/postcss-trigonometric-functions": 4.0.1(postcss@8.4.47)
-      "@csstools/postcss-unset-value": 4.0.0(postcss@8.4.47)
-      autoprefixer: 10.4.19(postcss@8.4.47)
-      browserslist: 4.23.1
-      css-blank-pseudo: 7.0.0(postcss@8.4.47)
-      css-has-pseudo: 7.0.0(postcss@8.4.47)
-      css-prefers-color-scheme: 10.0.0(postcss@8.4.47)
-      cssdb: 8.1.1
-      postcss: 8.4.47
-      postcss-attribute-case-insensitive: 7.0.0(postcss@8.4.47)
-      postcss-clamp: 4.1.0(postcss@8.4.47)
-      postcss-color-functional-notation: 7.0.2(postcss@8.4.47)
-      postcss-color-hex-alpha: 10.0.0(postcss@8.4.47)
-      postcss-color-rebeccapurple: 10.0.0(postcss@8.4.47)
-      postcss-custom-media: 11.0.1(postcss@8.4.47)
-      postcss-custom-properties: 14.0.1(postcss@8.4.47)
-      postcss-custom-selectors: 8.0.1(postcss@8.4.47)
-      postcss-dir-pseudo-class: 9.0.0(postcss@8.4.47)
-      postcss-double-position-gradients: 6.0.0(postcss@8.4.47)
-      postcss-focus-visible: 10.0.0(postcss@8.4.47)
-      postcss-focus-within: 9.0.0(postcss@8.4.47)
-      postcss-font-variant: 5.0.0(postcss@8.4.47)
-      postcss-gap-properties: 6.0.0(postcss@8.4.47)
-      postcss-image-set-function: 7.0.0(postcss@8.4.47)
-      postcss-lab-function: 7.0.2(postcss@8.4.47)
-      postcss-logical: 8.0.0(postcss@8.4.47)
-      postcss-nesting: 13.0.0(postcss@8.4.47)
-      postcss-opacity-percentage: 3.0.0(postcss@8.4.47)
-      postcss-overflow-shorthand: 6.0.0(postcss@8.4.47)
-      postcss-page-break: 3.0.4(postcss@8.4.47)
-      postcss-place: 10.0.0(postcss@8.4.47)
-      postcss-pseudo-class-any-link: 10.0.0(postcss@8.4.47)
-      postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.47)
-      postcss-selector-not: 8.0.0(postcss@8.4.47)
-
-  postcss-pseudo-class-any-link@10.0.0(postcss@8.4.47):
-    dependencies:
-      postcss: 8.4.47
-      postcss-selector-parser: 6.1.1
-
-  postcss-reduce-initial@7.0.2(postcss@8.4.47):
+  postcss-preset-env@10.1.3(postcss@8.4.49):
+    dependencies:
+      "@csstools/postcss-cascade-layers": 5.0.1(postcss@8.4.49)
+      "@csstools/postcss-color-function": 4.0.7(postcss@8.4.49)
+      "@csstools/postcss-color-mix-function": 3.0.7(postcss@8.4.49)
+      "@csstools/postcss-content-alt-text": 2.0.4(postcss@8.4.49)
+      "@csstools/postcss-exponential-functions": 2.0.6(postcss@8.4.49)
+      "@csstools/postcss-font-format-keywords": 4.0.0(postcss@8.4.49)
+      "@csstools/postcss-gamut-mapping": 2.0.7(postcss@8.4.49)
+      "@csstools/postcss-gradients-interpolation-method": 5.0.7(postcss@8.4.49)
+      "@csstools/postcss-hwb-function": 4.0.7(postcss@8.4.49)
+      "@csstools/postcss-ic-unit": 4.0.0(postcss@8.4.49)
+      "@csstools/postcss-initial": 2.0.0(postcss@8.4.49)
+      "@csstools/postcss-is-pseudo-class": 5.0.1(postcss@8.4.49)
+      "@csstools/postcss-light-dark-function": 2.0.7(postcss@8.4.49)
+      "@csstools/postcss-logical-float-and-clear": 3.0.0(postcss@8.4.49)
+      "@csstools/postcss-logical-overflow": 2.0.0(postcss@8.4.49)
+      "@csstools/postcss-logical-overscroll-behavior": 2.0.0(postcss@8.4.49)
+      "@csstools/postcss-logical-resize": 3.0.0(postcss@8.4.49)
+      "@csstools/postcss-logical-viewport-units": 3.0.3(postcss@8.4.49)
+      "@csstools/postcss-media-minmax": 2.0.6(postcss@8.4.49)
+      "@csstools/postcss-media-queries-aspect-ratio-number-values": 3.0.4(postcss@8.4.49)
+      "@csstools/postcss-nested-calc": 4.0.0(postcss@8.4.49)
+      "@csstools/postcss-normalize-display-values": 4.0.0(postcss@8.4.49)
+      "@csstools/postcss-oklab-function": 4.0.7(postcss@8.4.49)
+      "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.49)
+      "@csstools/postcss-random-function": 1.0.2(postcss@8.4.49)
+      "@csstools/postcss-relative-color-syntax": 3.0.7(postcss@8.4.49)
+      "@csstools/postcss-scope-pseudo-class": 4.0.1(postcss@8.4.49)
+      "@csstools/postcss-sign-functions": 1.1.1(postcss@8.4.49)
+      "@csstools/postcss-stepped-value-functions": 4.0.6(postcss@8.4.49)
+      "@csstools/postcss-text-decoration-shorthand": 4.0.1(postcss@8.4.49)
+      "@csstools/postcss-trigonometric-functions": 4.0.6(postcss@8.4.49)
+      "@csstools/postcss-unset-value": 4.0.0(postcss@8.4.49)
+      autoprefixer: 10.4.19(postcss@8.4.49)
+      browserslist: 4.23.3
+      css-blank-pseudo: 7.0.1(postcss@8.4.49)
+      css-has-pseudo: 7.0.2(postcss@8.4.49)
+      css-prefers-color-scheme: 10.0.0(postcss@8.4.49)
+      cssdb: 8.2.3
+      postcss: 8.4.49
+      postcss-attribute-case-insensitive: 7.0.1(postcss@8.4.49)
+      postcss-clamp: 4.1.0(postcss@8.4.49)
+      postcss-color-functional-notation: 7.0.7(postcss@8.4.49)
+      postcss-color-hex-alpha: 10.0.0(postcss@8.4.49)
+      postcss-color-rebeccapurple: 10.0.0(postcss@8.4.49)
+      postcss-custom-media: 11.0.5(postcss@8.4.49)
+      postcss-custom-properties: 14.0.4(postcss@8.4.49)
+      postcss-custom-selectors: 8.0.4(postcss@8.4.49)
+      postcss-dir-pseudo-class: 9.0.1(postcss@8.4.49)
+      postcss-double-position-gradients: 6.0.0(postcss@8.4.49)
+      postcss-focus-visible: 10.0.1(postcss@8.4.49)
+      postcss-focus-within: 9.0.1(postcss@8.4.49)
+      postcss-font-variant: 5.0.0(postcss@8.4.49)
+      postcss-gap-properties: 6.0.0(postcss@8.4.49)
+      postcss-image-set-function: 7.0.0(postcss@8.4.49)
+      postcss-lab-function: 7.0.7(postcss@8.4.49)
+      postcss-logical: 8.0.0(postcss@8.4.49)
+      postcss-nesting: 13.0.1(postcss@8.4.49)
+      postcss-opacity-percentage: 3.0.0(postcss@8.4.49)
+      postcss-overflow-shorthand: 6.0.0(postcss@8.4.49)
+      postcss-page-break: 3.0.4(postcss@8.4.49)
+      postcss-place: 10.0.0(postcss@8.4.49)
+      postcss-pseudo-class-any-link: 10.0.1(postcss@8.4.49)
+      postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.49)
+      postcss-selector-not: 8.0.1(postcss@8.4.49)
+
+  postcss-pseudo-class-any-link@10.0.1(postcss@8.4.49):
+    dependencies:
+      postcss: 8.4.49
+      postcss-selector-parser: 7.0.0
+
+  postcss-reduce-initial@7.0.2(postcss@8.4.49):
     dependencies:
       browserslist: 4.23.3
       caniuse-api: 3.0.0
-      postcss: 8.4.47
+      postcss: 8.4.49
 
-  postcss-reduce-transforms@7.0.0(postcss@8.4.47):
+  postcss-reduce-transforms@7.0.0(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  postcss-replace-overflow-wrap@4.0.0(postcss@8.4.47):
+  postcss-replace-overflow-wrap@4.0.0(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
 
-  postcss-reporter@7.1.0(postcss@8.4.47):
+  postcss-reporter@7.1.0(postcss@8.4.49):
     dependencies:
       picocolors: 1.0.0
-      postcss: 8.4.47
+      postcss: 8.4.49
       thenby: 1.3.4
 
   postcss-resolve-nested-selector@0.1.6: {}
 
-  postcss-safe-parser@7.0.0(postcss@8.4.47):
+  postcss-safe-parser@7.0.1(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
 
-  postcss-selector-not@8.0.0(postcss@8.4.47):
+  postcss-selector-not@8.0.1(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
-      postcss-selector-parser: 6.1.1
+      postcss: 8.4.49
+      postcss-selector-parser: 7.0.0
 
   postcss-selector-parser@6.0.10:
     dependencies:
@@ -14245,33 +14421,33 @@ snapshots:
       cssesc: 3.0.0
       util-deprecate: 1.0.2
 
-  postcss-selector-parser@6.1.1:
+  postcss-selector-parser@6.1.2:
     dependencies:
       cssesc: 3.0.0
       util-deprecate: 1.0.2
 
-  postcss-selector-parser@6.1.2:
+  postcss-selector-parser@7.0.0:
     dependencies:
       cssesc: 3.0.0
       util-deprecate: 1.0.2
 
-  postcss-svgo@7.0.1(postcss@8.4.47):
+  postcss-svgo@7.0.1(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-value-parser: 4.2.0
       svgo: 3.3.2
 
-  postcss-unique-selectors@7.0.3(postcss@8.4.47):
+  postcss-unique-selectors@7.0.3(postcss@8.4.49):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-selector-parser: 6.1.2
 
   postcss-value-parser@4.2.0: {}
 
-  postcss@8.4.47:
+  postcss@8.4.49:
     dependencies:
       nanoid: 3.3.7
-      picocolors: 1.1.0
+      picocolors: 1.1.1
       source-map-js: 1.2.1
 
   prelude-ls@1.1.2: {}
@@ -14282,15 +14458,15 @@ snapshots:
     dependencies:
       fast-diff: 1.3.0
 
-  prettier-plugin-organize-imports@4.1.0(prettier@3.3.3)(typescript@5.5.4):
+  prettier-plugin-organize-imports@4.1.0(prettier@3.4.2)(typescript@5.7.2):
     dependencies:
-      prettier: 3.3.3
-      typescript: 5.5.4
+      prettier: 3.4.2
+      typescript: 5.7.2
 
   prettier@2.8.8:
     optional: true
 
-  prettier@3.3.3: {}
+  prettier@3.4.2: {}
 
   pretty-bytes@5.6.0: {}
 
@@ -14462,34 +14638,33 @@ snapshots:
 
   rgbcolor@1.0.1: {}
 
-  rimraf@3.0.2:
-    dependencies:
-      glob: 7.2.3
-
   rollup@2.79.1:
     optionalDependencies:
       fsevents: 2.3.3
 
-  rollup@4.22.4:
+  rollup@4.30.1:
     dependencies:
-      "@types/estree": 1.0.5
+      "@types/estree": 1.0.6
     optionalDependencies:
-      "@rollup/rollup-android-arm-eabi": 4.22.4
-      "@rollup/rollup-android-arm64": 4.22.4
-      "@rollup/rollup-darwin-arm64": 4.22.4
-      "@rollup/rollup-darwin-x64": 4.22.4
-      "@rollup/rollup-linux-arm-gnueabihf": 4.22.4
-      "@rollup/rollup-linux-arm-musleabihf": 4.22.4
-      "@rollup/rollup-linux-arm64-gnu": 4.22.4
-      "@rollup/rollup-linux-arm64-musl": 4.22.4
-      "@rollup/rollup-linux-powerpc64le-gnu": 4.22.4
-      "@rollup/rollup-linux-riscv64-gnu": 4.22.4
-      "@rollup/rollup-linux-s390x-gnu": 4.22.4
-      "@rollup/rollup-linux-x64-gnu": 4.22.4
-      "@rollup/rollup-linux-x64-musl": 4.22.4
-      "@rollup/rollup-win32-arm64-msvc": 4.22.4
-      "@rollup/rollup-win32-ia32-msvc": 4.22.4
-      "@rollup/rollup-win32-x64-msvc": 4.22.4
+      "@rollup/rollup-android-arm-eabi": 4.30.1
+      "@rollup/rollup-android-arm64": 4.30.1
+      "@rollup/rollup-darwin-arm64": 4.30.1
+      "@rollup/rollup-darwin-x64": 4.30.1
+      "@rollup/rollup-freebsd-arm64": 4.30.1
+      "@rollup/rollup-freebsd-x64": 4.30.1
+      "@rollup/rollup-linux-arm-gnueabihf": 4.30.1
+      "@rollup/rollup-linux-arm-musleabihf": 4.30.1
+      "@rollup/rollup-linux-arm64-gnu": 4.30.1
+      "@rollup/rollup-linux-arm64-musl": 4.30.1
+      "@rollup/rollup-linux-loongarch64-gnu": 4.30.1
+      "@rollup/rollup-linux-powerpc64le-gnu": 4.30.1
+      "@rollup/rollup-linux-riscv64-gnu": 4.30.1
+      "@rollup/rollup-linux-s390x-gnu": 4.30.1
+      "@rollup/rollup-linux-x64-gnu": 4.30.1
+      "@rollup/rollup-linux-x64-musl": 4.30.1
+      "@rollup/rollup-win32-arm64-msvc": 4.30.1
+      "@rollup/rollup-win32-ia32-msvc": 4.30.1
+      "@rollup/rollup-win32-x64-msvc": 4.30.1
       fsevents: 2.3.3
 
   run-async@2.4.1: {}
@@ -14537,15 +14712,15 @@ snapshots:
       estree-is-function: 1.0.0
       get-assigned-identifiers: 1.2.0
 
-  semantic-release@24.1.1(typescript@5.5.4):
+  semantic-release@24.2.1(typescript@5.7.2):
     dependencies:
-      "@semantic-release/commit-analyzer": 13.0.0(semantic-release@24.1.1(typescript@5.5.4))
+      "@semantic-release/commit-analyzer": 13.0.0(semantic-release@24.2.1(typescript@5.7.2))
       "@semantic-release/error": 4.0.0
-      "@semantic-release/github": 10.0.3(semantic-release@24.1.1(typescript@5.5.4))
-      "@semantic-release/npm": 12.0.0(semantic-release@24.1.1(typescript@5.5.4))
-      "@semantic-release/release-notes-generator": 14.0.1(semantic-release@24.1.1(typescript@5.5.4))
+      "@semantic-release/github": 11.0.1(semantic-release@24.2.1(typescript@5.7.2))
+      "@semantic-release/npm": 12.0.0(semantic-release@24.2.1(typescript@5.7.2))
+      "@semantic-release/release-notes-generator": 14.0.1(semantic-release@24.2.1(typescript@5.7.2))
       aggregate-error: 5.0.0
-      cosmiconfig: 9.0.0(typescript@5.5.4)
+      cosmiconfig: 9.0.0(typescript@5.7.2)
       debug: 4.3.6
       env-ci: 11.0.0
       execa: 9.3.0
@@ -14555,11 +14730,11 @@ snapshots:
       git-log-parser: 1.2.0
       hook-std: 3.0.0
       hosted-git-info: 8.0.0
-      import-from-esm: 1.3.3
+      import-from-esm: 2.0.0
       lodash-es: 4.17.21
       marked: 12.0.2
       marked-terminal: 7.0.0(marked@12.0.2)
-      micromatch: 4.0.7
+      micromatch: 4.0.8
       p-each-series: 3.0.0
       p-reduce: 3.0.0
       read-package-up: 11.0.0
@@ -14819,61 +14994,60 @@ snapshots:
 
   style-mod@4.1.0: {}
 
-  stylehacks@7.0.4(postcss@8.4.47):
+  stylehacks@7.0.4(postcss@8.4.49):
     dependencies:
       browserslist: 4.23.3
-      postcss: 8.4.47
+      postcss: 8.4.49
       postcss-selector-parser: 6.1.2
 
-  stylelint-config-recommended@14.0.1(stylelint@16.9.0(typescript@5.5.4)):
+  stylelint-config-recommended@14.0.1(stylelint@16.12.0(typescript@5.7.2)):
     dependencies:
-      stylelint: 16.9.0(typescript@5.5.4)
+      stylelint: 16.12.0(typescript@5.7.2)
 
-  stylelint-config-standard@36.0.1(stylelint@16.9.0(typescript@5.5.4)):
+  stylelint-config-standard@36.0.1(stylelint@16.12.0(typescript@5.7.2)):
     dependencies:
-      stylelint: 16.9.0(typescript@5.5.4)
-      stylelint-config-recommended: 14.0.1(stylelint@16.9.0(typescript@5.5.4))
+      stylelint: 16.12.0(typescript@5.7.2)
+      stylelint-config-recommended: 14.0.1(stylelint@16.12.0(typescript@5.7.2))
 
-  stylelint@16.9.0(typescript@5.5.4):
+  stylelint@16.12.0(typescript@5.7.2):
     dependencies:
-      "@csstools/css-parser-algorithms": 3.0.1(@csstools/css-tokenizer@3.0.1)
-      "@csstools/css-tokenizer": 3.0.1
-      "@csstools/media-query-list-parser": 3.0.1(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)
-      "@csstools/selector-specificity": 4.0.0(postcss-selector-parser@6.1.2)
+      "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
+      "@csstools/css-tokenizer": 3.0.3
+      "@csstools/media-query-list-parser": 4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+      "@csstools/selector-specificity": 5.0.0(postcss-selector-parser@7.0.0)
       "@dual-bundle/import-meta-resolve": 4.1.0
       balanced-match: 2.0.0
       colord: 2.9.3
-      cosmiconfig: 9.0.0(typescript@5.5.4)
-      css-functions-list: 3.2.2
-      css-tree: 2.3.1
-      debug: 4.3.6
+      cosmiconfig: 9.0.0(typescript@5.7.2)
+      css-functions-list: 3.2.3
+      css-tree: 3.1.0
+      debug: 4.4.0
       fast-glob: 3.3.2
       fastest-levenshtein: 1.0.16
-      file-entry-cache: 9.0.0
+      file-entry-cache: 9.1.0
       global-modules: 2.0.0
       globby: 11.1.0
       globjoin: 0.1.4
       html-tags: 3.3.1
-      ignore: 5.3.2
+      ignore: 6.0.2
       imurmurhash: 0.1.4
       is-plain-object: 5.0.0
-      known-css-properties: 0.34.0
+      known-css-properties: 0.35.0
       mathml-tag-names: 2.1.3
       meow: 13.2.0
       micromatch: 4.0.8
       normalize-path: 3.0.0
-      picocolors: 1.0.1
-      postcss: 8.4.47
+      picocolors: 1.1.1
+      postcss: 8.4.49
       postcss-resolve-nested-selector: 0.1.6
-      postcss-safe-parser: 7.0.0(postcss@8.4.47)
-      postcss-selector-parser: 6.1.2
+      postcss-safe-parser: 7.0.1(postcss@8.4.49)
+      postcss-selector-parser: 7.0.0
       postcss-value-parser: 4.2.0
       resolve-from: 5.0.0
       string-width: 4.2.3
-      strip-ansi: 7.1.0
       supports-hyperlinks: 3.1.0
       svg-tags: 1.0.0
-      table: 6.8.2
+      table: 6.9.0
       write-file-atomic: 5.0.1
     transitivePeerDependencies:
       - supports-color
@@ -14902,11 +15076,6 @@ snapshots:
     dependencies:
       has-flag: 4.0.0
 
-  supports-hyperlinks@3.0.0:
-    dependencies:
-      has-flag: 4.0.0
-      supports-color: 7.2.0
-
   supports-hyperlinks@3.1.0:
     dependencies:
       has-flag: 4.0.0
@@ -14931,7 +15100,7 @@ snapshots:
       "@pkgr/core": 0.1.1
       tslib: 2.6.2
 
-  table@6.8.2:
+  table@6.9.0:
     dependencies:
       ajv: 8.12.0
       lodash.truncate: 4.4.2
@@ -14939,28 +15108,28 @@ snapshots:
       string-width: 4.2.3
       strip-ansi: 6.0.1
 
-  tailwindcss@3.4.13:
+  tailwindcss@3.4.17:
     dependencies:
       "@alloc/quick-lru": 5.2.0
       arg: 5.0.2
-      chokidar: 3.5.3
+      chokidar: 3.6.0
       didyoumean: 1.2.2
       dlv: 1.1.3
       fast-glob: 3.3.2
       glob-parent: 6.0.2
       is-glob: 4.0.3
-      jiti: 1.21.0
-      lilconfig: 2.1.0
-      micromatch: 4.0.7
+      jiti: 1.21.7
+      lilconfig: 3.1.3
+      micromatch: 4.0.8
       normalize-path: 3.0.0
       object-hash: 3.0.0
-      picocolors: 1.0.1
-      postcss: 8.4.47
-      postcss-import: 15.1.0(postcss@8.4.47)
-      postcss-js: 4.0.1(postcss@8.4.47)
-      postcss-load-config: 4.0.2(postcss@8.4.47)
-      postcss-nested: 6.0.1(postcss@8.4.47)
-      postcss-selector-parser: 6.1.1
+      picocolors: 1.1.1
+      postcss: 8.4.49
+      postcss-import: 15.1.0(postcss@8.4.49)
+      postcss-js: 4.0.1(postcss@8.4.49)
+      postcss-load-config: 4.0.2(postcss@8.4.49)
+      postcss-nested: 6.2.0(postcss@8.4.49)
+      postcss-selector-parser: 6.1.2
       resolve: 1.22.8
       sucrase: 3.35.0
     transitivePeerDependencies:
@@ -14987,14 +15156,12 @@ snapshots:
   terser@5.26.0:
     dependencies:
       "@jridgewell/source-map": 0.3.5
-      acorn: 8.11.3
+      acorn: 8.12.0
       commander: 2.20.3
       source-map-support: 0.5.21
 
   text-extensions@2.4.0: {}
 
-  text-table@0.2.0: {}
-
   thenby@1.3.4: {}
 
   thenify-all@1.6.0:
@@ -15020,9 +15187,9 @@ snapshots:
 
   tinyexec@0.3.0: {}
 
-  tinyglobby@0.2.0:
+  tinyglobby@0.2.10:
     dependencies:
-      fdir: 6.2.0(picomatch@4.0.2)
+      fdir: 6.4.2(picomatch@4.0.2)
       picomatch: 4.0.2
 
   tinyqueue@2.0.3: {}
@@ -15045,9 +15212,9 @@ snapshots:
 
   traverse@0.6.8: {}
 
-  ts-api-utils@1.3.0(typescript@5.5.4):
+  ts-api-utils@2.0.0(typescript@5.7.2):
     dependencies:
-      typescript: 5.5.4
+      typescript: 5.7.2
 
   ts-interface-checker@0.1.13: {}
 
@@ -15065,8 +15232,6 @@ snapshots:
 
   type-fest@0.16.0: {}
 
-  type-fest@0.20.2: {}
-
   type-fest@0.21.3: {}
 
   type-fest@1.4.0: {}
@@ -15110,7 +15275,17 @@ snapshots:
 
   typedarray@0.0.6: {}
 
-  typescript@5.5.4: {}
+  typescript-eslint@8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2):
+    dependencies:
+      "@typescript-eslint/eslint-plugin": 8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2)
+      "@typescript-eslint/parser": 8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2)
+      "@typescript-eslint/utils": 8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2)
+      eslint: 9.17.0(jiti@2.4.2)
+      typescript: 5.7.2
+    transitivePeerDependencies:
+      - supports-color
+
+  typescript@5.7.2: {}
 
   uglify-js@3.17.4:
     optional: true
@@ -15163,18 +15338,6 @@ snapshots:
 
   upath@1.2.0: {}
 
-  update-browserslist-db@1.0.13(browserslist@4.23.0):
-    dependencies:
-      browserslist: 4.23.0
-      escalade: 3.1.1
-      picocolors: 1.0.0
-
-  update-browserslist-db@1.0.16(browserslist@4.23.1):
-    dependencies:
-      browserslist: 4.23.1
-      escalade: 3.1.2
-      picocolors: 1.0.1
-
   update-browserslist-db@1.1.0(browserslist@4.23.3):
     dependencies:
       browserslist: 4.23.3
@@ -15196,30 +15359,32 @@ snapshots:
       spdx-correct: 3.2.0
       spdx-expression-parse: 3.0.1
 
-  vite-plugin-pwa@0.20.5(vite@5.4.7(@types/node@20.10.5)(terser@5.26.0))(workbox-build@7.1.1)(workbox-window@7.1.0):
+  vite-plugin-pwa@0.21.1(vite@6.0.7(@types/node@20.10.5)(jiti@2.4.2)(terser@5.26.0)(yaml@2.6.1))(workbox-build@7.3.0)(workbox-window@7.3.0):
     dependencies:
       debug: 4.3.6
       pretty-bytes: 6.1.1
-      tinyglobby: 0.2.0
-      vite: 5.4.7(@types/node@20.10.5)(terser@5.26.0)
-      workbox-build: 7.1.1
-      workbox-window: 7.1.0
+      tinyglobby: 0.2.10
+      vite: 6.0.7(@types/node@20.10.5)(jiti@2.4.2)(terser@5.26.0)(yaml@2.6.1)
+      workbox-build: 7.3.0
+      workbox-window: 7.3.0
     transitivePeerDependencies:
       - supports-color
 
-  vite@5.4.7(@types/node@20.10.5)(terser@5.26.0):
+  vite@6.0.7(@types/node@20.10.5)(jiti@2.4.2)(terser@5.26.0)(yaml@2.6.1):
     dependencies:
-      esbuild: 0.21.5
-      postcss: 8.4.47
-      rollup: 4.22.4
+      esbuild: 0.24.2
+      postcss: 8.4.49
+      rollup: 4.30.1
     optionalDependencies:
       "@types/node": 20.10.5
       fsevents: 2.3.3
+      jiti: 2.4.2
       terser: 5.26.0
+      yaml: 2.6.1
 
   w3c-keyname@2.2.8: {}
 
-  wavesurfer.js@7.8.6: {}
+  wavesurfer.js@7.8.15: {}
 
   wcwidth@1.0.1:
     dependencies:
@@ -15270,16 +15435,16 @@ snapshots:
 
   wordwrap@1.0.0: {}
 
-  workbox-background-sync@7.1.0:
+  workbox-background-sync@7.3.0:
     dependencies:
       idb: 7.1.1
-      workbox-core: 7.1.0
+      workbox-core: 7.3.0
 
-  workbox-broadcast-update@7.1.0:
+  workbox-broadcast-update@7.3.0:
     dependencies:
-      workbox-core: 7.1.0
+      workbox-core: 7.3.0
 
-  workbox-build@7.1.1:
+  workbox-build@7.3.0:
     dependencies:
       "@apideck/better-ajv-errors": 0.3.6(ajv@8.12.0)
       "@babel/core": 7.24.4
@@ -15303,85 +15468,85 @@ snapshots:
       strip-comments: 2.0.1
       tempy: 0.6.0
       upath: 1.2.0
-      workbox-background-sync: 7.1.0
-      workbox-broadcast-update: 7.1.0
-      workbox-cacheable-response: 7.1.0
-      workbox-core: 7.1.0
-      workbox-expiration: 7.1.0
-      workbox-google-analytics: 7.1.0
-      workbox-navigation-preload: 7.1.0
-      workbox-precaching: 7.1.0
-      workbox-range-requests: 7.1.0
-      workbox-recipes: 7.1.0
-      workbox-routing: 7.1.0
-      workbox-strategies: 7.1.0
-      workbox-streams: 7.1.0
-      workbox-sw: 7.1.0
-      workbox-window: 7.1.0
+      workbox-background-sync: 7.3.0
+      workbox-broadcast-update: 7.3.0
+      workbox-cacheable-response: 7.3.0
+      workbox-core: 7.3.0
+      workbox-expiration: 7.3.0
+      workbox-google-analytics: 7.3.0
+      workbox-navigation-preload: 7.3.0
+      workbox-precaching: 7.3.0
+      workbox-range-requests: 7.3.0
+      workbox-recipes: 7.3.0
+      workbox-routing: 7.3.0
+      workbox-strategies: 7.3.0
+      workbox-streams: 7.3.0
+      workbox-sw: 7.3.0
+      workbox-window: 7.3.0
     transitivePeerDependencies:
       - "@types/babel__core"
       - supports-color
 
-  workbox-cacheable-response@7.1.0:
+  workbox-cacheable-response@7.3.0:
     dependencies:
-      workbox-core: 7.1.0
+      workbox-core: 7.3.0
 
-  workbox-core@7.1.0: {}
+  workbox-core@7.3.0: {}
 
-  workbox-expiration@7.1.0:
+  workbox-expiration@7.3.0:
     dependencies:
       idb: 7.1.1
-      workbox-core: 7.1.0
+      workbox-core: 7.3.0
 
-  workbox-google-analytics@7.1.0:
+  workbox-google-analytics@7.3.0:
     dependencies:
-      workbox-background-sync: 7.1.0
-      workbox-core: 7.1.0
-      workbox-routing: 7.1.0
-      workbox-strategies: 7.1.0
+      workbox-background-sync: 7.3.0
+      workbox-core: 7.3.0
+      workbox-routing: 7.3.0
+      workbox-strategies: 7.3.0
 
-  workbox-navigation-preload@7.1.0:
+  workbox-navigation-preload@7.3.0:
     dependencies:
-      workbox-core: 7.1.0
+      workbox-core: 7.3.0
 
-  workbox-precaching@7.1.0:
+  workbox-precaching@7.3.0:
     dependencies:
-      workbox-core: 7.1.0
-      workbox-routing: 7.1.0
-      workbox-strategies: 7.1.0
+      workbox-core: 7.3.0
+      workbox-routing: 7.3.0
+      workbox-strategies: 7.3.0
 
-  workbox-range-requests@7.1.0:
+  workbox-range-requests@7.3.0:
     dependencies:
-      workbox-core: 7.1.0
+      workbox-core: 7.3.0
 
-  workbox-recipes@7.1.0:
+  workbox-recipes@7.3.0:
     dependencies:
-      workbox-cacheable-response: 7.1.0
-      workbox-core: 7.1.0
-      workbox-expiration: 7.1.0
-      workbox-precaching: 7.1.0
-      workbox-routing: 7.1.0
-      workbox-strategies: 7.1.0
+      workbox-cacheable-response: 7.3.0
+      workbox-core: 7.3.0
+      workbox-expiration: 7.3.0
+      workbox-precaching: 7.3.0
+      workbox-routing: 7.3.0
+      workbox-strategies: 7.3.0
 
-  workbox-routing@7.1.0:
+  workbox-routing@7.3.0:
     dependencies:
-      workbox-core: 7.1.0
+      workbox-core: 7.3.0
 
-  workbox-strategies@7.1.0:
+  workbox-strategies@7.3.0:
     dependencies:
-      workbox-core: 7.1.0
+      workbox-core: 7.3.0
 
-  workbox-streams@7.1.0:
+  workbox-streams@7.3.0:
     dependencies:
-      workbox-core: 7.1.0
-      workbox-routing: 7.1.0
+      workbox-core: 7.3.0
+      workbox-routing: 7.3.0
 
-  workbox-sw@7.1.0: {}
+  workbox-sw@7.3.0: {}
 
-  workbox-window@7.1.0:
+  workbox-window@7.3.0:
     dependencies:
       "@types/trusted-types": 2.0.7
-      workbox-core: 7.1.0
+      workbox-core: 7.3.0
 
   wrap-ansi@6.2.0:
     dependencies:
@@ -15434,10 +15599,10 @@ snapshots:
 
   yallist@4.0.0: {}
 
-  yaml@2.4.5: {}
-
   yaml@2.5.1: {}
 
+  yaml@2.6.1: {}
+
   yargs-parser@18.1.3:
     dependencies:
       camelcase: 5.3.1
diff --git a/scripts/bundle-prepare.sh b/scripts/bundle-prepare.sh
index 4d01158613f0ba72e02f9f1519c975cfa7699414..061779bd6238097ab67db5f29534eac1cc73118a 100644
--- a/scripts/bundle-prepare.sh
+++ b/scripts/bundle-prepare.sh
@@ -6,4 +6,3 @@ composer install --no-dev --prefer-dist --no-ansi --no-interaction --no-progress
 
 # build all production static assets (css, js, images, icons, fonts, etc.)
 pnpm run build
-pnpm run build:static
diff --git a/tests/database/ExampleDatabaseTest.php b/tests/database/ExampleDatabaseTest.php
index 8d4532667aaa92fcca7b867d51c1cec821e8051b..eda4a6ebbda58f96e510da41ffaaa363081076b6 100644
--- a/tests/database/ExampleDatabaseTest.php
+++ b/tests/database/ExampleDatabaseTest.php
@@ -45,6 +45,7 @@ class ExampleDatabaseTest extends CIUnitTestCase
         $model->delete($object->id);
 
         // The model should no longer find it
+        // @phpstan-ignore-next-line
         $this->assertNull($model->find($object->id));
 
         // ... but it should still be in the database
diff --git a/tests/session/ExampleSessionTest.php b/tests/session/ExampleSessionTest.php
index 6e2637ec2c8a056ec9c0d1851246e0258843a55c..b4299f17475bd617c2d1c01524f4dd7e9aa4327d 100644
--- a/tests/session/ExampleSessionTest.php
+++ b/tests/session/ExampleSessionTest.php
@@ -5,13 +5,12 @@ declare(strict_types=1);
 namespace Tests\Session;
 
 use CodeIgniter\Test\CIUnitTestCase;
-use Config\Services;
 
 class ExampleSessionTest extends CIUnitTestCase
 {
     public function testSessionSimple(): void
     {
-        $session = Services::session();
+        $session = service('session');
 
         $session->set('logged_in', 123);
         $this->assertSame(123, $session->get('logged_in'));
diff --git a/tests/unit/HealthTest.php b/tests/unit/HealthTest.php
index b3b5dbcec223bf50b3446f2978d1534ea5e3547c..86da3268fef6643e31907b1be75c91cc81df6671 100644
--- a/tests/unit/HealthTest.php
+++ b/tests/unit/HealthTest.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
 
 use CodeIgniter\Test\CIUnitTestCase;
 use Config\App;
-use Config\Services;
 use Tests\Support\Libraries\ConfigReader;
 
 /**
@@ -19,7 +18,7 @@ final class HealthTest extends CIUnitTestCase
 
     public function testBaseUrlHasBeenSet(): void
     {
-        $validation = Services::validation();
+        $validation = service('validation');
 
         $env = false;
 
diff --git a/themes/cp_admin/_layout.php b/themes/cp_admin/_layout.php
index 5bc6771043127866c7b621033498f2d3079f3766..783bd9d12a90043df85526f01d74c78da21b278d 100644
--- a/themes/cp_admin/_layout.php
+++ b/themes/cp_admin/_layout.php
@@ -39,7 +39,7 @@ $isEpisodeArea = isset($podcast) && isset($episode);
                     <div class="flex flex-wrap items-center truncate">
                     <?php if (($isEpisodeArea && $episode->is_premium) || ($isPodcastArea && $podcast->is_premium)): ?>
                         <div class="inline-flex items-center">
-                            <?php // @icon('exchange-dollar-fill')?>
+                            <?php // @icon("exchange-dollar-fill")?>
                             <IconButton uri="<?= route_to('subscription-list', $podcast->id) ?>" glyph="exchange-dollar-fill" variant="secondary" size="large" class="p-0 mr-2 border-0"><?= ($isEpisodeArea && $episode->is_premium) ? lang('PremiumPodcasts.episode_is_premium') : lang('PremiumPodcasts.podcast_is_premium') ?></IconButton>
                             <Heading tagName="h1" size="large" class="truncate"><?= $this->renderSection('pageTitle') ?></Heading>
                         </div>
diff --git a/themes/cp_admin/_sidebar.php b/themes/cp_admin/_sidebar.php
index 8279b8e3eb30fe7a820cfec5a802fccaf778acb1..c438898a54583a75a347ebfc122fc58262b0f3f2 100644
--- a/themes/cp_admin/_sidebar.php
+++ b/themes/cp_admin/_sidebar.php
@@ -7,11 +7,11 @@ use Modules\Auth\Models\UserModel;
 
 $navigation = [
     'dashboard' => [
-        'icon'  => 'dashboard-fill', // @icon('dashboard-fill')
+        'icon'  => 'dashboard-fill', // @icon("dashboard-fill")
         'items' => ['admin'],
     ],
     'podcasts' => [
-        'icon'              => 'mic-fill', // @icon('mic-fill')
+        'icon'              => 'mic-fill', // @icon("mic-fill")
         'items'             => ['podcast-list', 'podcast-create', 'all-podcast-imports', 'podcast-imports-add'],
         'items-permissions' => [
             'podcast-create'      => 'podcasts.create',
@@ -22,7 +22,7 @@ $navigation = [
         'count-route' => 'podcast-list',
     ],
     'persons' => [
-        'icon'              => 'folder-user-fill', // @icon('folder-user-fill')
+        'icon'              => 'folder-user-fill', // @icon("folder-user-fill")
         'items'             => ['person-list', 'person-create'],
         'items-permissions' => [
             'person-list'   => 'persons.manage',
@@ -33,7 +33,7 @@ $navigation = [
         'count-route' => 'person-list',
     ],
     'fediverse' => [
-        'icon'              => 'rocket-2-fill', // @icon('rocket-2-fill')
+        'icon'              => 'rocket-2-fill', // @icon("rocket-2-fill")
         'items'             => ['fediverse-blocked-actors', 'fediverse-blocked-domains'],
         'items-permissions' => [
             'fediverse-blocked-actors'  => 'fediverse.manage-blocks',
@@ -41,7 +41,7 @@ $navigation = [
         ],
     ],
     'users' => [
-        'icon'              => 'group-fill', // @icon('group-fill')
+        'icon'              => 'group-fill', // @icon("group-fill")
         'items'             => ['user-list', 'user-create'],
         'items-permissions' => [
             'user-list'   => 'users.manage',
@@ -52,7 +52,7 @@ $navigation = [
         'count-route' => 'user-list',
     ],
     'pages' => [
-        'icon'              => 'pages-fill', // @icon('pages-fill')
+        'icon'              => 'pages-fill', // @icon("pages-fill")
         'items'             => ['page-list', 'page-create'],
         'items-permissions' => [
             'page-list'   => 'pages.manage',
@@ -63,7 +63,7 @@ $navigation = [
         'count-route' => 'page-list',
     ],
     'settings' => [
-        'icon'              => 'settings-3-fill', // @icon('settings-3-fill')
+        'icon'              => 'settings-3-fill', // @icon("settings-3-fill")
         'items'             => ['settings-general', 'settings-theme', 'admin-about'],
         'items-permissions' => [
             'settings-general' => 'admin.settings',
diff --git a/themes/cp_admin/contributor/list.php b/themes/cp_admin/contributor/list.php
index 2f2ebd61dfa081fa4c6ee4d7bb01cedaf21f1c89..4a3b0b71e5be9d4b4b29ce457272baaddef37292 100644
--- a/themes/cp_admin/contributor/list.php
+++ b/themes/cp_admin/contributor/list.php
@@ -9,7 +9,7 @@
 <?= $this->endSection() ?>
 
 <?= $this->section('headerRight') ?>
-<?php // @icon('add-fill')?>
+<?php // @icon("add-fill")?>
 <Button uri="<?= route_to('contributor-add', $podcast->id) ?>" variant="primary" iconLeft="add-fill"><?= lang('Contributor.add') ?></Button>
 <?= $this->endSection() ?>
 
@@ -39,8 +39,8 @@
         [
             'header' => lang('Common.actions'),
             'cell'   => function ($contributor, $podcast) {
-                // @icon('pencil-fill')
-                // @icon('delete-bin-fill')
+                // @icon("pencil-fill")
+                // @icon("delete-bin-fill")
                 return '<Button uri="' . route_to('contributor-edit', $podcast->id, $contributor->id) . '" variant="secondary" iconLeft="pencil-fill" size="small">' . lang('Contributor.edit') . '</Button>' .
                 '<Button uri="' . route_to('contributor-remove', $podcast->id, $contributor->id) . '" variant="danger" iconLeft="delete-bin-fill" size="small">' . lang('Contributor.remove') . '</Button>';
             },
diff --git a/themes/cp_admin/dashboard.php b/themes/cp_admin/dashboard.php
index 3414370818ea7b5764ada07578681c5fcff38f66..2b03d52224d0a7dfe88bdac565ca67bf8101c343 100644
--- a/themes/cp_admin/dashboard.php
+++ b/themes/cp_admin/dashboard.php
@@ -12,15 +12,15 @@
 <?= $this->section('content') ?>
 
 <div class="flex flex-col items-stretch gap-4 lg:flex-row">
-    <?php // @icon('mic-fill')?>
+    <?php // @icon("mic-fill")?>
     <DashboardCard href="<?= $onlyPodcastId === null ? route_to('podcast-list') : route_to('podcast-view', $onlyPodcastId) ?>" glyph="mic-fill" title="<?= lang('Dashboard.podcasts.title') ?>" subtitle="<?= $podcastsData['last_published_at'] ? esc(lang('Dashboard.podcasts.last_published', [
         'lastPublicationDate' => local_date($podcastsData['last_published_at']),
     ], null, false)) : lang('Dashboard.podcasts.not_found') ?>"><?= $podcastsData['number_of_podcasts'] ?></DashboardCard>
-    <?php // @icon('play-fill')?>
+    <?php // @icon("play-fill")?>
     <DashboardCard href="<?= $onlyPodcastId === null ? '' : route_to('episode-list', $onlyPodcastId) ?>" glyph="play-fill" title="<?= lang('Dashboard.episodes.title') ?>" subtitle="<?= $episodesData['last_published_at'] ? esc(lang('Dashboard.episodes.last_published', [
         'lastPublicationDate' => local_date($episodesData['last_published_at']),
     ], null, false)) : lang('Dashboard.episodes.not_found') ?>"><?= $episodesData['number_of_episodes'] ?></DashboardCard>
-    <?php // @icon('database-2-fill')?>
+    <?php // @icon("database-2-fill")?>
     <DashboardCard glyph="database-2-fill" title="<?= lang('Dashboard.storage.title') ?>" subtitle="<?= lang('Dashboard.storage.subtitle', [
         'totalUploaded' => $storageData['total_uploaded'],
         'totalStorage'  => $storageData['limit'],
diff --git a/themes/cp_admin/episode/_sidebar.php b/themes/cp_admin/episode/_sidebar.php
index 74295f164855019346c5e4b58fc9520d3c21a521..6206b7c38452a96a978664b985d2268cf5019b91 100644
--- a/themes/cp_admin/episode/_sidebar.php
+++ b/themes/cp_admin/episode/_sidebar.php
@@ -2,7 +2,7 @@
 
 $episodeNavigation = [
     'dashboard' => [
-        'icon'              => 'dashboard-fill', // @icon('dashboard-fill')
+        'icon'              => 'dashboard-fill', // @icon("dashboard-fill")
         'items'             => ['episode-view', 'episode-edit', 'episode-persons-manage', 'embed-add'],
         'items-permissions' => [
             'episode-view'           => 'episodes.view',
@@ -12,7 +12,7 @@ $episodeNavigation = [
         ],
     ],
     'clips' => [
-        'icon'              => 'clapperboard-fill', // @icon('clapperboard-fill')
+        'icon'              => 'clapperboard-fill', // @icon("clapperboard-fill")
         'items'             => ['video-clips-list', 'video-clips-create', 'soundbites-list', 'soundbites-create'],
         'items-permissions' => [
             'video-clips-list'   => 'episodes.manage-clips',
diff --git a/themes/cp_admin/episode/edit.php b/themes/cp_admin/episode/edit.php
index 87a4117f0d48d2fc3a538bc902ab5c51bb961730..854647af4341e90f042d743fc8440b281c4d6ed1 100644
--- a/themes/cp_admin/episode/edit.php
+++ b/themes/cp_admin/episode/edit.php
@@ -288,10 +288,10 @@
 </form>
 
 <?php if ($episode->published_at === null): ?>
-    <?php // @icon('delete-bin-fill')?>
+    <?php // @icon("delete-bin-fill")?>
     <Button class="mt-8" variant="danger" uri="<?= route_to('episode-delete', $podcast->id, $episode->id) ?>" iconLeft="delete-bin-fill"><?= lang('Episode.delete') ?></Button>    
 <?php else: ?>
-    <?php // @icon('forbid-fill')?>
+    <?php // @icon("forbid-fill")?>
     <Button class="mt-8" variant="disabled" iconLeft="forbid-fill" data-tooltip="right" title="<?= lang('Episode.messages.unpublishBeforeDeleteTip') ?>"><?= lang('Episode.delete') ?></Button>
 <?php endif ?>
 
diff --git a/themes/cp_admin/episode/embed.php b/themes/cp_admin/episode/embed.php
index 58af05b87f663672d2edbf6fb690e0b7205ae592..483339bd69cbfd109139e6124ea1b4f1aeef9b18 100644
--- a/themes/cp_admin/episode/embed.php
+++ b/themes/cp_admin/episode/embed.php
@@ -34,13 +34,13 @@ $embedHeight = config('Embed')->height;
 
 <div class="flex items-center mt-8 gap-x-2">
     <Forms.Textarea readonly="true" class="w-full max-w-xl" name="iframe" rows="2" value="<?= esc("<iframe width=\"100%\" height=\"{$embedHeight}\" frameborder=\"0\" scrolling=\"no\" style=\"width: 100%; height: {$embedHeight}px; overflow: hidden;\" src=\"{$episode->embed_url}\"></iframe>") ?>" />
-    <?php // @icon('file-copy-fill')?>
+    <?php // @icon("file-copy-fill")?>
     <IconButton glyph="file-copy-fill" data-type="clipboard-copy" data-clipboard-target="iframe"><?= lang('Episode.embed.clipboard_iframe') ?></IconButton>
 </div>
 
 <div class="flex items-center mt-4 gap-x-2">
     <Forms.Input readonly="true" class="w-full max-w-xl" name="url" value="<?= esc($episode->embed_url) ?>" />
-    <?php // @icon('file-copy-fill')?>
+    <?php // @icon("file-copy-fill")?>
     <IconButton glyph="file-copy-fill" data-type="clipboard-copy" data-clipboard-target="url"><?= lang('Episode.embed.clipboard_url') ?></IconButton>
 </div>
 
diff --git a/themes/cp_admin/episode/list.php b/themes/cp_admin/episode/list.php
index 261bdcc12a5babbfde8cb0f743ee6b6963df4148..1f293278bd571b842adb93a01c64a94916aa9da0 100644
--- a/themes/cp_admin/episode/list.php
+++ b/themes/cp_admin/episode/list.php
@@ -9,7 +9,7 @@
 <?= $this->endSection() ?>
 
 <?= $this->section('headerRight') ?>
-<?php // @icon('add-fill')?>
+<?php // @icon("add-fill")?>
 <Button uri="<?= route_to('episode-create', $podcast->id) ?>" variant="primary" iconLeft="add-fill"><?= lang('Episode.create') ?></Button>
 <?= $this->endSection() ?>
 
diff --git a/themes/cp_admin/episode/persons.php b/themes/cp_admin/episode/persons.php
index a66a1520a974c43f80d8e441eb8346612060119e..850a95227f38a3f2f039c6f7d55e996c3f4b3964 100644
--- a/themes/cp_admin/episode/persons.php
+++ b/themes/cp_admin/episode/persons.php
@@ -9,7 +9,7 @@
 <?= $this->endSection() ?>
 
 <?= $this->section('headerRight') ?>
-<?php // @icon('add-fill')?>
+<?php // @icon("add-fill")?>
 <Button variant="primary" uri="<?= route_to('person-create') ?>" iconLeft="add-fill"><?= lang('Person.create') ?></Button>
 <?= $this->endSection() ?>
 
@@ -86,7 +86,7 @@
         [
             'header' => lang('Common.actions'),
             'cell'   => function ($person): string {
-                // @icon('delete-bin-fill')
+                // @icon("delete-bin-fill")
                 return '<Button uri="' . route_to('episode-person-remove', $person->podcast_id, $person->episode_id, $person->id) . '" variant="danger" size="small" iconLeft="delete-bin-fill">' . lang('Person.episode_form.remove') . '</Button>';
             },
         ],
diff --git a/themes/cp_admin/episode/soundbites_list.php b/themes/cp_admin/episode/soundbites_list.php
index 1955bfcea588e7e62bcc68d455d8dbf7039e70af..db6ff25e2cd644f1fa93696b9c6fe90d6ac1db41 100644
--- a/themes/cp_admin/episode/soundbites_list.php
+++ b/themes/cp_admin/episode/soundbites_list.php
@@ -9,7 +9,7 @@
 <?= $this->endSection() ?>
 
 <?= $this->section('headerRight') ?>
-<?php // @icon('add-fill')?>
+<?php // @icon("add-fill")?>
 <Button uri="<?= route_to('soundbites-create', $podcast->id, $episode->id) ?>" variant="primary" iconLeft="add-fill"><?= lang('Soundbite.create') ?></Button>
 <?= $this->endSection() ?>
 
diff --git a/themes/cp_admin/episode/soundbites_new.php b/themes/cp_admin/episode/soundbites_new.php
index c6ba10fb54f8fa3765fbafbdc17119c3ae665786..a96e58fdc45986fe1464f1135639118e6564048d 100644
--- a/themes/cp_admin/episode/soundbites_new.php
+++ b/themes/cp_admin/episode/soundbites_new.php
@@ -28,7 +28,7 @@
         <input slot="duration" type="number" name="duration" placeholder="<?= lang('VideoClip.form.duration') ?>" step="0.001" />
     </audio-clipper>
 
-    <?php // @icon('arrow-right-fill')?>
+    <?php // @icon("arrow-right-fill")?>
     <Button variant="primary" type="submit" class="self-end mt-4" iconRight="arrow-right-fill"><?= lang('Soundbite.form.submit') ?></Button>
 
 </form>
diff --git a/themes/cp_admin/episode/video_clips_list.php b/themes/cp_admin/episode/video_clips_list.php
index 2a0e075c96d92b524150bad1f5b96de42aba5ba9..c5cffa3769ac6dd4669eb011e3fa8b8ecae53e1f 100644
--- a/themes/cp_admin/episode/video_clips_list.php
+++ b/themes/cp_admin/episode/video_clips_list.php
@@ -15,7 +15,7 @@ use CodeIgniter\I18n\Time;
 <?= $this->endSection() ?>
 
 <?= $this->section('headerRight') ?>
-<?php // @icon('add-fill')?>
+<?php // @icon("add-fill")?>
 <Button uri="<?= route_to('video-clips-create', $podcast->id, $episode->id) ?>" variant="primary" iconLeft="add-fill"><?= lang('VideoClip.create') ?></Button>
 <?= $this->endSection() ?>
 
@@ -35,12 +35,12 @@ use CodeIgniter\I18n\Time;
                 ];
 
                 $pillIconMap = [
-                    'queued'   => 'timer-fill', // @icon('timer-fill')
-                    'pending'  => 'pause-fill', // @icon('pause-fill')
-                    'running'  => 'loader-fill', // @icon('loader-fill')
-                    'canceled' => 'forbid-fill', // @icon('forbid-fill')
-                    'failed'   => 'close-fill', // @icon('close-fill')
-                    'passed'   => 'check-fill', // @icon('check-fill')
+                    'queued'   => 'timer-fill', // @icon("timer-fill")
+                    'pending'  => 'pause-fill', // @icon("pause-fill")
+                    'running'  => 'loader-fill', // @icon("loader-fill")
+                    'canceled' => 'forbid-fill', // @icon("forbid-fill")
+                    'failed'   => 'close-fill', // @icon("close-fill")
+                    'passed'   => 'check-fill', // @icon("check-fill")
                 ];
 
                 $pillIconClassMap = [
@@ -97,7 +97,7 @@ use CodeIgniter\I18n\Time;
                 if ($videoClip->media) {
                     helper('misc');
                     $filename = 'clip-' . slugify($videoClip->title) . "-{$videoClip->start_time}-{$videoClip->end_time}";
-                    // @icon('import-fill')
+                    // @icon("import-fill")
                     $downloadButton = '<IconButton glyph="import-fill" uri="' . $videoClip->media->file_url . '" download="' . $filename . '">' . lang('VideoClip.download_clip') . '</IconButton>';
                 }
 
diff --git a/themes/cp_admin/episode/video_clips_new.php b/themes/cp_admin/episode/video_clips_new.php
index fdcd72b09ed955b998517159723854b0e6e06d48..332adf14915b51649395d9725f92fb14e8a1cced 100644
--- a/themes/cp_admin/episode/video_clips_new.php
+++ b/themes/cp_admin/episode/video_clips_new.php
@@ -71,7 +71,7 @@
             </div>
         </fieldset>
     </Forms.Section>
-    <?php // @icon('arrow-right-fill')?>
+    <?php // @icon("arrow-right-fill")?>
     <Button variant="primary" type="submit" iconRight="arrow-right-fill" class="self-end"><?= lang('VideoClip.form.submit') ?></Button>
 </div>
 </form>
diff --git a/themes/cp_admin/episode/view.php b/themes/cp_admin/episode/view.php
index a5cc18c6876276f065169857886c631f83101012..09b508d8bb69840c0abd4ad9a5671b19203894fb 100644
--- a/themes/cp_admin/episode/view.php
+++ b/themes/cp_admin/episode/view.php
@@ -18,7 +18,7 @@
 
 <?= $this->section('headerRight') ?>
 <?php if ($episode->publication_status === 'published'): ?>
-<?php // @icon('history-fill')?>
+<?php // @icon("history-fill")?>
 <IconButton
     uri="<?= route_to('episode-publish_date_edit', $podcast->id, $episode->id) ?>"
     glyph="history-fill"
diff --git a/themes/cp_admin/import/_queue_table.php b/themes/cp_admin/import/_queue_table.php
index c6ac64eb5e1908ee7d03cd65501725dd8408cc4e..70a38b34d08b129740c652db5e243a44fa8698e7 100644
--- a/themes/cp_admin/import/_queue_table.php
+++ b/themes/cp_admin/import/_queue_table.php
@@ -21,12 +21,12 @@ use Modules\PodcastImport\Entities\TaskStatus;
                 ];
 
                 $pillIconMap = [
-                    'queued'   => 'timer-fill', // @icon('timer-fill')
-                    'pending'  => 'pause-fill', // @icon('pause-fill')
-                    'running'  => 'loader-fill', // @icon('loader-fill')
-                    'canceled' => 'forbid-fill', // @icon('forbid-fill')
-                    'failed'   => 'close-fill', // @icon('close-fill')
-                    'passed'   => 'check-fill', // @icon('check-fill')
+                    'queued'   => 'timer-fill', // @icon("timer-fill")
+                    'pending'  => 'pause-fill', // @icon("pause-fill")
+                    'running'  => 'loader-fill', // @icon("loader-fill")
+                    'canceled' => 'forbid-fill', // @icon("forbid-fill")
+                    'failed'   => 'close-fill', // @icon("close-fill")
+                    'passed'   => 'check-fill', // @icon("check-fill")
                 ];
 
                 $pillIconClassMap = [
diff --git a/themes/cp_admin/import/add_to_queue.php b/themes/cp_admin/import/add_to_queue.php
index 75046a27e8dd39fc4704cd4201954a6ebf84891b..5ad4c3777aea1e0d0508a3908d454bf1e06b6dcb 100644
--- a/themes/cp_admin/import/add_to_queue.php
+++ b/themes/cp_admin/import/add_to_queue.php
@@ -15,7 +15,7 @@
 
 <Forms.Section
     title="<?= lang('PodcastImport.old_podcast_section_title') ?>">
-<?php // @icon('scales-3-fill')?>
+<?php // @icon("scales-3-fill")?>
 <Alert glyph="scales-3-fill" variant="info" title="<?= lang('PodcastImport.old_podcast_legal_disclaimer_title') ?>"><?= lang('PodcastImport.old_podcast_legal_disclaimer') ?></Alert>
 <Forms.Field
     name="imported_feed_url"
diff --git a/themes/cp_admin/import/podcast_queue.php b/themes/cp_admin/import/podcast_queue.php
index 9deec3a8e20cd5f5567c6406a1b97ba48d33099f..9be03c20403bc38f2c6045ccb51ab7a3565b3941 100644
--- a/themes/cp_admin/import/podcast_queue.php
+++ b/themes/cp_admin/import/podcast_queue.php
@@ -9,7 +9,7 @@
 <?= $this->endSection() ?>
 
 <?= $this->section('headerRight') ?>
-<?php // @icon('loop-left-fill')?>
+<?php // @icon("loop-left-fill")?>
 <Button uri="<?= route_to('podcast-imports-sync', $podcast->id) ?>" variant="primary" iconLeft="loop-left-fill"><?= lang('PodcastImport.syncForm.title') ?></Button>
 <?= $this->endSection() ?>
 
diff --git a/themes/cp_admin/import/queue.php b/themes/cp_admin/import/queue.php
index faedb76f8922718bb0a6816e3daf9bb03d9de68f..ff32f738cadbda0137c0bd984ecac3ded9ac9eb7 100644
--- a/themes/cp_admin/import/queue.php
+++ b/themes/cp_admin/import/queue.php
@@ -12,7 +12,7 @@
 <?= $this->endSection() ?>
 
 <?= $this->section('headerRight') ?>
-<?php // @icon('add-fill')?>
+<?php // @icon("add-fill")?>
 <Button uri="<?= route_to('podcast-imports-add') ?>" variant="primary" iconLeft="add-fill"><?= lang('Podcast.import') ?></Button>
 <?= $this->endSection() ?>
 
diff --git a/themes/cp_admin/page/list.php b/themes/cp_admin/page/list.php
index 4b08a44c0abae967d09e87f1c417a181226deeb7..9a73b629840b84e8fe88bc16fe091193065ed3c1 100644
--- a/themes/cp_admin/page/list.php
+++ b/themes/cp_admin/page/list.php
@@ -9,7 +9,7 @@
 <?= $this->endSection() ?>
 
 <?= $this->section('headerRight') ?>
-<?php // @icon('add-fill')?>
+<?php // @icon("add-fill")?>
 <Button uri="<?= route_to('page-create') ?>" variant="primary" iconLeft="add-fill"><?= lang('Page.create') ?></Button>
 <?= $this->endSection() ?>
 
diff --git a/themes/cp_admin/page/view.php b/themes/cp_admin/page/view.php
index 609fa4ad46946c919a0fe048d645a6c04f8e2e82..22fc098d77cb2421d77728cfdf1f7b60802e617e 100644
--- a/themes/cp_admin/page/view.php
+++ b/themes/cp_admin/page/view.php
@@ -9,7 +9,7 @@
 <?= $this->endSection() ?>
 
 <?= $this->section('headerRight') ?>
-<?php // @icon('add-fill')?>
+<?php // @icon("add-fill")?>
 <Button variant="primary" uri="<?= route_to('page-edit', $page->id) ?>" iconLeft="add-fill"><?= lang('Page.edit') ?></Button>
 <?= $this->endSection() ?>
 
diff --git a/themes/cp_admin/person/list.php b/themes/cp_admin/person/list.php
index 98d906429ef8dd5547204f0a70672c8c050a0647..07e4449cc3c29398b8516277ecbabc78e89d824e 100644
--- a/themes/cp_admin/person/list.php
+++ b/themes/cp_admin/person/list.php
@@ -9,7 +9,7 @@
 <?= $this->endSection() ?>
 
 <?= $this->section('headerRight') ?>
-<?php // @icon('add-fill')?>
+<?php // @icon("add-fill")?>
 <Button uri="<?= route_to('person-create') ?>" variant="primary" iconLeft="add-fill"><?= lang('Person.create') ?></Button>
 <?= $this->endSection() ?>
 
diff --git a/themes/cp_admin/person/view.php b/themes/cp_admin/person/view.php
index c10641dd1ea6268667a0fc0916c2683d6afe979f..02e726f011d20b9d25acee59ea1b6cfcea73848f 100644
--- a/themes/cp_admin/person/view.php
+++ b/themes/cp_admin/person/view.php
@@ -10,7 +10,7 @@
 <?= $this->endSection() ?>
 
 <?= $this->section('headerRight') ?>
-<?php // @icon('pencil-fill')?>
+<?php // @icon("pencil-fill")?>
 <Button uri="<?= route_to('person-edit', $person->id) ?>" variant="secondary" iconLeft="pencil-fill"><?= lang('Person.edit') ?></Button>
 <?= $this->endSection() ?>
 
diff --git a/themes/cp_admin/podcast/_sidebar.php b/themes/cp_admin/podcast/_sidebar.php
index e69d67c5ce910eaef948371f6eb3ae6686e092e3..2c291a8a33a35bfeab9ac67ea7b7f4272eb23d9e 100644
--- a/themes/cp_admin/podcast/_sidebar.php
+++ b/themes/cp_admin/podcast/_sidebar.php
@@ -2,7 +2,7 @@
 
 $podcastNavigation = [
     'dashboard' => [
-        'icon'              => 'dashboard-fill', // @icon('dashboard-fill')
+        'icon'              => 'dashboard-fill', // @icon("dashboard-fill")
         'items'             => ['podcast-view', 'podcast-edit', 'podcast-persons-manage', 'podcast-imports', 'podcast-imports-sync'],
         'items-permissions' => [
             'podcast-view'           => 'view',
@@ -13,7 +13,7 @@ $podcastNavigation = [
         ],
     ],
     'episodes' => [
-        'icon'              => 'play-circle-fill', // @icon('play-circle-fill')
+        'icon'              => 'play-circle-fill', // @icon("play-circle-fill")
         'items'             => ['episode-list', 'episode-create'],
         'items-permissions' => [
             'episode-list'   => 'episodes.view',
@@ -24,7 +24,7 @@ $podcastNavigation = [
         'count-route' => 'episode-list',
     ],
     'analytics' => [
-        'icon'  => 'line-chart-fill', // @icon('line-chart-fill')
+        'icon'  => 'line-chart-fill', // @icon("line-chart-fill")
         'items' => [
             'podcast-analytics',
             'podcast-analytics-unique-listeners',
@@ -45,7 +45,7 @@ $podcastNavigation = [
         ],
     ],
     'broadcast' => [
-        'icon'  => 'broadcast-fill', // @icon('broadcast-fill')
+        'icon'  => 'broadcast-fill', // @icon("broadcast-fill")
         'items' => [
             'platforms-podcasting',
             'platforms-social',
@@ -56,7 +56,7 @@ $podcastNavigation = [
         ],
     ],
     'monetization' => [
-        'icon'  => 'money-dollar-circle-fill', // @icon('money-dollar-circle-fill')
+        'icon'  => 'money-dollar-circle-fill', // @icon("money-dollar-circle-fill")
         'items' => [
             'subscription-list',
             'subscription-create',
@@ -71,7 +71,7 @@ $podcastNavigation = [
         ],
     ],
     'contributors' => [
-        'icon'              => 'group-fill', // @icon('group-fill')
+        'icon'              => 'group-fill', // @icon("group-fill")
         'items'             => ['contributor-list', 'contributor-add'],
         'items-permissions' => [
             'contributor-list' => 'manage-contributors',
diff --git a/themes/cp_admin/podcast/edit.php b/themes/cp_admin/podcast/edit.php
index 85c94fae11dbf50eeb6e07558e40749cda9f7377..fadba91b37fbcb86864e6f228147b896729ddd2c 100644
--- a/themes/cp_admin/podcast/edit.php
+++ b/themes/cp_admin/podcast/edit.php
@@ -282,7 +282,7 @@ value="<?= esc($podcast->new_feed_url) ?>"
 </div>
 
 </form>
-<?php // @icon('delete-bin-fill')?>
+<?php // @icon("delete-bin-fill")?>
 <Button class="mt-8" variant="danger" uri="<?= route_to('podcast-delete', $podcast->id) ?>" iconLeft="delete-bin-fill"><?= lang('Podcast.delete') ?></Button>
 
 <?= $this->endSection() ?>
diff --git a/themes/cp_admin/podcast/list.php b/themes/cp_admin/podcast/list.php
index 5ecb797674fd5202e4892bbbef416b74100b0a84..c20f2f7cd943f2186b6b6441df5524739ff3f2a6 100644
--- a/themes/cp_admin/podcast/list.php
+++ b/themes/cp_admin/podcast/list.php
@@ -10,8 +10,8 @@
 
 <?= $this->section('headerRight') ?>
 <?php
-// @icon('import-fill')
-// @icon('add-fill')
+// @icon("import-fill")
+// @icon("add-fill")
 ?>
 <Button uri="<?= route_to('podcast-imports-add') ?>" variant="secondary" iconLeft="import-fill"><?= lang('Podcast.import') ?></Button>
 <Button uri="<?= route_to('podcast-create') ?>" variant="primary" iconLeft="add-fill"><?= lang('Podcast.create') ?></Button>
diff --git a/themes/cp_admin/podcast/persons.php b/themes/cp_admin/podcast/persons.php
index 697d3ea23618486e0c65de0c63e44a8194294294..3235d9b730c76232259116dea538077b27f199da 100644
--- a/themes/cp_admin/podcast/persons.php
+++ b/themes/cp_admin/podcast/persons.php
@@ -9,7 +9,7 @@
 <?= $this->endSection() ?>
 
 <?= $this->section('headerRight') ?>
-<?php // @icon('add-fill')?>
+<?php // @icon("add-fill")?>
 <Button uri="<?= route_to('person-create') ?>" variant="primary" iconLeft="add-fill"><?= lang('Person.create') ?></Button>
 <?= $this->endSection() ?>
 
@@ -84,7 +84,7 @@
         [
             'header' => lang('Common.actions'),
             'cell'   => function ($person): string {
-                // @icon('delete-bin-fill')
+                // @icon("delete-bin-fill")
                 return '<Button uri="' . route_to('podcast-person-remove', $person->podcast_id, $person->id) . '" variant="danger" size="small" iconLeft="delete-bin-fill">' . lang('Person.podcast_form.remove') . '</Button>';
             },
         ],
diff --git a/themes/cp_admin/podcast/view.php b/themes/cp_admin/podcast/view.php
index 51a2ad398fcb4cd7a98daf29b5400fe936172745..9df1dc611645115131c87e6fb4021909d6c82b55 100644
--- a/themes/cp_admin/podcast/view.php
+++ b/themes/cp_admin/podcast/view.php
@@ -10,8 +10,8 @@
 
 <?= $this->section('headerRight') ?>
 <?php
-// @icon('pencil-fill')
-// @icon('add-fill')
+// @icon("pencil-fill")
+// @icon("add-fill")
 ?>
 <Button uri="<?= route_to('podcast-edit', $podcast->id) ?>" variant="secondary" class="[&>span]:hidden [&>span]:md:block py-3 md:py-2" iconLeft="pencil-fill"><?= lang('Podcast.edit') ?></Button>
 <Button uri="<?= route_to('episode-create', $podcast->id) ?>" variant="primary" class="[&>span]:hidden [&>span]:md:block py-3 md:py-2" iconLeft="add-fill"><?= lang('Episode.create') ?></Button>
diff --git a/themes/cp_admin/settings/general.php b/themes/cp_admin/settings/general.php
index 9253a0ed754bef1f28fc90b5250e4583bd92af35..600aae672d11140d7be9dce32b4cc9cd3636fa5b 100644
--- a/themes/cp_admin/settings/general.php
+++ b/themes/cp_admin/settings/general.php
@@ -67,7 +67,7 @@
 <Forms.Section
     title="<?= lang('Settings.images.title') ?>"
     subtitle="<?= lang('Settings.images.subtitle') ?>">
-    <?php // @icon('refresh-fill')?>
+    <?php // @icon("refresh-fill")?>
     <Button variant="primary" type="submit" iconLeft="refresh-fill"><?= lang('Settings.images.regenerate') ?></Button>
 
 </Forms.Section>
@@ -84,7 +84,7 @@
     <Forms.Toggler name="reset_counts" value="yes" size="small" checked="false" hint="<?= esc(lang('Settings.housekeeping.reset_counts_helper')) ?>"><?= lang('Settings.housekeeping.reset_counts') ?></Forms.Toggler>
     <Forms.Toggler name="rename_episodes_files" value="yes" size="small" checked="false" hint="<?= esc(lang('Settings.housekeeping.rename_episodes_files_hint')) ?>"><?= lang('Settings.housekeeping.rename_episodes_files') ?></Forms.Toggler>
     <Forms.Toggler name="clear_cache" value="yes" size="small" checked="false" hint="<?= esc(lang('Settings.housekeeping.clear_cache_helper')) ?>"><?= lang('Settings.housekeeping.clear_cache') ?></Forms.Toggler>
-    <?php // @icon('home-gear-fill')?>
+    <?php // @icon("home-gear-fill")?>
     <Button variant="primary" type="submit" iconLeft="home-gear-fill"><?= lang('Settings.housekeeping.run') ?></Button>
 
 </Forms.Section>
diff --git a/themes/cp_admin/subscription/list.php b/themes/cp_admin/subscription/list.php
index dc87523ee3436d2ead1837543b88c08327624a23..be45db5b72998cd03bc1c4ffee8e0da3075cd2ad 100644
--- a/themes/cp_admin/subscription/list.php
+++ b/themes/cp_admin/subscription/list.php
@@ -9,7 +9,7 @@
 <?= $this->endSection() ?>
 
 <?= $this->section('headerRight') ?>
-<?php // @icon('add-fill')?>
+<?php // @icon("add-fill")?>
 <Button uri="<?= route_to('subscription-create', $podcast->id) ?>" variant="primary" iconLeft="add-fill"><?= lang('Subscription.add') ?></Button>
 <?= $this->endSection() ?>
 
diff --git a/themes/cp_admin/subscription/suspend.php b/themes/cp_admin/subscription/suspend.php
index 3b3c8d9c40aa11490fa86f5a4998d5cd5e619720..ff7250c199eb41a1cfd55870caadeedefbf01270 100644
--- a/themes/cp_admin/subscription/suspend.php
+++ b/themes/cp_admin/subscription/suspend.php
@@ -28,7 +28,7 @@
 
 <div class="flex items-center self-end mt-4 gap-x-2">
     <Button uri="<?= route_to('subscription-list', $podcast->id) ?>"><?= lang('Common.cancel') ?></Button>
-    <?php // @icon('pause-fill')?>
+    <?php // @icon("pause-fill")?>
     <Button type="submit" variant="warning" iconLeft="pause-fill"><?= lang('Subscription.suspend_form.submit') ?></Button>
 </div>
 
diff --git a/themes/cp_admin/user/list.php b/themes/cp_admin/user/list.php
index aec95ff215d45ae1f1141e84fbc68db938b3e453..44d94e4c757d0774e8b572a6d7165f6e832483c8 100644
--- a/themes/cp_admin/user/list.php
+++ b/themes/cp_admin/user/list.php
@@ -9,7 +9,7 @@
 <?= $this->endSection() ?>
 
 <?= $this->section('headerRight') ?>
-<?php // @icon('user-add-fill')?>
+<?php // @icon("user-add-fill")?>
 <Button uri="<?= route_to('user-create') ?>" variant="primary" iconLeft="user-add-fill"><?= lang('User.create') ?></Button>
 <?= $this->endSection() ?>
 
@@ -37,7 +37,7 @@
                     $role = '<div class="inline-flex items-center"><span class="mr-2 focus:ring-accent" tabindex="0" data-tooltip="bottom" title="' . lang('Auth.instance_groups.owner.title') . '">' . icon('shield-user-fill') . '</span>' . $role . '</div>';
                 }
 
-                // @icon('pencil-fill')
+                // @icon("pencil-fill")
                 return $role . '<IconButton uri="' . route_to('user-edit', $user->id) . '" glyph="pencil-fill" variant="info">' . lang('User.edit_role', [
                     'username' => esc($user->username),
                 ]) . '</IconButton>';
diff --git a/themes/cp_app/embed.php b/themes/cp_app/embed.php
index 5e27cd7b80132aeb78100b9980c264fa43a68ba4..31ad15575b190fd0967413bb59887e3381f1a0d4 100644
--- a/themes/cp_app/embed.php
+++ b/themes/cp_app/embed.php
@@ -33,7 +33,7 @@
             <h1 class="font-semibold leading-tight opacity-100 line-clamp-2 hover:opacity-75"><?= esc($episode->title) ?></h1>
         </a>
         <?php if ($episode->is_premium && ! is_unlocked($podcast->handle)): ?>
-            <?php // @icon('lock-fill')?>
+            <?php // @icon("lock-fill")?>
             <Button variant="primary" class="mt-auto mb-2" iconLeft="lock-fill" uri="<?= $episode->link ?>" target="_blank" rel="noopener noreferrer"><?= lang('PremiumPodcasts.unlock') ?></Button>
         <?php else: ?>
         <vm-player
diff --git a/themes/cp_app/episode/_layout-preview.php b/themes/cp_app/episode/_layout-preview.php
index 917cebc70abc6f54981a2bc99349d7409dd60979..882689b10bdf360681a89336f36a19c6351bf3d1 100644
--- a/themes/cp_app/episode/_layout-preview.php
+++ b/themes/cp_app/episode/_layout-preview.php
@@ -170,7 +170,7 @@
         </div>
         <?php if (auth()->loggedIn()): ?>
             <?php if (in_array($episode->publication_status, ['scheduled', 'with_podcast'], true)): ?>
-                <?php // @icon('upload-cloud-fill')?>
+                <?php // @icon("upload-cloud-fill")?>
                 <Button
                     iconLeft="upload-cloud-fill"
                     variant="primary"
@@ -178,7 +178,7 @@
                     class="ml-auto"
                     uri="<?= route_to('episode-publish_edit', $episode->podcast_id, $episode->id) ?>"><?= lang('Episode.preview.publish_edit') ?></Button>
             <?php else: ?>
-                <?php // @icon('upload-cloud-fill')?>
+                <?php // @icon("upload-cloud-fill")?>
                 <Button
                     iconLeft="upload-cloud-fill"
                     variant="secondary"
diff --git a/themes/cp_app/episode/_partials/comment_with_replies.php b/themes/cp_app/episode/_partials/comment_with_replies.php
index cb588f4e8854c0f5210011ebf4a515dadd8fd881..9792c3f5629b2a6387b64cc980de17d1b8cc59b3 100644
--- a/themes/cp_app/episode/_partials/comment_with_replies.php
+++ b/themes/cp_app/episode/_partials/comment_with_replies.php
@@ -27,7 +27,7 @@ if ($comment->in_reply_to_id): ?>
                 'actorUsername' => esc($comment->actor->username),
             ]) ?>"
             rows="1" />
-        <?php // @icon('send-plane-2-fill')?>
+        <?php // @icon("send-plane-2-fill")?>
         <Button variant="primary" size="small" type="submit" name="action" value="reply" class="self-end" iconRight="send-plane-2-fill"><?= lang('Comment.form.submit_reply') ?></Button>
     </div>
 </form>
diff --git a/themes/cp_app/episode/activity.php b/themes/cp_app/episode/activity.php
index 9d0c0c8f48bfb1550f90b9fcac3e3c84e5468542..fcdcd47e4e95b544be2ae433a41c83ca2d766c0f 100644
--- a/themes/cp_app/episode/activity.php
+++ b/themes/cp_app/episode/activity.php
@@ -17,7 +17,7 @@
                 placeholder="<?= lang('Post.form.episode_message_placeholder') ?>"
                 required="true"
                 rows="2" />
-            <?php // @icon('send-plane-2-fill')?>
+            <?php // @icon("send-plane-2-fill")?>
             <Button variant="primary" size="small" type="submit" class="self-end" iconRight="send-plane-2-fill"><?= lang('Post.form.submit') ?></Button>
         </div>
     </form>
diff --git a/themes/cp_app/episode/comments.php b/themes/cp_app/episode/comments.php
index f907aab908ce13e71c4311c5a7920f9604ffec8c..dd507f75fd71c2b9a2fbcf467c5cac7b61e578f6 100644
--- a/themes/cp_app/episode/comments.php
+++ b/themes/cp_app/episode/comments.php
@@ -16,7 +16,7 @@
                 required="true"
                 placeholder="<?= lang('Comment.form.episode_message_placeholder') ?>"
                 rows="2" />
-            <?php // @icon('send-plane-2-fill')?>
+            <?php // @icon("send-plane-2-fill")?>
             <Button class="self-end" variant="primary" size="small" type="submit" iconRight="send-plane-2-fill"><?= lang('Comment.form.submit') ?></Button>
         </div>
     </form>
diff --git a/themes/cp_app/episode/preview-transcript.php b/themes/cp_app/episode/preview-transcript.php
index 90953788f1f11becda50c18612b808b94fe2f4e7..6728498fa04d048c510ee02e50223ca31571f1cd 100644
--- a/themes/cp_app/episode/preview-transcript.php
+++ b/themes/cp_app/episode/preview-transcript.php
@@ -4,7 +4,8 @@
 
 <?php if (isset($captions)) : ?>
     <div class="flex flex-col gap-2">
-        <Button uri="<?= $transcript->file_url ?>" size="small" iconLeft="download" class="self-start" variant="secondary" target="_blank" download="" rel="noopener noreferrer"><?= lang('Episode.download_transcript', [
+        <?php // @icon("download-2-fill")?>
+        <Button uri="<?= $transcript->file_url ?>" size="small" iconLeft="download-2-fill" class="self-start" variant="secondary" target="_blank" download="" rel="noopener noreferrer"><?= lang('Episode.download_transcript', [
             'extension' => '.' . $transcript->file_extension,
         ]) ?></Button>
     <?php
diff --git a/themes/cp_app/episode/transcript.php b/themes/cp_app/episode/transcript.php
index 5a183d6511937c7ef8f52fd7cecc17672f7b1c1b..7fa2e14a11c541d53b4884b058c47133a9e55bec 100644
--- a/themes/cp_app/episode/transcript.php
+++ b/themes/cp_app/episode/transcript.php
@@ -4,7 +4,8 @@
 
 <?php if (isset($captions)) : ?>
     <div class="flex flex-col gap-2">
-        <Button uri="<?= $transcript->file_url ?>" size="small" iconLeft="download" class="self-start" variant="secondary" target="_blank" download="" rel="noopener noreferrer"><?= lang('Episode.download_transcript', [
+        <?php // @icon("download-2-fill")?>
+        <Button uri="<?= $transcript->file_url ?>" size="small" iconLeft="download-2-fill" class="self-start" variant="secondary" target="_blank" download="" rel="noopener noreferrer"><?= lang('Episode.download_transcript', [
             'extension' => '.' . $transcript->file_extension,
         ]) ?></Button>
     <?php
diff --git a/themes/cp_app/podcast/_partials/premium_banner.php b/themes/cp_app/podcast/_partials/premium_banner.php
index 9e893018e3467582843182789b32c4007683bd73..5530f317f49722dcdc28deda58ee654eaed150e4 100644
--- a/themes/cp_app/podcast/_partials/premium_banner.php
+++ b/themes/cp_app/podcast/_partials/premium_banner.php
@@ -4,8 +4,8 @@ if ($podcast->is_premium): ?>
     <?php
         $isUnlocked = service('premium_podcasts')
             ->isUnlocked($podcast->handle);
-    // @icon('lock-unlock-fill')
-    // @icon('lock-fill')
+    // @icon("lock-unlock-fill")
+    // @icon("lock-fill")
     $shownIcon = $isUnlocked ? 'lock-unlock-fill' : 'lock-fill';
     $hiddenIcon = $isUnlocked ? 'lock-fill' : 'lock-unlock-fill';
     ?>
@@ -27,7 +27,7 @@ if ($podcast->is_premium): ?>
                     ]) ?>
                     <?= $isUnlocked ? lang('PremiumPodcasts.lock') : lang('PremiumPodcasts.unlock') ?>
                 </Button>
-                <?php // @icon('external-link-fill')?>
+                <?php // @icon("external-link-fill")?>
                 <Button
                     iconLeft="external-link-fill"
                     target="_blank"
diff --git a/themes/cp_app/podcast/activity.php b/themes/cp_app/podcast/activity.php
index 9cc52d8e80e11a6dc8121e6e565095003d257ddf..5c9ef39af0967c80630ac38de19d44f730fffadd 100644
--- a/themes/cp_app/podcast/activity.php
+++ b/themes/cp_app/podcast/activity.php
@@ -21,7 +21,7 @@
             name="episode_url"
             type="url"
             placeholder="<?= lang('Post.form.episode_url_placeholder') . ' (' . lang('Common.optional') . ')' ?>" />
-        <?php // @icon('send-plane-2-fill')?>
+        <?php // @icon("send-plane-2-fill")?>
         <Button variant="primary" size="small" type="submit" class="self-end" iconRight="send-plane-2-fill"><?= lang('Post.form.submit') ?></Button>
     </div>
 </form>
diff --git a/themes/cp_app/podcast/follow.php b/themes/cp_app/podcast/follow.php
index 95fceadd34980cad7ab9a861674aaddba5a4eccd..62a474fc9faad10e258ae1fdee535e492221cb73 100644
--- a/themes/cp_app/podcast/follow.php
+++ b/themes/cp_app/podcast/follow.php
@@ -60,7 +60,7 @@
                 hint="<?= esc(lang('Fediverse.your_handle_hint')) ?>"
                 required="true"
             />
-            <?php // @icon('send-plane-2-fill')?>
+            <?php // @icon("send-plane-2-fill")?>
             <Button variant="primary" type="submit" class="self-end" iconRight="send-plane-2-fill"><?= lang('Fediverse.follow.submit') ?></Button>
         </form>
     </main>
diff --git a/themes/cp_app/podcast/unlock.php b/themes/cp_app/podcast/unlock.php
index dd49b233531b66d7f0a4b5ccbe1d839b89a5793b..04487f311d8fd2fd3fca34864cae8eede0850757 100644
--- a/themes/cp_app/podcast/unlock.php
+++ b/themes/cp_app/podcast/unlock.php
@@ -58,7 +58,7 @@
                 ]) ?>"
                 required="true"
             />
-            <?php // @icon('lock-unlock-fill')?>
+            <?php // @icon("lock-unlock-fill")?>
             <Button type="submit" variant="primary" iconLeft="lock-unlock-fill" class="self-center mt-2"><?= lang('PremiumPodcasts.unlock_form.submit') ?></Button>
             <?php if ($subscriptionLink = service('settings')
                 ->get('Subscription.link', 'podcast:' . $podcast->id)): ?>
diff --git a/themes/cp_app/post/_partials/actions.php b/themes/cp_app/post/_partials/actions.php
index c0bd457737bf7f8c8ce9e5c899c62b09e60dcbbe..3eb6334dd62a3e8e25811e03c074459b95d2ed7c 100644
--- a/themes/cp_app/post/_partials/actions.php
+++ b/themes/cp_app/post/_partials/actions.php
@@ -59,7 +59,7 @@
             <form action="<?= route_to(
                 'post-attempt-block-domain',
                 esc(interact_as_actor()
-                ->username),
+                    ->username),
                 $post->id,
             ) ?>" method="POST">
                 <?= csrf_field() ?>
diff --git a/themes/cp_app/post/_partials/post_with_replies.php b/themes/cp_app/post/_partials/post_with_replies.php
index a94a47499bcafec71c00d9f58e9ef3a3208bcfb3..1aedee66a771df3713f9e715903b695c909c62ad 100644
--- a/themes/cp_app/post/_partials/post_with_replies.php
+++ b/themes/cp_app/post/_partials/post_with_replies.php
@@ -32,7 +32,7 @@ if ($post->in_reply_to_id): ?>
                             'actorUsername' => esc($post->actor->username),
                         ]) ?>"
                         rows="1" />
-                    <?php // @icon('send-plane-2-fill')?>
+                    <?php // @icon("send-plane-2-fill")?>
                     <Button variant="primary" size="small" type="submit" name="action" value="reply" class="self-end" iconRight="send-plane-2-fill"><?= lang('Post.form.submit_reply') ?></Button>
                 </div>
             </form>
diff --git a/themes/cp_app/post/_partials/reply_actions.php b/themes/cp_app/post/_partials/reply_actions.php
index 6e7693f7f2b4ccc0d50526ee2d27b45cd72311ce..7077ddefb220aeac108d420cb8ec3b32abbd5c0b 100644
--- a/themes/cp_app/post/_partials/reply_actions.php
+++ b/themes/cp_app/post/_partials/reply_actions.php
@@ -58,7 +58,7 @@ if (can_user_interact()): ?>
             <form action="<?= route_to(
                 'post-attempt-block-domain',
                 esc(interact_as_actor()
-                ->username),
+                    ->username),
                 $reply->id,
             ) ?>" method="POST">
                 <?= csrf_field() ?>
diff --git a/themes/cp_app/post/remote_action.php b/themes/cp_app/post/remote_action.php
index 0727114ffcbb71539902ebacb9fdf937a2fa915b..0871017ab56b1b2954edf3b15b88a5e0d69b1db4 100644
--- a/themes/cp_app/post/remote_action.php
+++ b/themes/cp_app/post/remote_action.php
@@ -51,7 +51,7 @@
                 label="<?= esc(lang('Fediverse.your_handle')) ?>"
                 hint="<?= esc(lang('Fediverse.your_handle_hint')) ?>"
                 required="true" />
-            <?php // @icon('send-plane-2-fill')?>
+            <?php // @icon("send-plane-2-fill")?>
             <Button variant="primary" type="submit" class="self-end" iconRight="send-plane-2-fill"><?= lang('Fediverse.' . $action . '.submit') ?></Button>
         </form>
     </main>
diff --git a/themes/cp_install/cache_config.php b/themes/cp_install/cache_config.php
index 7c4af11397c651b06662ff4cea95732edbe9a727..d622c48e5cc942130098d01f917e77899108a923 100644
--- a/themes/cp_install/cache_config.php
+++ b/themes/cp_install/cache_config.php
@@ -27,7 +27,7 @@
         ])) ?>"
     selected="file"
     required="true" />
-<?php // @icon('arrow-right-fill')?>
+<?php // @icon("arrow-right-fill")?>
 <Button variant="primary" class="self-end" iconRight="arrow-right-fill" type="submit"><?= lang('Install.form.next') ?></Button>
 
 <?= form_close() ?>
diff --git a/themes/cp_install/create_superadmin.php b/themes/cp_install/create_superadmin.php
index 6e7e3912326678453e78eb45d31bdff7139ecddf..e99b8253c03b4307bda69f9d5ef3995694d14812 100644
--- a/themes/cp_install/create_superadmin.php
+++ b/themes/cp_install/create_superadmin.php
@@ -28,7 +28,7 @@
     type="password"
     required="true"
     autocomplete="new-password" />
-<?php // @icon('check-fill')?>
+<?php // @icon("check-fill")?>
 <Button variant="primary" type="submit" class="self-end" iconLeft="check-fill"><?= lang('Install.form.submit') ?></Button>
 
 </form>
diff --git a/themes/cp_install/database_config.php b/themes/cp_install/database_config.php
index 154122c98efa0ef569d91242c1744351aa3096a6..c3940296ac890f95c99f58a06676cd156eb9de73 100644
--- a/themes/cp_install/database_config.php
+++ b/themes/cp_install/database_config.php
@@ -54,7 +54,7 @@
     label="<?= esc(lang('Install.form.db_prefix')) ?>"
     hint="<?= esc(lang('Install.form.db_prefix_hint')) ?>"
     value="<?= config('Database')->default['DBPrefix'] ?>" />
-<?php // @icon('arrow-right-fill')?>
+<?php // @icon("arrow-right-fill")?>
 <Button variant="primary" type="submit" class="self-end" iconRight="arrow-right-fill"><?= lang('Install.form.next') ?></Button>
 
 </form>
diff --git a/themes/cp_install/instance_config.php b/themes/cp_install/instance_config.php
index f2acedfc4b27b61bd40f77841605170590e06326..2892893d906ddc0f47261d75df9e9d3f22e27512 100644
--- a/themes/cp_install/instance_config.php
+++ b/themes/cp_install/instance_config.php
@@ -37,7 +37,7 @@
     hint="<?= esc(lang('Install.form.auth_gateway_hint')) ?>"
     value="<?= config('Auth')->gateway ?>"
     required="true" />
-<?php // @icon('arrow-right-fill')?>
+<?php // @icon("arrow-right-fill")?>
 <Button class="self-end" variant="primary" type="submit" iconRight="arrow-right-fill"><?= lang('Install.form.next') ?></Button>
 </form>
 
diff --git a/vite.config.ts b/vite.config.ts
index d4ef699320a1e873e20ee0eb05ad536ddb4c49fd..e7dc98561bf8ff4cc7b4b516d276c61212d4234a 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -32,4 +32,7 @@ export default defineConfig({
       outDir: "../../public",
     }),
   ],
+  server: {
+    host: true,
+  },
 });