diff --git a/.env.example b/.env.example index 4382f51d..baaf5b6d 100644 --- a/.env.example +++ b/.env.example @@ -4,7 +4,7 @@ APP_KEY= APP_DEBUG=true APP_URL=http://localhost -LOG_CHANNEL=stack +LOG_CHANNEL=daily LOG_DEPRECATIONS_CHANNEL=null LOG_LEVEL=debug diff --git a/.github/workflows/publish-docker-images.yml b/.github/workflows/build-and-push-docker.yml similarity index 72% rename from .github/workflows/publish-docker-images.yml rename to .github/workflows/build-and-push-docker.yml index 07fb196b..41bd9c61 100644 --- a/.github/workflows/publish-docker-images.yml +++ b/.github/workflows/build-and-push-docker.yml @@ -1,15 +1,7 @@ name: Publish Docker Images on: - push: - paths-ignore: - - README.md - - LICENSE - - .env.example - branches: - - master - - develop - tags: [ 'v*.*.*' ] + workflow_call: workflow_dispatch: env: @@ -28,15 +20,20 @@ jobs: id-token: write steps: - - name: Checkout repository + - name: Force linux line endings + run: | + git config --global core.autocrlf false + git config --global core.eol lf + + - name: Checkout uses: actions/checkout@v3 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 + uses: docker/setup-buildx-action@v3 - name: Log into registry ${{ env.REGISTRY }} if: github.event_name != 'pull_request' - uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0 + uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} @@ -44,7 +41,7 @@ jobs: - name: Extract Docker metadata id: meta - uses: docker/metadata-action@96383f45573cb7f253c731d3b3ab81c87ef81934 # v5.0.0 + uses: docker/metadata-action@v5 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} tags: | @@ -54,7 +51,7 @@ jobs: - name: Build and push Docker image id: build-and-push - uses: docker/build-push-action@0565240e2d4ab88bba5387d719585280857ece09 # v5.0.0 + uses: docker/build-push-action@v6 with: file: docker/production/Dockerfile context: . @@ -63,3 +60,4 @@ jobs: labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha cache-to: type=gha,mode=max + platforms: linux/amd64,linux/arm64 diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml new file mode 100644 index 00000000..3d38fa07 --- /dev/null +++ b/.github/workflows/code-quality.yml @@ -0,0 +1,90 @@ +name: Code Quality +on: + workflow_call: + workflow_dispatch: + pull_request: + branches: + - master + - develop + paths-ignore: + - '**.md' + - 'docs/**' + push: + branches: + - master + - develop + paths-ignore: + - '**.md' + - 'docs/**' +jobs: + code-quality: + runs-on: ubuntu-latest + steps: + - name: Force linux line endings + run: | + git config --global core.autocrlf false + git config --global core.eol lf + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: 8.4 + extensions: mbstring, json, grpc, opentelemetry + ini-values: post_max_size=512M, max_execution_time=180 + coverage: xdebug + tools: phpcs, phpstan, phpunit + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Setup problem matchers for PHPUnit + run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json" + + - name: Get composer cache directory + id: composer-cache + run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT + + - name: Cache dependencies + uses: actions/cache@v3 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: ${{ runner.os }}-composer-${{ matrix.php-versions }} + + - name: Install dependencies + run: composer install --prefer-dist --dev + + - name: Build Vite manifest + run: | + npm install + npm run build + + - name: Run PHP Codesniffer + run: phpcs + + - name: Run tests and collect coverage + run: vendor/bin/phpunit --coverage-clover coverage.xml + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v5 + with: + token: ${{ secrets.CODECOV_TOKEN }} + + build-and-push-docker: + needs: code-quality + uses: ./.github/workflows/build-and-push-docker.yml + secrets: inherit + permissions: + contents: read + packages: write + id-token: write + # Only build docker images on pushes to master, develop and tags + if: + ( + startsWith(github.ref, 'refs/tags') || + github.ref == format('refs/heads/{0}', 'master') || + github.ref == format('refs/heads/{0}', 'develop') + ) && + github.event_name != 'pull_request' + diff --git a/.gitignore b/.gitignore index d97a35ef..8acfa870 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,7 @@ yarn-error.log /.idea /.vscode /docker-compose.override.yml +/html-coverage +clover.xml +coverage.txt +.github/copilot-instructions.md diff --git a/README.md b/README.md index 060e28dc..2bc7a594 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,27 @@ # Control +[![codecov](https://codecov.io/github/mintopia/control/graph/badge.svg?token=UH1Y6FBHQW)](https://codecov.io/github/mintopia/control) ## Introduction -LAN Party user accounts, ticket management and seat picker. It is designed to work with multiple social authentication providers and ticket providers. +LAN Party user accounts, ticket management and seat picker. It is designed to work with multiple social authentication +providers and ticket providers. ### Social Provider Support - - Discord - - Steam (No authentication, just account linking) - - Twitch +- Discord +- Steam (No authentication, just account linking) +- Twitch These are using Laravel Socialite, so any provider supported by Socialite can be integrated. ### Ticket Provider Support - - Ticket Tailor - - WooCommerce - - Internal - -These are custom integrations but more can be added and used if people develop them. The Internal provider allows you to manually issue tickets to users. +- Ticket Tailor +- WooCommerce +- Internal +These are custom integrations but more can be added and used if people develop them. The Internal provider allows you to +manually issue tickets to users. ## Technology @@ -64,6 +66,19 @@ I'm running this with an external docker network called `frontend` with Caddy ru need to add a network section for the `control` service to add it to the `frontend` network if you want to do this. +The Caddyfile config I'm using for this is: + +```Caddyfile +control.example.com { + @websockets { + header Connection *Upgrade* + header Upgrade websocket + } + reverse_proxy @websockets control-reverb-1 + reverse_proxy control-control-1 +} +``` + You will need to make a logs directory and chmod it 777 as I still need to sort permissions out. To bring up the site, run the following: @@ -80,29 +95,71 @@ You should now be able to visit the site and login. From here you can use the ad ## Observability -Control supports basic observability functionality in using an OpenTelemetry collector. It can support traces, logs -and metrics. If enabled, it will create traces for all HTTP requests. To enable it, add the following to your `.env`: +The docker images from the project have the [Open Telemetry PHP extension](https://github.com/open-telemetry/opentelemetry-php-instrumentation/releases) and the project includes the appropriate Open +Telemetry libraries from Packagist. You can use Protobuf or GRPC transport if needed. You should just be able to +configure it using ENV variables and run a collector container. eg. ```dotenv -OPENTELEMETRY_ENABLED=true +OTEL_PHP_AUTOLOAD_ENABLED=true +OTEL_SERVICE_NAME=control +OTEL_EXPORTER_OTLP_ENDPOINT=http://collector:4317 ``` -For logging output, a logger is defined and can be used. I suggest you use this with your usual logger, eg. `daily`. -You can specify this logging with the following environment variables: +The docker container already sets `OTEL_PHP_EXCLUDED_URLS` to remove common URLs that are used a lot and add no value +to monitoring. The default value is: ```dotenv -LOG_CHANNEL=stack -LOG_STACK=opentelemetry,daily +OTEL_PHP_EXCLUDED_URLS="pulse,telescope/.*,horizon/.*,api/v1/ping,_ignition/.*,_debugbar/.*" ``` -By default it is configured to send to an OpenTelemetry container running with the name `collector`. An example config -is supplied with placeholders for sending data to [Honeycomb](https://www.honeycomb.io/). +For the container: -The plan will be to add further spans within individual requests and have spans for the jobs and queued actions. +```yaml + collector: + image: otel/opentelemetry-collector-contrib + volumes: + - ./collector.yml:/etc/otelcol-contrib/config.yaml +``` + +And finally the config in `collector.yml`, adapt this as you need. + +```yaml +receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 + http: + endpoint: 0.0.0.0:4318 + +processors: + batch: + +exporters: + debug: + +service: + pipelines: + traces: + receivers: [otlp] + processors: [batch] + exporters: [debug] + metrics: + receivers: [otlp] + processors: [batch] + exporters: [debug] + logs: + receivers: [otlp] + processors: [batch] + exporters: [debug] +``` ## Contributing -It's an open source project and I'm happy to accept pull requests. I am terrible at UI and UX, which is why this is entirely using server-side rendering. If someone wants to use Vue/Laravel Livewire - please go ahead! +It's an open source project and I'm happy to accept pull requests. I am terrible at UI and UX, which is why this is +entirely using server-side rendering. If someone wants to use Vue/Laravel Livewire - please go ahead! + +We have 100% test coverage, and would like to remain that way. ## Roadmap @@ -111,8 +168,7 @@ The following features are on the roadmap: - Better UI/UX. I'm currently using [tabler.io](https://tabler.io) and entirely server-side rendering. - Full-featured API. There's a basic one to support seating plan refreshes. I need to refactor it and improve it. - UI Customisation from Admin Pages. Currently the UI colours, branding is all either in the `.env` or compiled into the CSS at build. - - Unit Tests. This was very rapidly developed, I'm sorry! - - PHPCS and PHPStan. Should be aiming for PSR-12 and level 8 PHPStan. + - Static Analysis - We should be aiming for level 8 in PHPStan. ## Thanks diff --git a/app/Casts/SettingValue.php b/app/Casts/SettingValue.php index 3be0d1d6..6a6baae9 100644 --- a/app/Casts/SettingValue.php +++ b/app/Casts/SettingValue.php @@ -13,6 +13,7 @@ class SettingValue implements CastsAttributes * * @param array $attributes */ + public function get(Model $model, string $key, mixed $value, array $attributes): mixed { if ($model->encrypted && $value !== null) { @@ -26,6 +27,7 @@ public function get(Model $model, string $key, mixed $value, array $attributes): * * @param array $attributes */ + public function set(Model $model, string $key, mixed $value, array $attributes): mixed { if ($model->encrypted && $value !== null) { diff --git a/app/Console/Commands/SyncDiscordRoles.php b/app/Console/Commands/SyncDiscordRoles.php index 9cc20ffb..f8916181 100644 --- a/app/Console/Commands/SyncDiscordRoles.php +++ b/app/Console/Commands/SyncDiscordRoles.php @@ -2,13 +2,11 @@ namespace App\Console\Commands; -use App\Models\Event; use App\Models\LinkedAccount; use App\Models\SocialProvider; use App\Models\TicketType; use App\Models\User; use App\Services\DiscordApi; -use Carbon\Carbon; use Illuminate\Console\Command; use Illuminate\Support\Facades\Log; diff --git a/app/Console/Commands/SyncTickets.php b/app/Console/Commands/SyncTickets.php index e939a4e9..76ad7c67 100644 --- a/app/Console/Commands/SyncTickets.php +++ b/app/Console/Commands/SyncTickets.php @@ -2,9 +2,7 @@ namespace App\Console\Commands; -use App\Models\LinkedAccount; use App\Models\TicketProvider; -use App\Models\TicketType; use Illuminate\Console\Command; use Illuminate\Support\Facades\Log; diff --git a/app/Console/Commands/UpdateEventSeatingLock.php b/app/Console/Commands/UpdateEventSeatingLock.php index dd3795d4..e1c7bbb9 100644 --- a/app/Console/Commands/UpdateEventSeatingLock.php +++ b/app/Console/Commands/UpdateEventSeatingLock.php @@ -22,6 +22,8 @@ class UpdateEventSeatingLock extends Command * @var string * */ + protected $description = 'Update Event Seating Locks'; + public function handle() { Event::where('seating_opens_at', '<=', Carbon::now())->chunk(100, function ($chunk) { diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 8f40566c..8b1a1fd6 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -2,11 +2,19 @@ namespace App\Console; +use App\Console\Commands\UpdateEventSeatingLock; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; class Kernel extends ConsoleKernel { + /** + * Define the application's commands. + */ + protected $commands = [ + UpdateEventSeatingLock::class, + ]; + /** * Define the application's command schedule. */ @@ -14,9 +22,9 @@ protected function schedule(Schedule $schedule): void { $schedule->command('sanctum:prune-expired --hours=24')->daily(); $schedule->command('telescope:prune')->daily(); - $schedule->command('control:prune-clans')->everyFiveMinutes(); - $schedule->command('control:update-event-seating-locks')->everyMinute(); - $schedule->command('control:sync-discord-roles')->everyFifteenMinutes(); + $schedule->command('control:prune-clans')->daily(); + $schedule->command('control:update-event-seating-locks')->daily(); + $schedule->command('control:sync-discord-roles')->daily(); } /** diff --git a/app/Exceptions/TicketProviderWebhookException.php b/app/Exceptions/TicketProviderWebhookException.php index 71a49cce..c36e15f2 100644 --- a/app/Exceptions/TicketProviderWebhookException.php +++ b/app/Exceptions/TicketProviderWebhookException.php @@ -3,8 +3,59 @@ namespace App\Exceptions; use Exception; +use Throwable; class TicketProviderWebhookException extends Exception { - // + public const MISSING_HEADER = 1; + public const INVALID_FORMAT = 2; + public const TIMESTAMP_TOO_OLD = 3; + public const HASH_MISMATCH = 4; + + protected int $reasonCode = 0; + protected ?string $header = null; + protected ?int $timestamp = null; + + public function __construct(string $message = "", int $reasonCode = 0, ?string $header = null, ?int $timestamp = null, ?Throwable $previous = null) + { + parent::__construct($message, $reasonCode, $previous); + $this->reasonCode = $reasonCode; + $this->header = $header; + $this->timestamp = $timestamp; + } + + public static function missingHeader(?string $header = null): self + { + return new self('Missing webhook signature header', self::MISSING_HEADER, $header, null); + } + + public static function invalidFormat(?string $header = null): self + { + return new self('Invalid webhook signature header format', self::INVALID_FORMAT, $header, null); + } + + public static function timestampTooOld(?int $timestamp = null): self + { + return new self('Webhook message is more than allowed age', self::TIMESTAMP_TOO_OLD, null, $timestamp); + } + + public static function hashMismatch(?string $header = null, ?int $timestamp = null): self + { + return new self('Hash does not match signature', self::HASH_MISMATCH, $header, $timestamp); + } + + public function getReasonCode(): int + { + return $this->reasonCode; + } + + public function getHeader(): ?string + { + return $this->header; + } + + public function getTimestamp(): ?int + { + return $this->timestamp; + } } diff --git a/app/Http/Controllers/Admin/EventController.php b/app/Http/Controllers/Admin/EventController.php index 4357dacd..ebb54ee9 100644 --- a/app/Http/Controllers/Admin/EventController.php +++ b/app/Http/Controllers/Admin/EventController.php @@ -37,14 +37,15 @@ public function index(Request $request) if ($request->input('external_id')) { $filters->external_id = $request->input('external_id'); - $query = $query->whereHas('provider', function ($query) use ($filters) { + $query = $query->whereHas('mappings', function ($query) use ($filters) { $query->whereExternalId($filters->external_id); }); } if ($request->input('provider_id')) { $filters->provider_id = $request->input('provider_id'); - $query = $query->whereHas('provider', function ($query) use ($filters) { + // $query = $query->whereHas('provider', function ($query) use ($filters) { + $query = $query->whereHas('mappings', function ($query) use ($filters) { $query->whereTicketProviderId($filters->provider_id); }); } @@ -166,10 +167,18 @@ public function delete(Event $event) ]); } - public function export_tickets(Event $event) + public function exportTickets(Event $event) { $csv = [[ - 'ID', 'Ticket Provider', 'External ID', 'Reference', 'Type', 'Nickname', 'Name', 'Email', 'Seat', + 'ID', + 'Ticket Provider', + 'External ID', + 'Reference', + 'Type', + 'Nickname', + 'Name', + 'Email', + 'Seat', ]]; $event->tickets()->with(['user', 'type', 'provider', 'seat', 'user.primaryEmail'])->chunk(100, function ($chunk) use (&$csv) { foreach ($chunk as $ticket) { diff --git a/app/Http/Controllers/Admin/LinkedAccountController.php b/app/Http/Controllers/Admin/LinkedAccountController.php index f0825699..c6cb6c45 100644 --- a/app/Http/Controllers/Admin/LinkedAccountController.php +++ b/app/Http/Controllers/Admin/LinkedAccountController.php @@ -11,7 +11,7 @@ class LinkedAccountController extends Controller public function destroy(User $user, LinkedAccount $account) { if (!$account->canDelete()) { - return response()->redirectToRoute('admin.users.show')->with('errorMessage', 'It is not possible to remove this account'); + return response()->redirectToRoute('admin.users.show', $user->id)->with('errorMessage', 'It is not possible to remove this account'); } $account->delete(); return response()->redirectToRoute('admin.users.show', $account->user->id)->with('successMessage', 'The account has been deleted'); @@ -20,7 +20,7 @@ public function destroy(User $user, LinkedAccount $account) public function delete(User $user, LinkedAccount $account) { if (!$account->canDelete()) { - return response()->redirectToRoute('admin.users.show')->with('errorMessage', 'It is not possible to remove this account'); + return response()->redirectToRoute('admin.users.show', $user->id)->with('errorMessage', 'It is not possible to remove this account'); } return view('admin.linkedaccounts.delete', [ 'account' => $account, diff --git a/app/Http/Controllers/Admin/SeatGroupAssignmentController.php b/app/Http/Controllers/Admin/SeatGroupAssignmentController.php index db58e21c..b1c68a69 100644 --- a/app/Http/Controllers/Admin/SeatGroupAssignmentController.php +++ b/app/Http/Controllers/Admin/SeatGroupAssignmentController.php @@ -5,7 +5,6 @@ use App\Http\Controllers\Controller; use App\Http\Requests\Admin\DeleteRequest; use App\Http\Requests\Admin\SeatGroupAssignmentUpdateRequest; -use App\Http\Requests\Admin\SeatGroupUpdateRequest; use App\Models\Event; use App\Models\SeatGroup; use App\Models\SeatGroupAssignment; diff --git a/app/Http/Controllers/Admin/SeatGroupController.php b/app/Http/Controllers/Admin/SeatGroupController.php index d597c07b..a5ebefe6 100644 --- a/app/Http/Controllers/Admin/SeatGroupController.php +++ b/app/Http/Controllers/Admin/SeatGroupController.php @@ -6,7 +6,6 @@ use App\Http\Requests\Admin\DeleteRequest; use App\Http\Requests\Admin\SeatGroupUpdateRequest; use App\Models\Event; -use App\Models\Seat; use App\Models\SeatGroup; use Illuminate\Http\Request; diff --git a/app/Http/Controllers/Admin/SeatingPlanController.php b/app/Http/Controllers/Admin/SeatingPlanController.php index 554e8a25..42db70a5 100644 --- a/app/Http/Controllers/Admin/SeatingPlanController.php +++ b/app/Http/Controllers/Admin/SeatingPlanController.php @@ -135,7 +135,7 @@ public function export(Event $event, SeatingPlan $seatingplan) }, $filename); } - public function import_process(SeatingPlanImportRequest $request, Event $event, SeatingPlan $seatingplan) + public function importProcess(SeatingPlanImportRequest $request, Event $event, SeatingPlan $seatingplan) { $csv = $request->file('csv')->get(); $wipe = (bool)$request->input('wipe', false); diff --git a/app/Http/Controllers/Admin/SettingController.php b/app/Http/Controllers/Admin/SettingController.php index a7afdc08..ca69e3ad 100644 --- a/app/Http/Controllers/Admin/SettingController.php +++ b/app/Http/Controllers/Admin/SettingController.php @@ -9,6 +9,7 @@ use App\Models\SocialProvider; use App\Models\Theme; use App\Models\TicketProvider; +use Exception; class SettingController extends Controller { @@ -45,22 +46,32 @@ public function update(SettingUpdateRequest $request) return response()->redirectToRoute('admin.settings.index')->with('successMessage', 'Settings have been updated'); } - public function add_discord() + public function addDiscord() { - $provider = SocialProvider::whereCode('discord')->first()->getProvider(route('admin.settings.discord_return')); + $provider = $this->getDiscordProvider(); return $provider->addBotToServer(); } - public function add_discord_return() + /** + * Return an instance of the configured Discord provider. + * Extracted so tests can override or call provider retrieval directly. + */ + protected function getDiscordProvider(?string $redirectUrl = null) + { + $redirect = $redirectUrl ?? route('admin.settings.discord_return'); + return SocialProvider::whereCode('discord')->first()->getProvider($redirect); + } + + public function addDiscordReturn() { $serverName = Setting::whereCode('discord.server.name')->first(); $serverId = Setting::whereCode('discord.server.id')->first(); try { - $response = SocialProvider::whereCode('discord')->first()->getProvider(route('admin.settings.discord_return'))->bot(); + $response = $this->callDiscordBot(); $serverName->value = $response->accessTokenResponseBody['guild']['name']; $serverId->value = $response->accessTokenResponseBody['guild']['id']; return response()->redirectToRoute('admin.settings.index')->with('successMessage', "Link to {{ $serverName->value }} has been successful"); - } catch (\Exception $ex) { + } catch (Exception $ex) { $serverName->value = null; $serverId->value = null; return response()->redirectToRoute('admin.settings.index')->with('errorMessage', "Unable to link to Discord server"); @@ -69,4 +80,14 @@ public function add_discord_return() $serverId->save(); } } + + /** + * Call the provider bot() flow and return the response object. + * Extracted so tests can stub or call this method directly. + */ + protected function callDiscordBot(?string $redirectUrl = null) + { + $provider = $this->getDiscordProvider($redirectUrl); + return $provider->bot(); + } } diff --git a/app/Http/Controllers/Admin/ThemeController.php b/app/Http/Controllers/Admin/ThemeController.php index 3c671fd5..d3052afb 100644 --- a/app/Http/Controllers/Admin/ThemeController.php +++ b/app/Http/Controllers/Admin/ThemeController.php @@ -32,6 +32,29 @@ public function store(ThemeUpdateRequest $request) return response()->redirectToRoute('admin.settings.index')->with('successMessage', 'The theme has been created'); } + protected function updateObject(Theme $theme, Request $request) + { + $theme->active = (bool)$request->input('active'); + $theme->dark_mode = (bool)$request->input('dark_mode'); + if (!$theme->readonly) { + $map = [ + 'name', + 'css', + 'primary', + 'nav_background', + 'seat_available', + 'seat_disabled', + 'seat_taken', + 'seat_clan', + 'seat_selected', + ]; + foreach ($map as $prop) { + $theme->{$prop} = $request->input($prop); + } + } + $theme->save(); + } + public function edit(Theme $theme) { return view('admin.themes.edit', [ @@ -45,16 +68,6 @@ public function update(ThemeUpdateRequest $request, Theme $theme) return response()->redirectToRoute('admin.settings.index')->with('successMessage', 'The theme has been updated'); } - public function delete(Theme $theme) - { - if ($theme->readonly) { - abort(400); - } - return view('admin.themes.delete', [ - 'theme' => $theme, - ]); - } - public function destroy(Theme $theme) { if ($theme->readonly) { @@ -64,26 +77,13 @@ public function destroy(Theme $theme) return response()->redirectToRoute('admin.settings.index')->with('successMessage', 'The theme has been deleted'); } - protected function updateObject(Theme $theme, Request $request) + public function delete(Theme $theme) { - $theme->active = (bool)$request->input('active'); - $theme->dark_mode = (bool)$request->input('dark_mode'); - if (!$theme->readonly) { - $map = [ - 'name', - 'css', - 'primary', - 'nav_background', - 'seat_available', - 'seat_disabled', - 'seat_taken', - 'seat_clan', - 'seat_selected', - ]; - foreach ($map as $prop) { - $theme->{$prop} = $request->input($prop); - } + if ($theme->readonly) { + abort(400); } - $theme->save(); + return view('admin.themes.delete', [ + 'theme' => $theme, + ]); } } diff --git a/app/Http/Controllers/Admin/TicketController.php b/app/Http/Controllers/Admin/TicketController.php index d5c1f356..12b1fede 100644 --- a/app/Http/Controllers/Admin/TicketController.php +++ b/app/Http/Controllers/Admin/TicketController.php @@ -219,12 +219,7 @@ public function delete(Ticket $ticket) ]); } - public function import() - { - return view('admin.tickets.import'); - } - - public function import_show(TicketImportRequest $request) + public function importShow(TicketImportRequest $request) { $csv = $request->file('csv')->get(); $imports = Ticket::import($csv); @@ -234,9 +229,13 @@ public function import_show(TicketImportRequest $request) ]); } - public function import_process(Request $request) + public function import() + { + return view('admin.tickets.import'); + } + + public function importProcess(Request $request) { - // TODO: Process Import $imports = $request->session()->get('imports'); foreach ($imports as $import) { Ticket::createFromImport($import); diff --git a/app/Http/Controllers/Admin/TicketTypeMappingController.php b/app/Http/Controllers/Admin/TicketTypeMappingController.php index 1a196824..85adb04f 100644 --- a/app/Http/Controllers/Admin/TicketTypeMappingController.php +++ b/app/Http/Controllers/Admin/TicketTypeMappingController.php @@ -46,7 +46,8 @@ protected function updateObject(TicketTypeMapping $mapping, Request $request) } } if (!$mapping->name) { - $mapping->name = $mapping->ticket->name; + // fallback to the local ticket type name when external name not found + $mapping->name = $mapping->type->name; } $mapping->save(); } diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index c6665914..2dc70161 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -169,7 +169,7 @@ public function impersonate(Request $request, User $user) return response()->redirectToRoute('home'); } - public function sync_tickets(User $user) + public function syncTickets(User $user) { $user->syncTickets(force: true); return response()->redirectToRoute('admin.users.show', $user->id)->with('successMessage', "Tickets will be synchronised for {$user->nickname}"); diff --git a/app/Http/Controllers/Api/V1/EventController.php b/app/Http/Controllers/Api/V1/EventController.php new file mode 100644 index 00000000..fb99173c --- /dev/null +++ b/app/Http/Controllers/Api/V1/EventController.php @@ -0,0 +1,22 @@ +get(); + return fractal($events, new EventTransformer())->respond(); + } + + public function show(Event $event) + { + return fractal($event, new EventTransformer())->respond(); + } +} diff --git a/app/Http/Controllers/EmailAddressController.php b/app/Http/Controllers/EmailAddressController.php index 4bb64046..58900f4d 100644 --- a/app/Http/Controllers/EmailAddressController.php +++ b/app/Http/Controllers/EmailAddressController.php @@ -42,7 +42,7 @@ public function delete(EmailAddress $emailaddress) ]); } - public function verify_resend(EmailAddress $emailaddress) + public function verifyResend(EmailAddress $emailaddress) { if ($emailaddress->verified_at) { return response()->redirectToRoute('user.profile')->with('successMessage', 'The email address is verified'); @@ -51,7 +51,7 @@ public function verify_resend(EmailAddress $emailaddress) return response()->redirectToRoute('emails.verify', $emailaddress->id)->with('successMessage', "A verification code has been sent to {$emailaddress->email}"); } - public function verify_code(EmailVerifyRequest $request, EmailAddress $emailaddress) + public function verifyCode(EmailVerifyRequest $request, EmailAddress $emailaddress) { return $this->verifyEmail($emailaddress, $request->input('code')); } @@ -72,7 +72,7 @@ public function verify(Request $request, EmailAddress $emailaddress) ]); } - public function verify_process(EmailVerifyRequest $request, EmailAddress $emailaddress) + public function verifyProcess(EmailVerifyRequest $request, EmailAddress $emailaddress) { return $this->verifyEmail($emailaddress, $request->input('code')); } diff --git a/app/Http/Controllers/SeatingPlanController.php b/app/Http/Controllers/SeatingPlanController.php index d23eefe5..23e9e685 100644 --- a/app/Http/Controllers/SeatingPlanController.php +++ b/app/Http/Controllers/SeatingPlanController.php @@ -12,7 +12,7 @@ class SeatingPlanController extends Controller public function index(Request $request) { $query = Event::query(); - if (!$request->user()->hasAnyRole(['admin','manager'])) { + if (!$request->user()->hasAnyRole(['admin', 'manager'])) { $query = $query->whereDraft(false); } $events = $query->orderBy('starts_at', 'DESC')->with('seatingPlans')->paginate(); @@ -21,6 +21,7 @@ public function index(Request $request) ]); } + //VALIDATE This fixes session call and made unseat() robust when ticket has no seat public function show(Request $request, Event $event, ?Ticket $ticket = null) { if ($event->seating_locked) { @@ -171,16 +172,26 @@ public function select(Request $request, Event $event, Ticket $ticket, Seat $sea public function unseat(Request $request, Event $event, Ticket $ticket) { + // Determine the plan code to use in the redirect fragment. Use the ticket's current seat plan + // if available, otherwise fall back to the event code. + $planCode = $event->code; + if ($ticket->seat) { + $planCode = $ticket->seat->plan->code; + } + if (!$ticket->canPickSeat() || !$ticket->canBeManagedBy($request->user())) { - return response()->redirectToRoute('seatingplans.show', $event->code)->with('errorMessage', 'You cannot unseat this ticket')->withFragment("tab-plan-{$seat->plan->code}"); + return response()->redirectToRoute('seatingplans.show', $event->code) + ->with('errorMessage', 'You cannot unseat this ticket') + ->withFragment("tab-plan-{$planCode}"); } if ($ticket->seat) { $seat = $ticket->seat; $seat->ticket()->disassociate(); $seat->save(); + $planCode = $seat->plan->code; } - return response()->redirectToRoute('seatingplans.show', $event->code)->withFragment("tab-plan-{$seat->plan->code}"); + return response()->redirectToRoute('seatingplans.show', $event->code)->withFragment("tab-plan-{$planCode}"); } } diff --git a/app/Http/Controllers/TicketController.php b/app/Http/Controllers/TicketController.php index 71a82f54..9f4ae075 100644 --- a/app/Http/Controllers/TicketController.php +++ b/app/Http/Controllers/TicketController.php @@ -22,7 +22,7 @@ public function index(Request $request) } $tickets = $query->with(['event' => function ($query) { - $query->orderBy('starts_at', 'DESC'); + $query->orderBy('starts_at', 'DESC'); }, 'type', 'seat']) ->paginate(); diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 299b0cb7..44bf7acc 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -36,7 +36,7 @@ public function logout(Request $request) return response()->redirectToRoute('home')->with('successMessage', 'You have been logged out'); } - public function login_redirect(SocialProvider $socialprovider) + public function loginRedirect(SocialProvider $socialprovider) { if (!$socialprovider->enabled || !$socialprovider->auth_enabled) { return response()->redirectToRoute('login')->with('errorMessage', 'Unable to login'); @@ -44,8 +44,12 @@ public function login_redirect(SocialProvider $socialprovider) return $socialprovider->redirect(); } - public function login_return(SocialProvider $socialprovider) + public function loginReturn(SocialProvider $socialprovider) { + // If we get 2 redirects back from the auth provider, handle it here. + if (Auth::hasUser()) { + return response()->redirectToIntended(route('home'))->with('successMessage', 'You have been logged in'); + } if (!$socialprovider->enabled || !$socialprovider->auth_enabled) { return response()->redirectToRoute('login')->with('errorMessage', 'Unable to login'); } @@ -86,7 +90,7 @@ public function signup(Request $request) ]); } - public function signup_process(UserSignupRequest $request) + public function signupProcess(UserSignupRequest $request) { $user = $request->user(); $user->nickname = $request->input('nickname'); diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 75782625..1dd8744b 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -59,7 +59,6 @@ class Kernel extends HttpKernel */ protected $middlewareGroups = [ 'web' => [ - MeasureRequest::class, EncryptCookies::class, AddQueuedCookiesToResponse::class, StartSession::class, @@ -69,7 +68,6 @@ class Kernel extends HttpKernel ], 'api' => [ - MeasureRequest::class, EnsureFrontendRequestsAreStateful::class, ThrottleRequests::class . ':api', SubstituteBindings::class, diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php index d4ef6447..624cd371 100644 --- a/app/Http/Middleware/Authenticate.php +++ b/app/Http/Middleware/Authenticate.php @@ -5,6 +5,9 @@ use Illuminate\Auth\Middleware\Authenticate as Middleware; use Illuminate\Http\Request; +/** + * @codeCoverageIgnore + */ class Authenticate extends Middleware { /** diff --git a/app/Http/Middleware/EncryptCookies.php b/app/Http/Middleware/EncryptCookies.php index 867695bd..caa421d6 100644 --- a/app/Http/Middleware/EncryptCookies.php +++ b/app/Http/Middleware/EncryptCookies.php @@ -4,6 +4,9 @@ use Illuminate\Cookie\Middleware\EncryptCookies as Middleware; +/** + * @codeCoverageIgnore + */ class EncryptCookies extends Middleware { /** diff --git a/app/Http/Middleware/MeasureRequest.php b/app/Http/Middleware/MeasureRequest.php deleted file mode 100644 index 2e3f35c6..00000000 --- a/app/Http/Middleware/MeasureRequest.php +++ /dev/null @@ -1,49 +0,0 @@ -getRequestUri(); - } - - $trace = $request->header('traceparent'); - $state = $request->header('tracestate'); - $span = OpenTelemetry::startSpan(name: "{$request->getMethod()} {$name}", parentTrace: $trace, parentState: $state); - $span->span->setAttributes([ - TraceAttributes::HTTP_REQUEST_METHOD => $request->getMethod(), - TraceAttributes::HTTP_URL => $request->getRequestUri(), - ]); - if (Route::getCurrentRoute() !== null) { - $span->span->setAttribute(TraceAttributes::HTTP_ROUTE, Route::getCurrentRoute()->uri()); - } - - $request->attributes->set('traceId', $span->span->getContext()->getTraceId()); - - $response = $next($request); - $response->headers->set('X-TraceId', $span->span->getContext()->getTraceId()); - $span->span->setAttribute(TraceAttributes::HTTP_RESPONSE_STATUS_CODE, $response->getStatusCode()); - $span->end(); - return $response; - } -} diff --git a/app/Http/Middleware/MetricsCollector.php b/app/Http/Middleware/MetricsCollector.php index 015041b1..855b219e 100644 --- a/app/Http/Middleware/MetricsCollector.php +++ b/app/Http/Middleware/MetricsCollector.php @@ -3,6 +3,7 @@ namespace App\Http\Middleware; use Closure; +use Exception; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Redis; @@ -13,7 +14,7 @@ class MetricsCollector /** * Handle an incoming request. * - * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next + * @param Closure(Request): (Response) $next */ public function handle(Request $request, Closure $next): Response { @@ -29,7 +30,7 @@ public function handle(Request $request, Closure $next): Response $statusCode = $response->getStatusCode(); try { $this->storeMetrics($method, $statusCode); - } catch (\Exception $ex) { + } catch (Exception $ex) { // Purposely do nothing other than logging Log::warning("Unable to store metrics: {$ex->getMessage()}"); } diff --git a/app/Http/Middleware/PreventRequestsDuringMaintenance.php b/app/Http/Middleware/PreventRequestsDuringMaintenance.php index 74cbd9a9..13a710eb 100644 --- a/app/Http/Middleware/PreventRequestsDuringMaintenance.php +++ b/app/Http/Middleware/PreventRequestsDuringMaintenance.php @@ -4,6 +4,9 @@ use Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance as Middleware; +/** + * @codeCoverageIgnore + */ class PreventRequestsDuringMaintenance extends Middleware { /** diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php index 741105db..0133c74d 100644 --- a/app/Http/Middleware/RedirectIfAuthenticated.php +++ b/app/Http/Middleware/RedirectIfAuthenticated.php @@ -8,6 +8,9 @@ use Illuminate\Support\Facades\Auth; use Symfony\Component\HttpFoundation\Response; +/** + * @codeCoverageIgnore + */ class RedirectIfAuthenticated { /** diff --git a/app/Http/Middleware/RedirectOnFirstLoginMiddleware.php b/app/Http/Middleware/RedirectOnFirstLoginMiddleware.php index 3085e0ea..dfc927cf 100644 --- a/app/Http/Middleware/RedirectOnFirstLoginMiddleware.php +++ b/app/Http/Middleware/RedirectOnFirstLoginMiddleware.php @@ -15,7 +15,8 @@ class RedirectOnFirstLoginMiddleware */ public function handle(Request $request, Closure $next): Response { - if ($request->user()->first_login) { + $user = $request->user(); + if ($user && isset($user->first_login) && $user->first_login) { return response()->redirectToRoute('login.signup'); } return $next($request); diff --git a/app/Http/Middleware/TrimStrings.php b/app/Http/Middleware/TrimStrings.php index 88cadcaa..b1e2a25f 100644 --- a/app/Http/Middleware/TrimStrings.php +++ b/app/Http/Middleware/TrimStrings.php @@ -4,6 +4,9 @@ use Illuminate\Foundation\Http\Middleware\TrimStrings as Middleware; +/** + * @codeCoverageIgnore + */ class TrimStrings extends Middleware { /** diff --git a/app/Http/Middleware/TrustHosts.php b/app/Http/Middleware/TrustHosts.php index c9c58bdd..9c88c34c 100644 --- a/app/Http/Middleware/TrustHosts.php +++ b/app/Http/Middleware/TrustHosts.php @@ -4,6 +4,9 @@ use Illuminate\Http\Middleware\TrustHosts as Middleware; +/** + * @codeCoverageIgnore + */ class TrustHosts extends Middleware { /** diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php index 559dd2fc..3082eb7a 100644 --- a/app/Http/Middleware/TrustProxies.php +++ b/app/Http/Middleware/TrustProxies.php @@ -5,6 +5,9 @@ use Illuminate\Http\Middleware\TrustProxies as Middleware; use Illuminate\Http\Request; +/** + * @codeCoverageIgnore + */ class TrustProxies extends Middleware { /** diff --git a/app/Http/Middleware/ValidateSignature.php b/app/Http/Middleware/ValidateSignature.php index 093bf64a..4d1648f1 100644 --- a/app/Http/Middleware/ValidateSignature.php +++ b/app/Http/Middleware/ValidateSignature.php @@ -4,6 +4,9 @@ use Illuminate\Routing\Middleware\ValidateSignature as Middleware; +/** + * @codeCoverageIgnore + */ class ValidateSignature extends Middleware { /** diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php index 011c1d09..506bdbc9 100644 --- a/app/Http/Middleware/VerifyCsrfToken.php +++ b/app/Http/Middleware/VerifyCsrfToken.php @@ -4,6 +4,9 @@ use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; +/** + * @codeCoverageIgnore + */ class VerifyCsrfToken extends Middleware { /** diff --git a/app/Http/Requests/Admin/SettingUpdateRequest.php b/app/Http/Requests/Admin/SettingUpdateRequest.php index 65a003ff..28de3892 100644 --- a/app/Http/Requests/Admin/SettingUpdateRequest.php +++ b/app/Http/Requests/Admin/SettingUpdateRequest.php @@ -3,6 +3,7 @@ namespace App\Http\Requests\Admin; use App\Models\Setting; +use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Foundation\Http\FormRequest; class SettingUpdateRequest extends FormRequest @@ -18,7 +19,7 @@ public function authorize(): bool /** * Get the validation rules that apply to the request. * - * @return array|string> + * @return array|string> */ public function rules(): array { diff --git a/app/Http/Requests/Admin/ThemeUpdateRequest.php b/app/Http/Requests/Admin/ThemeUpdateRequest.php index 6ec6583c..993d1b80 100644 --- a/app/Http/Requests/Admin/ThemeUpdateRequest.php +++ b/app/Http/Requests/Admin/ThemeUpdateRequest.php @@ -2,6 +2,7 @@ namespace App\Http\Requests\Admin; +use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Foundation\Http\FormRequest; class ThemeUpdateRequest extends FormRequest @@ -17,7 +18,7 @@ public function authorize(): bool /** * Get the validation rules that apply to the request. * - * @return array|string> + * @return array|string> */ public function rules(): array { diff --git a/app/Http/Requests/Admin/TicketImportRequest.php b/app/Http/Requests/Admin/TicketImportRequest.php index ea13050d..2ad24007 100644 --- a/app/Http/Requests/Admin/TicketImportRequest.php +++ b/app/Http/Requests/Admin/TicketImportRequest.php @@ -23,7 +23,8 @@ public function authorize(): bool public function rules(): array { return [ - 'csv' => 'required|file', + // Accept common CSV mime types alongside the file requirement (see testCsvRuleContainsFileAndMimetypes) + 'csv' => 'required|file|mimetypes:text/csv,text/plain,application/vnd.ms-excel', ]; } } diff --git a/app/Http/Requests/ProfileUpdateRequest.php b/app/Http/Requests/ProfileUpdateRequest.php index 3f4e6ef5..b5a172c1 100644 --- a/app/Http/Requests/ProfileUpdateRequest.php +++ b/app/Http/Requests/ProfileUpdateRequest.php @@ -23,13 +23,22 @@ public function authorize(): bool */ public function rules(): array { + // Safely obtain the current user id (can be null when running unit tests) + $ignoreId = optional($this->user())->id; + + // Build the unique rule and only apply ignore when we have an id to ignore. + $uniqueNickname = Rule::unique('users', 'nickname'); + if ($ignoreId) { + $uniqueNickname = $uniqueNickname->ignore($ignoreId); + } + return [ 'nickname' => [ 'required', 'string', 'max:255', 'min:2', - Rule::unique('users', 'nickname')->ignore($this->user()->id), + $uniqueNickname, ], 'name' => 'required|string|max:255|min:4', ]; diff --git a/app/Models/Clan.php b/app/Models/Clan.php index 17c68f37..a5ec3e9a 100644 --- a/app/Models/Clan.php +++ b/app/Models/Clan.php @@ -3,9 +3,13 @@ namespace App\Models; use App\Models\Traits\ToString; +use Eloquent; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Support\Carbon; use InvalidArgumentException; use function App\makeCode; @@ -18,20 +22,20 @@ * @property string $name * @property string $code * @property string $invite_code - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @property-read \Illuminate\Database\Eloquent\Collection $members + * @property Carbon|null $created_at + * @property Carbon|null $updated_at + * @property-read Collection $members * @property-read int|null $members_count - * @method static \Illuminate\Database\Eloquent\Builder|Clan newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Clan newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Clan query() - * @method static \Illuminate\Database\Eloquent\Builder|Clan whereCode($value) - * @method static \Illuminate\Database\Eloquent\Builder|Clan whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Clan whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Clan whereInviteCode($value) - * @method static \Illuminate\Database\Eloquent\Builder|Clan whereName($value) - * @method static \Illuminate\Database\Eloquent\Builder|Clan whereUpdatedAt($value) - * @mixin \Eloquent + * @method static Builder|Clan newModelQuery() + * @method static Builder|Clan newQuery() + * @method static Builder|Clan query() + * @method static Builder|Clan whereCode($value) + * @method static Builder|Clan whereCreatedAt($value) + * @method static Builder|Clan whereId($value) + * @method static Builder|Clan whereInviteCode($value) + * @method static Builder|Clan whereName($value) + * @method static Builder|Clan whereUpdatedAt($value) + * @mixin Eloquent */ class Clan extends Model { diff --git a/app/Models/ClanMembership.php b/app/Models/ClanMembership.php index 86b4bad3..17be974f 100644 --- a/app/Models/ClanMembership.php +++ b/app/Models/ClanMembership.php @@ -3,9 +3,12 @@ namespace App\Models; use App\Models\Traits\ToString; +use Eloquent; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Support\Carbon; /** * App\Models\ClanMembership @@ -15,21 +18,21 @@ * @property int $user_id * @property int $clan_id * @property int $clan_role_id - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @property-read \App\Models\Clan $clan - * @property-read \App\Models\ClanRole $role - * @property-read \App\Models\User $user - * @method static \Illuminate\Database\Eloquent\Builder|ClanMembership newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|ClanMembership newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|ClanMembership query() - * @method static \Illuminate\Database\Eloquent\Builder|ClanMembership whereClanId($value) - * @method static \Illuminate\Database\Eloquent\Builder|ClanMembership whereClanRoleId($value) - * @method static \Illuminate\Database\Eloquent\Builder|ClanMembership whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|ClanMembership whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|ClanMembership whereUpdatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|ClanMembership whereUserId($value) - * @mixin \Eloquent + * @property Carbon|null $created_at + * @property Carbon|null $updated_at + * @property-read Clan $clan + * @property-read ClanRole $role + * @property-read User $user + * @method static Builder|ClanMembership newModelQuery() + * @method static Builder|ClanMembership newQuery() + * @method static Builder|ClanMembership query() + * @method static Builder|ClanMembership whereClanId($value) + * @method static Builder|ClanMembership whereClanRoleId($value) + * @method static Builder|ClanMembership whereCreatedAt($value) + * @method static Builder|ClanMembership whereId($value) + * @method static Builder|ClanMembership whereUpdatedAt($value) + * @method static Builder|ClanMembership whereUserId($value) + * @mixin Eloquent */ class ClanMembership extends Model { diff --git a/app/Models/ClanRole.php b/app/Models/ClanRole.php index 75e8c29d..f3a3bac9 100644 --- a/app/Models/ClanRole.php +++ b/app/Models/ClanRole.php @@ -3,9 +3,13 @@ namespace App\Models; use App\Models\Traits\ToString; +use Eloquent; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Support\Carbon; /** * App\Models\ClanRole @@ -14,19 +18,19 @@ * @property int $id * @property string $code * @property string $name - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @property-read \Illuminate\Database\Eloquent\Collection $members + * @property Carbon|null $created_at + * @property Carbon|null $updated_at + * @property-read Collection $members * @property-read int|null $members_count - * @method static \Illuminate\Database\Eloquent\Builder|ClanRole newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|ClanRole newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|ClanRole query() - * @method static \Illuminate\Database\Eloquent\Builder|ClanRole whereCode($value) - * @method static \Illuminate\Database\Eloquent\Builder|ClanRole whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|ClanRole whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|ClanRole whereName($value) - * @method static \Illuminate\Database\Eloquent\Builder|ClanRole whereUpdatedAt($value) - * @mixin \Eloquent + * @method static Builder|ClanRole newModelQuery() + * @method static Builder|ClanRole newQuery() + * @method static Builder|ClanRole query() + * @method static Builder|ClanRole whereCode($value) + * @method static Builder|ClanRole whereCreatedAt($value) + * @method static Builder|ClanRole whereId($value) + * @method static Builder|ClanRole whereName($value) + * @method static Builder|ClanRole whereUpdatedAt($value) + * @mixin Eloquent */ class ClanRole extends Model { diff --git a/app/Models/EmailAddress.php b/app/Models/EmailAddress.php index 5abe8bbc..ccd66da5 100644 --- a/app/Models/EmailAddress.php +++ b/app/Models/EmailAddress.php @@ -7,6 +7,9 @@ use App\Mail\VerifyEmail; use App\Models\Traits\ToString; use Carbon\Carbon; +use Eloquent; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -27,27 +30,41 @@ * @property \Illuminate\Support\Carbon|null $verified_at * @property \Illuminate\Support\Carbon|null $created_at * @property \Illuminate\Support\Carbon|null $updated_at - * @property-read \Illuminate\Database\Eloquent\Collection $linkedAccounts + * @property-read Collection $linkedAccounts * @property-read int|null $linked_accounts_count - * @property-read \App\Models\User $user - * @method static \Illuminate\Database\Eloquent\Builder|EmailAddress newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|EmailAddress newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|EmailAddress query() - * @method static \Illuminate\Database\Eloquent\Builder|EmailAddress whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|EmailAddress whereEmail($value) - * @method static \Illuminate\Database\Eloquent\Builder|EmailAddress whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|EmailAddress whereUpdatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|EmailAddress whereUserId($value) - * @method static \Illuminate\Database\Eloquent\Builder|EmailAddress whereVerificationCode($value) - * @method static \Illuminate\Database\Eloquent\Builder|EmailAddress whereVerificationSentAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|EmailAddress whereVerifiedAt($value) - * @mixin \Eloquent + * @property-read User $user + * @method static Builder|EmailAddress newModelQuery() + * @method static Builder|EmailAddress newQuery() + * @method static Builder|EmailAddress query() + * @method static Builder|EmailAddress whereCreatedAt($value) + * @method static Builder|EmailAddress whereEmail($value) + * @method static Builder|EmailAddress whereId($value) + * @method static Builder|EmailAddress whereUpdatedAt($value) + * @method static Builder|EmailAddress whereUserId($value) + * @method static Builder|EmailAddress whereVerificationCode($value) + * @method static Builder|EmailAddress whereVerificationSentAt($value) + * @method static Builder|EmailAddress whereVerifiedAt($value) + * @mixin Eloquent */ class EmailAddress extends Model { use HasFactory; use ToString; + protected $fillable = [ + 'user_id', + 'email', + 'verification_code', + 'verification_sent_at', + 'verified_at', + 'created_at', + 'updated_at' + ]; + + protected $hidden = [ + 'verification_code', + ]; + protected $casts = [ 'verified_at' => 'datetime', 'verification_sent_at' => 'datetime', diff --git a/app/Models/Event.php b/app/Models/Event.php index 9c281886..518d0c57 100644 --- a/app/Models/Event.php +++ b/app/Models/Event.php @@ -3,9 +3,13 @@ namespace App\Models; use App\Models\Traits\ToString; +use Eloquent; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Support\Carbon; /** * App\Models\Event @@ -16,50 +20,53 @@ * @property string $code * @property int $draft * @property string|null $boxoffice_url - * @property \Illuminate\Support\Carbon|null $starts_at - * @property \Illuminate\Support\Carbon|null $ends_at - * @property int $seating_locked - * @property \Illuminate\Support\Carbon|null $seating_opens_at - * @property \Illuminate\Support\Carbon|null $seating_closes_at - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @property-read \Illuminate\Database\Eloquent\Collection $mappings + * @property Carbon|null $starts_at + * @property Carbon|null $ends_at + * @property bool $seating_locked + * @property Carbon|null $seating_opens_at + * @property Carbon|null $seating_closes_at + * @property Carbon|null $created_at + * @property Carbon|null $updated_at + * @property-read Collection $mappings * @property-read int|null $mappings_count - * @property-read \Illuminate\Database\Eloquent\Collection $seatGroups + * @property-read Collection $seatGroups * @property-read int|null $seat_groups_count - * @property-read \Illuminate\Database\Eloquent\Collection $seatingPlans + * @property-read Collection $seatingPlans * @property-read int|null $seating_plans_count - * @property-read \Illuminate\Database\Eloquent\Collection $ticketTypes + * @property-read Collection $ticketTypes * @property-read int|null $ticket_types_count - * @property-read \Illuminate\Database\Eloquent\Collection $tickets + * @property-read Collection $tickets * @property-read int|null $tickets_count - * @method static \Illuminate\Database\Eloquent\Builder|Event newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Event newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Event query() - * @method static \Illuminate\Database\Eloquent\Builder|Event whereBoxofficeUrl($value) - * @method static \Illuminate\Database\Eloquent\Builder|Event whereCode($value) - * @method static \Illuminate\Database\Eloquent\Builder|Event whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Event whereDraft($value) - * @method static \Illuminate\Database\Eloquent\Builder|Event whereEndsAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Event whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Event whereName($value) - * @method static \Illuminate\Database\Eloquent\Builder|Event whereSeatingClosesAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Event whereSeatingLocked($value) - * @method static \Illuminate\Database\Eloquent\Builder|Event whereSeatingOpensAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Event whereStartsAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Event whereUpdatedAt($value) - * @mixin \Eloquent + * @method static Builder|Event newModelQuery() + * @method static Builder|Event newQuery() + * @method static Builder|Event query() + * @method static Builder|Event whereBoxofficeUrl($value) + * @method static Builder|Event whereCode($value) + * @method static Builder|Event whereCreatedAt($value) + * @method static Builder|Event whereDraft($value) + * @method static Builder|Event whereEndsAt($value) + * @method static Builder|Event whereId($value) + * @method static Builder|Event whereName($value) + * @method static Builder|Event whereSeatingClosesAt($value) + * @method static Builder|Event whereSeatingLocked($value) + * @method static Builder|Event whereSeatingOpensAt($value) + * @method static Builder|Event whereStartsAt($value) + * @method static Builder|Event whereUpdatedAt($value) + * @mixin Eloquent */ class Event extends Model { use HasFactory; use ToString; + protected $fillable = ['name', 'code', 'draft', 'boxoffice_url', 'starts_at', 'ends_at', 'seating_locked', 'seating_opens_at', 'seating_closes_at']; + protected $casts = [ 'starts_at' => 'datetime', 'ends_at' => 'datetime', 'seating_opens_at' => 'datetime', 'seating_closes_at' => 'datetime', + 'seating_locked' => 'boolean', ]; public function getRouteKeyName() diff --git a/app/Models/EventMapping.php b/app/Models/EventMapping.php index 3e2b04d7..5ccb8014 100644 --- a/app/Models/EventMapping.php +++ b/app/Models/EventMapping.php @@ -3,9 +3,12 @@ namespace App\Models; use App\Models\Traits\ToString; +use Eloquent; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Support\Carbon; /** * App\Models\EventMapping @@ -16,21 +19,21 @@ * @property int $ticket_provider_id * @property string $external_id * @property string|null $name - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @property-read \App\Models\Event $event - * @property-read \App\Models\TicketProvider $provider - * @method static \Illuminate\Database\Eloquent\Builder|EventMapping newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|EventMapping newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|EventMapping query() - * @method static \Illuminate\Database\Eloquent\Builder|EventMapping whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|EventMapping whereEventId($value) - * @method static \Illuminate\Database\Eloquent\Builder|EventMapping whereExternalId($value) - * @method static \Illuminate\Database\Eloquent\Builder|EventMapping whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|EventMapping whereName($value) - * @method static \Illuminate\Database\Eloquent\Builder|EventMapping whereTicketProviderId($value) - * @method static \Illuminate\Database\Eloquent\Builder|EventMapping whereUpdatedAt($value) - * @mixin \Eloquent + * @property Carbon|null $created_at + * @property Carbon|null $updated_at + * @property-read Event $event + * @property-read TicketProvider $provider + * @method static Builder|EventMapping newModelQuery() + * @method static Builder|EventMapping newQuery() + * @method static Builder|EventMapping query() + * @method static Builder|EventMapping whereCreatedAt($value) + * @method static Builder|EventMapping whereEventId($value) + * @method static Builder|EventMapping whereExternalId($value) + * @method static Builder|EventMapping whereId($value) + * @method static Builder|EventMapping whereName($value) + * @method static Builder|EventMapping whereTicketProviderId($value) + * @method static Builder|EventMapping whereUpdatedAt($value) + * @mixin Eloquent */ class EventMapping extends Model { diff --git a/app/Models/LinkedAccount.php b/app/Models/LinkedAccount.php index 96149b4b..d16ec195 100644 --- a/app/Models/LinkedAccount.php +++ b/app/Models/LinkedAccount.php @@ -3,9 +3,12 @@ namespace App\Models; use App\Models\Traits\ToString; +use Eloquent; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Support\Carbon; /** * App\Models\LinkedAccount @@ -21,33 +24,47 @@ * @property mixed|null $access_token * @property mixed|null $refresh_token * @property string|null $access_token_expires_at - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @property-read \App\Models\EmailAddress|null $email - * @property-read \App\Models\SocialProvider|null $provider - * @property-read \App\Models\User $user - * @method static \Illuminate\Database\Eloquent\Builder|LinkedAccount newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|LinkedAccount newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|LinkedAccount query() - * @method static \Illuminate\Database\Eloquent\Builder|LinkedAccount whereAccessToken($value) - * @method static \Illuminate\Database\Eloquent\Builder|LinkedAccount whereAccessTokenExpiresAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|LinkedAccount whereAvatarUrl($value) - * @method static \Illuminate\Database\Eloquent\Builder|LinkedAccount whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|LinkedAccount whereEmailAddressId($value) - * @method static \Illuminate\Database\Eloquent\Builder|LinkedAccount whereExternalId($value) - * @method static \Illuminate\Database\Eloquent\Builder|LinkedAccount whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|LinkedAccount whereName($value) - * @method static \Illuminate\Database\Eloquent\Builder|LinkedAccount whereRefreshToken($value) - * @method static \Illuminate\Database\Eloquent\Builder|LinkedAccount whereSocialProviderId($value) - * @method static \Illuminate\Database\Eloquent\Builder|LinkedAccount whereUpdatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|LinkedAccount whereUserId($value) - * @mixin \Eloquent + * @property Carbon|null $created_at + * @property Carbon|null $updated_at + * @property-read EmailAddress|null $email + * @property-read SocialProvider|null $provider + * @property-read User $user + * @method static Builder|LinkedAccount newModelQuery() + * @method static Builder|LinkedAccount newQuery() + * @method static Builder|LinkedAccount query() + * @method static Builder|LinkedAccount whereAccessToken($value) + * @method static Builder|LinkedAccount whereAccessTokenExpiresAt($value) + * @method static Builder|LinkedAccount whereAvatarUrl($value) + * @method static Builder|LinkedAccount whereCreatedAt($value) + * @method static Builder|LinkedAccount whereEmailAddressId($value) + * @method static Builder|LinkedAccount whereExternalId($value) + * @method static Builder|LinkedAccount whereId($value) + * @method static Builder|LinkedAccount whereName($value) + * @method static Builder|LinkedAccount whereRefreshToken($value) + * @method static Builder|LinkedAccount whereSocialProviderId($value) + * @method static Builder|LinkedAccount whereUpdatedAt($value) + * @method static Builder|LinkedAccount whereUserId($value) + * @mixin Eloquent */ class LinkedAccount extends Model { use HasFactory; use ToString; + protected $fillable = [ + 'user_id', + 'email_address_id', + 'social_provider_id', + 'external_id', + 'name', + 'avatar_url', + 'access_token', + 'refresh_token', + 'access_token_expires_at', + 'created_at', + 'updated_at' + ]; + protected $hidden = [ 'access_token', 'refresh_token', diff --git a/app/Models/ProviderSetting.php b/app/Models/ProviderSetting.php index 68e94f8f..6692f137 100644 --- a/app/Models/ProviderSetting.php +++ b/app/Models/ProviderSetting.php @@ -4,10 +4,12 @@ use App\Casts\SettingValue; use App\Enums\SettingType; +use Eloquent; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\MorphTo; +use Illuminate\Support\Carbon; use Spatie\EloquentSortable\Sortable; use Spatie\EloquentSortable\SortableTrait; @@ -26,9 +28,9 @@ * @property string|null $validation * @property mixed|null|null $value * @property int $order - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @property-read Model|\Eloquent $provider + * @property Carbon|null $created_at + * @property Carbon|null $updated_at + * @property-read Model|Eloquent $provider * @method static Builder|ProviderSetting newModelQuery() * @method static Builder|ProviderSetting newQuery() * @method static Builder|ProviderSetting ordered(string $direction = 'asc') @@ -46,7 +48,7 @@ * @method static Builder|ProviderSetting whereUpdatedAt($value) * @method static Builder|ProviderSetting whereValidation($value) * @method static Builder|ProviderSetting whereValue($value) - * @mixin \Eloquent + * @mixin Eloquent */ class ProviderSetting extends Model implements Sortable { diff --git a/app/Models/Role.php b/app/Models/Role.php index 3bcecc7d..3a2eecb2 100644 --- a/app/Models/Role.php +++ b/app/Models/Role.php @@ -3,9 +3,13 @@ namespace App\Models; use App\Models\Traits\ToString; +use Eloquent; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsToMany; +use Illuminate\Support\Carbon; /** * App\Models\Role @@ -14,25 +18,30 @@ * @property int $id * @property string $code * @property string $name - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @property-read \Illuminate\Database\Eloquent\Collection $users + * @property Carbon|null $created_at + * @property Carbon|null $updated_at + * @property-read Collection $users * @property-read int|null $users_count - * @method static \Illuminate\Database\Eloquent\Builder|Role newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Role newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Role query() - * @method static \Illuminate\Database\Eloquent\Builder|Role whereCode($value) - * @method static \Illuminate\Database\Eloquent\Builder|Role whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Role whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Role whereName($value) - * @method static \Illuminate\Database\Eloquent\Builder|Role whereUpdatedAt($value) - * @mixin \Eloquent + * @method static Builder|Role newModelQuery() + * @method static Builder|Role newQuery() + * @method static Builder|Role query() + * @method static Builder|Role whereCode($value) + * @method static Builder|Role whereCreatedAt($value) + * @method static Builder|Role whereId($value) + * @method static Builder|Role whereName($value) + * @method static Builder|Role whereUpdatedAt($value) + * @mixin Eloquent */ class Role extends Model { use HasFactory; use ToString; + protected $fillable = [ + 'code', + 'name' + ]; + public function users(): BelongsToMany { return $this->belongsToMany(User::class)->withTimestamps(); diff --git a/app/Models/Seat.php b/app/Models/Seat.php index 3deac537..3c6f050b 100644 --- a/app/Models/Seat.php +++ b/app/Models/Seat.php @@ -3,10 +3,12 @@ namespace App\Models; use App\Models\Traits\ToString; +use Eloquent; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; -use Illuminate\Support\Collection; +use Illuminate\Support\Carbon; /** * App\Models\Seat @@ -24,35 +26,49 @@ * @property string|null $description * @property string|null $class * @property int $disabled - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @property-read \App\Models\SeatGroup|null $group - * @property-read \App\Models\SeatingPlan $plan - * @property-read \App\Models\Ticket|null $ticket - * @method static \Illuminate\Database\Eloquent\Builder|Seat newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Seat newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Seat query() - * @method static \Illuminate\Database\Eloquent\Builder|Seat whereClass($value) - * @method static \Illuminate\Database\Eloquent\Builder|Seat whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Seat whereDescription($value) - * @method static \Illuminate\Database\Eloquent\Builder|Seat whereDisabled($value) - * @method static \Illuminate\Database\Eloquent\Builder|Seat whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Seat whereLabel($value) - * @method static \Illuminate\Database\Eloquent\Builder|Seat whereNumber($value) - * @method static \Illuminate\Database\Eloquent\Builder|Seat whereRow($value) - * @method static \Illuminate\Database\Eloquent\Builder|Seat whereSeatGroupId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Seat whereSeatingPlanId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Seat whereTicketId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Seat whereUpdatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Seat whereX($value) - * @method static \Illuminate\Database\Eloquent\Builder|Seat whereY($value) - * @mixin \Eloquent + * @property Carbon|null $created_at + * @property Carbon|null $updated_at + * @property-read SeatGroup|null $group + * @property-read SeatingPlan $plan + * @property-read Ticket|null $ticket + * @method static Builder|Seat newModelQuery() + * @method static Builder|Seat newQuery() + * @method static Builder|Seat query() + * @method static Builder|Seat whereClass($value) + * @method static Builder|Seat whereCreatedAt($value) + * @method static Builder|Seat whereDescription($value) + * @method static Builder|Seat whereDisabled($value) + * @method static Builder|Seat whereId($value) + * @method static Builder|Seat whereLabel($value) + * @method static Builder|Seat whereNumber($value) + * @method static Builder|Seat whereRow($value) + * @method static Builder|Seat whereSeatGroupId($value) + * @method static Builder|Seat whereSeatingPlanId($value) + * @method static Builder|Seat whereTicketId($value) + * @method static Builder|Seat whereUpdatedAt($value) + * @method static Builder|Seat whereX($value) + * @method static Builder|Seat whereY($value) + * @mixin Eloquent */ class Seat extends Model { use HasFactory; use ToString; + protected $fillable = [ + 'row', + 'seat_group_id', + 'seating_plan_id', + 'ticket_id', + 'x', + 'y', + 'number', + 'label', + 'description', + 'class', + 'disabled' + ]; + public function ticket(): BelongsTo { return $this->belongsTo(Ticket::class); @@ -80,7 +96,7 @@ public function canPick(?User $user = null): bool return true; } $tickets = $user->getPickableTickets($this->plan->event); - if (!$tickets) { + if ($tickets->count() === 0) { return false; } if ($this->group) { diff --git a/app/Models/SeatGroup.php b/app/Models/SeatGroup.php index fb454b76..8fe1d61e 100644 --- a/app/Models/SeatGroup.php +++ b/app/Models/SeatGroup.php @@ -3,10 +3,14 @@ namespace App\Models; use App\Models\Traits\ToString; +use Eloquent; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Support\Carbon; /** * App\Models\SeatGroup @@ -15,23 +19,23 @@ * @property string $name * @property int $event_id * @property string|null $class - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @property-read \Illuminate\Database\Eloquent\Collection $assignments + * @property Carbon|null $created_at + * @property Carbon|null $updated_at + * @property-read Collection $assignments * @property-read int|null $assignments_count - * @property-read \App\Models\Event $event - * @property-read \Illuminate\Database\Eloquent\Collection $seats + * @property-read Event $event + * @property-read Collection $seats * @property-read int|null $seats_count - * @method static \Illuminate\Database\Eloquent\Builder|SeatGroup newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|SeatGroup newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|SeatGroup query() - * @method static \Illuminate\Database\Eloquent\Builder|SeatGroup whereClass($value) - * @method static \Illuminate\Database\Eloquent\Builder|SeatGroup whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|SeatGroup whereEventId($value) - * @method static \Illuminate\Database\Eloquent\Builder|SeatGroup whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|SeatGroup whereName($value) - * @method static \Illuminate\Database\Eloquent\Builder|SeatGroup whereUpdatedAt($value) - * @mixin \Eloquent + * @method static Builder|SeatGroup newModelQuery() + * @method static Builder|SeatGroup newQuery() + * @method static Builder|SeatGroup query() + * @method static Builder|SeatGroup whereClass($value) + * @method static Builder|SeatGroup whereCreatedAt($value) + * @method static Builder|SeatGroup whereEventId($value) + * @method static Builder|SeatGroup whereId($value) + * @method static Builder|SeatGroup whereName($value) + * @method static Builder|SeatGroup whereUpdatedAt($value) + * @mixin Eloquent */ class SeatGroup extends Model { diff --git a/app/Models/SeatGroupAssignment.php b/app/Models/SeatGroupAssignment.php index 4115e343..5d0d6b90 100644 --- a/app/Models/SeatGroupAssignment.php +++ b/app/Models/SeatGroupAssignment.php @@ -2,9 +2,12 @@ namespace App\Models; +use Eloquent; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Support\Carbon; /** * App\Models\SeatGroupAssignment @@ -13,19 +16,19 @@ * @property int $seat_group_id * @property string $assignment_type * @property int $assignment_type_id - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @property-read \App\Models\SeatGroup|null $group - * @method static \Illuminate\Database\Eloquent\Builder|SeatGroupAssignment newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|SeatGroupAssignment newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|SeatGroupAssignment query() - * @method static \Illuminate\Database\Eloquent\Builder|SeatGroupAssignment whereAssignmentType($value) - * @method static \Illuminate\Database\Eloquent\Builder|SeatGroupAssignment whereAssignmentTypeId($value) - * @method static \Illuminate\Database\Eloquent\Builder|SeatGroupAssignment whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|SeatGroupAssignment whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|SeatGroupAssignment whereSeatGroupId($value) - * @method static \Illuminate\Database\Eloquent\Builder|SeatGroupAssignment whereUpdatedAt($value) - * @mixin \Eloquent + * @property Carbon|null $created_at + * @property Carbon|null $updated_at + * @property-read SeatGroup|null $group + * @method static Builder|SeatGroupAssignment newModelQuery() + * @method static Builder|SeatGroupAssignment newQuery() + * @method static Builder|SeatGroupAssignment query() + * @method static Builder|SeatGroupAssignment whereAssignmentType($value) + * @method static Builder|SeatGroupAssignment whereAssignmentTypeId($value) + * @method static Builder|SeatGroupAssignment whereCreatedAt($value) + * @method static Builder|SeatGroupAssignment whereId($value) + * @method static Builder|SeatGroupAssignment whereSeatGroupId($value) + * @method static Builder|SeatGroupAssignment whereUpdatedAt($value) + * @mixin Eloquent */ class SeatGroupAssignment extends Model { diff --git a/app/Models/SeatingPlan.php b/app/Models/SeatingPlan.php index c0c31492..1f3df372 100644 --- a/app/Models/SeatingPlan.php +++ b/app/Models/SeatingPlan.php @@ -4,13 +4,14 @@ use App\Jobs\UpdateSeatingPlanJob; use App\Models\Traits\ToString; +use Eloquent; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Support\Carbon; use Illuminate\Support\Collection; -use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; @@ -31,10 +32,10 @@ * @property string|null $image_url * @property int|null $image_height * @property int|null $image_width - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @property-read \App\Models\Event $event - * @property-read \Illuminate\Database\Eloquent\Collection $seats + * @property Carbon|null $created_at + * @property Carbon|null $updated_at + * @property-read Event $event + * @property-read \Illuminate\Database\Eloquent\Collection $seats * @property-read int|null $seats_count * @method static Builder|SeatingPlan newModelQuery() * @method static Builder|SeatingPlan newQuery() @@ -52,7 +53,7 @@ * @method static Builder|SeatingPlan whereRevision($value) * @method static Builder|SeatingPlan whereScale($value) * @method static Builder|SeatingPlan whereUpdatedAt($value) - * @mixin \Eloquent + * @mixin Eloquent */ class SeatingPlan extends Model implements Sortable { @@ -63,6 +64,18 @@ class SeatingPlan extends Model implements Sortable // Cache the plan for 30 days protected const CACHE_TTL = 30 * 86400; + protected $fillable = [ + 'event_id', + 'name', + 'code', + 'order', + 'scale', + 'revision', + 'image_url', + 'image_height', + 'image_width' + ]; + public function event(): BelongsTo { return $this->belongsTo(Event::class); @@ -159,8 +172,12 @@ public function import(string $csv, bool $wipe = false): void if (!$row[5]) { continue; } - if ((int)$row[0] > 0) { - $seat = $this->seats->where('id', $row[0])->first(); + + if (isset($row[0]) && is_numeric($row[0])) { + $id = (int)$row[0]; + if ($id > 0) { + $seat = $this->seats->firstWhere('id', $id); + } } if ($seat === null) { $seat = new Seat(); @@ -174,8 +191,8 @@ public function import(string $csv, bool $wipe = false): void $seat->label = $row[5]; $seat->description = $row[6] ?? null; $seat->class = $row[7] ?? null; - $seat->seat_group_id = (int)$row[8] ?? null; - $seat->disabled = (bool)$row[9]; + $seat->seat_group_id = (int)($row[8] ?? null); + $seat->disabled = (bool)($row[9] ?? false); $seat->saveQuietly(); } @@ -190,8 +207,34 @@ public function updateRevision(): void $this->save(); } + /** + * Randomise seat allocation - CHANGE PLACES! + * @return void + */ + public function randomise(): void + { + Log::debug("{$this} Randomising seats"); + $this->refresh(); + $tickets = $this->event->tickets()->whereHas('type', function ($query) { + $query->where('has_seat', true); + })->inRandomOrder()->get(); + foreach ($this->seats as $seat) { + $seat->ticket()->dissociate(); + $seat->saveQuietly(); + } + + $seats = $this->seats()->inRandomOrder()->get(); + foreach ($tickets as $ticket) { + $seat = $seats->pop(); + Log::debug("{$this} Allocating {$seat} to {$ticket}"); + $seat->ticket()->associate($ticket); + $seat->saveQuietly(); + } + $this->updateRevision(); + } + protected function toStringName(): string { - return $this->code; + return $this->code ?? ''; } } diff --git a/app/Models/Setting.php b/app/Models/Setting.php index 7f70ef14..3e211c94 100644 --- a/app/Models/Setting.php +++ b/app/Models/Setting.php @@ -5,8 +5,11 @@ use App\Casts\SettingValue; use App\Enums\SettingType; use App\Models\Traits\ToString; +use Eloquent; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Crypt; use Illuminate\Support\Facades\Log; @@ -27,25 +30,25 @@ * @property string|null $validation * @property SettingType $type * @property int $order - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @method static \Illuminate\Database\Eloquent\Builder|Setting newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Setting newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Setting ordered(string $direction = 'asc') - * @method static \Illuminate\Database\Eloquent\Builder|Setting query() - * @method static \Illuminate\Database\Eloquent\Builder|Setting whereCode($value) - * @method static \Illuminate\Database\Eloquent\Builder|Setting whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Setting whereDescription($value) - * @method static \Illuminate\Database\Eloquent\Builder|Setting whereEncrypted($value) - * @method static \Illuminate\Database\Eloquent\Builder|Setting whereHidden($value) - * @method static \Illuminate\Database\Eloquent\Builder|Setting whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Setting whereName($value) - * @method static \Illuminate\Database\Eloquent\Builder|Setting whereOrder($value) - * @method static \Illuminate\Database\Eloquent\Builder|Setting whereType($value) - * @method static \Illuminate\Database\Eloquent\Builder|Setting whereUpdatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Setting whereValidation($value) - * @method static \Illuminate\Database\Eloquent\Builder|Setting whereValue($value) - * @mixin \Eloquent + * @property Carbon|null $created_at + * @property Carbon|null $updated_at + * @method static Builder|Setting newModelQuery() + * @method static Builder|Setting newQuery() + * @method static Builder|Setting ordered(string $direction = 'asc') + * @method static Builder|Setting query() + * @method static Builder|Setting whereCode($value) + * @method static Builder|Setting whereCreatedAt($value) + * @method static Builder|Setting whereDescription($value) + * @method static Builder|Setting whereEncrypted($value) + * @method static Builder|Setting whereHidden($value) + * @method static Builder|Setting whereId($value) + * @method static Builder|Setting whereName($value) + * @method static Builder|Setting whereOrder($value) + * @method static Builder|Setting whereType($value) + * @method static Builder|Setting whereUpdatedAt($value) + * @method static Builder|Setting whereValidation($value) + * @method static Builder|Setting whereValue($value) + * @mixin Eloquent */ class Setting extends Model implements Sortable { @@ -55,6 +58,18 @@ class Setting extends Model implements Sortable protected static array $cached = []; + protected $fillable = [ + 'code', + 'name', + 'description', + 'encrypted', + 'hidden', + 'value', + 'validation', + 'type', + 'order' + ]; + protected $casts = [ 'value' => SettingValue::class, 'type' => SettingType::class, @@ -91,13 +106,6 @@ public static function fetch(string $code, $default = null) return $setting->value ?? $default; } - public function clearCache(): void - { - Log::debug("Clearing settings.{$this->code} from cache"); - unset(static::$cached[$this->code]); - Cache::forget("settings.{$this->code}"); - } - public function getValue() { return (object)[ @@ -107,6 +115,13 @@ public function getValue() ]; } + public function clearCache(): void + { + Log::debug("Clearing settings.{$this->code} from cache"); + unset(static::$cached[$this->code]); + Cache::forget("settings.{$this->code}"); + } + protected function toStringName(): string { return $this->code; diff --git a/app/Models/SocialProvider.php b/app/Models/SocialProvider.php index b357bb70..d183174e 100644 --- a/app/Models/SocialProvider.php +++ b/app/Models/SocialProvider.php @@ -4,10 +4,14 @@ use App\Models\Traits\ToString; use App\Services\Contracts\SocialProviderContract; +use Eloquent; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\MorphMany; +use Illuminate\Support\Carbon; /** * App\Models\SocialProvider @@ -21,32 +25,42 @@ * @property int $enabled * @property int $auth_enabled * @property int $can_be_renamed - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @property-read \Illuminate\Database\Eloquent\Collection $accounts + * @property Carbon|null $created_at + * @property Carbon|null $updated_at + * @property-read Collection $accounts * @property-read int|null $accounts_count - * @property-read \Illuminate\Database\Eloquent\Collection $settings + * @property-read Collection $settings * @property-read int|null $settings_count - * @method static \Illuminate\Database\Eloquent\Builder|SocialProvider newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|SocialProvider newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|SocialProvider query() - * @method static \Illuminate\Database\Eloquent\Builder|SocialProvider whereAuthEnabled($value) - * @method static \Illuminate\Database\Eloquent\Builder|SocialProvider whereCanBeRenamed($value) - * @method static \Illuminate\Database\Eloquent\Builder|SocialProvider whereCode($value) - * @method static \Illuminate\Database\Eloquent\Builder|SocialProvider whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|SocialProvider whereEnabled($value) - * @method static \Illuminate\Database\Eloquent\Builder|SocialProvider whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|SocialProvider whereName($value) - * @method static \Illuminate\Database\Eloquent\Builder|SocialProvider whereProviderClass($value) - * @method static \Illuminate\Database\Eloquent\Builder|SocialProvider whereSupportsAuth($value) - * @method static \Illuminate\Database\Eloquent\Builder|SocialProvider whereUpdatedAt($value) - * @mixin \Eloquent + * @method static Builder|SocialProvider newModelQuery() + * @method static Builder|SocialProvider newQuery() + * @method static Builder|SocialProvider query() + * @method static Builder|SocialProvider whereAuthEnabled($value) + * @method static Builder|SocialProvider whereCanBeRenamed($value) + * @method static Builder|SocialProvider whereCode($value) + * @method static Builder|SocialProvider whereCreatedAt($value) + * @method static Builder|SocialProvider whereEnabled($value) + * @method static Builder|SocialProvider whereId($value) + * @method static Builder|SocialProvider whereName($value) + * @method static Builder|SocialProvider whereProviderClass($value) + * @method static Builder|SocialProvider whereSupportsAuth($value) + * @method static Builder|SocialProvider whereUpdatedAt($value) + * @mixin Eloquent */ class SocialProvider extends Model { use HasFactory; use ToString; + protected $fillable = [ + 'name', + 'code', + 'provider_class', + 'supports_auth', + 'enabled', + 'auth_enabled', + 'can_be_renamed', + ]; + protected array $_settings = []; public function accounts(): HasMany @@ -61,6 +75,10 @@ public function redirect(?string $redirectUrl = null) public function getProvider(?string $redirectUrl = null): SocialProviderContract { + // Prefer resolving from the container if bound (tests may bind stubs) + if (app()->bound($this->provider_class)) { + return app()->make($this->provider_class, ['provider' => $this, 'redirectUrl' => $redirectUrl]); + } return new $this->provider_class($this, $redirectUrl); } @@ -74,16 +92,6 @@ public function configMapping(): array return $this->getProvider()->configMapping(); } - protected function toStringName(): string - { - return $this->code; - } - - public function settings(): MorphMany - { - return $this->morphMany(ProviderSetting::class, 'provider'); - } - public function getSetting(string $code): mixed { if (isset($this->_settings[$code])) { @@ -97,4 +105,14 @@ public function getSetting(string $code): mixed $this->_settings[$code] = $setting->value; return $setting->value; } + + public function settings(): MorphMany + { + return $this->morphMany(ProviderSetting::class, 'provider'); + } + + protected function toStringName(): string + { + return $this->code; + } } diff --git a/app/Models/Theme.php b/app/Models/Theme.php index 9e02dc61..26b014a7 100644 --- a/app/Models/Theme.php +++ b/app/Models/Theme.php @@ -2,8 +2,11 @@ namespace App\Models; +use Eloquent; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Carbon; /** * App\Models\Theme @@ -23,33 +26,49 @@ * @property string $seat_clan * @property string $seat_selected * @property string|null $css - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @method static \Illuminate\Database\Eloquent\Builder|Theme newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Theme newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Theme query() - * @method static \Illuminate\Database\Eloquent\Builder|Theme whereActive($value) - * @method static \Illuminate\Database\Eloquent\Builder|Theme whereCode($value) - * @method static \Illuminate\Database\Eloquent\Builder|Theme whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Theme whereCss($value) - * @method static \Illuminate\Database\Eloquent\Builder|Theme whereDarkMode($value) - * @method static \Illuminate\Database\Eloquent\Builder|Theme whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Theme whereName($value) - * @method static \Illuminate\Database\Eloquent\Builder|Theme whereNavBackground($value) - * @method static \Illuminate\Database\Eloquent\Builder|Theme wherePrimary($value) - * @method static \Illuminate\Database\Eloquent\Builder|Theme whereReadonly($value) - * @method static \Illuminate\Database\Eloquent\Builder|Theme whereSeatAvailable($value) - * @method static \Illuminate\Database\Eloquent\Builder|Theme whereSeatClan($value) - * @method static \Illuminate\Database\Eloquent\Builder|Theme whereSeatDisabled($value) - * @method static \Illuminate\Database\Eloquent\Builder|Theme whereSeatSelected($value) - * @method static \Illuminate\Database\Eloquent\Builder|Theme whereSeatTaken($value) - * @method static \Illuminate\Database\Eloquent\Builder|Theme whereUpdatedAt($value) - * @mixin \Eloquent + * @property Carbon|null $created_at + * @property Carbon|null $updated_at + * @method static Builder|Theme newModelQuery() + * @method static Builder|Theme newQuery() + * @method static Builder|Theme query() + * @method static Builder|Theme whereActive($value) + * @method static Builder|Theme whereCode($value) + * @method static Builder|Theme whereCreatedAt($value) + * @method static Builder|Theme whereCss($value) + * @method static Builder|Theme whereDarkMode($value) + * @method static Builder|Theme whereId($value) + * @method static Builder|Theme whereName($value) + * @method static Builder|Theme whereNavBackground($value) + * @method static Builder|Theme wherePrimary($value) + * @method static Builder|Theme whereReadonly($value) + * @method static Builder|Theme whereSeatAvailable($value) + * @method static Builder|Theme whereSeatClan($value) + * @method static Builder|Theme whereSeatDisabled($value) + * @method static Builder|Theme whereSeatSelected($value) + * @method static Builder|Theme whereSeatTaken($value) + * @method static Builder|Theme whereUpdatedAt($value) + * @mixin Eloquent */ class Theme extends Model { use HasFactory; + protected $fillable = [ + 'name', + 'code', + 'readonly', + 'active', + 'dark_mode', + 'primary', + 'nav_background', + 'seat_available', + 'seat_disabled', + 'seat_taken', + 'seat_clan', + 'seat_selected', + 'css' + ]; + public function rgb(string $property): string { $colour = $this->{$property}; diff --git a/app/Models/Ticket.php b/app/Models/Ticket.php index 070af3a6..dd59f441 100644 --- a/app/Models/Ticket.php +++ b/app/Models/Ticket.php @@ -5,6 +5,8 @@ use App\Models\Helpers\TicketImport; use App\Models\Traits\ToString; use Carbon\Carbon; +use Eloquent; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -30,37 +32,108 @@ * @property string|null $transfer_code * @property \Illuminate\Support\Carbon|null $created_at * @property \Illuminate\Support\Carbon|null $updated_at - * @property-read \App\Models\Event $event - * @property-read \App\Models\TicketProvider $provider - * @property-read \App\Models\Seat|null $seat - * @property-read \App\Models\TicketType $type - * @property-read \App\Models\User|null $user - * @method static \Illuminate\Database\Eloquent\Builder|Ticket newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Ticket newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Ticket query() - * @method static \Illuminate\Database\Eloquent\Builder|Ticket whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Ticket whereEventId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Ticket whereExternalId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Ticket whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Ticket whereName($value) - * @method static \Illuminate\Database\Eloquent\Builder|Ticket whereOriginalEmail($value) - * @method static \Illuminate\Database\Eloquent\Builder|Ticket whereQrcode($value) - * @method static \Illuminate\Database\Eloquent\Builder|Ticket whereReference($value) - * @method static \Illuminate\Database\Eloquent\Builder|Ticket whereTicketProviderId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Ticket whereTicketTypeId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Ticket whereTransferCode($value) - * @method static \Illuminate\Database\Eloquent\Builder|Ticket whereUpdatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Ticket whereUserId($value) - * @mixin \Eloquent + * @property-read Event $event + * @property-read TicketProvider $provider + * @property-read Seat|null $seat + * @property-read TicketType $type + * @property-read User|null $user + * @method static Builder|Ticket newModelQuery() + * @method static Builder|Ticket newQuery() + * @method static Builder|Ticket query() + * @method static Builder|Ticket whereCreatedAt($value) + * @method static Builder|Ticket whereEventId($value) + * @method static Builder|Ticket whereExternalId($value) + * @method static Builder|Ticket whereId($value) + * @method static Builder|Ticket whereName($value) + * @method static Builder|Ticket whereOriginalEmail($value) + * @method static Builder|Ticket whereQrcode($value) + * @method static Builder|Ticket whereReference($value) + * @method static Builder|Ticket whereTicketProviderId($value) + * @method static Builder|Ticket whereTicketTypeId($value) + * @method static Builder|Ticket whereTransferCode($value) + * @method static Builder|Ticket whereUpdatedAt($value) + * @method static Builder|Ticket whereUserId($value) + * @mixin Eloquent */ class Ticket extends Model { use HasFactory; use ToString; - public function user(): BelongsTo + protected $fillable = [ + 'ticket_provider_id', + 'user_id', + 'event_id', + 'ticket_type_id', + 'external_id', + 'original_email', + 'name', + 'reference', + 'qrcode', + 'transfer_code', + 'created_at', + 'updated_at' + ]; + + public static function import(string $csv): array { - return $this->belongsTo(User::class); + $csv = explode("\n", trim($csv)); + $rows = array_map(function ($row) { + return str_getcsv(trim($row)); + }, $csv); + if (!is_numeric($rows[0][0])) { + // Header row, throw it away + unset($rows[0]); + } + $imports = []; + foreach ($rows as $row) { + $type = TicketType::whereId($row[0])->with(['event'])->first(); + if (!$type) { + continue; + } + $user = User::whereId($row[1])->first(); + if (!$user) { + continue; + } + $seat = null; + if ($row[2] && $type->has_seat) { + $seat = Seat::whereHas('plan', function ($query) use ($type) { + $query->where('event_id', $type->event_id); + })->whereLabel($row[2])->first(); + } + $imports[] = new TicketImport($user, $type->event, $type, $seat); + } + return $imports; + } + + public static function createFromImport(TicketImport $import): Ticket + { + $provider = TicketProvider::whereCode('internal')->first(); + + $ticket = new Ticket(); + $ticket->event()->associate($import->event); + $ticket->provider()->associate($provider); + $ticket->user()->associate($import->user); + $ticket->type()->associate($import->type); + + $ticket->external_id = makeCode(8); + $ticket->name = $import->type->name; + $ticket->qrcode = 'https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=' . $ticket->external_id; + $ticket->reference = $ticket->external_id; + + DB::transaction(function ($query) use ($import, $ticket) { + $ticket->save(); + if ($import->seat) { + $import->seat->ticket()->associate($ticket); + $import->seat->save(); + } + }); + return $ticket; + } + + public function event(): BelongsTo + { + return $this->belongsTo(Event::class); } public function provider(): BelongsTo @@ -68,14 +141,14 @@ public function provider(): BelongsTo return $this->belongsTo(TicketProvider::class, 'ticket_provider_id'); } - public function type(): BelongsTo + public function user(): BelongsTo { - return $this->belongsTo(TicketType::class, 'ticket_type_id'); + return $this->belongsTo(User::class); } - public function event(): BelongsTo + public function type(): BelongsTo { - return $this->belongsTo(Event::class); + return $this->belongsTo(TicketType::class, 'ticket_type_id'); } public function seat(): HasOne @@ -129,60 +202,4 @@ public function canBeManagedBy(User $user): bool $common = $thisTicketClans->intersect($userClans); return $common->count() > 0; } - - public static function import(string $csv): array - { - $csv = explode("\n", trim($csv)); - $rows = array_map(function ($row) { - return str_getcsv(trim($row)); - }, $csv); - if (!is_numeric($rows[0][0])) { - // Header row, throw it away - unset($rows[0]); - } - $imports = []; - foreach ($rows as $row) { - $type = TicketType::whereId($row[0])->with(['event'])->first(); - if (!$type) { - continue; - } - $user = User::whereId($row[1])->first(); - if (!$user) { - continue; - } - $seat = null; - if ($row[2] && $type->has_seat) { - $seat = Seat::whereHas('plan', function ($query) use ($type) { - $query->where('event_id', $type->event_id); - })->whereLabel($row[2])->first(); - } - $imports[] = new TicketImport($user, $type->event, $type, $seat); - } - return $imports; - } - - public static function createFromImport(TicketImport $import): Ticket - { - $provider = TicketProvider::whereCode('internal')->first(); - - $ticket = new Ticket(); - $ticket->event()->associate($import->event); - $ticket->provider()->associate($provider); - $ticket->user()->associate($import->user); - $ticket->type()->associate($import->type); - - $ticket->external_id = makeCode(8); - $ticket->name = $import->type->name; - $ticket->qrcode = 'https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=' . $ticket->external_id; - $ticket->reference = $ticket->external_id; - - DB::transaction(function ($query) use ($import, $ticket) { - $ticket->save(); - if ($import->seat) { - $import->seat->ticket()->associate($ticket); - $import->seat->save(); - } - }); - return $ticket; - } } diff --git a/app/Models/TicketProvider.php b/app/Models/TicketProvider.php index c4fb5a3a..71846da7 100644 --- a/app/Models/TicketProvider.php +++ b/app/Models/TicketProvider.php @@ -4,11 +4,15 @@ use App\Models\Traits\ToString; use App\Services\Contracts\TicketProviderContract; +use Eloquent; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\MorphMany; use Illuminate\Http\Request; +use Illuminate\Support\Carbon; /** * App\Models\TicketProvider @@ -20,34 +24,42 @@ * @property string $provider_class * @property int $enabled * @property string $cache_prefix - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @property-read \Illuminate\Database\Eloquent\Collection $events + * @property Carbon|null $created_at + * @property Carbon|null $updated_at + * @property-read Collection $events * @property-read int|null $events_count - * @property-read \Illuminate\Database\Eloquent\Collection $settings + * @property-read Collection $settings * @property-read int|null $settings_count - * @property-read \Illuminate\Database\Eloquent\Collection $tickets + * @property-read Collection $tickets * @property-read int|null $tickets_count - * @property-read \Illuminate\Database\Eloquent\Collection $types + * @property-read Collection $types * @property-read int|null $types_count - * @method static \Illuminate\Database\Eloquent\Builder|TicketProvider newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|TicketProvider newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|TicketProvider query() - * @method static \Illuminate\Database\Eloquent\Builder|TicketProvider whereCachePrefix($value) - * @method static \Illuminate\Database\Eloquent\Builder|TicketProvider whereCode($value) - * @method static \Illuminate\Database\Eloquent\Builder|TicketProvider whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|TicketProvider whereEnabled($value) - * @method static \Illuminate\Database\Eloquent\Builder|TicketProvider whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|TicketProvider whereName($value) - * @method static \Illuminate\Database\Eloquent\Builder|TicketProvider whereProviderClass($value) - * @method static \Illuminate\Database\Eloquent\Builder|TicketProvider whereUpdatedAt($value) - * @mixin \Eloquent + * @method static Builder|TicketProvider newModelQuery() + * @method static Builder|TicketProvider newQuery() + * @method static Builder|TicketProvider query() + * @method static Builder|TicketProvider whereCachePrefix($value) + * @method static Builder|TicketProvider whereCode($value) + * @method static Builder|TicketProvider whereCreatedAt($value) + * @method static Builder|TicketProvider whereEnabled($value) + * @method static Builder|TicketProvider whereId($value) + * @method static Builder|TicketProvider whereName($value) + * @method static Builder|TicketProvider whereProviderClass($value) + * @method static Builder|TicketProvider whereUpdatedAt($value) + * @mixin Eloquent */ class TicketProvider extends Model { use HasFactory; use ToString; + protected $fillable = [ + 'name', + 'code', + 'provider_class', + 'enabled', + 'cache_prefix', + ]; + protected array $_settings = []; public function tickets(): HasMany @@ -55,14 +67,14 @@ public function tickets(): HasMany return $this->hasMany(Ticket::class); } - public function getProvider(): TicketProviderContract + public function syncTickets(string|EmailAddress $email): void { - return new $this->provider_class($this); + $this->getProvider()->syncTickets($email); } - public function syncTickets(string|EmailAddress $email): void + public function getProvider(): TicketProviderContract { - $this->getProvider()->syncTickets($email); + return app()->make($this->provider_class, ['provider' => $this]); } public function processWebhook(Request $request): bool @@ -137,11 +149,6 @@ public function types(): HasMany return $this->hasMany(TicketTypeMapping::class); } - public function settings(): MorphMany - { - return $this->morphMany(ProviderSetting::class, 'provider'); - } - public function getSetting(string $code): mixed { if (isset($this->_settings[$code])) { @@ -156,6 +163,11 @@ public function getSetting(string $code): mixed return $setting->value; } + public function settings(): MorphMany + { + return $this->morphMany(ProviderSetting::class, 'provider'); + } + public function clearCache(): void { $this->cache_prefix = time(); diff --git a/app/Models/TicketType.php b/app/Models/TicketType.php index 93205453..74ceff76 100644 --- a/app/Models/TicketType.php +++ b/app/Models/TicketType.php @@ -4,10 +4,14 @@ use App\Models\Traits\ToString; use App\Services\DiscordApi; +use Eloquent; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Artisan; /** @@ -20,31 +24,39 @@ * @property int $has_seat * @property string|null $discord_role_id * @property string|null $discord_role_name - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @property-read \App\Models\Event $event - * @property-read \Illuminate\Database\Eloquent\Collection $mappings + * @property Carbon|null $created_at + * @property Carbon|null $updated_at + * @property-read Event $event + * @property-read Collection $mappings * @property-read int|null $mappings_count - * @property-read \Illuminate\Database\Eloquent\Collection $tickets + * @property-read Collection $tickets * @property-read int|null $tickets_count - * @method static \Illuminate\Database\Eloquent\Builder|TicketType newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|TicketType newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|TicketType query() - * @method static \Illuminate\Database\Eloquent\Builder|TicketType whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|TicketType whereDiscordRoleId($value) - * @method static \Illuminate\Database\Eloquent\Builder|TicketType whereDiscordRoleName($value) - * @method static \Illuminate\Database\Eloquent\Builder|TicketType whereEventId($value) - * @method static \Illuminate\Database\Eloquent\Builder|TicketType whereHasSeat($value) - * @method static \Illuminate\Database\Eloquent\Builder|TicketType whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|TicketType whereName($value) - * @method static \Illuminate\Database\Eloquent\Builder|TicketType whereUpdatedAt($value) - * @mixin \Eloquent + * @method static Builder|TicketType newModelQuery() + * @method static Builder|TicketType newQuery() + * @method static Builder|TicketType query() + * @method static Builder|TicketType whereCreatedAt($value) + * @method static Builder|TicketType whereDiscordRoleId($value) + * @method static Builder|TicketType whereDiscordRoleName($value) + * @method static Builder|TicketType whereEventId($value) + * @method static Builder|TicketType whereHasSeat($value) + * @method static Builder|TicketType whereId($value) + * @method static Builder|TicketType whereName($value) + * @method static Builder|TicketType whereUpdatedAt($value) + * @mixin Eloquent */ class TicketType extends Model { use HasFactory; use ToString; + protected $fillable = [ + 'event_id', + 'name', + 'has_seat', + 'discord_role_id', + 'discord_role_name', + ]; + public function event(): BelongsTo { return $this->belongsTo(Event::class); diff --git a/app/Models/TicketTypeMapping.php b/app/Models/TicketTypeMapping.php index 50bf0154..c92e8682 100644 --- a/app/Models/TicketTypeMapping.php +++ b/app/Models/TicketTypeMapping.php @@ -3,9 +3,12 @@ namespace App\Models; use App\Models\Traits\ToString; +use Eloquent; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Support\Carbon; /** * App\Models\TicketTypeMapping @@ -16,27 +19,34 @@ * @property int $ticket_provider_id * @property string $external_id * @property string|null $name - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @property-read \App\Models\TicketProvider $provider - * @property-read \App\Models\TicketType $type - * @method static \Illuminate\Database\Eloquent\Builder|TicketTypeMapping newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|TicketTypeMapping newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|TicketTypeMapping query() - * @method static \Illuminate\Database\Eloquent\Builder|TicketTypeMapping whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|TicketTypeMapping whereExternalId($value) - * @method static \Illuminate\Database\Eloquent\Builder|TicketTypeMapping whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|TicketTypeMapping whereName($value) - * @method static \Illuminate\Database\Eloquent\Builder|TicketTypeMapping whereTicketProviderId($value) - * @method static \Illuminate\Database\Eloquent\Builder|TicketTypeMapping whereTicketTypeId($value) - * @method static \Illuminate\Database\Eloquent\Builder|TicketTypeMapping whereUpdatedAt($value) - * @mixin \Eloquent + * @property Carbon|null $created_at + * @property Carbon|null $updated_at + * @property-read TicketProvider $provider + * @property-read TicketType $type + * @method static Builder|TicketTypeMapping newModelQuery() + * @method static Builder|TicketTypeMapping newQuery() + * @method static Builder|TicketTypeMapping query() + * @method static Builder|TicketTypeMapping whereCreatedAt($value) + * @method static Builder|TicketTypeMapping whereExternalId($value) + * @method static Builder|TicketTypeMapping whereId($value) + * @method static Builder|TicketTypeMapping whereName($value) + * @method static Builder|TicketTypeMapping whereTicketProviderId($value) + * @method static Builder|TicketTypeMapping whereTicketTypeId($value) + * @method static Builder|TicketTypeMapping whereUpdatedAt($value) + * @mixin Eloquent */ class TicketTypeMapping extends Model { use HasFactory; use ToString; + protected $fillable = [ + 'ticket_type_id', + 'ticket_provider_id', + 'external_id', + 'name', + ]; + public function provider(): BelongsTo { return $this->belongsTo(TicketProvider::class, 'ticket_provider_id'); diff --git a/app/Models/User.php b/app/Models/User.php index f55f61ec..56ddcbc4 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -5,17 +5,24 @@ use App\Models\Traits\ToString; use App\Services\DiscordApi; use Carbon\Carbon; +use Database\Factories\UserFactory; +use Eloquent; +use Exception; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Foundation\Auth\User as Authenticatable; +use Illuminate\Notifications\DatabaseNotification; +use Illuminate\Notifications\DatabaseNotificationCollection; use Illuminate\Notifications\Notifiable; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Log; use Laravel\Sanctum\HasApiTokens; +use Laravel\Sanctum\PersonalAccessToken; /** * App\Models\User @@ -33,38 +40,38 @@ * @property \Illuminate\Support\Carbon|null $tickets_synced_at * @property \Illuminate\Support\Carbon|null $created_at * @property \Illuminate\Support\Carbon|null $updated_at - * @property-read \Illuminate\Database\Eloquent\Collection $accounts + * @property-read \Illuminate\Database\Eloquent\Collection $accounts * @property-read int|null $accounts_count - * @property-read \Illuminate\Database\Eloquent\Collection $clanMemberships + * @property-read \Illuminate\Database\Eloquent\Collection $clanMemberships * @property-read int|null $clan_memberships_count - * @property-read \Illuminate\Database\Eloquent\Collection $emails + * @property-read \Illuminate\Database\Eloquent\Collection $emails * @property-read int|null $emails_count - * @property-read \Illuminate\Notifications\DatabaseNotificationCollection $notifications + * @property-read DatabaseNotificationCollection $notifications * @property-read int|null $notifications_count - * @property-read \App\Models\EmailAddress|null $primaryEmail - * @property-read \Illuminate\Database\Eloquent\Collection $roles + * @property-read EmailAddress|null $primaryEmail + * @property-read \Illuminate\Database\Eloquent\Collection $roles * @property-read int|null $roles_count - * @property-read \Illuminate\Database\Eloquent\Collection $tickets + * @property-read \Illuminate\Database\Eloquent\Collection $tickets * @property-read int|null $tickets_count - * @property-read \Illuminate\Database\Eloquent\Collection $tokens + * @property-read \Illuminate\Database\Eloquent\Collection $tokens * @property-read int|null $tokens_count - * @method static \Database\Factories\UserFactory factory($count = null, $state = []) - * @method static \Illuminate\Database\Eloquent\Builder|User newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|User newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|User query() - * @method static \Illuminate\Database\Eloquent\Builder|User whereAvatar($value) - * @method static \Illuminate\Database\Eloquent\Builder|User whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|User whereFirstLogin($value) - * @method static \Illuminate\Database\Eloquent\Builder|User whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|User whereLastLogin($value) - * @method static \Illuminate\Database\Eloquent\Builder|User whereName($value) - * @method static \Illuminate\Database\Eloquent\Builder|User whereNickname($value) - * @method static \Illuminate\Database\Eloquent\Builder|User wherePrimaryEmailId($value) - * @method static \Illuminate\Database\Eloquent\Builder|User whereSuspended($value) - * @method static \Illuminate\Database\Eloquent\Builder|User whereTermsAgreedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|User whereTicketsSyncedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|User whereUpdatedAt($value) - * @mixin \Eloquent + * @method static UserFactory factory($count = null, $state = []) + * @method static Builder|User newModelQuery() + * @method static Builder|User newQuery() + * @method static Builder|User query() + * @method static Builder|User whereAvatar($value) + * @method static Builder|User whereCreatedAt($value) + * @method static Builder|User whereFirstLogin($value) + * @method static Builder|User whereId($value) + * @method static Builder|User whereLastLogin($value) + * @method static Builder|User whereName($value) + * @method static Builder|User whereNickname($value) + * @method static Builder|User wherePrimaryEmailId($value) + * @method static Builder|User whereSuspended($value) + * @method static Builder|User whereTermsAgreedAt($value) + * @method static Builder|User whereTicketsSyncedAt($value) + * @method static Builder|User whereUpdatedAt($value) + * @mixin Eloquent */ class User extends Authenticatable { @@ -73,6 +80,20 @@ class User extends Authenticatable use Notifiable; use ToString; + protected $fillable = [ + 'nickname', + 'name', + 'avatar', + 'terms_agreed_at', + 'first_login', + 'last_login', + 'suspended', + 'primary_email_id', + 'tickets_synced_at', + 'created_at', + 'updated_at' + ]; + protected ?Collection $pickableTickets = null; protected $casts = [ @@ -91,11 +112,6 @@ public function primaryEmail(): BelongsTo return $this->belongsTo(EmailAddress::class, 'primary_email_id'); } - public function accounts(): HasMany - { - return $this->hasMany(LinkedAccount::class); - } - public function tickets(): HasMany { return $this->hasMany(Ticket::class); @@ -109,6 +125,11 @@ public function hasRole(string|Role $role): bool return (bool)$this->roles()->whereCode($role)->count(); } + public function roles(): BelongsToMany + { + return $this->belongsToMany(Role::class); + } + public function hasAnyRole(array $roles): bool { foreach ($roles as $role) { @@ -122,11 +143,6 @@ public function hasAnyRole(array $roles): bool return false; } - public function roles(): BelongsToMany - { - return $this->belongsToMany(Role::class); - } - public function avatarUrl(): string { foreach ($this->accounts as $acc) { @@ -190,27 +206,6 @@ public function clanMemberships(): HasMany return $this->hasMany(ClanMembership::class); } - protected function toStringName(): string - { - return $this->nickname; - } - - protected function email(): Attribute - { - return Attribute::make( - get: function (mixed $value, array $attributes) { - return $this->primaryEmail->email ?? null; - }, - ); - } - - protected function getDiscordAccount() - { - return $this->accounts()->whereHas('provider', function ($query) { - $query->whereCode('discord'); - })->first(); - } - public function addDiscordRole(string $roleId): bool { $account = $this->getDiscordAccount(); @@ -224,11 +219,23 @@ public function addDiscordRole(string $roleId): bool try { $api->addRoleToMember($roleId, $account->external_id); return true; - } catch (\Exception $ex) { + } catch (Exception $ex) { return false; } } + protected function getDiscordAccount() + { + return $this->accounts()->whereHas('provider', function ($query) { + $query->whereCode('discord'); + })->first(); + } + + public function accounts(): HasMany + { + return $this->hasMany(LinkedAccount::class); + } + public function removeDiscordRole(string $roleId): bool { $account = $this->getDiscordAccount(); @@ -242,7 +249,7 @@ public function removeDiscordRole(string $roleId): bool try { $api->removeRoleFromMember($roleId, $account->external_id); return true; - } catch (\Exception $ex) { + } catch (Exception $ex) { return false; } } @@ -282,4 +289,18 @@ public function allowedSeatGroup(SeatGroup $group): bool } return false; } + + protected function toStringName(): string + { + return $this->nickname; + } + + protected function email(): Attribute + { + return Attribute::make( + get: function (mixed $value, array $attributes) { + return $this->primaryEmail->email ?? null; + }, + ); + } } diff --git a/app/Observers/ClanMembershipObserver.php b/app/Observers/ClanMembershipObserver.php index 6c853f50..55bec053 100644 --- a/app/Observers/ClanMembershipObserver.php +++ b/app/Observers/ClanMembershipObserver.php @@ -19,22 +19,6 @@ public function saved(ClanMembership $clanMembership): void } } - /** - * Handle the ClanMembership "created" event. - */ - public function created(ClanMembership $clanMembership): void - { - // - } - - /** - * Handle the ClanMembership "updated" event. - */ - public function updated(ClanMembership $clanMembership): void - { - // - } - public function deleting(ClanMembership $clanMembership): void { $plans = SeatingPlan::whereHas('seats.ticket.user.clanMemberships', function ($query) use ($clanMembership) { @@ -44,20 +28,4 @@ public function deleting(ClanMembership $clanMembership): void $plan->delayedRevisionUpdate(); } } - - /** - * Handle the ClanMembership "restored" event. - */ - public function restored(ClanMembership $clanMembership): void - { - // - } - - /** - * Handle the ClanMembership "force deleted" event. - */ - public function forceDeleted(ClanMembership $clanMembership): void - { - // - } } diff --git a/app/Observers/ClanObserver.php b/app/Observers/ClanObserver.php index 463e2199..4ab129db 100644 --- a/app/Observers/ClanObserver.php +++ b/app/Observers/ClanObserver.php @@ -31,14 +31,6 @@ public function deleting(Clan $clan): void } } - /** - * Handle the Clan "created" event. - */ - public function created(Clan $clan): void - { - // - } - public function saving(Clan $clan): void { if (!$clan->invite_code) { @@ -46,36 +38,4 @@ public function saving(Clan $clan): void } $clan->code = makePermalink($clan->name); } - - /** - * Handle the Clan "updated" event. - */ - public function updated(Clan $clan): void - { - // - } - - /** - * Handle the Clan "deleted" event. - */ - public function deleted(Clan $clan): void - { - // - } - - /** - * Handle the Clan "restored" event. - */ - public function restored(Clan $clan): void - { - // - } - - /** - * Handle the Clan "force deleted" event. - */ - public function forceDeleted(Clan $clan): void - { - // - } } diff --git a/app/Observers/EmailAddressObserver.php b/app/Observers/EmailAddressObserver.php index 62254fbf..f9ef9e8a 100644 --- a/app/Observers/EmailAddressObserver.php +++ b/app/Observers/EmailAddressObserver.php @@ -11,41 +11,13 @@ class EmailAddressObserver */ public function created(EmailAddress $emailAddress): void { + $user = $emailAddress->user; + if ($emailAddress->user === null) { + return; + } if ($emailAddress->user->primaryEmail === null) { $emailAddress->user->primaryEmail()->associate($emailAddress); - $emailAddress->user->save(); + $user->save(); } } - - /** - * Handle the EmailAddress "updated" event. - */ - public function updated(EmailAddress $emailAddress): void - { - // - } - - /** - * Handle the EmailAddress "deleted" event. - */ - public function deleted(EmailAddress $emailAddress): void - { - // - } - - /** - * Handle the EmailAddress "restored" event. - */ - public function restored(EmailAddress $emailAddress): void - { - // - } - - /** - * Handle the EmailAddress "force deleted" event. - */ - public function forceDeleted(EmailAddress $emailAddress): void - { - // - } } diff --git a/app/Observers/EventObserver.php b/app/Observers/EventObserver.php index d4d6403d..60d0c6bd 100644 --- a/app/Observers/EventObserver.php +++ b/app/Observers/EventObserver.php @@ -23,44 +23,4 @@ public function saving(Event $event): void $event->code = makePermalink($event->name); } } - - /** - * Handle the Event "created" event. - */ - public function created(Event $event): void - { - // - } - - /** - * Handle the Event "updated" event. - */ - public function updated(Event $event): void - { - // - } - - /** - * Handle the Event "deleted" event. - */ - public function deleted(Event $event): void - { - // - } - - /** - * Handle the Event "restored" event. - */ - public function restored(Event $event): void - { - // - } - - /** - * Handle the Event "force deleted" event. - */ - public function forceDeleted(Event $event): void - { - // - } } diff --git a/app/Observers/SeatObserver.php b/app/Observers/SeatObserver.php index 20ab9473..a4b4a25c 100644 --- a/app/Observers/SeatObserver.php +++ b/app/Observers/SeatObserver.php @@ -33,21 +33,6 @@ public function saved(Seat $seat): void } } - /** - * Handle the Seat "created" event. - */ - public function created(Seat $seat): void - { - // - } - - /** - * Handle the Seat "updated" event. - */ - public function updated(Seat $seat): void - { - // - } /** * Handle the Seat "deleted" event. @@ -56,20 +41,4 @@ public function deleted(Seat $seat): void { $seat->plan->updateRevision(); } - - /** - * Handle the Seat "restored" event. - */ - public function restored(Seat $seat): void - { - // - } - - /** - * Handle the Seat "force deleted" event. - */ - public function forceDeleted(Seat $seat): void - { - // - } } diff --git a/app/Observers/SeatingPlanObserver.php b/app/Observers/SeatingPlanObserver.php index 909d99b5..39ed2451 100644 --- a/app/Observers/SeatingPlanObserver.php +++ b/app/Observers/SeatingPlanObserver.php @@ -13,7 +13,8 @@ public function saving(SeatingPlan $seatingPlan): void if (!$seatingPlan->code) { $seatingPlan->code = makePermalink($seatingPlan->name); } - if (!$seatingPlan->isDirty('revision')) { + + if ($seatingPlan->exists && $seatingPlan->isDirty('revision')) { $seatingPlan->revision++; } } @@ -24,44 +25,4 @@ public function saved(SeatingPlan $seatingPlan): void $seatingPlan->queueUpdate(); } } - - /** - * Handle the SeatingPlan "created" event. - */ - public function created(SeatingPlan $seatingPlan): void - { - // - } - - /** - * Handle the SeatingPlan "updated" event. - */ - public function updated(SeatingPlan $seatingPlan): void - { - // - } - - /** - * Handle the SeatingPlan "deleted" event. - */ - public function deleted(SeatingPlan $seatingPlan): void - { - // - } - - /** - * Handle the SeatingPlan "restored" event. - */ - public function restored(SeatingPlan $seatingPlan): void - { - // - } - - /** - * Handle the SeatingPlan "force deleted" event. - */ - public function forceDeleted(SeatingPlan $seatingPlan): void - { - // - } } diff --git a/app/Observers/SettingObserver.php b/app/Observers/SettingObserver.php index d75c9622..e12c2602 100644 --- a/app/Observers/SettingObserver.php +++ b/app/Observers/SettingObserver.php @@ -10,43 +10,4 @@ public function saved(Setting $setting): void { $setting->clearCache(); } - /** - * Handle the Setting "created" event. - */ - public function created(Setting $setting): void - { - // - } - - /** - * Handle the Setting "updated" event. - */ - public function updated(Setting $setting): void - { - // - } - - /** - * Handle the Setting "deleted" event. - */ - public function deleted(Setting $setting): void - { - // - } - - /** - * Handle the Setting "restored" event. - */ - public function restored(Setting $setting): void - { - // - } - - /** - * Handle the Setting "force deleted" event. - */ - public function forceDeleted(Setting $setting): void - { - // - } } diff --git a/app/Observers/TicketProviderObserver.php b/app/Observers/TicketProviderObserver.php index b3591331..c596b1d4 100644 --- a/app/Observers/TicketProviderObserver.php +++ b/app/Observers/TicketProviderObserver.php @@ -12,44 +12,4 @@ public function saving(TicketProvider $ticketProvider): void $ticketProvider->cache_prefix = time(); } } - - /** - * Handle the TicketProvider "created" event. - */ - public function created(TicketProvider $ticketProvider): void - { - // - } - - /** - * Handle the TicketProvider "updated" event. - */ - public function updated(TicketProvider $ticketProvider): void - { - // - } - - /** - * Handle the TicketProvider "deleted" event. - */ - public function deleted(TicketProvider $ticketProvider): void - { - // - } - - /** - * Handle the TicketProvider "restored" event. - */ - public function restored(TicketProvider $ticketProvider): void - { - // - } - - /** - * Handle the TicketProvider "force deleted" event. - */ - public function forceDeleted(TicketProvider $ticketProvider): void - { - // - } } diff --git a/app/Policies/EventPolicy.php b/app/Policies/EventPolicy.php index 4cf8174c..1618b014 100644 --- a/app/Policies/EventPolicy.php +++ b/app/Policies/EventPolicy.php @@ -4,7 +4,6 @@ use App\Models\Event; use App\Models\User; -use Illuminate\Auth\Access\Response; class EventPolicy { diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 9c3528f2..e46b3378 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,11 +2,7 @@ namespace App\Providers; -use App\Models\Setting; -use App\Models\SocialProvider; use App\Models\Theme; -use App\Services\DiscordApi; -use GuzzleHttp\Client; use Illuminate\Support\Facades\Blade; use Illuminate\Support\ServiceProvider; @@ -29,13 +25,13 @@ public function boot(): void }); view()->composer(['layouts.app', 'layouts.login'], function ($view) { - $currentTheme = Theme::whereActive(true)->first(); - $darkMode = false; + $currentTheme = Theme::whereActive(true)->first(); + $darkMode = false; if ($currentTheme) { $darkMode = $currentTheme->dark_mode; } - $view->with('currentTheme', $currentTheme); - $view->with('darkMode', $darkMode); + $view->with('currentTheme', $currentTheme); + $view->with('darkMode', $darkMode); }); } } diff --git a/app/Providers/OpenTelemetryProvider.php b/app/Providers/OpenTelemetryProvider.php deleted file mode 100644 index 8b0a78b7..00000000 --- a/app/Providers/OpenTelemetryProvider.php +++ /dev/null @@ -1,97 +0,0 @@ -initOpenTelemetry(); - } - - protected function initOpenTelemetry(): void - { - $resource = ResourceInfoFactory::emptyResource()->merge(ResourceInfo::create(Attributes::create([ - ResourceAttributes::SERVICE_NAMESPACE => config('open-telemetry.service.namespace'), - ResourceAttributes::SERVICE_NAME => config('open-telemetry.service.name'), - ResourceAttributes::SERVICE_VERSION => config('open-telemetry.service.version'), - ResourceAttributes::DEPLOYMENT_ENVIRONMENT_NAME => config('open-telemetry.environment'), - ResourceAttributes::HOST_NAME => getenv('HOSTNAME'), - ]))); - $tracesEndpoint = config('open-telemetry.endpoints.traces'); - $spanExporter = new SpanExporter( - (new OtlpHttpTransportFactory())->create($tracesEndpoint, ContentTypes::JSON) - ); - - $logsEndpoint = config('open-telemetry.endpoints.logs'); - $logExporter = new LogsExporter( - (new OtlpHttpTransportFactory())->create($logsEndpoint, ContentTypes::JSON) - ); - - $metricsEndpoint = config('open-telemetry.endpoints.metrics'); - $reader = new ExportingReader( - new MetricExporter( - (new OtlpHttpTransportFactory())->create($metricsEndpoint, ContentTypes::JSON) - ) - ); - - $meterProvider = MeterProvider::builder() - ->setResource($resource) - ->addReader($reader) - ->build(); - - $tracerProvider = TracerProvider::builder() - ->addSpanProcessor( - new SimpleSpanProcessor($spanExporter) - ) - ->setResource($resource) - ->setSampler(new ParentBased(new AlwaysOnSampler())) - ->build(); - - $loggerProvider = LoggerProvider::builder() - ->setResource($resource) - ->addLogRecordProcessor( - new SimpleLogRecordProcessor($logExporter) - ) - ->build(); - - Sdk::builder() - ->setTracerProvider($tracerProvider) - ->setMeterProvider($meterProvider) - ->setLoggerProvider($loggerProvider) - ->setPropagator(TraceContextPropagator::getInstance()) - ->setAutoShutdown(true) - ->buildAndRegisterGlobal(); - } -} diff --git a/app/Providers/TelescopeServiceProvider.php b/app/Providers/TelescopeServiceProvider.php index ca61d757..267afc53 100644 --- a/app/Providers/TelescopeServiceProvider.php +++ b/app/Providers/TelescopeServiceProvider.php @@ -25,7 +25,7 @@ public function register(): void } // Filter out the seating plan API - if ($entry->isRequest() && str_starts_with($entry->content['uri'], '/api/v1/')) { + if ($entry->isRequest() && isset($entry->content['uri']) && str_starts_with($entry->content['uri'], '/api/v1/')) { return false; } @@ -34,19 +34,17 @@ public function register(): void } return $entry->isReportableException() || - $entry->isFailedRequest() || - $entry->isFailedJob() || - $entry->isScheduledTask() || - $entry->hasMonitoredTag(); + $entry->isFailedRequest() || + $entry->isFailedJob() || + $entry->isScheduledTask() || + $entry->hasMonitoredTag(); }); Telescope::avatar(function (string $id, string $email) { - return User::find($id)->avatarUrl(); + return $this->resolveAvatar($id, $email); }); } - - /** * Prevent sensitive request details from being logged by Telescope. */ @@ -65,6 +63,15 @@ protected function hideSensitiveRequestDetails(): void ]); } + /** + * Resolve an avatar URL for Telescope given a user id and email. + */ + protected function resolveAvatar(string $id, string $email): string + { + $user = User::find($id); + return $user ? $user->avatarUrl() : 'https://www.gravatar.com/avatar/' . md5(strtolower(trim($email))); + } + /** * Register the Telescope gate. * diff --git a/app/Services/DiscordApi.php b/app/Services/DiscordApi.php index 16ea2c3b..7d4b0339 100644 --- a/app/Services/DiscordApi.php +++ b/app/Services/DiscordApi.php @@ -16,22 +16,6 @@ public function __construct(protected SocialProvider $provider, protected string { } - - protected function getClient(): Client - { - if (!$this->client) { - $config = [ - 'base_uri' => config('services.discord.endpoint', 'https://discord.com/api/'), - 'verify' => config('services.discord.verifytls', true), - 'headers' => [ - 'Authorization' => "Bot {$this->provider->getSetting('token')}", - ] - ]; - $this->client = new Client($config); - } - return $this->client; - } - public function getRoles(): array { if ($this->roles !== null) { @@ -54,6 +38,21 @@ public function getRoles(): array return $this->roles; } + protected function getClient(): Client + { + if (!$this->client) { + $config = [ + 'base_uri' => config('services.discord.endpoint', 'https://discord.com/api/'), + 'verify' => config('services.discord.verifytls', true), + 'headers' => [ + 'Authorization' => "Bot {$this->provider->getSetting('token')}", + ] + ]; + $this->client = new Client($config); + } + return $this->client; + } + public function getMemberRoles(): array { if ($this->members !== null) { diff --git a/app/Services/OpenTelemetry.php b/app/Services/OpenTelemetry.php deleted file mode 100644 index 1a516bd5..00000000 --- a/app/Services/OpenTelemetry.php +++ /dev/null @@ -1,96 +0,0 @@ -getTracer( - $serviceName ?? config('open-telemetry.service.name'), - $version ?? config('open-telemetry.service.version'), - 'https://opentelemetry.io/schemas/1.24.0' - ); - $parent = Span::getCurrent(); - if ($parent instanceof NonRecordingSpan) { - $builder = $tracer - ->spanBuilder($name) - ->setSpanKind(SpanKind::KIND_SERVER); - $context = null; - if ($parentTrace !== null) { - $context = self::getParentContext($parentTrace, $parentState); - $builder = $builder->setParent($context); - } - $span = $builder->startSpan(); - $scope = $span->activate(); - } else { - $scope = $parent->activate(); - $span = $tracer->spanBuilder($name)->startSpan(); - } - - return new SpanHelper($span, $scope); - } - - protected static function getParentContext(string $parentTrace, ?string $parentState = null): ?ContextInterface - { - $pieces = explode('-', $parentTrace); - if (count($pieces) < 4) { - return null; - } - - [$version, $traceId, $spanId, $traceFlags] = $pieces; - if ( - !TraceContextValidator::isValidTraceVersion($version) - || !SpanContextValidator::isValidTraceId($traceId) - || !SpanContextValidator::isValidSpanId($spanId) - || !TraceContextValidator::isValidTraceFlag($traceFlags) - ) { - return null; - } - - $convertedTraceFlags = hexdec($traceFlags); - $isSampled = ($convertedTraceFlags & TraceFlags::SAMPLED) === TraceFlags::SAMPLED; - - $traceState = null; - if ($parentState !== null) { - $traceState = new TraceState($parentState); - } - $spanContext = SpanContext::createFromRemoteParent( - $traceId, - $spanId, - $isSampled ? TraceFlags::SAMPLED : TraceFlags::DEFAULT, - $traceState, - ); - if (!$spanContext->isValid()) { - return null; - } - $context = Context::getCurrent(); - return $context->withContextValue(Span::wrap($spanContext)); - } - - public static function getMeter(?string $serviceName = null, ?string $serviceVersion = null): MeterInterface - { - return Globals::meterProvider()->getMeter( - $serviceName ?? config('open-telemetry.service.name'), - $serviceVersion ?? config('open-telemetry.service.version'), - 'https://opentelemetry.io/schemas/1.24.0' - ); - } -} diff --git a/app/Services/OpenTelemetry/Logger.php b/app/Services/OpenTelemetry/Logger.php deleted file mode 100644 index e4875c7f..00000000 --- a/app/Services/OpenTelemetry/Logger.php +++ /dev/null @@ -1,28 +0,0 @@ - $config - * @return \Monolog\Logger - */ - public function __invoke(array $config): \Monolog\Logger - { - $level = $config['level'] ?? 'debug'; - if (config('services.open_telemetry.enabled')) { - $handler = new Handler( - Globals::loggerProvider(), - $level, - ); - } else { - $handler = new NullHandler($level); - } - return new \Monolog\Logger($config['name'] ?? 'opentelemetry', [$handler]); - } -} diff --git a/app/Services/OpenTelemetry/SpanHelper.php b/app/Services/OpenTelemetry/SpanHelper.php deleted file mode 100644 index a974adbb..00000000 --- a/app/Services/OpenTelemetry/SpanHelper.php +++ /dev/null @@ -1,38 +0,0 @@ -span->end(); - if ($this->scope !== null) { - $this->scope->detach(); - } - } - - /** - * @param string $name - * @param array $args - * @return mixed - */ - public function __call(string $name, array $args): mixed - { - if (method_exists($this->span, $name)) { - $result = $this->span->$name(...$args); - if ($result instanceof SpanInterface) { - $this->span = $result; - } - return $result; - } - return null; - } -} diff --git a/app/Services/SocialProviders/AbstractSocialProvider.php b/app/Services/SocialProviders/AbstractSocialProvider.php index 7d377fe5..c72411cf 100644 --- a/app/Services/SocialProviders/AbstractSocialProvider.php +++ b/app/Services/SocialProviders/AbstractSocialProvider.php @@ -43,42 +43,32 @@ protected function resolveRedirectUrl(?string $redirectUrl = null): void } } - public function configMapping(): array - { - return [ - 'client_id' => (object)[ - 'name' => 'Client ID', - 'validation' => 'required|string', - ], - 'client_secret' => (object)[ - 'name' => 'Client Secret', - 'validation' => 'required|string', - 'encrypted' => true, - ], - ]; - } - public function install(): SocialProvider { $this->provider = SocialProvider::whereCode($this->code)->first(); - if (!$this->provider) { - $provider = new SocialProvider(); - $this->provider = $provider; - $provider->name = $this->name; - $provider->code = $this->code; - $provider->provider_class = get_called_class(); - $provider->supports_auth = $this->supportsAuth; - $provider->enabled = false; - $provider->auth_enabled = false; - $provider->can_be_renamed = $this->canBeRenamed; - - DB::transaction(function () use ($provider) { - $provider->save(); - $this->installSettings(); - }); + if ($this->provider) { + // Ensure settings exist/are up-to-date for existing provider (idempotent) + $this->installSettings(); + return $this->provider; + } + $provider = new SocialProvider(); + $this->provider = $provider; + $provider->name = $this->name; + $provider->code = $this->code; + $provider->provider_class = get_called_class(); + $provider->supports_auth = $this->supportsAuth; + $provider->enabled = false; + $provider->auth_enabled = false; + $provider->can_be_renamed = $this->canBeRenamed; + + DB::transaction(function () use ($provider) { $provider->save(); - } + $this->installSettings(); + }); + + $provider->save(); + return $this->provider; } @@ -104,6 +94,21 @@ public function installSettings(): void } } + public function configMapping(): array + { + return [ + 'client_id' => (object)[ + 'name' => 'Client ID', + 'validation' => 'required|string', + ], + 'client_secret' => (object)[ + 'name' => 'Client Secret', + 'validation' => 'required|string', + 'encrypted' => true, + ], + ]; + } + public function redirect(): RedirectResponse { return $this->getSocialiteProvider()->redirect(); @@ -191,4 +196,7 @@ public function user(?User $localUser = null) } return $localUser; } + + // Subclasses should implement provider-specific account updates + abstract protected function updateAccount(LinkedAccount $account, $remoteUser): void; } diff --git a/app/Services/SocialProviders/DiscordProvider.php b/app/Services/SocialProviders/DiscordProvider.php index 009e8a5a..0d8b585d 100644 --- a/app/Services/SocialProviders/DiscordProvider.php +++ b/app/Services/SocialProviders/DiscordProvider.php @@ -14,16 +14,6 @@ class DiscordProvider extends AbstractSocialProvider protected string $socialiteProviderCode = 'discord'; protected bool $supportsAuth = true; - protected function getSocialiteProvider() - { - return Socialite::buildProvider(Provider::class, [ - 'client_id' => $this->provider->getSetting('client_id'), - 'client_secret' => $this->provider->getSetting('client_secret'), - 'redirect' => $this->redirectUrl, - ]); - } - - public function configMapping(): array { return array_merge( @@ -38,12 +28,9 @@ public function configMapping(): array ); } - protected function updateAccount(LinkedAccount $account, $remoteUser): void + public function addBotToServer(): RedirectResponse { - $account->avatar_url = $remoteUser->getAvatar(); - $account->refresh_token = $remoteUser->refreshToken; - $account->access_token = $remoteUser->token; - $account->name = $remoteUser->getNickname(); + return $this->getBotProvider()->redirect(); } protected function getBotProvider() @@ -53,13 +40,25 @@ protected function getBotProvider() ]); } - public function addBotToServer(): RedirectResponse + protected function getSocialiteProvider() { - return $this->getBotProvider()->redirect(); + return Socialite::buildProvider(Provider::class, [ + 'client_id' => $this->provider->getSetting('client_id'), + 'client_secret' => $this->provider->getSetting('client_secret'), + 'redirect' => $this->redirectUrl, + ]); } public function bot() { return $this->getBotProvider()->user(); } + + protected function updateAccount(LinkedAccount $account, $remoteUser): void + { + $account->avatar_url = $remoteUser->getAvatar(); + $account->refresh_token = $remoteUser->refreshToken; + $account->access_token = $remoteUser->token; + $account->name = $remoteUser->getNickname(); + } } diff --git a/app/Services/SocialProviders/LaravelPassportProvider.php b/app/Services/SocialProviders/LaravelPassportProvider.php index df1921b7..99e9a291 100644 --- a/app/Services/SocialProviders/LaravelPassportProvider.php +++ b/app/Services/SocialProviders/LaravelPassportProvider.php @@ -24,18 +24,6 @@ public function __construct(?SocialProvider $provider = null, ?string $redirectU } } - protected function getSocialiteProvider() - { - $config = new Config( - $this->provider->getSetting('client_id'), - $this->provider->getSetting('client_secret'), - $this->redirectUrl, - ['host' => $this->provider->getSetting('host')] - ); - return Socialite::buildProvider(Provider::class, $config->get()) - ->setConfig($config)->with(['prompt' => 'none']); - } - public function configMapping(): array { return array_merge( @@ -49,6 +37,18 @@ public function configMapping(): array ); } + protected function getSocialiteProvider() + { + $config = new Config( + $this->provider->getSetting('client_id'), + $this->provider->getSetting('client_secret'), + $this->redirectUrl, + ['host' => $this->provider->getSetting('host')] + ); + return Socialite::buildProvider(Provider::class, $config->get()) + ->setConfig($config)->with(['prompt' => 'none']); + } + protected function updateAccount(LinkedAccount $account, $remoteUser): void { $account->avatar_url = $remoteUser->getAvatar(); diff --git a/app/Services/TicketProviders/AbstractTicketProvider.php b/app/Services/TicketProviders/AbstractTicketProvider.php index bbf25aaf..803dbddb 100644 --- a/app/Services/TicketProviders/AbstractTicketProvider.php +++ b/app/Services/TicketProviders/AbstractTicketProvider.php @@ -29,20 +29,6 @@ protected function setProvider(TicketProvider $provider): void $this->provider = $provider; } - public function configMapping(): array - { - return [ - 'apikey' => (object)[ - 'name' => 'API Key', - 'validation' => 'required|string', - ], - 'webhook_secret' => (object)[ - 'name' => 'Webhook Secret', - 'validation' => 'required|string', - ], - ]; - } - public function install(): TicketProvider { $this->provider = TicketProvider::whereCode($this->code)->first(); @@ -84,6 +70,20 @@ public function installSettings(): void } } + public function configMapping(): array + { + return [ + 'apikey' => (object)[ + 'name' => 'API Key', + 'validation' => 'required|string', + ], + 'webhook_secret' => (object)[ + 'name' => 'Webhook Secret', + 'validation' => 'required|string', + ], + ]; + } + public function processWebhook(Request $request): bool { return true; diff --git a/app/Services/TicketProviders/FakeProvider.php b/app/Services/TicketProviders/FakeProvider.php new file mode 100644 index 00000000..6a060a57 --- /dev/null +++ b/app/Services/TicketProviders/FakeProvider.php @@ -0,0 +1,58 @@ +provider = $provider; + } + + public function configMapping(): array + { + return []; + } + + public function install(): TicketProvider + { + // return existing provider or throw if not available; tests shouldn't call this + return $this->provider ?? throw new RuntimeException('No provider'); + } + + public function processWebhook(Request $request): bool + { + return true; + } + + public function syncTickets(string|EmailAddress $email): void + { + // noop for tests + } + + public function getEvents(): array + { + return []; + } + + public function getTicketTypes(string $eventExternalId): array + { + return []; + } + + public function syncAllTickets(?OutputStyle $output): void + { + if ($output instanceof OutputStyle) { + $output->writeln('FakeProvider: syncAllTickets called'); + } + } +} diff --git a/app/Services/TicketProviders/GenericTicketProvider.php b/app/Services/TicketProviders/GenericTicketProvider.php index 2ff8ca73..ae82b446 100644 --- a/app/Services/TicketProviders/GenericTicketProvider.php +++ b/app/Services/TicketProviders/GenericTicketProvider.php @@ -41,17 +41,6 @@ public function configMapping(): array ]; } - protected function getClient(): Client - { - if (!$this->client) { - $this->client = new Client([ - 'base_uri' => $this->provider->getSetting('endpoint'), - 'auth' => [$this->provider->getSetting('apikey'), ''] - ]); - } - return $this->client; - } - public function processWebhook(Request $request): bool { $payload = $request->input('payload'); @@ -86,25 +75,6 @@ protected function processTicket(object $data): ?Ticket return $ticket; } - protected function getEvent(string $externalId): ?Event - { - return Event::whereHas('mappings', function ($query) use ($externalId) { - $query->whereTicketProviderId($this->provider->id)->whereExternalId($externalId); - })->first(); - } - - protected function getType(string $externalId): ?TicketType - { - return TicketType::whereHas('mappings', function ($query) use ($externalId) { - $query->whereTicketProviderId($this->provider->id)->whereExternalId($externalId); - })->first(); - } - - protected function getQrCode(object $data): string - { - return ""; - } - protected function makeTicket(?User $user, object $data): ?Ticket { $event = $this->getEvent($data->event_id); @@ -140,24 +110,23 @@ protected function makeTicket(?User $user, object $data): ?Ticket return $ticket; } - protected function getTickets(?string $address = null): array + protected function getEvent(string $externalId): ?Event { - $query = []; - if ($address) { - $query['email'] = $address; - } - do { - $tickets = []; - $response = $this->getClient()->get('tickets', [ - 'query' => $query, - ]); - $data = json_decode($response->getBody()); - foreach ($data->tickets as $ticket) { - $query['after'] = $ticket->id; - $tickets[$ticket->id] = $ticket; - } - } while ($data->hasMore); - return $tickets; + return Event::whereHas('mappings', function ($query) use ($externalId) { + $query->whereTicketProviderId($this->provider->id)->whereExternalId($externalId); + })->first(); + } + + protected function getType(string $externalId): ?TicketType + { + return TicketType::whereHas('mappings', function ($query) use ($externalId) { + $query->whereTicketProviderId($this->provider->id)->whereExternalId($externalId); + })->first(); + } + + protected function getQrCode(object $data): string + { + return ""; } public function syncTickets(string|EmailAddress $email): void @@ -217,6 +186,37 @@ public function syncTickets(string|EmailAddress $email): void } } + protected function getTickets(?string $address = null): array + { + $query = []; + if ($address) { + $query['email'] = $address; + } + do { + $tickets = []; + $response = $this->getClient()->get('tickets', [ + 'query' => $query, + ]); + $data = json_decode($response->getBody()); + foreach ($data->tickets as $ticket) { + $query['after'] = $ticket->id; + $tickets[$ticket->id] = $ticket; + } + } while ($data->hasMore); + return $tickets; + } + + protected function getClient(): Client + { + if (!$this->client) { + $this->client = new Client([ + 'base_uri' => $this->provider->getSetting('endpoint'), + 'auth' => [$this->provider->getSetting('apikey'), ''] + ]); + } + return $this->client; + } + public function getEvents(): array { $key = "ticketproviders.{$this->provider->id}.{$this->provider->cache_prefix}.events"; @@ -257,7 +257,7 @@ public function getTicketTypes(string $eventExternalId): array $response = $this->getClient()->get( "tickettypes", [ - 'query' => $query, + 'query' => $query, ] ); $data = json_decode($response->getBody()); diff --git a/app/Services/TicketProviders/TicketTailorProvider.php b/app/Services/TicketProviders/TicketTailorProvider.php index 9327c8ac..a7d20796 100644 --- a/app/Services/TicketProviders/TicketTailorProvider.php +++ b/app/Services/TicketProviders/TicketTailorProvider.php @@ -6,6 +6,7 @@ use App\Models\EmailAddress; use App\Models\Event; use App\Models\Ticket; +use App\Models\TicketProvider; use App\Models\TicketType; use App\Models\User; use App\Services\TicketProviders\Traits\GenericSyncAllTrait; @@ -27,6 +28,14 @@ class TicketTailorProvider extends AbstractTicketProvider protected string $name = 'Ticket Tailor'; protected string $code = 'tickettailor'; + /** + * Public getter for the provider property (for testing and cache key access) + */ + public function getProvider(): ?TicketProvider + { + return $this->provider; + } + public function configMapping(): array { return [ @@ -161,38 +170,6 @@ protected function getQrCode(object $data): string return "https://api.qrserver.com/v1/create-qr-code/?size=200x200&data={$data->barcode}"; } - protected function getClient(): Client - { - if (!$this->client) { - $this->client = new Client([ - 'base_uri' => config('services.tickettailor.endpoint'), - 'verify' => config('services.tickettailor.verifytls'), - 'auth' => [$this->provider->getSetting('apikey'), ''] - ]); - } - return $this->client; - } - - protected function getTickets(?string $address = null): array - { - $query = []; - if ($address) { - $query['email'] = $address; - } - $tickets = []; - do { - $response = $this->getClient()->get('/v1/issued_tickets', [ - 'query' => $query, - ]); - $data = json_decode($response->getBody()); - foreach ($data->data as $ticket) { - $query['starting_after'] = $ticket->id; - $tickets[$ticket->id] = $ticket; - } - } while ($data->links->next); - return $tickets; - } - public function syncTickets(string|EmailAddress $email): void { $user = null; @@ -251,6 +228,38 @@ public function syncTickets(string|EmailAddress $email): void } } + protected function getTickets(?string $address = null): array + { + $query = []; + if ($address) { + $query['email'] = $address; + } + $tickets = []; + do { + $response = $this->getClient()->get('/v1/issued_tickets', [ + 'query' => $query, + ]); + $data = json_decode($response->getBody()); + foreach ($data->data as $ticket) { + $query['starting_after'] = $ticket->id; + $tickets[$ticket->id] = $ticket; + } + } while ($data->links->next); + return $tickets; + } + + protected function getClient(): Client + { + if (!$this->client) { + $this->client = new Client([ + 'base_uri' => config('services.tickettailor.endpoint'), + 'verify' => config('services.tickettailor.verifytls'), + 'auth' => [$this->provider->getSetting('apikey'), ''] + ]); + } + return $this->client; + } + public function getEvents(): array { $key = "ticketproviders.{$this->provider->id}.{$this->provider->cache_prefix}.events"; diff --git a/app/Services/TicketProviders/WooCommerceProvider.php b/app/Services/TicketProviders/WooCommerceProvider.php index b5fd4d67..7b86b696 100644 --- a/app/Services/TicketProviders/WooCommerceProvider.php +++ b/app/Services/TicketProviders/WooCommerceProvider.php @@ -4,20 +4,16 @@ use App\Exceptions\TicketProviderWebhookException; use App\Models\EmailAddress; -use App\Models\Event; use App\Models\Ticket; +use App\Models\TicketProvider; use App\Models\TicketType; use App\Models\User; use App\Services\TicketProviders\Traits\GenericSyncAllTrait; use Carbon\Carbon; use GuzzleHttp\Client; -use GuzzleHttp\Exception\ClientException; -use Illuminate\Console\OutputStyle; use Illuminate\Http\Request; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Log; -use PharIo\Manifest\Email; -use Ramsey\Uuid\Uuid; class WooCommerceProvider extends AbstractTicketProvider { @@ -27,10 +23,17 @@ class WooCommerceProvider extends AbstractTicketProvider protected const EVENTS_CACHE_TTL = 86400; protected ?Client $client = null; - protected string $name = 'Woo Commerce'; protected string $code = 'woocommerce'; + /** + * Public getter for the provider property (for testing and cache key access) + */ + public function getProvider(): ?TicketProvider + { + return $this->provider; + } + public function configMapping(): array { return [ @@ -92,6 +95,77 @@ protected function verifyWebhook(Request $request): bool return true; } + protected function parseOrder(object $order): array + { + $tickets = []; + foreach ($order->line_items as $item) { + for ($i = 1; $i <= $item->quantity; $i++) { + $externalId = "{$order->id}-{$item->id}-{$i}"; + $status = 'voided'; + if (in_array($order->status, ['processing', 'completed'])) { + $status = 'valid'; + } + $tickets[$externalId] = (object)[ + 'id' => $externalId, + 'ticket_type_id' => $item->product_id, + 'order' => $order, + 'item' => $item, + 'status' => $status, + 'email' => $order->billing->email, + ]; + } + } + return $tickets; + } + + protected function processTickets(array $ticketData, string $address, ?User $user = null): void + { + $tickets = []; + $valid = []; + $voided = []; + + foreach ($ticketData as $ticket) { + $tickets[] = $ticket->id; + if (in_array($ticket->order->status, ['processing', 'completed'])) { + $valid[] = $ticket->id; + } else { + $voided[] = $ticket->id; + } + } + + // Remove voided - fetch all and delete them in chunks so we trigger delete events + if ($voided) { + Ticket::whereTicketProviderId($this->provider->id)->whereIn('external_id', $voided)->chunk(100, function ($chunk) { + foreach ($chunk as $ticket) { + Log::info("{$this->provider} {$ticket} Removed. Status is Voided"); + $ticket->delete(); + } + }); + } + + // Add any missing valid tickets + $tickets = Ticket::whereTicketProviderId($this->provider->id)->whereIn('external_id', $valid)->get(); + $found = []; + foreach ($tickets as $ticket) { + $found[] = $ticket->external_id; + // Match up with our user if we have one + if ($user && !$ticket->user) { + $ticket->user()->associate($user); + $ticket->save(); + Log::info("{$this->provider} {$ticket} has been allocated to {$user}"); + } + } + $missing = array_diff($valid, $found); + + foreach ($missing as $ticketId) { + $data = $ticketData[$ticketId]; + $ticket = $this->makeTicket($user, $data); + if ($ticket) { + Log::info("{$this->provider} {$ticket} has been added for {$address}"); + } + } + } + protected function makeTicket(?User $user, object $data): ?Ticket { $type = $this->getType($data->ticket_type_id); @@ -135,18 +209,6 @@ protected function getQrCode(object $data): string return "https://api.qrserver.com/v1/create-qr-code/?size=200x200&data={$data->id}"; } - protected function getClient(): Client - { - if (!$this->client) { - $this->client = new Client([ - 'base_uri' => $this->provider->getSetting('endpoint'), - 'verify' => config('services.woocommerce.verifytls', true), - 'auth' => [$this->provider->getSetting('apikey'), $this->provider->getSetting('apisecret')], - ]); - } - return $this->client; - } - public function syncTickets(string|EmailAddress $email): void { $user = null; @@ -161,54 +223,6 @@ public function syncTickets(string|EmailAddress $email): void $this->processTickets($ticketData, $address, $user); } - protected function processTickets(array $ticketData, string $address, ?User $user = null): void - { - $tickets = []; - $valid = []; - $voided = []; - - foreach ($ticketData as $ticket) { - $tickets[] = $ticket->id; - if (in_array($ticket->order->status, ['processing', 'completed'])) { - $valid[] = $ticket->id; - } else { - $voided[] = $ticket->id; - } - } - - // Remove voided - fetch all and delete them in chunks so we trigger delete events - if ($voided) { - Ticket::whereTicketProviderId($this->provider->id)->whereIn('external_id', $voided)->chunk(100, function ($chunk) { - foreach ($chunk as $ticket) { - Log::info("{$this->provider} {$ticket} Removed. Status is Voided"); - $ticket->delete(); - } - }); - } - - // Add any missing valid tickets - $tickets = Ticket::whereTicketProviderId($this->provider->id)->whereIn('external_id', $valid)->get(); - $found = []; - foreach ($tickets as $ticket) { - $found[] = $ticket->external_id; - // Match up with our user if we have one - if ($user && !$ticket->user) { - $ticket->user()->associate($user); - $ticket->save(); - Log::info("{$this->provider} {$ticket} has been allocated to {$user}"); - } - } - $missing = array_diff($valid, $found); - - foreach ($missing as $ticketId) { - $data = $ticketData[$ticketId]; - $ticket = $this->makeTicket($user, $data); - if ($ticket) { - Log::info("{$this->provider} {$ticket} has been added for {$address}"); - } - } - } - protected function getTickets(?string $address = null): array { $orders = []; @@ -242,27 +256,16 @@ protected function getTickets(?string $address = null): array return $tickets; } - protected function parseOrder(object $order): array + protected function getClient(): Client { - $tickets = []; - foreach ($order->line_items as $item) { - for ($i = 1; $i <= $item->quantity; $i++) { - $externalId = "{$order->id}-{$item->id}-{$i}"; - $status = 'voided'; - if (in_array($order->status, ['processing', 'completed'])) { - $status = 'valid'; - } - $tickets[$externalId] = (object)[ - 'id' => $externalId, - 'ticket_type_id' => $item->product_id, - 'order' => $order, - 'item' => $item, - 'status' => $status, - 'email' => $order->billing->email, - ]; - } + if (!$this->client) { + $this->client = new Client([ + 'base_uri' => $this->provider->getSetting('endpoint'), + 'verify' => config('services.woocommerce.verifytls', true), + 'auth' => [$this->provider->getSetting('apikey'), $this->provider->getSetting('apisecret')], + ]); } - return $tickets; + return $this->client; } public function getEvents(): array diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 00000000..6ad76c75 --- /dev/null +++ b/codecov.yml @@ -0,0 +1,10 @@ +coverage: + status: + project: + default: + target: 100% + threshold: 0% + base: auto + if_ci_failed: error + informational: false + only_pulls: false diff --git a/composer.json b/composer.json index 9aed4a41..efa46ce0 100644 --- a/composer.json +++ b/composer.json @@ -17,10 +17,12 @@ "laravel/socialite": "^5.20", "laravel/telescope": "^5.7", "laravel/tinker": "^2.10", + "open-telemetry/exporter-otlp": "^1.3", + "open-telemetry/gen-otlp-protobuf": "^1.5", + "open-telemetry/opentelemetry-auto-laravel": "^1.2", + "open-telemetry/sdk": "^1.6", + "open-telemetry/transport-grpc": "^1.1", "ramsey/uuid": "^4.7", - "open-telemetry/exporter-otlp": "^1.2", - "open-telemetry/opentelemetry-logger-monolog": "^1.1", - "open-telemetry/sdk": "^1.3", "socialiteproviders/discord": "^4.2", "socialiteproviders/laravelpassport": "^4.3", "socialiteproviders/steam": "^4.3", diff --git a/composer.lock b/composer.lock index 216f58e7..2d1f86ed 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": "e840192e9267e47de6d46b6e30a1302d", + "content-hash": "63dcca889b88cf34178c0930a6533636", "packages": [ { "name": "aws/aws-crt-php", @@ -62,16 +62,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.343.7", + "version": "3.356.12", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "da15c4ac4d19a10212dd10c6fe37dc293c2ce798" + "reference": "0068088fed44e2bed3a2e82f2c7a0bb9e356b3c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/da15c4ac4d19a10212dd10c6fe37dc293c2ce798", - "reference": "da15c4ac4d19a10212dd10c6fe37dc293c2ce798", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/0068088fed44e2bed3a2e82f2c7a0bb9e356b3c3", + "reference": "0068088fed44e2bed3a2e82f2c7a0bb9e356b3c3", "shasum": "" }, "require": { @@ -153,31 +153,31 @@ "support": { "forum": "https://github.com/aws/aws-sdk-php/discussions", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.343.7" + "source": "https://github.com/aws/aws-sdk-php/tree/3.356.12" }, - "time": "2025-05-08T18:07:19+00:00" + "time": "2025-09-05T18:10:41+00:00" }, { "name": "brick/math", - "version": "0.12.3", + "version": "0.14.0", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba" + "reference": "113a8ee2656b882d4c3164fa31aa6e12cbb7aaa2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/866551da34e9a618e64a819ee1e01c20d8a588ba", - "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba", + "url": "https://api.github.com/repos/brick/math/zipball/113a8ee2656b882d4c3164fa31aa6e12cbb7aaa2", + "reference": "113a8ee2656b882d4c3164fa31aa6e12cbb7aaa2", "shasum": "" }, "require": { - "php": "^8.1" + "php": "^8.2" }, "require-dev": { "php-coveralls/php-coveralls": "^2.2", - "phpunit/phpunit": "^10.1", - "vimeo/psalm": "6.8.8" + "phpstan/phpstan": "2.1.22", + "phpunit/phpunit": "^11.5" }, "type": "library", "autoload": { @@ -207,7 +207,7 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.12.3" + "source": "https://github.com/brick/math/tree/0.14.0" }, "funding": [ { @@ -215,7 +215,7 @@ "type": "github" } ], - "time": "2025-02-28T13:11:00+00:00" + "time": "2025-08-29T12:40:03+00:00" }, { "name": "carbonphp/carbon-doctrine-types", @@ -418,16 +418,16 @@ }, { "name": "composer/semver", - "version": "3.4.3", + "version": "3.4.4", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", "shasum": "" }, "require": { @@ -479,7 +479,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.3" + "source": "https://github.com/composer/semver/tree/3.4.4" }, "funding": [ { @@ -489,13 +489,9 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2024-09-19T14:15:21+00:00" + "time": "2025-08-20T19:15:30+00:00" }, { "name": "dflydev/dot-access-data", @@ -574,33 +570,32 @@ }, { "name": "doctrine/inflector", - "version": "2.0.10", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", - "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^11.0", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-strict-rules": "^1.3", - "phpunit/phpunit": "^8.5 || ^9.5", - "vimeo/psalm": "^4.25 || ^5.4" + "doctrine/coding-standard": "^12.0 || ^13.0", + "phpstan/phpstan": "^1.12 || ^2.0", + "phpstan/phpstan-phpunit": "^1.4 || ^2.0", + "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", + "phpunit/phpunit": "^8.5 || ^12.2" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + "Doctrine\\Inflector\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -645,7 +640,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.10" + "source": "https://github.com/doctrine/inflector/tree/2.1.0" }, "funding": [ { @@ -661,7 +656,7 @@ "type": "tidelift" } ], - "time": "2024-02-18T20:23:39+00:00" + "time": "2025-08-10T19:31:58+00:00" }, { "name": "doctrine/lexer", @@ -1110,23 +1105,26 @@ }, { "name": "google/protobuf", - "version": "v4.30.2", + "version": "v4.32.0", "source": { "type": "git", "url": "https://github.com/protocolbuffers/protobuf-php.git", - "reference": "a4c4d8565b40b9f76debc9dfeb221412eacb8ced" + "reference": "9a9a92ecbe9c671dc1863f6d4a91ea3ea12c8646" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/a4c4d8565b40b9f76debc9dfeb221412eacb8ced", - "reference": "a4c4d8565b40b9f76debc9dfeb221412eacb8ced", + "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/9a9a92ecbe9c671dc1863f6d4a91ea3ea12c8646", + "reference": "9a9a92ecbe9c671dc1863f6d4a91ea3ea12c8646", "shasum": "" }, "require": { - "php": ">=7.0.0" + "php": ">=8.1.0" + }, + "provide": { + "ext-protobuf": "*" }, "require-dev": { - "phpunit/phpunit": ">=5.0.0" + "phpunit/phpunit": ">=5.0.0 <8.5.27" }, "suggest": { "ext-bcmath": "Need to support JSON deserialization" @@ -1148,9 +1146,9 @@ "proto" ], "support": { - "source": "https://github.com/protocolbuffers/protobuf-php/tree/v4.30.2" + "source": "https://github.com/protocolbuffers/protobuf-php/tree/v4.32.0" }, - "time": "2025-03-26T18:01:50+00:00" + "time": "2025-08-14T20:00:33+00:00" }, { "name": "graham-campbell/result-type", @@ -1214,24 +1212,68 @@ ], "time": "2024-07-20T21:45:45+00:00" }, + { + "name": "grpc/grpc", + "version": "1.74.0", + "source": { + "type": "git", + "url": "https://github.com/grpc/grpc-php.git", + "reference": "32bf4dba256d60d395582fb6e4e8d3936bcdb713" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/grpc/grpc-php/zipball/32bf4dba256d60d395582fb6e4e8d3936bcdb713", + "reference": "32bf4dba256d60d395582fb6e4e8d3936bcdb713", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "google/auth": "^v1.3.0" + }, + "suggest": { + "ext-protobuf": "For better performance, install the protobuf C extension.", + "google/protobuf": "To get started using grpc quickly, install the native protobuf library." + }, + "type": "library", + "autoload": { + "psr-4": { + "Grpc\\": "src/lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "gRPC library for PHP", + "homepage": "https://grpc.io", + "keywords": [ + "rpc" + ], + "support": { + "source": "https://github.com/grpc/grpc-php/tree/v1.74.0" + }, + "time": "2025-07-24T20:02:16+00:00" + }, { "name": "guzzlehttp/guzzle", - "version": "7.9.3", + "version": "7.10.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77" + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", - "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0.3", - "guzzlehttp/psr7": "^2.7.0", + "guzzlehttp/promises": "^2.3", + "guzzlehttp/psr7": "^2.8", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -1322,7 +1364,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.9.3" + "source": "https://github.com/guzzle/guzzle/tree/7.10.0" }, "funding": [ { @@ -1338,20 +1380,20 @@ "type": "tidelift" } ], - "time": "2025-03-27T13:37:11+00:00" + "time": "2025-08-23T22:36:01+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.2.0", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c" + "reference": "481557b130ef3790cf82b713667b43030dc9c957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/7c69f28996b0a6920945dd20b3857e499d9ca96c", - "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c", + "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", + "reference": "481557b130ef3790cf82b713667b43030dc9c957", "shasum": "" }, "require": { @@ -1359,7 +1401,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.39 || ^9.6.20" + "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "type": "library", "extra": { @@ -1405,7 +1447,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.2.0" + "source": "https://github.com/guzzle/promises/tree/2.3.0" }, "funding": [ { @@ -1421,20 +1463,20 @@ "type": "tidelift" } ], - "time": "2025-03-27T13:27:01+00:00" + "time": "2025-08-22T14:34:08+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.7.1", + "version": "2.8.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16" + "reference": "21dc724a0583619cd1652f673303492272778051" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/c2270caaabe631b3b44c85f99e5a04bbb8060d16", - "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", + "reference": "21dc724a0583619cd1652f673303492272778051", "shasum": "" }, "require": { @@ -1450,7 +1492,7 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "0.9.0", - "phpunit/phpunit": "^8.5.39 || ^9.6.20" + "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -1521,7 +1563,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.7.1" + "source": "https://github.com/guzzle/psr7/tree/2.8.0" }, "funding": [ { @@ -1537,20 +1579,20 @@ "type": "tidelift" } ], - "time": "2025-03-27T12:30:47+00:00" + "time": "2025-08-23T21:21:41+00:00" }, { "name": "guzzlehttp/uri-template", - "version": "v1.0.4", + "version": "v1.0.5", "source": { "type": "git", "url": "https://github.com/guzzle/uri-template.git", - "reference": "30e286560c137526eccd4ce21b2de477ab0676d2" + "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/uri-template/zipball/30e286560c137526eccd4ce21b2de477ab0676d2", - "reference": "30e286560c137526eccd4ce21b2de477ab0676d2", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/4f4bbd4e7172148801e76e3decc1e559bdee34e1", + "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1", "shasum": "" }, "require": { @@ -1559,7 +1601,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "phpunit/phpunit": "^8.5.44 || ^9.6.25", "uri-template/tests": "1.0.0" }, "type": "library", @@ -1607,7 +1649,7 @@ ], "support": { "issues": "https://github.com/guzzle/uri-template/issues", - "source": "https://github.com/guzzle/uri-template/tree/v1.0.4" + "source": "https://github.com/guzzle/uri-template/tree/v1.0.5" }, "funding": [ { @@ -1623,7 +1665,7 @@ "type": "tidelift" } ], - "time": "2025-02-03T10:55:03+00:00" + "time": "2025-08-22T14:27:06+00:00" }, { "name": "laminas/laminas-diactoros", @@ -1715,20 +1757,20 @@ }, { "name": "laravel/framework", - "version": "v12.13.0", + "version": "v12.28.1", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "52b588bcd8efc6d01bc1493d2d67848f8065f269" + "reference": "868c1f2d3dba4df6d21e3a8d818479f094cfd942" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/52b588bcd8efc6d01bc1493d2d67848f8065f269", - "reference": "52b588bcd8efc6d01bc1493d2d67848f8065f269", + "url": "https://api.github.com/repos/laravel/framework/zipball/868c1f2d3dba4df6d21e3a8d818479f094cfd942", + "reference": "868c1f2d3dba4df6d21e3a8d818479f094cfd942", "shasum": "" }, "require": { - "brick/math": "^0.11|^0.12", + "brick/math": "^0.11|^0.12|^0.13|^0.14", "composer-runtime-api": "^2.2", "doctrine/inflector": "^2.0.5", "dragonmantank/cron-expression": "^3.4", @@ -1764,7 +1806,9 @@ "symfony/http-kernel": "^7.2.0", "symfony/mailer": "^7.2.0", "symfony/mime": "^7.2.0", - "symfony/polyfill-php83": "^1.31", + "symfony/polyfill-php83": "^1.33", + "symfony/polyfill-php84": "^1.33", + "symfony/polyfill-php85": "^1.33", "symfony/process": "^7.2.0", "symfony/routing": "^7.2.0", "symfony/uid": "^7.2.0", @@ -1800,6 +1844,7 @@ "illuminate/filesystem": "self.version", "illuminate/hashing": "self.version", "illuminate/http": "self.version", + "illuminate/json-schema": "self.version", "illuminate/log": "self.version", "illuminate/macroable": "self.version", "illuminate/mail": "self.version", @@ -1832,7 +1877,8 @@ "league/flysystem-read-only": "^3.25.1", "league/flysystem-sftp-v3": "^3.25.1", "mockery/mockery": "^1.6.10", - "orchestra/testbench-core": "^10.0.0", + "opis/json-schema": "^2.4.1", + "orchestra/testbench-core": "^10.6.5", "pda/pheanstalk": "^5.0.6|^7.0.0", "php-http/discovery": "^1.15", "phpstan/phpstan": "^2.0", @@ -1926,20 +1972,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-05-07T17:29:01+00:00" + "time": "2025-09-04T14:58:12+00:00" }, { "name": "laravel/horizon", - "version": "v5.31.2", + "version": "v5.33.5", "source": { "type": "git", "url": "https://github.com/laravel/horizon.git", - "reference": "e6068c65be6c02a01e34531abf3143fab91f0de0" + "reference": "ef1c74b8134432eddabbd512e6e61a2e84a13d7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/horizon/zipball/e6068c65be6c02a01e34531abf3143fab91f0de0", - "reference": "e6068c65be6c02a01e34531abf3143fab91f0de0", + "url": "https://api.github.com/repos/laravel/horizon/zipball/ef1c74b8134432eddabbd512e6e61a2e84a13d7a", + "reference": "ef1c74b8134432eddabbd512e6e61a2e84a13d7a", "shasum": "" }, "require": { @@ -1960,13 +2006,13 @@ "require-dev": { "mockery/mockery": "^1.0", "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^9.0|^10.4|^11.5", - "predis/predis": "^1.1|^2.0" + "phpstan/phpstan": "^1.10|^2.0", + "phpunit/phpunit": "^9.0|^10.4|^11.5|^12.0", + "predis/predis": "^1.1|^2.0|^3.0" }, "suggest": { "ext-redis": "Required to use the Redis PHP driver.", - "predis/predis": "Required when not using the Redis PHP driver (^1.1|^2.0)." + "predis/predis": "Required when not using the Redis PHP driver (^1.1|^2.0|^3.0)." }, "type": "library", "extra": { @@ -1979,7 +2025,7 @@ ] }, "branch-alias": { - "dev-master": "5.x-dev" + "dev-master": "6.x-dev" } }, "autoload": { @@ -2004,22 +2050,22 @@ ], "support": { "issues": "https://github.com/laravel/horizon/issues", - "source": "https://github.com/laravel/horizon/tree/v5.31.2" + "source": "https://github.com/laravel/horizon/tree/v5.33.5" }, - "time": "2025-04-18T12:57:39+00:00" + "time": "2025-08-31T23:36:14+00:00" }, { "name": "laravel/octane", - "version": "v2.9.1", + "version": "v2.12.1", "source": { "type": "git", "url": "https://github.com/laravel/octane.git", - "reference": "445002b2551c837d60cda4324259063c356dfb56" + "reference": "4ca38b90d76f31b8c1e27873316c2db34450151c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/octane/zipball/445002b2551c837d60cda4324259063c356dfb56", - "reference": "445002b2551c837d60cda4324259063c356dfb56", + "url": "https://api.github.com/repos/laravel/octane/zipball/4ca38b90d76f31b8c1e27873316c2db34450151c", + "reference": "4ca38b90d76f31b8c1e27873316c2db34450151c", "shasum": "" }, "require": { @@ -2096,20 +2142,20 @@ "issues": "https://github.com/laravel/octane/issues", "source": "https://github.com/laravel/octane" }, - "time": "2025-04-13T21:10:35+00:00" + "time": "2025-07-25T15:03:05+00:00" }, { "name": "laravel/prompts", - "version": "v0.3.5", + "version": "v0.3.6", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "57b8f7efe40333cdb925700891c7d7465325d3b1" + "reference": "86a8b692e8661d0fb308cec64f3d176821323077" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/57b8f7efe40333cdb925700891c7d7465325d3b1", - "reference": "57b8f7efe40333cdb925700891c7d7465325d3b1", + "url": "https://api.github.com/repos/laravel/prompts/zipball/86a8b692e8661d0fb308cec64f3d176821323077", + "reference": "86a8b692e8661d0fb308cec64f3d176821323077", "shasum": "" }, "require": { @@ -2153,22 +2199,22 @@ "description": "Add beautiful and user-friendly forms to your command-line applications.", "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.3.5" + "source": "https://github.com/laravel/prompts/tree/v0.3.6" }, - "time": "2025-02-11T13:34:40+00:00" + "time": "2025-07-07T14:17:42+00:00" }, { "name": "laravel/pulse", - "version": "v1.4.1", + "version": "v1.4.3", "source": { "type": "git", "url": "https://github.com/laravel/pulse.git", - "reference": "b3cf86e88fa78ea8e6aeb86a7d9ea25ba2c1d31f" + "reference": "8c57f30aa6e094c138cd191314fe060d60773c14" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pulse/zipball/b3cf86e88fa78ea8e6aeb86a7d9ea25ba2c1d31f", - "reference": "b3cf86e88fa78ea8e6aeb86a7d9ea25ba2c1d31f", + "url": "https://api.github.com/repos/laravel/pulse/zipball/8c57f30aa6e094c138cd191314fe060d60773c14", + "reference": "8c57f30aa6e094c138cd191314fe060d60773c14", "shasum": "" }, "require": { @@ -2187,7 +2233,7 @@ "illuminate/routing": "^10.48.4|^11.0.8|^12.0", "illuminate/support": "^10.48.4|^11.0.8|^12.0", "illuminate/view": "^10.48.4|^11.0.8|^12.0", - "livewire/livewire": "^3.4.9", + "livewire/livewire": "^3.6.4", "nesbot/carbon": "^2.67|^3.0", "php": "^8.1", "symfony/console": "^6.0|^7.0" @@ -2242,20 +2288,20 @@ "issues": "https://github.com/laravel/pulse/issues", "source": "https://github.com/laravel/pulse" }, - "time": "2025-03-30T16:25:37+00:00" + "time": "2025-07-18T15:54:11+00:00" }, { "name": "laravel/reverb", - "version": "v1.5.0", + "version": "v1.5.1", "source": { "type": "git", "url": "https://github.com/laravel/reverb.git", - "reference": "bf84766ad35d9174fb508147f956e8bcf2e46e91" + "reference": "c82751070c9a5397095d91ff743aefb0549917c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/reverb/zipball/bf84766ad35d9174fb508147f956e8bcf2e46e91", - "reference": "bf84766ad35d9174fb508147f956e8bcf2e46e91", + "url": "https://api.github.com/repos/laravel/reverb/zipball/c82751070c9a5397095d91ff743aefb0549917c3", + "reference": "c82751070c9a5397095d91ff743aefb0549917c3", "shasum": "" }, "require": { @@ -2322,22 +2368,22 @@ ], "support": { "issues": "https://github.com/laravel/reverb/issues", - "source": "https://github.com/laravel/reverb/tree/v1.5.0" + "source": "https://github.com/laravel/reverb/tree/v1.5.1" }, - "time": "2025-03-31T14:06:47+00:00" + "time": "2025-06-16T13:48:47+00:00" }, { "name": "laravel/sanctum", - "version": "v4.1.1", + "version": "v4.2.0", "source": { "type": "git", "url": "https://github.com/laravel/sanctum.git", - "reference": "a360a6a1fd2400ead4eb9b6a9c1bb272939194f5" + "reference": "fd6df4f79f48a72992e8d29a9c0ee25422a0d677" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sanctum/zipball/a360a6a1fd2400ead4eb9b6a9c1bb272939194f5", - "reference": "a360a6a1fd2400ead4eb9b6a9c1bb272939194f5", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/fd6df4f79f48a72992e8d29a9c0ee25422a0d677", + "reference": "fd6df4f79f48a72992e8d29a9c0ee25422a0d677", "shasum": "" }, "require": { @@ -2388,7 +2434,7 @@ "issues": "https://github.com/laravel/sanctum/issues", "source": "https://github.com/laravel/sanctum" }, - "time": "2025-04-23T13:03:38+00:00" + "time": "2025-07-09T19:45:24+00:00" }, { "name": "laravel/serializable-closure", @@ -2453,16 +2499,16 @@ }, { "name": "laravel/socialite", - "version": "v5.20.0", + "version": "v5.23.0", "source": { "type": "git", "url": "https://github.com/laravel/socialite.git", - "reference": "30972c12a41f71abeb418bc9ff157da8d9231519" + "reference": "e9e0fc83b9d8d71c8385a5da20e5b95ca6234cf5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/30972c12a41f71abeb418bc9ff157da8d9231519", - "reference": "30972c12a41f71abeb418bc9ff157da8d9231519", + "url": "https://api.github.com/repos/laravel/socialite/zipball/e9e0fc83b9d8d71c8385a5da20e5b95ca6234cf5", + "reference": "e9e0fc83b9d8d71c8385a5da20e5b95ca6234cf5", "shasum": "" }, "require": { @@ -2521,20 +2567,20 @@ "issues": "https://github.com/laravel/socialite/issues", "source": "https://github.com/laravel/socialite" }, - "time": "2025-04-21T14:21:34+00:00" + "time": "2025-07-23T14:16:08+00:00" }, { "name": "laravel/telescope", - "version": "v5.7.0", + "version": "v5.11.3", "source": { "type": "git", "url": "https://github.com/laravel/telescope.git", - "reference": "440908cb856cfbef9323244f7978ad4bf8cd2daa" + "reference": "7684604e104e7755b70dcacfeee06888e2470689" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/telescope/zipball/440908cb856cfbef9323244f7978ad4bf8cd2daa", - "reference": "440908cb856cfbef9323244f7978ad4bf8cd2daa", + "url": "https://api.github.com/repos/laravel/telescope/zipball/7684604e104e7755b70dcacfeee06888e2470689", + "reference": "7684604e104e7755b70dcacfeee06888e2470689", "shasum": "" }, "require": { @@ -2588,9 +2634,9 @@ ], "support": { "issues": "https://github.com/laravel/telescope/issues", - "source": "https://github.com/laravel/telescope/tree/v5.7.0" + "source": "https://github.com/laravel/telescope/tree/v5.11.3" }, - "time": "2025-03-27T17:25:52+00:00" + "time": "2025-08-21T14:25:40+00:00" }, { "name": "laravel/tinker", @@ -2660,16 +2706,16 @@ }, { "name": "league/commonmark", - "version": "2.7.0", + "version": "2.7.1", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "6fbb36d44824ed4091adbcf4c7d4a3923cdb3405" + "reference": "10732241927d3971d28e7ea7b5712721fa2296ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/6fbb36d44824ed4091adbcf4c7d4a3923cdb3405", - "reference": "6fbb36d44824ed4091adbcf4c7d4a3923cdb3405", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/10732241927d3971d28e7ea7b5712721fa2296ca", + "reference": "10732241927d3971d28e7ea7b5712721fa2296ca", "shasum": "" }, "require": { @@ -2698,7 +2744,7 @@ "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" + "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0" }, "suggest": { "symfony/yaml": "v2.3+ required if using the Front Matter extension" @@ -2763,7 +2809,7 @@ "type": "tidelift" } ], - "time": "2025-05-05T12:20:28+00:00" + "time": "2025-07-20T12:47:49+00:00" }, { "name": "league/config", @@ -2849,16 +2895,16 @@ }, { "name": "league/flysystem", - "version": "3.29.1", + "version": "3.30.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319" + "reference": "2203e3151755d874bb2943649dae1eb8533ac93e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/edc1bb7c86fab0776c3287dbd19b5fa278347319", - "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/2203e3151755d874bb2943649dae1eb8533ac93e", + "reference": "2203e3151755d874bb2943649dae1eb8533ac93e", "shasum": "" }, "require": { @@ -2882,13 +2928,13 @@ "composer/semver": "^3.0", "ext-fileinfo": "*", "ext-ftp": "*", - "ext-mongodb": "^1.3", + "ext-mongodb": "^1.3|^2", "ext-zip": "*", "friendsofphp/php-cs-fixer": "^3.5", "google/cloud-storage": "^1.23", "guzzlehttp/psr7": "^2.6", "microsoft/azure-storage-blob": "^1.1", - "mongodb/mongodb": "^1.2", + "mongodb/mongodb": "^1.2|^2", "phpseclib/phpseclib": "^3.0.36", "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^9.5.11|^10.0", @@ -2926,22 +2972,22 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.29.1" + "source": "https://github.com/thephpleague/flysystem/tree/3.30.0" }, - "time": "2024-10-08T08:58:34+00:00" + "time": "2025-06-25T13:29:59+00:00" }, { "name": "league/flysystem-local", - "version": "3.29.0", + "version": "3.30.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27" + "reference": "6691915f77c7fb69adfb87dcd550052dc184ee10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/e0e8d52ce4b2ed154148453d321e97c8e931bd27", - "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/6691915f77c7fb69adfb87dcd550052dc184ee10", + "reference": "6691915f77c7fb69adfb87dcd550052dc184ee10", "shasum": "" }, "require": { @@ -2975,9 +3021,9 @@ "local" ], "support": { - "source": "https://github.com/thephpleague/flysystem-local/tree/3.29.0" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.30.0" }, - "time": "2024-08-09T21:24:39+00:00" + "time": "2025-05-21T10:34:19+00:00" }, { "name": "league/fractal", @@ -3357,16 +3403,16 @@ }, { "name": "livewire/livewire", - "version": "v3.6.3", + "version": "v3.6.4", "source": { "type": "git", "url": "https://github.com/livewire/livewire.git", - "reference": "56aa1bb63a46e06181c56fa64717a7287e19115e" + "reference": "ef04be759da41b14d2d129e670533180a44987dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/livewire/livewire/zipball/56aa1bb63a46e06181c56fa64717a7287e19115e", - "reference": "56aa1bb63a46e06181c56fa64717a7287e19115e", + "url": "https://api.github.com/repos/livewire/livewire/zipball/ef04be759da41b14d2d129e670533180a44987dc", + "reference": "ef04be759da41b14d2d129e670533180a44987dc", "shasum": "" }, "require": { @@ -3421,7 +3467,7 @@ "description": "A front-end framework for Laravel.", "support": { "issues": "https://github.com/livewire/livewire/issues", - "source": "https://github.com/livewire/livewire/tree/v3.6.3" + "source": "https://github.com/livewire/livewire/tree/v3.6.4" }, "funding": [ { @@ -3429,7 +3475,7 @@ "type": "github" } ], - "time": "2025-04-12T22:26:52+00:00" + "time": "2025-07-17T05:12:15+00:00" }, { "name": "monolog/monolog", @@ -3602,16 +3648,16 @@ }, { "name": "nesbot/carbon", - "version": "3.9.1", + "version": "3.10.3", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "ced71f79398ece168e24f7f7710462f462310d4d" + "reference": "8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/ced71f79398ece168e24f7f7710462f462310d4d", - "reference": "ced71f79398ece168e24f7f7710462f462310d4d", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f", + "reference": "8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f", "shasum": "" }, "require": { @@ -3619,9 +3665,9 @@ "ext-json": "*", "php": "^8.1", "psr/clock": "^1.0", - "symfony/clock": "^6.3 || ^7.0", + "symfony/clock": "^6.3.12 || ^7.0", "symfony/polyfill-mbstring": "^1.0", - "symfony/translation": "^4.4.18 || ^5.2.1|| ^6.0 || ^7.0" + "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0" }, "provide": { "psr/clock-implementation": "1.0" @@ -3629,14 +3675,13 @@ "require-dev": { "doctrine/dbal": "^3.6.3 || ^4.0", "doctrine/orm": "^2.15.2 || ^3.0", - "friendsofphp/php-cs-fixer": "^3.57.2", + "friendsofphp/php-cs-fixer": "^v3.87.1", "kylekatarnls/multi-tester": "^2.5.3", - "ondrejmirtes/better-reflection": "^6.25.0.4", "phpmd/phpmd": "^2.15.0", - "phpstan/extension-installer": "^1.3.1", - "phpstan/phpstan": "^1.11.2", - "phpunit/phpunit": "^10.5.20", - "squizlabs/php_codesniffer": "^3.9.0" + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.22", + "phpunit/phpunit": "^10.5.53", + "squizlabs/php_codesniffer": "^3.13.4" }, "bin": [ "bin/carbon" @@ -3704,7 +3749,7 @@ "type": "tidelift" } ], - "time": "2025-05-01T19:51:51+00:00" + "time": "2025-09-06T13:39:36+00:00" }, { "name": "nette/schema", @@ -3770,29 +3815,29 @@ }, { "name": "nette/utils", - "version": "v4.0.6", + "version": "v4.0.8", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "ce708655043c7050eb050df361c5e313cf708309" + "reference": "c930ca4e3cf4f17dcfb03037703679d2396d2ede" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/ce708655043c7050eb050df361c5e313cf708309", - "reference": "ce708655043c7050eb050df361c5e313cf708309", + "url": "https://api.github.com/repos/nette/utils/zipball/c930ca4e3cf4f17dcfb03037703679d2396d2ede", + "reference": "c930ca4e3cf4f17dcfb03037703679d2396d2ede", "shasum": "" }, "require": { - "php": "8.0 - 8.4" + "php": "8.0 - 8.5" }, "conflict": { "nette/finder": "<3", "nette/schema": "<1.2.2" }, "require-dev": { - "jetbrains/phpstorm-attributes": "dev-master", + "jetbrains/phpstorm-attributes": "^1.2", "nette/tester": "^2.5", - "phpstan/phpstan": "^1.0", + "phpstan/phpstan-nette": "^2.0@stable", "tracy/tracy": "^2.9" }, "suggest": { @@ -3810,6 +3855,9 @@ } }, "autoload": { + "psr-4": { + "Nette\\": "src" + }, "classmap": [ "src/" ] @@ -3850,22 +3898,22 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.0.6" + "source": "https://github.com/nette/utils/tree/v4.0.8" }, - "time": "2025-03-30T21:06:30+00:00" + "time": "2025-08-06T21:43:34+00:00" }, { "name": "nikic/php-parser", - "version": "v5.4.0", + "version": "v5.6.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494" + "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2", + "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2", "shasum": "" }, "require": { @@ -3884,7 +3932,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.x-dev" } }, "autoload": { @@ -3908,9 +3956,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.1" }, - "time": "2024-12-30T11:07:19+00:00" + "time": "2025-08-13T20:13:15+00:00" }, { "name": "nunomaduro/termwind", @@ -4067,16 +4115,16 @@ }, { "name": "open-telemetry/api", - "version": "1.2.3", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/opentelemetry-php/api.git", - "reference": "199d7ddda88f5f5619fa73463f1a5a7149ccd1f1" + "reference": "7692075f486c14d8cfd37fba98a08a5667f089e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opentelemetry-php/api/zipball/199d7ddda88f5f5619fa73463f1a5a7149ccd1f1", - "reference": "199d7ddda88f5f5619fa73463f1a5a7149ccd1f1", + "url": "https://api.github.com/repos/opentelemetry-php/api/zipball/7692075f486c14d8cfd37fba98a08a5667f089e5", + "reference": "7692075f486c14d8cfd37fba98a08a5667f089e5", "shasum": "" }, "require": { @@ -4096,7 +4144,7 @@ ] }, "branch-alias": { - "dev-main": "1.1.x-dev" + "dev-main": "1.4.x-dev" } }, "autoload": { @@ -4133,20 +4181,20 @@ "issues": "https://github.com/open-telemetry/opentelemetry-php/issues", "source": "https://github.com/open-telemetry/opentelemetry-php" }, - "time": "2025-03-05T21:42:54+00:00" + "time": "2025-08-07T23:07:38+00:00" }, { "name": "open-telemetry/context", - "version": "1.2.1", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/opentelemetry-php/context.git", - "reference": "1eb2b837ee9362db064a6b65d5ecce15a9f9f020" + "reference": "438f71812242db3f196fb4c717c6f92cbc819be6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opentelemetry-php/context/zipball/1eb2b837ee9362db064a6b65d5ecce15a9f9f020", - "reference": "1eb2b837ee9362db064a6b65d5ecce15a9f9f020", + "url": "https://api.github.com/repos/opentelemetry-php/context/zipball/438f71812242db3f196fb4c717c6f92cbc819be6", + "reference": "438f71812242db3f196fb4c717c6f92cbc819be6", "shasum": "" }, "require": { @@ -4192,20 +4240,20 @@ "issues": "https://github.com/open-telemetry/opentelemetry-php/issues", "source": "https://github.com/open-telemetry/opentelemetry-php" }, - "time": "2025-05-07T23:36:50+00:00" + "time": "2025-08-13T01:12:00+00:00" }, { "name": "open-telemetry/exporter-otlp", - "version": "1.2.1", + "version": "1.3.2", "source": { "type": "git", "url": "https://github.com/opentelemetry-php/exporter-otlp.git", - "reference": "b7580440b7481a98da97aceabeb46e1b276c8747" + "reference": "196f3a1dbce3b2c0f8110d164232c11ac00ddbb2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opentelemetry-php/exporter-otlp/zipball/b7580440b7481a98da97aceabeb46e1b276c8747", - "reference": "b7580440b7481a98da97aceabeb46e1b276c8747", + "url": "https://api.github.com/repos/opentelemetry-php/exporter-otlp/zipball/196f3a1dbce3b2c0f8110d164232c11ac00ddbb2", + "reference": "196f3a1dbce3b2c0f8110d164232c11ac00ddbb2", "shasum": "" }, "require": { @@ -4256,7 +4304,7 @@ "issues": "https://github.com/open-telemetry/opentelemetry-php/issues", "source": "https://github.com/open-telemetry/opentelemetry-php" }, - "time": "2025-03-06T23:21:56+00:00" + "time": "2025-06-16T00:24:51+00:00" }, { "name": "open-telemetry/gen-otlp-protobuf", @@ -4322,82 +4370,88 @@ "time": "2025-01-15T23:07:07+00:00" }, { - "name": "open-telemetry/opentelemetry-logger-monolog", - "version": "1.1.0", + "name": "open-telemetry/opentelemetry-auto-laravel", + "version": "1.3.0", "source": { "type": "git", - "url": "https://github.com/opentelemetry-php/contrib-logger-monolog.git", - "reference": "e188fa2c2fba5f69f92913f8ec486398e89ef971" + "url": "https://github.com/opentelemetry-php/contrib-auto-laravel.git", + "reference": "6e480938762e571b0a101d7bea82c284d542bfe8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opentelemetry-php/contrib-logger-monolog/zipball/e188fa2c2fba5f69f92913f8ec486398e89ef971", - "reference": "e188fa2c2fba5f69f92913f8ec486398e89ef971", + "url": "https://api.github.com/repos/opentelemetry-php/contrib-auto-laravel/zipball/6e480938762e571b0a101d7bea82c284d542bfe8", + "reference": "6e480938762e571b0a101d7bea82c284d542bfe8", "shasum": "" }, "require": { - "monolog/monolog": "^1.1|^2|^3", + "ext-json": "*", + "ext-opentelemetry": "*", + "laravel/framework": "^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0", "open-telemetry/api": "^1.0", + "open-telemetry/sem-conv": "^1.32", "php": "^8.1" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3", - "google/protobuf": ">=3.5.0", - "guzzlehttp/guzzle": "^7.4", - "nyholm/psr7": "^1.6", - "open-telemetry/exporter-otlp": ">=1.0", - "open-telemetry/sdk": ">=1.0", + "friendsofphp/php-cs-fixer": "^3.50", + "guzzlehttp/guzzle": "*", + "nunomaduro/collision": "*", + "open-telemetry/sdk": "^1.0", + "orchestra/testbench": ">=7.41.3", "phan/phan": "^5.0", - "phpbench/phpbench": "^1.2", + "php-http/mock-client": "*", "phpstan/phpstan": "^1.1", "phpstan/phpstan-phpunit": "^1.0", "phpunit/phpunit": "^9.5", "psalm/plugin-phpunit": "^0.19.2", + "spatie/laravel-ignition": "*", "vimeo/psalm": "6.4.0" }, "type": "library", "autoload": { + "files": [ + "_register.php" + ], "psr-4": { - "OpenTelemetry\\Contrib\\Logs\\Monolog\\": "src/" + "OpenTelemetry\\Contrib\\Instrumentation\\Laravel\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "Apache-2.0" ], - "description": "OpenTelemetry Monolog handler.", - "homepage": "https://opentelemetry.io", + "description": "OpenTelemetry auto-instrumentation for Laravel", + "homepage": "https://opentelemetry.io/docs/php", "keywords": [ - "handler", - "logs", - "monolog", + "instrumentation", + "laravel", "open-telemetry", "opentelemetry", - "otel" + "otel", + "tracing" ], "support": { - "source": "https://github.com/opentelemetry-php/contrib-logger-monolog/tree/1.1.0" + "source": "https://github.com/opentelemetry-php/contrib-auto-laravel/tree/1.3.0" }, - "time": "2025-02-25T01:30:01+00:00" + "time": "2025-07-28T00:47:29+00:00" }, { "name": "open-telemetry/sdk", - "version": "1.3.0", + "version": "1.7.1", "source": { "type": "git", "url": "https://github.com/opentelemetry-php/sdk.git", - "reference": "05d9ceb6773b5bddcf485af6d4a6f543bbeb980b" + "reference": "52690d4b37ae4f091af773eef3c238ed2bc0aa06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opentelemetry-php/sdk/zipball/05d9ceb6773b5bddcf485af6d4a6f543bbeb980b", - "reference": "05d9ceb6773b5bddcf485af6d4a6f543bbeb980b", + "url": "https://api.github.com/repos/opentelemetry-php/sdk/zipball/52690d4b37ae4f091af773eef3c238ed2bc0aa06", + "reference": "52690d4b37ae4f091af773eef3c238ed2bc0aa06", "shasum": "" }, "require": { "ext-json": "*", "nyholm/psr7-server": "^1.1", - "open-telemetry/api": "~1.0 || ~1.1", + "open-telemetry/api": "^1.4", "open-telemetry/context": "^1.0", "open-telemetry/sem-conv": "^1.0", "php": "^8.1", @@ -4410,7 +4464,7 @@ "ramsey/uuid": "^3.0 || ^4.0", "symfony/polyfill-mbstring": "^1.23", "symfony/polyfill-php82": "^1.26", - "tbachert/spi": "^1.0.1" + "tbachert/spi": "^1.0.5" }, "suggest": { "ext-gmp": "To support unlimited number of synchronous metric readers", @@ -4420,6 +4474,13 @@ "type": "library", "extra": { "spi": { + "OpenTelemetry\\API\\Configuration\\ConfigEnv\\EnvComponentLoader": [ + "OpenTelemetry\\API\\Instrumentation\\Configuration\\General\\ConfigEnv\\EnvComponentLoaderHttpConfig", + "OpenTelemetry\\API\\Instrumentation\\Configuration\\General\\ConfigEnv\\EnvComponentLoaderPeerConfig" + ], + "OpenTelemetry\\SDK\\Common\\Configuration\\Resolver\\ResolverInterface": [ + "OpenTelemetry\\SDK\\Common\\Configuration\\Resolver\\SdkConfigurationResolver" + ], "OpenTelemetry\\API\\Instrumentation\\AutoInstrumentation\\HookManagerInterface": [ "OpenTelemetry\\API\\Instrumentation\\AutoInstrumentation\\ExtensionHookManager" ] @@ -4468,20 +4529,20 @@ "issues": "https://github.com/open-telemetry/opentelemetry-php/issues", "source": "https://github.com/open-telemetry/opentelemetry-php" }, - "time": "2025-05-01T23:20:43+00:00" + "time": "2025-09-05T07:17:06+00:00" }, { "name": "open-telemetry/sem-conv", - "version": "1.32.0", + "version": "1.37.0", "source": { "type": "git", "url": "https://github.com/opentelemetry-php/sem-conv.git", - "reference": "16585cc0dbc3032a318e274043454679430d2ebf" + "reference": "8da7ec497c881e39afa6657d72586e27efbd29a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opentelemetry-php/sem-conv/zipball/16585cc0dbc3032a318e274043454679430d2ebf", - "reference": "16585cc0dbc3032a318e274043454679430d2ebf", + "url": "https://api.github.com/repos/opentelemetry-php/sem-conv/zipball/8da7ec497c881e39afa6657d72586e27efbd29a1", + "reference": "8da7ec497c881e39afa6657d72586e27efbd29a1", "shasum": "" }, "require": { @@ -4525,7 +4586,69 @@ "issues": "https://github.com/open-telemetry/opentelemetry-php/issues", "source": "https://github.com/open-telemetry/opentelemetry-php" }, - "time": "2025-05-05T03:58:53+00:00" + "time": "2025-09-03T12:08:10+00:00" + }, + { + "name": "open-telemetry/transport-grpc", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/opentelemetry-php/transport-grpc.git", + "reference": "763cc620552d871fe2050fa58644398827651576" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/opentelemetry-php/transport-grpc/zipball/763cc620552d871fe2050fa58644398827651576", + "reference": "763cc620552d871fe2050fa58644398827651576", + "shasum": "" + }, + "require": { + "ext-grpc": "*", + "grpc/grpc": "*", + "open-telemetry/sdk": "^1.0", + "php": "^8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.0.x-dev" + } + }, + "autoload": { + "files": [ + "_register.php" + ], + "psr-4": { + "OpenTelemetry\\Contrib\\Grpc\\": "." + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "opentelemetry-php contributors", + "homepage": "https://github.com/open-telemetry/opentelemetry-php/graphs/contributors" + } + ], + "description": "gRPC transport for OpenTelemetry PHP.", + "keywords": [ + "contrib", + "gRPC", + "opentelemetry", + "otel", + "otlp", + "tracing", + "transport" + ], + "support": { + "chat": "https://app.slack.com/client/T08PSQ7BQ/C01NFPCV44V", + "docs": "https://opentelemetry.io/docs/php", + "issues": "https://github.com/open-telemetry/opentelemetry-php/issues", + "source": "https://github.com/open-telemetry/opentelemetry-php" + }, + "time": "2025-03-04T22:35:49+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -4816,16 +4939,16 @@ }, { "name": "phpoption/phpoption", - "version": "1.9.3", + "version": "1.9.4", "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54" + "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54", - "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d", + "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d", "shasum": "" }, "require": { @@ -4833,7 +4956,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + "phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34" }, "type": "library", "extra": { @@ -4875,7 +4998,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.3" + "source": "https://github.com/schmittjoh/php-option/tree/1.9.4" }, "funding": [ { @@ -4887,20 +5010,20 @@ "type": "tidelift" } ], - "time": "2024-07-20T21:41:07+00:00" + "time": "2025-08-21T11:53:16+00:00" }, { "name": "phpseclib/phpseclib", - "version": "3.0.43", + "version": "3.0.46", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "709ec107af3cb2f385b9617be72af8cf62441d02" + "reference": "56483a7de62a6c2a6635e42e93b8a9e25d4f0ec6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/709ec107af3cb2f385b9617be72af8cf62441d02", - "reference": "709ec107af3cb2f385b9617be72af8cf62441d02", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/56483a7de62a6c2a6635e42e93b8a9e25d4f0ec6", + "reference": "56483a7de62a6c2a6635e42e93b8a9e25d4f0ec6", "shasum": "" }, "require": { @@ -4981,7 +5104,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.43" + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.46" }, "funding": [ { @@ -4997,7 +5120,7 @@ "type": "tidelift" } ], - "time": "2024-12-14T21:12:59+00:00" + "time": "2025-06-26T16:29:55+00:00" }, { "name": "promphp/prometheus_client_php", @@ -5481,16 +5604,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.8", + "version": "v0.12.10", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "85057ceedee50c49d4f6ecaff73ee96adb3b3625" + "reference": "6e80abe6f2257121f1eb9a4c55bf29d921025b22" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/85057ceedee50c49d4f6ecaff73ee96adb3b3625", - "reference": "85057ceedee50c49d4f6ecaff73ee96adb3b3625", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/6e80abe6f2257121f1eb9a4c55bf29d921025b22", + "reference": "6e80abe6f2257121f1eb9a4c55bf29d921025b22", "shasum": "" }, "require": { @@ -5540,12 +5663,11 @@ "authors": [ { "name": "Justin Hileman", - "email": "justin@justinhileman.info", - "homepage": "http://justinhileman.com" + "email": "justin@justinhileman.info" } ], "description": "An interactive shell for modern PHP.", - "homepage": "http://psysh.org", + "homepage": "https://psysh.org", "keywords": [ "REPL", "console", @@ -5554,9 +5676,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.8" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.10" }, - "time": "2025-03-16T03:05:19+00:00" + "time": "2025-08-04T12:39:37+00:00" }, { "name": "pusher/pusher-php-server", @@ -5741,21 +5863,20 @@ }, { "name": "ramsey/uuid", - "version": "4.7.6", + "version": "4.9.1", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "91039bc1faa45ba123c4328958e620d382ec7088" + "reference": "81f941f6f729b1e3ceea61d9d014f8b6c6800440" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", - "reference": "91039bc1faa45ba123c4328958e620d382ec7088", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/81f941f6f729b1e3ceea61d9d014f8b6c6800440", + "reference": "81f941f6f729b1e3ceea61d9d014f8b6c6800440", "shasum": "" }, "require": { - "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", - "ext-json": "*", + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14", "php": "^8.0", "ramsey/collection": "^1.2 || ^2.0" }, @@ -5763,26 +5884,23 @@ "rhumsaa/uuid": "self.version" }, "require-dev": { - "captainhook/captainhook": "^5.10", + "captainhook/captainhook": "^5.25", "captainhook/plugin-composer": "^5.3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "doctrine/annotations": "^1.8", - "ergebnis/composer-normalize": "^2.15", - "mockery/mockery": "^1.3", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "ergebnis/composer-normalize": "^2.47", + "mockery/mockery": "^1.6", "paragonie/random-lib": "^2", - "php-mock/php-mock": "^2.2", - "php-mock/php-mock-mockery": "^1.3", - "php-parallel-lint/php-parallel-lint": "^1.1", - "phpbench/phpbench": "^1.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^8.5 || ^9", - "ramsey/composer-repl": "^1.4", - "slevomat/coding-standard": "^8.4", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.9" + "php-mock/php-mock": "^2.6", + "php-mock/php-mock-mockery": "^1.5", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpbench/phpbench": "^1.2.14", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6", + "slevomat/coding-standard": "^8.18", + "squizlabs/php_codesniffer": "^3.13" }, "suggest": { "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", @@ -5817,19 +5935,9 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.7.6" + "source": "https://github.com/ramsey/uuid/tree/4.9.1" }, - "funding": [ - { - "url": "https://github.com/ramsey", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", - "type": "tidelift" - } - ], - "time": "2024-04-27T21:32:50+00:00" + "time": "2025-09-04T20:59:21+00:00" }, { "name": "ratchet/rfc6455", @@ -6112,23 +6220,23 @@ }, { "name": "react/promise", - "version": "v3.2.0", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "8a164643313c71354582dc850b42b33fa12a4b63" + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63", - "reference": "8a164643313c71354582dc850b42b33fa12a4b63", + "url": "https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a", + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a", "shasum": "" }, "require": { "php": ">=7.1.0" }, "require-dev": { - "phpstan/phpstan": "1.10.39 || 1.4.10", + "phpstan/phpstan": "1.12.28 || 1.4.10", "phpunit/phpunit": "^9.6 || ^7.5" }, "type": "library", @@ -6173,7 +6281,7 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v3.2.0" + "source": "https://github.com/reactphp/promise/tree/v3.3.0" }, "funding": [ { @@ -6181,7 +6289,7 @@ "type": "open_collective" } ], - "time": "2024-05-24T10:39:05+00:00" + "time": "2025-08-19T18:57:03+00:00" }, { "name": "react/promise-timer", @@ -6697,16 +6805,16 @@ }, { "name": "spatie/eloquent-sortable", - "version": "4.4.2", + "version": "4.5.2", "source": { "type": "git", "url": "https://github.com/spatie/eloquent-sortable.git", - "reference": "69e0e258e19513cf261305dd17717ee731aaede3" + "reference": "c1c4f3a66cd41eb7458783c8a4c8e5d7924a9f20" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/eloquent-sortable/zipball/69e0e258e19513cf261305dd17717ee731aaede3", - "reference": "69e0e258e19513cf261305dd17717ee731aaede3", + "url": "https://api.github.com/repos/spatie/eloquent-sortable/zipball/c1c4f3a66cd41eb7458783c8a4c8e5d7924a9f20", + "reference": "c1c4f3a66cd41eb7458783c8a4c8e5d7924a9f20", "shasum": "" }, "require": { @@ -6755,7 +6863,7 @@ ], "support": { "issues": "https://github.com/spatie/eloquent-sortable/issues", - "source": "https://github.com/spatie/eloquent-sortable/tree/4.4.2" + "source": "https://github.com/spatie/eloquent-sortable/tree/4.5.2" }, "funding": [ { @@ -6767,7 +6875,7 @@ "type": "github" } ], - "time": "2025-02-19T07:17:00+00:00" + "time": "2025-08-25T11:46:57+00:00" }, { "name": "spatie/fractalistic", @@ -6914,16 +7022,16 @@ }, { "name": "spatie/laravel-package-tools", - "version": "1.92.4", + "version": "1.92.7", "source": { "type": "git", "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "d20b1969f836d210459b78683d85c9cd5c5f508c" + "reference": "f09a799850b1ed765103a4f0b4355006360c49a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/d20b1969f836d210459b78683d85c9cd5c5f508c", - "reference": "d20b1969f836d210459b78683d85c9cd5c5f508c", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/f09a799850b1ed765103a4f0b4355006360c49a5", + "reference": "f09a799850b1ed765103a4f0b4355006360c49a5", "shasum": "" }, "require": { @@ -6963,7 +7071,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.92.4" + "source": "https://github.com/spatie/laravel-package-tools/tree/1.92.7" }, "funding": [ { @@ -6971,7 +7079,7 @@ "type": "github" } ], - "time": "2025-04-11T15:27:14+00:00" + "time": "2025-07-17T15:46:43+00:00" }, { "name": "spatie/laravel-prometheus", @@ -7052,7 +7160,7 @@ }, { "name": "symfony/clock", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", @@ -7106,7 +7214,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v7.2.0" + "source": "https://github.com/symfony/clock/tree/v7.3.0" }, "funding": [ { @@ -7126,23 +7234,24 @@ }, { "name": "symfony/console", - "version": "v7.2.6", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "0e2e3f38c192e93e622e41ec37f4ca70cfedf218" + "reference": "cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/0e2e3f38c192e93e622e41ec37f4ca70cfedf218", - "reference": "0e2e3f38c192e93e622e41ec37f4ca70cfedf218", + "url": "https://api.github.com/repos/symfony/console/zipball/cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7", + "reference": "cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^6.4|^7.0" + "symfony/string": "^7.2" }, "conflict": { "symfony/dependency-injection": "<6.4", @@ -7199,7 +7308,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.2.6" + "source": "https://github.com/symfony/console/tree/v7.3.3" }, "funding": [ { @@ -7210,16 +7319,20 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-04-07T19:09:28+00:00" + "time": "2025-08-25T06:35:40+00:00" }, { "name": "symfony/css-selector", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", @@ -7264,7 +7377,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.2.0" + "source": "https://github.com/symfony/css-selector/tree/v7.3.0" }, "funding": [ { @@ -7284,16 +7397,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", "shasum": "" }, "require": { @@ -7306,7 +7419,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -7331,7 +7444,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.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" }, "funding": [ { @@ -7347,20 +7460,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/error-handler", - "version": "v7.2.5", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b" + "reference": "0b31a944fcd8759ae294da4d2808cbc53aebd0c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b", - "reference": "102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/0b31a944fcd8759ae294da4d2808cbc53aebd0c3", + "reference": "0b31a944fcd8759ae294da4d2808cbc53aebd0c3", "shasum": "" }, "require": { @@ -7373,9 +7486,11 @@ "symfony/http-kernel": "<6.4" }, "require-dev": { + "symfony/console": "^6.4|^7.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-kernel": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0" + "symfony/serializer": "^6.4|^7.0", + "symfony/webpack-encore-bundle": "^1.0|^2.0" }, "bin": [ "Resources/bin/patch-type-declarations" @@ -7406,7 +7521,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.2.5" + "source": "https://github.com/symfony/error-handler/tree/v7.3.2" }, "funding": [ { @@ -7417,25 +7532,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-03-03T07:12:39+00:00" + "time": "2025-07-07T08:17:57+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.2.0", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1" + "reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1", - "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b7dc69e71de420ac04bc9ab830cf3ffebba48191", + "reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191", "shasum": "" }, "require": { @@ -7486,7 +7605,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.2.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.3.3" }, "funding": [ { @@ -7497,25 +7616,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2025-08-13T11:49:31+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", - "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", "shasum": "" }, "require": { @@ -7529,7 +7652,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -7562,7 +7685,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" }, "funding": [ { @@ -7578,20 +7701,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/finder", - "version": "v7.2.2", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "87a71856f2f56e4100373e92529eed3171695cfb" + "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/87a71856f2f56e4100373e92529eed3171695cfb", - "reference": "87a71856f2f56e4100373e92529eed3171695cfb", + "url": "https://api.github.com/repos/symfony/finder/zipball/2a6614966ba1074fa93dae0bc804227422df4dfe", + "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe", "shasum": "" }, "require": { @@ -7626,7 +7749,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.2.2" + "source": "https://github.com/symfony/finder/tree/v7.3.2" }, "funding": [ { @@ -7637,25 +7760,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-12-30T19:00:17+00:00" + "time": "2025-07-15T13:41:35+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.2.6", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "6023ec7607254c87c5e69fb3558255aca440d72b" + "reference": "7475561ec27020196c49bb7c4f178d33d7d3dc00" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6023ec7607254c87c5e69fb3558255aca440d72b", - "reference": "6023ec7607254c87c5e69fb3558255aca440d72b", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/7475561ec27020196c49bb7c4f178d33d7d3dc00", + "reference": "7475561ec27020196c49bb7c4f178d33d7d3dc00", "shasum": "" }, "require": { @@ -7672,6 +7799,7 @@ "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", "symfony/cache": "^6.4.12|^7.1.5", + "symfony/clock": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", "symfony/expression-language": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", @@ -7704,7 +7832,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.2.6" + "source": "https://github.com/symfony/http-foundation/tree/v7.3.3" }, "funding": [ { @@ -7715,25 +7843,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-04-09T08:14:01+00:00" + "time": "2025-08-20T08:04:18+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.2.6", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "f9dec01e6094a063e738f8945ef69c0cfcf792ec" + "reference": "72c304de37e1a1cec6d5d12b81187ebd4850a17b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f9dec01e6094a063e738f8945ef69c0cfcf792ec", - "reference": "f9dec01e6094a063e738f8945ef69c0cfcf792ec", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/72c304de37e1a1cec6d5d12b81187ebd4850a17b", + "reference": "72c304de37e1a1cec6d5d12b81187ebd4850a17b", "shasum": "" }, "require": { @@ -7741,8 +7873,8 @@ "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^6.4|^7.0", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", + "symfony/event-dispatcher": "^7.3", + "symfony/http-foundation": "^7.3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -7818,7 +7950,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.2.6" + "source": "https://github.com/symfony/http-kernel/tree/v7.3.3" }, "funding": [ { @@ -7829,25 +7961,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-05-02T09:04:03+00:00" + "time": "2025-08-29T08:23:45+00:00" }, { "name": "symfony/mailer", - "version": "v7.2.6", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "998692469d6e698c6eadc7ef37a6530a9eabb356" + "reference": "a32f3f45f1990db8c4341d5122a7d3a381c7e575" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/998692469d6e698c6eadc7ef37a6530a9eabb356", - "reference": "998692469d6e698c6eadc7ef37a6530a9eabb356", + "url": "https://api.github.com/repos/symfony/mailer/zipball/a32f3f45f1990db8c4341d5122a7d3a381c7e575", + "reference": "a32f3f45f1990db8c4341d5122a7d3a381c7e575", "shasum": "" }, "require": { @@ -7898,7 +8034,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.2.6" + "source": "https://github.com/symfony/mailer/tree/v7.3.3" }, "funding": [ { @@ -7909,25 +8045,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-04-04T09:50:51+00:00" + "time": "2025-08-13T11:49:31+00:00" }, { "name": "symfony/mime", - "version": "v7.2.6", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "706e65c72d402539a072d0d6ad105fff6c161ef1" + "reference": "e0a0f859148daf1edf6c60b398eb40bfc96697d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/706e65c72d402539a072d0d6ad105fff6c161ef1", - "reference": "706e65c72d402539a072d0d6ad105fff6c161ef1", + "url": "https://api.github.com/repos/symfony/mime/zipball/e0a0f859148daf1edf6c60b398eb40bfc96697d1", + "reference": "e0a0f859148daf1edf6c60b398eb40bfc96697d1", "shasum": "" }, "require": { @@ -7982,7 +8122,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.2.6" + "source": "https://github.com/symfony/mime/tree/v7.3.2" }, "funding": [ { @@ -7993,16 +8133,20 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-04-27T13:34:41+00:00" + "time": "2025-07-15T13:41:35+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", @@ -8061,7 +8205,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" }, "funding": [ { @@ -8072,6 +8216,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -8081,16 +8229,16 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", "shasum": "" }, "require": { @@ -8139,7 +8287,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" }, "funding": [ { @@ -8150,16 +8298,20 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-06-27T09:58:17+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", @@ -8222,7 +8374,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" }, "funding": [ { @@ -8233,6 +8385,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -8242,7 +8398,7 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -8303,7 +8459,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" }, "funding": [ { @@ -8314,6 +8470,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -8323,7 +8483,7 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", @@ -8384,7 +8544,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" }, "funding": [ { @@ -8395,6 +8555,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -8404,7 +8568,7 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", @@ -8464,7 +8628,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" }, "funding": [ { @@ -8475,6 +8639,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -8484,7 +8652,7 @@ }, { "name": "symfony/polyfill-php82", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php82.git", @@ -8540,7 +8708,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php82/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-php82/tree/v1.33.0" }, "funding": [ { @@ -8551,6 +8719,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -8560,16 +8732,16 @@ }, { "name": "symfony/polyfill-php83", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", "shasum": "" }, "require": { @@ -8616,7 +8788,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" }, "funding": [ { @@ -8627,16 +8799,180 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-07-08T02:45:35+00:00" + }, + { + "name": "symfony/polyfill-php84", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-24T13:30:11+00:00" + }, + { + "name": "symfony/polyfill-php85", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php85\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-23T16:12:55+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", @@ -8695,7 +9031,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.33.0" }, "funding": [ { @@ -8706,6 +9042,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -8715,16 +9055,16 @@ }, { "name": "symfony/process", - "version": "v7.2.5", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "87b7c93e57df9d8e39a093d32587702380ff045d" + "reference": "32241012d521e2e8a9d713adb0812bb773b907f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/87b7c93e57df9d8e39a093d32587702380ff045d", - "reference": "87b7c93e57df9d8e39a093d32587702380ff045d", + "url": "https://api.github.com/repos/symfony/process/zipball/32241012d521e2e8a9d713adb0812bb773b907f1", + "reference": "32241012d521e2e8a9d713adb0812bb773b907f1", "shasum": "" }, "require": { @@ -8756,7 +9096,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.2.5" + "source": "https://github.com/symfony/process/tree/v7.3.3" }, "funding": [ { @@ -8767,16 +9107,20 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-03-13T12:21:46+00:00" + "time": "2025-08-18T09:42:54+00:00" }, { "name": "symfony/psr-http-message-bridge", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/psr-http-message-bridge.git", @@ -8839,7 +9183,7 @@ "psr-7" ], "support": { - "source": "https://github.com/symfony/psr-http-message-bridge/tree/v7.2.0" + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v7.3.0" }, "funding": [ { @@ -8859,16 +9203,16 @@ }, { "name": "symfony/routing", - "version": "v7.2.3", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "ee9a67edc6baa33e5fae662f94f91fd262930996" + "reference": "7614b8ca5fa89b9cd233e21b627bfc5774f586e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/ee9a67edc6baa33e5fae662f94f91fd262930996", - "reference": "ee9a67edc6baa33e5fae662f94f91fd262930996", + "url": "https://api.github.com/repos/symfony/routing/zipball/7614b8ca5fa89b9cd233e21b627bfc5774f586e4", + "reference": "7614b8ca5fa89b9cd233e21b627bfc5774f586e4", "shasum": "" }, "require": { @@ -8920,7 +9264,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.2.3" + "source": "https://github.com/symfony/routing/tree/v7.3.2" }, "funding": [ { @@ -8931,25 +9275,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-17T10:56:55+00:00" + "time": "2025-07-15T11:36:08+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", - "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4", "shasum": "" }, "require": { @@ -8967,7 +9315,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -9003,7 +9351,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.6.0" }, "funding": [ { @@ -9019,20 +9367,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2025-04-25T09:37:31+00:00" }, { "name": "symfony/string", - "version": "v7.2.6", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "a214fe7d62bd4df2a76447c67c6b26e1d5e74931" + "reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/a214fe7d62bd4df2a76447c67c6b26e1d5e74931", - "reference": "a214fe7d62bd4df2a76447c67c6b26e1d5e74931", + "url": "https://api.github.com/repos/symfony/string/zipball/17a426cce5fd1f0901fefa9b2a490d0038fd3c9c", + "reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c", "shasum": "" }, "require": { @@ -9090,7 +9438,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.2.6" + "source": "https://github.com/symfony/string/tree/v7.3.3" }, "funding": [ { @@ -9101,25 +9449,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-04-20T20:18:16+00:00" + "time": "2025-08-25T06:35:40+00:00" }, { "name": "symfony/translation", - "version": "v7.2.6", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "e7fd8e2a4239b79a0fd9fb1fef3e0e7f969c6dc6" + "reference": "e0837b4cbcef63c754d89a4806575cada743a38d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/e7fd8e2a4239b79a0fd9fb1fef3e0e7f969c6dc6", - "reference": "e7fd8e2a4239b79a0fd9fb1fef3e0e7f969c6dc6", + "url": "https://api.github.com/repos/symfony/translation/zipball/e0837b4cbcef63c754d89a4806575cada743a38d", + "reference": "e0837b4cbcef63c754d89a4806575cada743a38d", "shasum": "" }, "require": { @@ -9129,6 +9481,7 @@ "symfony/translation-contracts": "^2.5|^3.0" }, "conflict": { + "nikic/php-parser": "<5.0", "symfony/config": "<6.4", "symfony/console": "<6.4", "symfony/dependency-injection": "<6.4", @@ -9142,7 +9495,7 @@ "symfony/translation-implementation": "2.3|3.0" }, "require-dev": { - "nikic/php-parser": "^4.18|^5.0", + "nikic/php-parser": "^5.0", "psr/log": "^1|^2|^3", "symfony/config": "^6.4|^7.0", "symfony/console": "^6.4|^7.0", @@ -9185,7 +9538,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.2.6" + "source": "https://github.com/symfony/translation/tree/v7.3.3" }, "funding": [ { @@ -9196,25 +9549,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-04-07T19:09:28+00:00" + "time": "2025-08-01T21:02:37+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" + "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", - "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/df210c7a2573f1913b2d17cc95f90f53a73d8f7d", + "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d", "shasum": "" }, "require": { @@ -9227,7 +9584,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -9263,7 +9620,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/translation-contracts/tree/v3.6.0" }, "funding": [ { @@ -9279,20 +9636,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-27T08:32:26+00:00" }, { "name": "symfony/uid", - "version": "v7.2.0", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "2d294d0c48df244c71c105a169d0190bfb080426" + "reference": "a69f69f3159b852651a6bf45a9fdd149520525bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/2d294d0c48df244c71c105a169d0190bfb080426", - "reference": "2d294d0c48df244c71c105a169d0190bfb080426", + "url": "https://api.github.com/repos/symfony/uid/zipball/a69f69f3159b852651a6bf45a9fdd149520525bb", + "reference": "a69f69f3159b852651a6bf45a9fdd149520525bb", "shasum": "" }, "require": { @@ -9337,7 +9694,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v7.2.0" + "source": "https://github.com/symfony/uid/tree/v7.3.1" }, "funding": [ { @@ -9353,31 +9710,31 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2025-06-27T19:55:54+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.2.6", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "9c46038cd4ed68952166cf7001b54eb539184ccb" + "reference": "34d8d4c4b9597347306d1ec8eb4e1319b1e6986f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/9c46038cd4ed68952166cf7001b54eb539184ccb", - "reference": "9c46038cd4ed68952166cf7001b54eb539184ccb", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/34d8d4c4b9597347306d1ec8eb4e1319b1e6986f", + "reference": "34d8d4c4b9597347306d1ec8eb4e1319b1e6986f", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { "symfony/console": "<6.4" }, "require-dev": { - "ext-iconv": "*", "symfony/console": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", "symfony/process": "^6.4|^7.0", @@ -9420,7 +9777,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.2.6" + "source": "https://github.com/symfony/var-dumper/tree/v7.3.3" }, "funding": [ { @@ -9431,25 +9788,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-04-09T08:14:01+00:00" + "time": "2025-08-13T11:49:31+00:00" }, { "name": "tbachert/spi", - "version": "v1.0.3", + "version": "v1.0.5", "source": { "type": "git", "url": "https://github.com/Nevay/spi.git", - "reference": "506a79c98e1a51522e76ee921ccb6c62d52faf3a" + "reference": "e7078767866d0a9e0f91d3f9d42a832df5e39002" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Nevay/spi/zipball/506a79c98e1a51522e76ee921ccb6c62d52faf3a", - "reference": "506a79c98e1a51522e76ee921ccb6c62d52faf3a", + "url": "https://api.github.com/repos/Nevay/spi/zipball/e7078767866d0a9e0f91d3f9d42a832df5e39002", + "reference": "e7078767866d0a9e0f91d3f9d42a832df5e39002", "shasum": "" }, "require": { @@ -9467,7 +9828,7 @@ "extra": { "class": "Nevay\\SPI\\Composer\\Plugin", "branch-alias": { - "dev-main": "0.2.x-dev" + "dev-main": "1.0.x-dev" }, "plugin-optional": true }, @@ -9486,9 +9847,9 @@ ], "support": { "issues": "https://github.com/Nevay/spi/issues", - "source": "https://github.com/Nevay/spi/tree/v1.0.3" + "source": "https://github.com/Nevay/spi/tree/v1.0.5" }, - "time": "2025-04-02T19:38:14+00:00" + "time": "2025-06-29T15:42:06+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -9765,16 +10126,16 @@ "packages-dev": [ { "name": "barryvdh/laravel-debugbar", - "version": "v3.15.4", + "version": "v3.16.0", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "c0667ea91f7185f1e074402c5788195e96bf8106" + "reference": "f265cf5e38577d42311f1a90d619bcd3740bea23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/c0667ea91f7185f1e074402c5788195e96bf8106", - "reference": "c0667ea91f7185f1e074402c5788195e96bf8106", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/f265cf5e38577d42311f1a90d619bcd3740bea23", + "reference": "f265cf5e38577d42311f1a90d619bcd3740bea23", "shasum": "" }, "require": { @@ -9782,7 +10143,7 @@ "illuminate/session": "^9|^10|^11|^12", "illuminate/support": "^9|^10|^11|^12", "php": "^8.1", - "php-debugbar/php-debugbar": "~2.1.1", + "php-debugbar/php-debugbar": "~2.2.0", "symfony/finder": "^6|^7" }, "require-dev": { @@ -9802,7 +10163,7 @@ ] }, "branch-alias": { - "dev-master": "3.15-dev" + "dev-master": "3.16-dev" } }, "autoload": { @@ -9834,7 +10195,7 @@ ], "support": { "issues": "https://github.com/barryvdh/laravel-debugbar/issues", - "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.15.4" + "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.16.0" }, "funding": [ { @@ -9846,24 +10207,24 @@ "type": "github" } ], - "time": "2025-04-16T06:32:06+00:00" + "time": "2025-07-14T11:56:43+00:00" }, { "name": "barryvdh/laravel-ide-helper", - "version": "v3.5.5", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-ide-helper.git", - "reference": "8d441ec99f8612b942b55f5183151d91591b618a" + "reference": "8d00250cba25728373e92c1d8dcebcbf64623d29" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/8d441ec99f8612b942b55f5183151d91591b618a", - "reference": "8d441ec99f8612b942b55f5183151d91591b618a", + "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/8d00250cba25728373e92c1d8dcebcbf64623d29", + "reference": "8d00250cba25728373e92c1d8dcebcbf64623d29", "shasum": "" }, "require": { - "barryvdh/reflection-docblock": "^2.3", + "barryvdh/reflection-docblock": "^2.4", "composer/class-map-generator": "^1.0", "ext-json": "*", "illuminate/console": "^11.15 || ^12", @@ -9928,7 +10289,7 @@ ], "support": { "issues": "https://github.com/barryvdh/laravel-ide-helper/issues", - "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v3.5.5" + "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v3.6.0" }, "funding": [ { @@ -9940,20 +10301,20 @@ "type": "github" } ], - "time": "2025-02-11T13:59:46+00:00" + "time": "2025-07-17T20:11:57+00:00" }, { "name": "barryvdh/reflection-docblock", - "version": "v2.3.1", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/barryvdh/ReflectionDocBlock.git", - "reference": "b6ff9f93603561f50e53b64310495d20b8dff5d8" + "reference": "d103774cbe7e94ddee7e4870f97f727b43fe7201" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/ReflectionDocBlock/zipball/b6ff9f93603561f50e53b64310495d20b8dff5d8", - "reference": "b6ff9f93603561f50e53b64310495d20b8dff5d8", + "url": "https://api.github.com/repos/barryvdh/ReflectionDocBlock/zipball/d103774cbe7e94ddee7e4870f97f727b43fe7201", + "reference": "d103774cbe7e94ddee7e4870f97f727b43fe7201", "shasum": "" }, "require": { @@ -9990,22 +10351,22 @@ } ], "support": { - "source": "https://github.com/barryvdh/ReflectionDocBlock/tree/v2.3.1" + "source": "https://github.com/barryvdh/ReflectionDocBlock/tree/v2.4.0" }, - "time": "2025-01-18T19:26:32+00:00" + "time": "2025-07-17T06:07:30+00:00" }, { "name": "composer/class-map-generator", - "version": "1.6.1", + "version": "1.6.2", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", - "reference": "134b705ddb0025d397d8318a75825fe3c9d1da34" + "reference": "ba9f089655d4cdd64e762a6044f411ccdaec0076" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/134b705ddb0025d397d8318a75825fe3c9d1da34", - "reference": "134b705ddb0025d397d8318a75825fe3c9d1da34", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/ba9f089655d4cdd64e762a6044f411ccdaec0076", + "reference": "ba9f089655d4cdd64e762a6044f411ccdaec0076", "shasum": "" }, "require": { @@ -10049,7 +10410,7 @@ ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.6.1" + "source": "https://github.com/composer/class-map-generator/tree/1.6.2" }, "funding": [ { @@ -10059,13 +10420,9 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2025-03-24T13:50:44+00:00" + "time": "2025-08-20T18:52:43+00:00" }, { "name": "composer/pcre", @@ -10211,16 +10568,16 @@ }, { "name": "filp/whoops", - "version": "2.18.0", + "version": "2.18.4", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "a7de6c3c6c3c022f5cfc337f8ede6a14460cf77e" + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/a7de6c3c6c3c022f5cfc337f8ede6a14460cf77e", - "reference": "a7de6c3c6c3c022f5cfc337f8ede6a14460cf77e", + "url": "https://api.github.com/repos/filp/whoops/zipball/d2102955e48b9fd9ab24280a7ad12ed552752c4d", + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d", "shasum": "" }, "require": { @@ -10270,7 +10627,7 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.18.0" + "source": "https://github.com/filp/whoops/tree/2.18.4" }, "funding": [ { @@ -10278,7 +10635,7 @@ "type": "github" } ], - "time": "2025-03-15T12:00:00+00:00" + "time": "2025-08-08T12:00:00+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -10333,16 +10690,16 @@ }, { "name": "laravel/pint", - "version": "v1.22.1", + "version": "v1.24.0", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "941d1927c5ca420c22710e98420287169c7bcaf7" + "reference": "0345f3b05f136801af8c339f9d16ef29e6b4df8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/941d1927c5ca420c22710e98420287169c7bcaf7", - "reference": "941d1927c5ca420c22710e98420287169c7bcaf7", + "url": "https://api.github.com/repos/laravel/pint/zipball/0345f3b05f136801af8c339f9d16ef29e6b4df8a", + "reference": "0345f3b05f136801af8c339f9d16ef29e6b4df8a", "shasum": "" }, "require": { @@ -10353,10 +10710,10 @@ "php": "^8.2.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.75.0", - "illuminate/view": "^11.44.7", - "larastan/larastan": "^3.4.0", - "laravel-zero/framework": "^11.36.1", + "friendsofphp/php-cs-fixer": "^3.82.2", + "illuminate/view": "^11.45.1", + "larastan/larastan": "^3.5.0", + "laravel-zero/framework": "^11.45.0", "mockery/mockery": "^1.6.12", "nunomaduro/termwind": "^2.3.1", "pestphp/pest": "^2.36.0" @@ -10366,6 +10723,9 @@ ], "type": "project", "autoload": { + "files": [ + "overrides/Runner/Parallel/ProcessFactory.php" + ], "psr-4": { "App\\": "app/", "Database\\Seeders\\": "database/seeders/", @@ -10395,20 +10755,20 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2025-05-08T08:38:12+00:00" + "time": "2025-07-10T18:09:32+00:00" }, { "name": "laravel/sail", - "version": "v1.42.0", + "version": "v1.45.0", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "2edaaf77f3c07a4099965bb3d7dfee16e801c0f6" + "reference": "019a2933ff4a9199f098d4259713f9bc266a874e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/2edaaf77f3c07a4099965bb3d7dfee16e801c0f6", - "reference": "2edaaf77f3c07a4099965bb3d7dfee16e801c0f6", + "url": "https://api.github.com/repos/laravel/sail/zipball/019a2933ff4a9199f098d4259713f9bc266a874e", + "reference": "019a2933ff4a9199f098d4259713f9bc266a874e", "shasum": "" }, "require": { @@ -10458,7 +10818,7 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2025-04-29T14:26:46+00:00" + "time": "2025-08-25T19:28:31+00:00" }, { "name": "mockery/mockery", @@ -10545,16 +10905,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.13.1", + "version": "1.13.4", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c" + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/1720ddd719e16cf0db4eb1c6eca108031636d46c", - "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", "shasum": "" }, "require": { @@ -10593,7 +10953,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.1" + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" }, "funding": [ { @@ -10601,27 +10961,27 @@ "type": "tidelift" } ], - "time": "2025-04-29T12:36:36+00:00" + "time": "2025-08-01T08:46:24+00:00" }, { "name": "nunomaduro/collision", - "version": "v8.8.0", + "version": "v8.8.2", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "4cf9f3b47afff38b139fb79ce54fc71799022ce8" + "reference": "60207965f9b7b7a4ce15a0f75d57f9dadb105bdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/4cf9f3b47afff38b139fb79ce54fc71799022ce8", - "reference": "4cf9f3b47afff38b139fb79ce54fc71799022ce8", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/60207965f9b7b7a4ce15a0f75d57f9dadb105bdb", + "reference": "60207965f9b7b7a4ce15a0f75d57f9dadb105bdb", "shasum": "" }, "require": { - "filp/whoops": "^2.18.0", - "nunomaduro/termwind": "^2.3.0", + "filp/whoops": "^2.18.1", + "nunomaduro/termwind": "^2.3.1", "php": "^8.2.0", - "symfony/console": "^7.2.5" + "symfony/console": "^7.3.0" }, "conflict": { "laravel/framework": "<11.44.2 || >=13.0.0", @@ -10629,15 +10989,15 @@ }, "require-dev": { "brianium/paratest": "^7.8.3", - "larastan/larastan": "^3.2", - "laravel/framework": "^11.44.2 || ^12.6", - "laravel/pint": "^1.21.2", - "laravel/sail": "^1.41.0", - "laravel/sanctum": "^4.0.8", + "larastan/larastan": "^3.4.2", + "laravel/framework": "^11.44.2 || ^12.18", + "laravel/pint": "^1.22.1", + "laravel/sail": "^1.43.1", + "laravel/sanctum": "^4.1.1", "laravel/tinker": "^2.10.1", - "orchestra/testbench-core": "^9.12.0 || ^10.1", - "pestphp/pest": "^3.8.0", - "sebastian/environment": "^7.2.0 || ^8.0" + "orchestra/testbench-core": "^9.12.0 || ^10.4", + "pestphp/pest": "^3.8.2", + "sebastian/environment": "^7.2.1 || ^8.0" }, "type": "library", "extra": { @@ -10700,7 +11060,7 @@ "type": "patreon" } ], - "time": "2025-04-03T14:33:09+00:00" + "time": "2025-06-25T02:12:12+00:00" }, { "name": "phar-io/manifest", @@ -10822,16 +11182,16 @@ }, { "name": "php-debugbar/php-debugbar", - "version": "v2.1.6", + "version": "v2.2.4", "source": { "type": "git", "url": "https://github.com/php-debugbar/php-debugbar.git", - "reference": "16fa68da5617220594aa5e33fa9de415f94784a0" + "reference": "3146d04671f51f69ffec2a4207ac3bdcf13a9f35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-debugbar/php-debugbar/zipball/16fa68da5617220594aa5e33fa9de415f94784a0", - "reference": "16fa68da5617220594aa5e33fa9de415f94784a0", + "url": "https://api.github.com/repos/php-debugbar/php-debugbar/zipball/3146d04671f51f69ffec2a4207ac3bdcf13a9f35", + "reference": "3146d04671f51f69ffec2a4207ac3bdcf13a9f35", "shasum": "" }, "require": { @@ -10839,6 +11199,9 @@ "psr/log": "^1|^2|^3", "symfony/var-dumper": "^4|^5|^6|^7" }, + "replace": { + "maximebf/debugbar": "self.version" + }, "require-dev": { "dbrekelmans/bdi": "^1", "phpunit/phpunit": "^8|^9", @@ -10853,7 +11216,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "2.1-dev" } }, "autoload": { @@ -10886,22 +11249,22 @@ ], "support": { "issues": "https://github.com/php-debugbar/php-debugbar/issues", - "source": "https://github.com/php-debugbar/php-debugbar/tree/v2.1.6" + "source": "https://github.com/php-debugbar/php-debugbar/tree/v2.2.4" }, - "time": "2025-02-21T17:47:03+00:00" + "time": "2025-07-22T14:01:30+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "11.0.9", + "version": "11.0.11", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "14d63fbcca18457e49c6f8bebaa91a87e8e188d7" + "reference": "4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/14d63fbcca18457e49c6f8bebaa91a87e8e188d7", - "reference": "14d63fbcca18457e49c6f8bebaa91a87e8e188d7", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4", + "reference": "4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4", "shasum": "" }, "require": { @@ -10958,15 +11321,27 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.9" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.11" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" } ], - "time": "2025-02-25T13:26:39+00:00" + "time": "2025-08-27T14:37:49+00:00" }, { "name": "phpunit/php-file-iterator", @@ -11215,16 +11590,16 @@ }, { "name": "phpunit/phpunit", - "version": "11.5.19", + "version": "11.5.36", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "0da1ebcdbc4d5bd2d189cfe02846a89936d8dda5" + "reference": "264a87c7ef68b1ab9af7172357740dc266df5957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0da1ebcdbc4d5bd2d189cfe02846a89936d8dda5", - "reference": "0da1ebcdbc4d5bd2d189cfe02846a89936d8dda5", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/264a87c7ef68b1ab9af7172357740dc266df5957", + "reference": "264a87c7ef68b1ab9af7172357740dc266df5957", "shasum": "" }, "require": { @@ -11234,24 +11609,24 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.1", + "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.2", - "phpunit/php-code-coverage": "^11.0.9", + "phpunit/php-code-coverage": "^11.0.11", "phpunit/php-file-iterator": "^5.1.0", "phpunit/php-invoker": "^5.0.1", "phpunit/php-text-template": "^4.0.1", "phpunit/php-timer": "^7.0.1", "sebastian/cli-parser": "^3.0.2", "sebastian/code-unit": "^3.0.3", - "sebastian/comparator": "^6.3.1", + "sebastian/comparator": "^6.3.2", "sebastian/diff": "^6.0.2", - "sebastian/environment": "^7.2.0", + "sebastian/environment": "^7.2.1", "sebastian/exporter": "^6.3.0", "sebastian/global-state": "^7.0.2", "sebastian/object-enumerator": "^6.0.1", - "sebastian/type": "^5.1.2", + "sebastian/type": "^5.1.3", "sebastian/version": "^5.0.2", "staabm/side-effects-detector": "^1.0.5" }, @@ -11296,7 +11671,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.19" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.36" }, "funding": [ { @@ -11320,7 +11695,7 @@ "type": "tidelift" } ], - "time": "2025-05-02T06:56:52+00:00" + "time": "2025-09-03T06:24:17+00:00" }, { "name": "sebastian/cli-parser", @@ -11494,16 +11869,16 @@ }, { "name": "sebastian/comparator", - "version": "6.3.1", + "version": "6.3.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "24b8fbc2c8e201bb1308e7b05148d6ab393b6959" + "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/24b8fbc2c8e201bb1308e7b05148d6ab393b6959", - "reference": "24b8fbc2c8e201bb1308e7b05148d6ab393b6959", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/85c77556683e6eee4323e4c5468641ca0237e2e8", + "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8", "shasum": "" }, "require": { @@ -11562,15 +11937,27 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.1" + "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" } ], - "time": "2025-03-07T06:57:01+00:00" + "time": "2025-08-10T08:07:46+00:00" }, { "name": "sebastian/complexity", @@ -11699,23 +12086,23 @@ }, { "name": "sebastian/environment", - "version": "7.2.0", + "version": "7.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5" + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", - "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4", + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4", "shasum": "" }, "require": { "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^11.3" }, "suggest": { "ext-posix": "*" @@ -11751,15 +12138,27 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/7.2.0" + "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" } ], - "time": "2024-07-03T04:54:44+00:00" + "time": "2025-05-21T11:55:47+00:00" }, { "name": "sebastian/exporter", @@ -12075,23 +12474,23 @@ }, { "name": "sebastian/recursion-context", - "version": "6.0.2", + "version": "6.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "694d156164372abbd149a4b85ccda2e4670c0e16" + "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/694d156164372abbd149a4b85ccda2e4670c0e16", - "reference": "694d156164372abbd149a4b85ccda2e4670c0e16", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/f6458abbf32a6c8174f8f26261475dc133b3d9dc", + "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc", "shasum": "" }, "require": { "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { @@ -12127,28 +12526,40 @@ "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.2" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" } ], - "time": "2024-07-03T05:10:34+00:00" + "time": "2025-08-13T04:42:22+00:00" }, { "name": "sebastian/type", - "version": "5.1.2", + "version": "5.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "a8a7e30534b0eb0c77cd9d07e82de1a114389f5e" + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/a8a7e30534b0eb0c77cd9d07e82de1a114389f5e", - "reference": "a8a7e30534b0eb0c77cd9d07e82de1a114389f5e", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/f77d2d4e78738c98d9a68d2596fe5e8fa380f449", + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449", "shasum": "" }, "require": { @@ -12184,15 +12595,27 @@ "support": { "issues": "https://github.com/sebastianbergmann/type/issues", "security": "https://github.com/sebastianbergmann/type/security/policy", - "source": "https://github.com/sebastianbergmann/type/tree/5.1.2" + "source": "https://github.com/sebastianbergmann/type/tree/5.1.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", + "type": "tidelift" } ], - "time": "2025-03-18T13:35:50+00:00" + "time": "2025-08-09T06:55:48+00:00" }, { "name": "sebastian/version", @@ -12250,16 +12673,16 @@ }, { "name": "spatie/backtrace", - "version": "1.7.4", + "version": "1.8.1", "source": { "type": "git", "url": "https://github.com/spatie/backtrace.git", - "reference": "cd37a49fce7137359ac30ecc44ef3e16404cccbe" + "reference": "8c0f16a59ae35ec8c62d85c3c17585158f430110" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/backtrace/zipball/cd37a49fce7137359ac30ecc44ef3e16404cccbe", - "reference": "cd37a49fce7137359ac30ecc44ef3e16404cccbe", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/8c0f16a59ae35ec8c62d85c3c17585158f430110", + "reference": "8c0f16a59ae35ec8c62d85c3c17585158f430110", "shasum": "" }, "require": { @@ -12297,7 +12720,8 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/backtrace/tree/1.7.4" + "issues": "https://github.com/spatie/backtrace/issues", + "source": "https://github.com/spatie/backtrace/tree/1.8.1" }, "funding": [ { @@ -12309,7 +12733,7 @@ "type": "other" } ], - "time": "2025-05-08T15:41:09+00:00" + "time": "2025-08-26T08:22:30+00:00" }, { "name": "spatie/error-solutions", @@ -12630,16 +13054,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.12.2", + "version": "3.13.4", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "6d4cf6032d4b718f168c90a96e36c7d0eaacb2aa" + "reference": "ad545ea9c1b7d270ce0fc9cbfb884161cd706119" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/6d4cf6032d4b718f168c90a96e36c7d0eaacb2aa", - "reference": "6d4cf6032d4b718f168c90a96e36c7d0eaacb2aa", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/ad545ea9c1b7d270ce0fc9cbfb884161cd706119", + "reference": "ad545ea9c1b7d270ce0fc9cbfb884161cd706119", "shasum": "" }, "require": { @@ -12710,7 +13134,7 @@ "type": "thanks_dev" } ], - "time": "2025-04-13T04:10:18+00:00" + "time": "2025-09-05T05:47:09+00:00" }, { "name": "staabm/side-effects-detector", @@ -12766,16 +13190,16 @@ }, { "name": "symfony/yaml", - "version": "v7.2.6", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "0feafffb843860624ddfd13478f481f4c3cd8b23" + "reference": "d4f4a66866fe2451f61296924767280ab5732d9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/0feafffb843860624ddfd13478f481f4c3cd8b23", - "reference": "0feafffb843860624ddfd13478f481f4c3cd8b23", + "url": "https://api.github.com/repos/symfony/yaml/zipball/d4f4a66866fe2451f61296924767280ab5732d9d", + "reference": "d4f4a66866fe2451f61296924767280ab5732d9d", "shasum": "" }, "require": { @@ -12818,7 +13242,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.2.6" + "source": "https://github.com/symfony/yaml/tree/v7.3.3" }, "funding": [ { @@ -12829,12 +13253,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-04-04T10:10:11+00:00" + "time": "2025-08-27T11:34:33+00:00" }, { "name": "theseer/tokenizer", @@ -12893,7 +13321,7 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "^8.4" + "php": "^8.2 || ^8.3 || ^8.4 || ^8.5" }, "platform-dev": {}, "plugin-api-version": "2.6.0" diff --git a/config/app.php b/config/app.php index e31bf424..de08b372 100644 --- a/config/app.php +++ b/config/app.php @@ -172,7 +172,6 @@ App\Providers\TelescopeServiceProvider::class, \SocialiteProviders\Manager\ServiceProvider::class, App\Providers\DiscordApiServiceProvider::class, - App\Providers\OpenTelemetryProvider::class, ])->toArray(), /* diff --git a/config/logging.php b/config/logging.php index 0fadddcc..e60200c4 100644 --- a/config/logging.php +++ b/config/logging.php @@ -66,12 +66,6 @@ 'replace_placeholders' => true, ], - 'opentelemetry' => [ - 'driver' => 'custom', - 'via' => Logger::class, - 'level' => env('LOG_LEVEL', 'debug'), - ], - 'daily' => [ 'driver' => 'daily', 'path' => storage_path('logs/laravel.log'), diff --git a/config/open-telemetry.php b/config/open-telemetry.php deleted file mode 100644 index 5c00acc1..00000000 --- a/config/open-telemetry.php +++ /dev/null @@ -1,16 +0,0 @@ - env('OPENTELEMETRY_ENABLED', false), - 'endpoints' => [ - 'traces' => env('OPENTELEMETRY_ENDPOINT_TRACES', 'http://collector:4318/v1/traces'), - 'metrics' => env('OPENTELEMETRY_ENDPOINT_METRICS', 'http://collector:4318/v1/metrics'), - 'logs' => env('OPENTELEMETRY_ENDPOINT_LOGS', 'http://collector:4318/v1/logs'), - ], - 'service' => [ - 'name' => env('OPENTELEMETRY_SERVICE_NAME', config('app.name')), - 'namespace' => env('OPENTELEMETRY_SERVICE_NAMESPACE', \Illuminate\Support\Str::slug(config('app.name'))), - 'version' => env('OPENTELEMETRY_SERVICE_VERSION', '1.0.0'), - ], - 'environment' => env('OPENTELEMETRY_ENVIRONMENT', config('app.env')), -]; diff --git a/database/factories/ClanFactory.php b/database/factories/ClanFactory.php new file mode 100644 index 00000000..46717b0b --- /dev/null +++ b/database/factories/ClanFactory.php @@ -0,0 +1,20 @@ + $this->faker->unique()->company(), + 'invite_code' => strtoupper(Str::random(8)), + ]; + } +} diff --git a/database/factories/ClanMembershipFactory.php b/database/factories/ClanMembershipFactory.php new file mode 100644 index 00000000..411ae440 --- /dev/null +++ b/database/factories/ClanMembershipFactory.php @@ -0,0 +1,23 @@ + User::factory(), + 'clan_id' => Clan::factory(), + 'clan_role_id' => ClanRole::factory(), + ]; + } +} diff --git a/database/factories/ClanRoleFactory.php b/database/factories/ClanRoleFactory.php new file mode 100644 index 00000000..bb5d87ab --- /dev/null +++ b/database/factories/ClanRoleFactory.php @@ -0,0 +1,20 @@ + $this->faker->unique()->word(), + 'name' => $this->faker->unique()->jobTitle(), + ]; + } +} diff --git a/database/factories/EmailAddressFactory.php b/database/factories/EmailAddressFactory.php new file mode 100644 index 00000000..6a44fe85 --- /dev/null +++ b/database/factories/EmailAddressFactory.php @@ -0,0 +1,28 @@ + + */ + + protected $model = EmailAddress::class; + + public function definition() + { + return [ + 'email' => fake()->unique()->safeEmail(), + 'verification_code' => null, + 'verification_sent_at' => null, + 'user_id' => User::factory(), + ]; + } +} diff --git a/database/factories/EventFactory.php b/database/factories/EventFactory.php new file mode 100644 index 00000000..650c0bb9 --- /dev/null +++ b/database/factories/EventFactory.php @@ -0,0 +1,51 @@ + $this->faker->unique()->word(), + 'code' => $this->faker->unique()->bothify('EVT-####'), + 'seating_opens_at' => null, + 'seating_closes_at' => null, + 'seating_locked' => true, + ]; + } + + /** + * State: event where seating opened in the past (should be unlocked). + */ + public function opened(): self + { + return $this->state(function (array $attributes) { + return [ + 'seating_opens_at' => now()->subMinute(), + 'seating_locked' => false, + ]; + }); + } + + /** + * State: event where seating closed in the past (should be locked). + */ + public function closed(): self + { + return $this->state(function (array $attributes) { + return [ + 'seating_closes_at' => now()->subMinute(), + 'seating_locked' => true, + ]; + }); + } +} diff --git a/database/factories/EventMappingFactory.php b/database/factories/EventMappingFactory.php new file mode 100644 index 00000000..e7a92cf3 --- /dev/null +++ b/database/factories/EventMappingFactory.php @@ -0,0 +1,23 @@ + Event::factory(), + 'ticket_provider_id' => TicketProvider::factory(), + 'external_id' => $this->faker->unique()->numerify('#####'), + 'name' => null, + ]; + } +} diff --git a/database/factories/LinkedAccountFactory.php b/database/factories/LinkedAccountFactory.php new file mode 100644 index 00000000..10980007 --- /dev/null +++ b/database/factories/LinkedAccountFactory.php @@ -0,0 +1,22 @@ + User::factory(), + 'social_provider_id' => SocialProvider::factory(), + 'external_id' => $this->faker->unique()->numerify('########'), + ]; + } +} diff --git a/database/factories/ProviderSettingFactory.php b/database/factories/ProviderSettingFactory.php new file mode 100644 index 00000000..c881ff47 --- /dev/null +++ b/database/factories/ProviderSettingFactory.php @@ -0,0 +1,27 @@ + SocialProvider::class, + 'provider_id' => SocialProvider::factory(), + 'name' => $this->faker->word(), + 'code' => $this->faker->unique()->word(), + 'type' => \App\Enums\SettingType::stString, + 'encrypted' => false, + 'validation' => null, + 'value' => $this->faker->word(), + 'order' => 1, + ]; + } +} diff --git a/database/factories/SeatFactory.php b/database/factories/SeatFactory.php new file mode 100644 index 00000000..d81c9122 --- /dev/null +++ b/database/factories/SeatFactory.php @@ -0,0 +1,25 @@ + SeatingPlan::factory(), + 'x' => $this->faker->numberBetween(1, 100), + 'y' => $this->faker->numberBetween(1, 100), + 'row' => $this->faker->randomLetter(), + 'number' => $this->faker->numberBetween(1, 50), + 'label' => $this->faker->unique()->bothify('Row ? Seat ##'), + 'disabled' => false, + ]; + } +} diff --git a/database/factories/SeatingPlanFactory.php b/database/factories/SeatingPlanFactory.php new file mode 100644 index 00000000..8423a733 --- /dev/null +++ b/database/factories/SeatingPlanFactory.php @@ -0,0 +1,24 @@ + Event::factory(), + 'name' => $this->faker->word(), + 'code' => $this->faker->unique()->bothify('PLAN-####'), + 'order' => $this->faker->numberBetween(1, 10), + 'scale' => 1, + 'revision' => 1, + ]; + } +} diff --git a/database/factories/SettingFactory.php b/database/factories/SettingFactory.php new file mode 100644 index 00000000..cc257844 --- /dev/null +++ b/database/factories/SettingFactory.php @@ -0,0 +1,30 @@ + + */ + public function definition(): array + { + return [ + 'code' => fake()->unique()->word(), + 'name' => fake()->words(3, true), + 'description' => null, + 'encrypted' => 0, + 'value' => fake()->word(), + 'validation' => null, + 'type' => 'stString', + 'order' => 1, + ]; + } +} diff --git a/database/factories/SocialProviderFactory.php b/database/factories/SocialProviderFactory.php new file mode 100644 index 00000000..614730a6 --- /dev/null +++ b/database/factories/SocialProviderFactory.php @@ -0,0 +1,24 @@ + 'Discord', + 'code' => 'discord', + 'provider_class' => 'App\\Services\\SocialProviders\\DiscordProvider', + 'supports_auth' => true, + 'enabled' => true, + 'auth_enabled' => true, + 'can_be_renamed' => false, + ]; + } +} diff --git a/database/factories/ThemeFactory.php b/database/factories/ThemeFactory.php new file mode 100644 index 00000000..25c75feb --- /dev/null +++ b/database/factories/ThemeFactory.php @@ -0,0 +1,30 @@ + 'Default', + 'code' => 'default', + 'readonly' => 0, + 'active' => 1, + 'dark_mode' => 1, + 'primary' => '#000000', + 'nav_background' => '#ffffff', + 'seat_available' => '#00ff00', + 'seat_disabled' => '#cccccc', + 'seat_taken' => '#ff0000', + 'seat_clan' => '#0000ff', + 'seat_selected' => '#ffff00', + 'css' => null, + ]; + } +} diff --git a/database/factories/TicketFactory.php b/database/factories/TicketFactory.php new file mode 100644 index 00000000..25dbf6f2 --- /dev/null +++ b/database/factories/TicketFactory.php @@ -0,0 +1,28 @@ + TicketProvider::factory(), + 'user_id' => User::factory(), + 'event_id' => Event::factory(), + 'ticket_type_id' => TicketType::factory(), + 'external_id' => $this->faker->unique()->uuid(), + 'name' => $this->faker->name(), + 'reference' => $this->faker->unique()->uuid(), + ]; + } +} diff --git a/database/factories/TicketProviderFactory.php b/database/factories/TicketProviderFactory.php new file mode 100644 index 00000000..665e6505 --- /dev/null +++ b/database/factories/TicketProviderFactory.php @@ -0,0 +1,21 @@ + $this->faker->company(), + 'code' => $this->faker->unique()->word(), + 'enabled' => true, + 'provider_class' => 'App\\Services\\TicketProviders\\FakeProvider', + ]; + } +} diff --git a/database/factories/TicketTypeFactory.php b/database/factories/TicketTypeFactory.php new file mode 100644 index 00000000..9fc15fb0 --- /dev/null +++ b/database/factories/TicketTypeFactory.php @@ -0,0 +1,21 @@ + Event::factory(), + 'name' => $this->faker->word(), + 'discord_role_id' => $this->faker->unique()->numerify('########'), + ]; + } +} diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index 683bff8c..66117a76 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -22,14 +22,44 @@ class UserFactory extends Factory public function definition(): array { return [ + // UPDATED 10-AUG 2025 changed to below for connection to email address / was: + // 'name' => fake()->name(), + // 'email' => fake()->unique()->safeEmail(), + // 'email_verified_at' => now(), + // 'password' => static::$password ??= Hash::make('password'), + // 'remember_token' => Str::random(10), + + 'nickname' => fake()->userName(), 'name' => fake()->name(), - 'email' => fake()->unique()->safeEmail(), - 'email_verified_at' => now(), - 'password' => static::$password ??= Hash::make('password'), - 'remember_token' => Str::random(10), + 'avatar' => fake()->imageUrl(200, 200, 'people'), + 'terms_agreed_at' => now(), + 'first_login' => now(), + 'last_login' => now(), + 'suspended' => false, + 'primary_email_id' => null, + 'tickets_synced_at' => null, ]; } + //CHECK that the $table->foreignId('user_id')->constrained()->cascadeOnDelete(); on table email_addresses is always unique! + /** + * Create a related email address for the user and links it to the user account. + + */ + public function withEmailAddresses($count = 1) + { + return $this->has(\App\Models\EmailAddress::factory()->count($count), 'emails'); + } + + public function withEmailAddress() + { + return $this->has(\App\Models\EmailAddress::factory(), 'emails') + ->afterCreating(function (User $user) { + $user->primary_email_id = $user->emails()->first()->id; + $user->save(); + }); + } + /** * Indicate that the model's email address should be unverified. */ diff --git a/database/migrations/2023_06_07_000001_create_pulse_tables.php b/database/migrations/2023_06_07_000001_create_pulse_tables.php index 0748fc4d..a8eb902a 100644 --- a/database/migrations/2023_06_07_000001_create_pulse_tables.php +++ b/database/migrations/2023_06_07_000001_create_pulse_tables.php @@ -30,6 +30,7 @@ public function up(): void match ($driver = $connection->getDriverName()) { 'mysql' => $table->char('key_hash', 16)->charset('binary')->virtualAs('unhex(md5(`key`))'), 'pgsql' => $table->uuid('key_hash')->storedAs('md5("key")::uuid'), + 'sqlite' => $table->string('key_hash', 32), default => throw new RuntimeException("Unsupported database driver [{$driver}]."), }; $table->mediumText('value'); @@ -47,6 +48,7 @@ public function up(): void match ($driver = $connection->getDriverName()) { 'mysql' => $table->char('key_hash', 16)->charset('binary')->virtualAs('unhex(md5(`key`))'), 'pgsql' => $table->uuid('key_hash')->storedAs('md5("key")::uuid'), + 'sqlite' => $table->string('key_hash', 32), default => throw new RuntimeException("Unsupported database driver [{$driver}]."), }; $table->bigInteger('value')->nullable(); @@ -66,6 +68,7 @@ public function up(): void match ($driver = $connection->getDriverName()) { 'mysql' => $table->char('key_hash', 16)->charset('binary')->virtualAs('unhex(md5(`key`))'), 'pgsql' => $table->uuid('key_hash')->storedAs('md5("key")::uuid'), + 'sqlite' => $table->string('key_hash', 32), default => throw new RuntimeException("Unsupported database driver [{$driver}]."), }; $table->string('aggregate'); diff --git a/database/migrations/2023_12_05_220753_create_email_addresses_table.php b/database/migrations/2023_12_05_220753_create_email_addresses_table.php index e9b2aa7b..9158fb35 100644 --- a/database/migrations/2023_12_05_220753_create_email_addresses_table.php +++ b/database/migrations/2023_12_05_220753_create_email_addresses_table.php @@ -31,7 +31,9 @@ public function up(): void public function down(): void { Schema::table('users', function (Blueprint $table) { - $table->dropForeign(['primary_user_id']); + if (Schema::getConnection()->getDriverName() !== 'sqlite') { + $table->dropForeign(['primary_user_id']); + } }); Schema::dropIfExists('email_addresses'); } diff --git a/database/migrations/2023_12_10_151710_add_event_id_to_tickets.php b/database/migrations/2023_12_10_151710_add_event_id_to_tickets.php index 03aab3e1..d116874f 100644 --- a/database/migrations/2023_12_10_151710_add_event_id_to_tickets.php +++ b/database/migrations/2023_12_10_151710_add_event_id_to_tickets.php @@ -24,7 +24,9 @@ public function up(): void public function down(): void { Schema::table('tickets', function (Blueprint $table) { - $table->dropForeign(['event_id']); + if (Schema::getConnection()->getDriverName() !== 'sqlite') { + $table->dropForeign(['event_id']); + } $table->dropColumn(['event_id', 'name', 'reference', 'qrcode']); }); } diff --git a/database/migrations/2023_12_10_161335_add_ticket_type_id_to_tickets.php b/database/migrations/2023_12_10_161335_add_ticket_type_id_to_tickets.php index df380c97..cc652ed0 100644 --- a/database/migrations/2023_12_10_161335_add_ticket_type_id_to_tickets.php +++ b/database/migrations/2023_12_10_161335_add_ticket_type_id_to_tickets.php @@ -21,7 +21,9 @@ public function up(): void public function down(): void { Schema::table('tickets', function (Blueprint $table) { - $table->dropForeign(['ticket_type_id']); + if (Schema::getConnection()->getDriverName() !== 'sqlite') { + $table->dropForeign(['ticket_type_id']); + } $table->dropColumn('ticket_type_id'); }); } diff --git a/database/migrations/2023_12_11_011355_add_seat_id_to_tickets.php b/database/migrations/2023_12_11_011355_add_seat_id_to_tickets.php index 6536a999..6062f3f8 100644 --- a/database/migrations/2023_12_11_011355_add_seat_id_to_tickets.php +++ b/database/migrations/2023_12_11_011355_add_seat_id_to_tickets.php @@ -21,7 +21,10 @@ public function up(): void public function down(): void { Schema::table('tickets', function (Blueprint $table) { - $table->dropForeign(['seat_id']); + if (Schema::getConnection()->getDriverName() !== 'sqlite') { + $table->dropForeign(['seat_id']); + } + $table->dropColumn('seat_id'); }); } diff --git a/database/migrations/2023_12_15_144604_add_ticket_id_to_seats.php b/database/migrations/2023_12_15_144604_add_ticket_id_to_seats.php index 27ef49e4..9393f3ab 100644 --- a/database/migrations/2023_12_15_144604_add_ticket_id_to_seats.php +++ b/database/migrations/2023_12_15_144604_add_ticket_id_to_seats.php @@ -1,6 +1,7 @@ foreignId('ticket_id')->after('seating_plan_id')->nullable()->default(null)->constrained()->nullOnDelete(); }); - Schema::table('tickets', function (Blueprint $table) { - $table->dropForeign(['seat_id']); - $table->dropColumn('seat_id'); - }); + + try { + Schema::table('tickets', function (Blueprint $table) { + if (Schema::getConnection()->getDriverName() !== 'sqlite') { + $table->dropForeign(['seat_id']); + } + $table->dropColumn('seat_id'); + }); + } catch (QueryException $ex) { + // Do Nothing + } } /** @@ -25,7 +34,9 @@ public function up(): void public function down(): void { Schema::table('seats', function (Blueprint $table) { - $table->dropForeign(['ticket_id']); + if (Schema::getConnection()->getDriverName() !== 'sqlite') { + $table->dropForeign(['ticket_id']); + } $table->dropColumn('ticket_id'); }); diff --git a/database/migrations/2024_01_03_183324_update_tickets_make_user_id_nullable.php b/database/migrations/2024_01_03_183324_update_tickets_make_user_id_nullable.php index 0883d288..21f0a091 100644 --- a/database/migrations/2024_01_03_183324_update_tickets_make_user_id_nullable.php +++ b/database/migrations/2024_01_03_183324_update_tickets_make_user_id_nullable.php @@ -13,7 +13,9 @@ public function up(): void { Schema::table('tickets', function (Blueprint $table) { - $table->dropForeign('tickets_user_id_foreign'); + if (Schema::getConnection()->getDriverName() !== 'sqlite') { + $table->dropForeign('tickets_user_id_foreign'); + } $table->unsignedBigInteger('user_id')->nullable(true)->default(null)->change(); $table->foreign('user_id')->references('id')->on('users')->cascadeOnDelete(); $table->string('original_email')->nullable()->default(null)->after('external_id'); @@ -26,7 +28,9 @@ public function up(): void public function down(): void { Schema::table('tickets', function (Blueprint $table) { - $table->dropForeign('tickets_user_id_foreign'); + if (Schema::getConnection()->getDriverName() !== 'sqlite') { + $table->dropForeign('tickets_user_id_foreign'); + } $table->unsignedBigInteger('user_id')->nullable(false)->change(); $table->foreign('user_id')->references('id')->on('users')->cascadeOnDelete(); $table->dropColumn('original_email'); diff --git a/docker-compose.yaml b/docker-compose.yaml index e950ab43..75e1e771 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -15,11 +15,9 @@ services: - XDEBUG_SESSION=start - CADDY_SERVER_FRANKENPHP_OPTIONS= - APP_INDEX_FILE=index.php - - OPENTELEMETRY_ENABLED=true depends_on: - redis - db - - collector reverb: build: @@ -31,7 +29,6 @@ services: depends_on: - redis - db - - collector entrypoint: [ "php", "artisan", "reverb:start", "--host=0.0.0.0", "--debug", "--port=80" ] healthcheck: disable: true @@ -48,7 +45,6 @@ services: depends_on: - db - redis - - collector healthcheck: disable: true @@ -64,7 +60,6 @@ services: depends_on: - db - redis - - collector healthcheck: disable: true @@ -100,7 +95,7 @@ services: build: context: . dockerfile: docker/develop/Dockerfile - entrypoint: [ "php", "vendor/bin/phpunit" ] + entrypoint: [ "php", "-d", "memory_limit=512M", "vendor/bin/phpunit" ] volumes: - ./:/app healthcheck: @@ -165,11 +160,6 @@ services: healthcheck: disable: true - collector: - image: otel/opentelemetry-collector-contrib - volumes: - - ./otel-collector-config.yml:/etc/otelcol-contrib/config.yaml - volumes: dbdata: driver: local diff --git a/docker/develop/Dockerfile b/docker/develop/Dockerfile index fd4e1664..ba211f92 100644 --- a/docker/develop/Dockerfile +++ b/docker/develop/Dockerfile @@ -1,15 +1,9 @@ -FROM dunglas/frankenphp:1.5.0-php8.4.5-alpine +FROM ghcr.io/mintopia/php-frankenphp-base:8.4.10 RUN apk add --update nodejs npm && \ - npm install chokidar && \ - install-php-extensions \ - pcntl \ - redis \ - bcmath \ - xdebug \ - pdo \ - pdo_mysql && \ - echo 'memory_limit = 256M' > /usr/local/etc/php/conf.d/memory_limit.ini + npm install -g chokidar && \ + install-php-extensions xdebug && \ + echo 'memory_limit = 512M' > /usr/local/etc/php/conf.d/memory_limit.ini COPY --from=composer:latest /usr/bin/composer /usr/local/bin/ diff --git a/docker/production/Dockerfile b/docker/production/Dockerfile index dc341f1f..71992eff 100644 --- a/docker/production/Dockerfile +++ b/docker/production/Dockerfile @@ -1,12 +1,9 @@ # Use the FrankenPHP image for building/running composer -FROM dunglas/frankenphp:1.5.0-php8.4.5-alpine AS composer +FROM ghcr.io/mintopia/php-frankenphp-base:8.4.10 AS composer WORKDIR /app/ ENV HOME=/tmp -RUN mkdir -p /app && \ - install-php-extensions \ - pcntl \ - redis +RUN mkdir -p /app COPY --from=composer:2.8 /usr/bin/composer /usr/bin/composer COPY . /app/ COPY docker/production/production.env /app/.env @@ -15,37 +12,35 @@ RUN composer install \ --no-dev \ --no-progress \ --optimize-autoloader \ - --prefer-dist + --prefer-dist \ + --ignore-platform-reqs # Use the node23 image to do an npm install -FROM node:23 AS npm +FROM node:24-slim AS npm WORKDIR /app/ ENV HOME=/tmp RUN mkdir -p /app COPY --from=composer /app/ /app +# Update npm to the latest version to patch vulnerabilities +RUN npm install -g npm@latest + RUN npm install --production=false && \ npm run build # Now our final image -FROM dunglas/frankenphp:1.5.0-php8.4.5-alpine +FROM ghcr.io/mintopia/php-frankenphp-base:8.4.10 LABEL org.opencontainers.image.authors="jess@mintopia.net" COPY --from=npm /app /app COPY docker/production/entrypoint.sh /entrypoint.sh -RUN chmod +x /entrypoint.sh +RUN chmod +x /entrypoint.sh && \ + mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" && \ + echo 'memory_limit = 512M' > /usr/local/etc/php/conf.d/memory_limit.ini && \ + echo 'session.upload_progress.enabled = 0' > /usr/local/etc/php/conf.d/session_upload_progress.ini \ COPY docker/Caddyfile / ENTRYPOINT ["/entrypoint.sh"] CMD ["php", "artisan", "octane:frankenphp", "--caddyfile=/Caddyfile", "--admin-host=0.0.0.0", "--port=80"] - -RUN install-php-extensions \ - pcntl \ - redis \ - bcmath \ - pdo \ - pdo_mysql && \ - mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" && \ - echo 'memory_limit = 256M' > /usr/local/etc/php/conf.d/memory_limit.ini diff --git a/docker/production/production.env b/docker/production/production.env index 58e2bab7..1ae85e37 100644 --- a/docker/production/production.env +++ b/docker/production/production.env @@ -35,3 +35,7 @@ VITE_REVERB_PORT=443 VITE_REVERB_SCHEME="https" OCTANE_SERVER=frankenphp + +OTEL_PHP_AUTOLOAD_ENABLED=false +OTEL_PHP_EXCLUDED_URLS="pulse,telescope/.*,horizon/.*,api/v1/ping,_ignition/.*,_debugbar/.*,api/v1/events/.*/seatingplans" +OTEL_EXPORTER_OTLP_PROTOCOL=grpc diff --git a/otel-collector-config.example.yml b/otel-collector-config.example.yml deleted file mode 100644 index 8592a586..00000000 --- a/otel-collector-config.example.yml +++ /dev/null @@ -1,39 +0,0 @@ -receivers: - otlp: - protocols: - grpc: - endpoint: 0.0.0.0:4317 - http: - endpoint: 0.0.0.0:4318 -processors: - batch: - -exporters: - otlp/honeycomb: - endpoint: api.honeycomb.io:443 - headers: - "x-honeycomb-team": apikey - -extensions: - health_check: - endpoint: "0.0.0.0:13133" - pprof: - endpoint: "0.0.0.0:1888" - zpages: - endpoint: "0.0.0.0:55679" - -service: - extensions: [health_check, pprof, zpages] - pipelines: - traces: - receivers: [otlp] - processors: [batch] - exporters: [otlp/honeycomb] - metrics: - receivers: [otlp] - processors: [batch] - exporters: [otlp/honeycomb] - logs: - receivers: [otlp] - processors: [batch] - exporters: [otlp/honeycomb] diff --git a/otel-collector-config.yml b/otel-collector-config.yml deleted file mode 100644 index 766b8ace..00000000 --- a/otel-collector-config.yml +++ /dev/null @@ -1,39 +0,0 @@ -receivers: - otlp: - protocols: - grpc: - endpoint: 0.0.0.0:4317 - http: - endpoint: 0.0.0.0:4318 -processors: - batch: - -exporters: - otlp/honeycomb: - endpoint: api.eu1.honeycomb.io:443 - headers: - "x-honeycomb-team": gc8OcYqNxeoPzjpNkoF3KE - -extensions: - health_check: - endpoint: "0.0.0.0:13133" - pprof: - endpoint: "0.0.0.0:1888" - zpages: - endpoint: "0.0.0.0:55679" - -service: - extensions: [health_check, pprof, zpages] - pipelines: - traces: - receivers: [otlp] - processors: [batch] - exporters: [otlp/honeycomb] - metrics: - receivers: [otlp] - processors: [batch] - exporters: [otlp/honeycomb] - logs: - receivers: [otlp] - processors: [batch] - exporters: [otlp/honeycomb] diff --git a/package-lock.json b/package-lock.json index fd0d3b55..8456ac53 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,9 +1,10 @@ { - "name": "app", + "name": "control", "lockfileVersion": 3, "requires": true, "packages": { "": { + "name": "control", "devDependencies": { "@tabler/core": "^1.0.0-beta20", "autosize": "^6.0.1", @@ -426,10 +427,11 @@ "peer": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.30", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", + "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -569,10 +571,11 @@ } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@types/json-schema": { @@ -593,163 +596,178 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, + "license": "Apache-2.0", "peer": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -758,6 +776,7 @@ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true, + "license": "BSD-3-Clause", "peer": true }, "node_modules/@xtuc/long": { @@ -765,13 +784,15 @@ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true, + "license": "Apache-2.0", "peer": true }, "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, + "license": "MIT", "peer": true, "bin": { "acorn": "bin/acorn" @@ -780,14 +801,18 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "dev": true, + "license": "MIT", "peer": true, + "engines": { + "node": ">=10.13.0" + }, "peerDependencies": { - "acorn": "^8" + "acorn": "^8.14.0" } }, "node_modules/adjust-sourcemap-loader": { @@ -804,30 +829,54 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "license": "MIT", "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, "peerDependencies": { - "ajv": "^6.9.1" + "ajv": "^8.8.2" } }, "node_modules/anymatch": { @@ -847,7 +896,8 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/autosize": { "version": "6.0.1", @@ -856,13 +906,14 @@ "dev": true }, "node_modules/axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", + "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", "dev": true, + "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, @@ -904,21 +955,22 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" } }, "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "version": "4.25.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.3.tgz", + "integrity": "sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==", "dev": true, "funding": [ { @@ -934,12 +986,13 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "peer": true, "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001735", + "electron-to-chromium": "^1.5.204", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -955,10 +1008,24 @@ "dev": true, "peer": true }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/caniuse-lite": { - "version": "1.0.30001565", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001565.tgz", - "integrity": "sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w==", + "version": "1.0.30001735", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001735.tgz", + "integrity": "sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w==", "dev": true, "funding": [ { @@ -974,6 +1041,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "CC-BY-4.0", "peer": true }, "node_modules/chokidar": { @@ -1018,6 +1086,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -1043,15 +1112,32 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/electron-to-chromium": { - "version": "1.4.600", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.600.tgz", - "integrity": "sha512-KD6CWjf1BnQG+NsXuyiTDDT1eV13sKuYsOUioXkQweYTQIbgHkXPry9K7M+7cKtYHnSUPitVaLrXYB1jTkkYrw==", + "version": "1.5.207", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.207.tgz", + "integrity": "sha512-mryFrrL/GXDTmAtIVMVf+eIXM09BBPlO5IQ7lUyKmK8d+A4VpRGG+M3ofoVef6qyF8s60rJei8ymlJxjUA8Faw==", "dev": true, + "license": "ISC", "peer": true }, "node_modules/emojis-list": { @@ -1064,10 +1150,11 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -1077,6 +1164,26 @@ "node": ">=10.13.0" } }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", @@ -1084,6 +1191,35 @@ "dev": true, "peer": true }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/esbuild": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", @@ -1122,10 +1258,11 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -1193,20 +1330,33 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, + "license": "MIT", "peer": true }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause", "peer": true }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -1215,9 +1365,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "dev": true, "funding": [ { @@ -1225,6 +1375,7 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -1235,13 +1386,16 @@ } }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "dev": true, + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { @@ -1262,6 +1416,55 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -1279,13 +1482,28 @@ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true, + "license": "BSD-2-Clause", "peer": true }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, + "license": "ISC", "peer": true }, "node_modules/has-flag": { @@ -1293,11 +1511,54 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" } }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/imask": { "version": "6.6.3", "resolved": "https://registry.npmjs.org/imask/-/imask-6.6.3.tgz", @@ -1351,6 +1612,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -1360,6 +1622,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/node": "*", @@ -1378,10 +1641,11 @@ "peer": true }, "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/json5": { @@ -1460,11 +1724,22 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/mime-db": { @@ -1489,9 +1764,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -1499,6 +1774,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -1513,10 +1789,11 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/normalize-path": { @@ -1529,10 +1806,11 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -1580,16 +1858,6 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/pusher-js": { "version": "8.4.0-rc2", "resolved": "https://registry.npmjs.org/pusher-js/-/pusher-js-8.4.0-rc2.tgz", @@ -1604,6 +1872,7 @@ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "safe-buffer": "^5.1.0" @@ -1627,6 +1896,17 @@ "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", "dev": true }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve-url-loader": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", @@ -1644,10 +1924,11 @@ } }, "node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "version": "3.29.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", + "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", "dev": true, + "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, @@ -1678,6 +1959,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "peer": true }, "node_modules/sass": { @@ -1732,15 +2014,17 @@ } }, "node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 10.13.0" @@ -1751,10 +2035,11 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "randombytes": "^2.1.0" @@ -1794,6 +2079,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "has-flag": "^4.0.0" @@ -1806,24 +2092,26 @@ } }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" } }, "node_modules/terser": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", - "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", + "version": "5.43.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", "dev": true, + "license": "BSD-2-Clause", "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.14.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -1835,17 +2123,18 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -1874,6 +2163,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -1895,9 +2185,9 @@ "peer": true }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "funding": [ { @@ -1913,10 +2203,11 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "peer": true, "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -1925,21 +2216,12 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "peer": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, "node_modules/vite": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", - "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", + "version": "4.5.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.14.tgz", + "integrity": "sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.18.10", "postcss": "^8.4.27", @@ -2001,10 +2283,11 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -2015,36 +2298,38 @@ } }, "node_modules/webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "version": "5.101.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.3.tgz", + "integrity": "sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.3", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", + "schema-utils": "^4.3.2", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" @@ -2063,10 +2348,11 @@ } }, "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=10.13.0" diff --git a/phpcs.xml b/phpcs.xml index dec6f7b0..a083c0dc 100644 --- a/phpcs.xml +++ b/phpcs.xml @@ -1,11 +1,12 @@ - + - PHPCS configuration file. + PSR12 ruleset for application app + tests - - + + diff --git a/phpunit.xml b/phpunit.xml index f112c0c8..57267780 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,8 +1,9 @@ @@ -17,15 +18,23 @@ app + + + + + + + - - - - - - - - - + + + + + + + + + + diff --git a/public/vendor/telescope/app.js b/public/vendor/telescope/app.js index 77877492..e5d173af 100644 --- a/public/vendor/telescope/app.js +++ b/public/vendor/telescope/app.js @@ -1,2 +1,2 @@ /*! For license information please see app.js.LICENSE.txt */ -(()=>{var t,e={2465:(t,e,n)=>{"use strict";var o=Object.freeze({}),p=Array.isArray;function M(t){return null==t}function b(t){return null!=t}function c(t){return!0===t}function r(t){return"string"==typeof t||"number"==typeof t||"symbol"==typeof t||"boolean"==typeof t}function z(t){return"function"==typeof t}function a(t){return null!==t&&"object"==typeof t}var i=Object.prototype.toString;function O(t){return"[object Object]"===i.call(t)}function s(t){return"[object RegExp]"===i.call(t)}function A(t){var e=parseFloat(String(t));return e>=0&&Math.floor(e)===e&&isFinite(t)}function u(t){return b(t)&&"function"==typeof t.then&&"function"==typeof t.catch}function l(t){return null==t?"":Array.isArray(t)||O(t)&&t.toString===i?JSON.stringify(t,null,2):String(t)}function d(t){var e=parseFloat(t);return isNaN(e)?t:e}function f(t,e){for(var n=Object.create(null),o=t.split(","),p=0;p-1)return t.splice(o,1)}}var v=Object.prototype.hasOwnProperty;function R(t,e){return v.call(t,e)}function m(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}var g=/-(\w)/g,L=m((function(t){return t.replace(g,(function(t,e){return e?e.toUpperCase():""}))})),y=m((function(t){return t.charAt(0).toUpperCase()+t.slice(1)})),_=/\B([A-Z])/g,N=m((function(t){return t.replace(_,"-$1").toLowerCase()}));var E=Function.prototype.bind?function(t,e){return t.bind(e)}:function(t,e){function n(n){var o=arguments.length;return o?o>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n};function T(t,e){e=e||0;for(var n=t.length-e,o=new Array(n);n--;)o[n]=t[n+e];return o}function B(t,e){for(var n in e)t[n]=e[n];return t}function C(t){for(var e={},n=0;n0,tt=Q&&Q.indexOf("edge/")>0;Q&&Q.indexOf("android");var et=Q&&/iphone|ipad|ipod|ios/.test(Q);Q&&/chrome\/\d+/.test(Q),Q&&/phantomjs/.test(Q);var nt,ot=Q&&Q.match(/firefox\/(\d+)/),pt={}.watch,Mt=!1;if(K)try{var bt={};Object.defineProperty(bt,"passive",{get:function(){Mt=!0}}),window.addEventListener("test-passive",null,bt)}catch(t){}var ct=function(){return void 0===nt&&(nt=!K&&void 0!==n.g&&(n.g.process&&"server"===n.g.process.env.VUE_ENV)),nt},rt=K&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function zt(t){return"function"==typeof t&&/native code/.test(t.toString())}var at,it="undefined"!=typeof Symbol&&zt(Symbol)&&"undefined"!=typeof Reflect&&zt(Reflect.ownKeys);at="undefined"!=typeof Set&&zt(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var Ot=null;function st(t){void 0===t&&(t=null),t||Ot&&Ot._scope.off(),Ot=t,t&&t._scope.on()}var At=function(){function t(t,e,n,o,p,M,b,c){this.tag=t,this.data=e,this.children=n,this.text=o,this.elm=p,this.ns=void 0,this.context=M,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=e&&e.key,this.componentOptions=b,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=c,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1}return Object.defineProperty(t.prototype,"child",{get:function(){return this.componentInstance},enumerable:!1,configurable:!0}),t}(),ut=function(t){void 0===t&&(t="");var e=new At;return e.text=t,e.isComment=!0,e};function lt(t){return new At(void 0,void 0,void 0,String(t))}function dt(t){var e=new At(t.tag,t.data,t.children&&t.children.slice(),t.text,t.elm,t.context,t.componentOptions,t.asyncFactory);return e.ns=t.ns,e.isStatic=t.isStatic,e.key=t.key,e.isComment=t.isComment,e.fnContext=t.fnContext,e.fnOptions=t.fnOptions,e.fnScopeId=t.fnScopeId,e.asyncMeta=t.asyncMeta,e.isCloned=!0,e}var ft=0,qt=[],ht=function(){for(var t=0;t0&&(Vt((o=Kt(o,"".concat(e||"","_").concat(n)))[0])&&Vt(a)&&(i[z]=lt(a.text+o[0].text),o.shift()),i.push.apply(i,o)):r(o)?Vt(a)?i[z]=lt(a.text+o):""!==o&&i.push(lt(o)):Vt(o)&&Vt(a)?i[z]=lt(a.text+o.text):(c(t._isVList)&&b(o.tag)&&M(o.key)&&b(e)&&(o.key="__vlist".concat(e,"_").concat(n,"__")),i.push(o)));return i}var Qt=1,Jt=2;function Zt(t,e,n,o,M,i){return(p(n)||r(n))&&(M=o,o=n,n=void 0),c(i)&&(M=Jt),function(t,e,n,o,M){if(b(n)&&b(n.__ob__))return ut();b(n)&&b(n.is)&&(e=n.is);if(!e)return ut();0;p(o)&&z(o[0])&&((n=n||{}).scopedSlots={default:o[0]},o.length=0);M===Jt?o=$t(o):M===Qt&&(o=function(t){for(var e=0;e0,c=e?!!e.$stable:!b,r=e&&e.$key;if(e){if(e._normalized)return e._normalized;if(c&&p&&p!==o&&r===p.$key&&!b&&!p.$hasNormal)return p;for(var z in M={},e)e[z]&&"$"!==z[0]&&(M[z]=he(t,n,z,e[z]))}else M={};for(var a in n)a in M||(M[a]=We(n,a));return e&&Object.isExtensible(e)&&(e._normalized=M),Y(M,"$stable",c),Y(M,"$key",r),Y(M,"$hasNormal",b),M}function he(t,e,n,o){var M=function(){var e=Ot;st(t);var n=arguments.length?o.apply(null,arguments):o({}),M=(n=n&&"object"==typeof n&&!p(n)?[n]:$t(n))&&n[0];return st(e),n&&(!M||1===n.length&&M.isComment&&!fe(M))?void 0:n};return o.proxy&&Object.defineProperty(e,n,{get:M,enumerable:!0,configurable:!0}),M}function We(t,e){return function(){return t[e]}}function ve(t){return{get attrs(){if(!t._attrsProxy){var e=t._attrsProxy={};Y(e,"_v_attr_proxy",!0),Re(e,t.$attrs,o,t,"$attrs")}return t._attrsProxy},get listeners(){t._listenersProxy||Re(t._listenersProxy={},t.$listeners,o,t,"$listeners");return t._listenersProxy},get slots(){return function(t){t._slotsProxy||ge(t._slotsProxy={},t.$scopedSlots);return t._slotsProxy}(t)},emit:E(t.$emit,t),expose:function(e){e&&Object.keys(e).forEach((function(n){return Ut(t,e,n)}))}}}function Re(t,e,n,o,p){var M=!1;for(var b in e)b in t?e[b]!==n[b]&&(M=!0):(M=!0,me(t,b,o,p));for(var b in t)b in e||(M=!0,delete t[b]);return M}function me(t,e,n,o){Object.defineProperty(t,e,{enumerable:!0,configurable:!0,get:function(){return n[o][e]}})}function ge(t,e){for(var n in e)t[n]=e[n];for(var n in t)n in e||delete t[n]}var Le,ye=null;function _e(t,e){return(t.__esModule||it&&"Module"===t[Symbol.toStringTag])&&(t=t.default),a(t)?e.extend(t):t}function Ne(t){if(p(t))for(var e=0;edocument.createEvent("Event").timeStamp&&(Ye=function(){return $e.now()})}var Ve=function(t,e){if(t.post){if(!e.post)return 1}else if(e.post)return-1;return t.id-e.id};function Ke(){var t,e;for(Ge=Ye(),He=!0,De.sort(Ve),Fe=0;FeFe&&De[n].id>t.id;)n--;De.splice(n+1,0,t)}else De.push(t);je||(je=!0,ln(Ke))}}var Je="watcher";"".concat(Je," callback"),"".concat(Je," getter"),"".concat(Je," cleanup");var Ze;var tn=function(){function t(t){void 0===t&&(t=!1),this.detached=t,this.active=!0,this.effects=[],this.cleanups=[],this.parent=Ze,!t&&Ze&&(this.index=(Ze.scopes||(Ze.scopes=[])).push(this)-1)}return t.prototype.run=function(t){if(this.active){var e=Ze;try{return Ze=this,t()}finally{Ze=e}}else 0},t.prototype.on=function(){Ze=this},t.prototype.off=function(){Ze=this.parent},t.prototype.stop=function(t){if(this.active){var e=void 0,n=void 0;for(e=0,n=this.effects.length;e-1)if(M&&!R(p,"default"))b=!1;else if(""===b||b===N(t)){var r=eo(String,p.type);(r<0||c-1:"string"==typeof t?t.split(",").indexOf(e)>-1:!!s(t)&&t.test(e)}function bo(t,e){var n=t.cache,o=t.keys,p=t._vnode;for(var M in n){var b=n[M];if(b){var c=b.name;c&&!e(c)&&co(n,M,o,p)}}}function co(t,e,n,o){var p=t[e];!p||o&&p.tag===o.tag||p.componentInstance.$destroy(),t[e]=null,W(n,e)}!function(t){t.prototype._init=function(t){var e=this;e._uid=Bn++,e._isVue=!0,e.__v_skip=!0,e._scope=new tn(!0),e._scope._vm=!0,t&&t._isComponent?function(t,e){var n=t.$options=Object.create(t.constructor.options),o=e._parentVnode;n.parent=e.parent,n._parentVnode=o;var p=o.componentOptions;n.propsData=p.propsData,n._parentListeners=p.listeners,n._renderChildren=p.children,n._componentTag=p.tag,e.render&&(n.render=e.render,n.staticRenderFns=e.staticRenderFns)}(e,t):e.$options=Vn(Cn(e.constructor),t||{},e),e._renderProxy=e,e._self=e,function(t){var e=t.$options,n=e.parent;if(n&&!e.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(t)}t.$parent=n,t.$root=n?n.$root:t,t.$children=[],t.$refs={},t._provided=n?n._provided:Object.create(null),t._watcher=null,t._inactive=null,t._directInactive=!1,t._isMounted=!1,t._isDestroyed=!1,t._isBeingDestroyed=!1}(e),function(t){t._events=Object.create(null),t._hasHookEvent=!1;var e=t.$options._parentListeners;e&&Ce(t,e)}(e),function(t){t._vnode=null,t._staticTrees=null;var e=t.$options,n=t.$vnode=e._parentVnode,p=n&&n.context;t.$slots=le(e._renderChildren,p),t.$scopedSlots=n?qe(t.$parent,n.data.scopedSlots,t.$slots):o,t._c=function(e,n,o,p){return Zt(t,e,n,o,p,!1)},t.$createElement=function(e,n,o,p){return Zt(t,e,n,o,p,!0)};var M=n&&n.data;wt(t,"$attrs",M&&M.attrs||o,null,!0),wt(t,"$listeners",e._parentListeners||o,null,!0)}(e),Ie(e,"beforeCreate",void 0,!1),function(t){var e=Tn(t.$options.inject,t);e&&(Et(!1),Object.keys(e).forEach((function(n){wt(t,n,e[n])})),Et(!0))}(e),gn(e),function(t){var e=t.$options.provide;if(e){var n=z(e)?e.call(t):e;if(!a(n))return;for(var o=en(t),p=it?Reflect.ownKeys(n):Object.keys(n),M=0;M1?T(n):n;for(var o=T(arguments,1),p='event handler for "'.concat(t,'"'),M=0,b=n.length;MparseInt(this.max)&&co(e,n[0],n,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var t in this.cache)co(this.cache,t,this.keys)},mounted:function(){var t=this;this.cacheVNode(),this.$watch("include",(function(e){bo(t,(function(t){return Mo(e,t)}))})),this.$watch("exclude",(function(e){bo(t,(function(t){return!Mo(e,t)}))}))},updated:function(){this.cacheVNode()},render:function(){var t=this.$slots.default,e=Ne(t),n=e&&e.componentOptions;if(n){var o=po(n),p=this.include,M=this.exclude;if(p&&(!o||!Mo(p,o))||M&&o&&Mo(M,o))return e;var b=this.cache,c=this.keys,r=null==e.key?n.Ctor.cid+(n.tag?"::".concat(n.tag):""):e.key;b[r]?(e.componentInstance=b[r].componentInstance,W(c,r),c.push(r)):(this.vnodeToCache=e,this.keyToCache=r),e.data.keepAlive=!0}return e||t&&t[0]}},ao={KeepAlive:zo};!function(t){var e={get:function(){return H}};Object.defineProperty(t,"config",e),t.util={warn:Un,extend:B,mergeOptions:Vn,defineReactive:wt},t.set=St,t.delete=Xt,t.nextTick=ln,t.observable=function(t){return Ct(t),t},t.options=Object.create(null),U.forEach((function(e){t.options[e+"s"]=Object.create(null)})),t.options._base=t,B(t.options.components,ao),function(t){t.use=function(t){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var n=T(arguments,1);return n.unshift(this),z(t.install)?t.install.apply(t,n):z(t)&&t.apply(null,n),e.push(t),this}}(t),function(t){t.mixin=function(t){return this.options=Vn(this.options,t),this}}(t),oo(t),function(t){U.forEach((function(e){t[e]=function(t,n){return n?("component"===e&&O(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),"directive"===e&&z(n)&&(n={bind:n,update:n}),this.options[e+"s"][t]=n,n):this.options[e+"s"][t]}}))}(t)}(no),Object.defineProperty(no.prototype,"$isServer",{get:ct}),Object.defineProperty(no.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(no,"FunctionalRenderContext",{value:wn}),no.version="2.7.14";var io=f("style,class"),Oo=f("input,textarea,option,select,progress"),so=function(t,e,n){return"value"===n&&Oo(t)&&"button"!==e||"selected"===n&&"option"===t||"checked"===n&&"input"===t||"muted"===n&&"video"===t},Ao=f("contenteditable,draggable,spellcheck"),uo=f("events,caret,typing,plaintext-only"),lo=function(t,e){return vo(e)||"false"===e?"false":"contenteditable"===t&&uo(e)?e:"true"},fo=f("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),qo="http://www.w3.org/1999/xlink",ho=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},Wo=function(t){return ho(t)?t.slice(6,t.length):""},vo=function(t){return null==t||!1===t};function Ro(t){for(var e=t.data,n=t,o=t;b(o.componentInstance);)(o=o.componentInstance._vnode)&&o.data&&(e=mo(o.data,e));for(;b(n=n.parent);)n&&n.data&&(e=mo(e,n.data));return function(t,e){if(b(t)||b(e))return go(t,Lo(e));return""}(e.staticClass,e.class)}function mo(t,e){return{staticClass:go(t.staticClass,e.staticClass),class:b(t.class)?[t.class,e.class]:e.class}}function go(t,e){return t?e?t+" "+e:t:e||""}function Lo(t){return Array.isArray(t)?function(t){for(var e,n="",o=0,p=t.length;o-1?Jo(t,e,n):fo(e)?vo(n)?t.removeAttribute(e):(n="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,n)):Ao(e)?t.setAttribute(e,lo(e,n)):ho(e)?vo(n)?t.removeAttributeNS(qo,Wo(e)):t.setAttributeNS(qo,e,n):Jo(t,e,n)}function Jo(t,e,n){if(vo(n))t.removeAttribute(e);else{if(J&&!Z&&"TEXTAREA"===t.tagName&&"placeholder"===e&&""!==n&&!t.__ieph){var o=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",o)};t.addEventListener("input",o),t.__ieph=!0}t.setAttribute(e,n)}}var Zo={create:Ko,update:Ko};function tp(t,e){var n=e.elm,o=e.data,p=t.data;if(!(M(o.staticClass)&&M(o.class)&&(M(p)||M(p.staticClass)&&M(p.class)))){var c=Ro(e),r=n._transitionClasses;b(r)&&(c=go(c,Lo(r))),c!==n._prevClass&&(n.setAttribute("class",c),n._prevClass=c)}}var ep,np,op,pp,Mp,bp,cp={create:tp,update:tp},rp=/[\w).+\-_$\]]/;function zp(t){var e,n,o,p,M,b=!1,c=!1,r=!1,z=!1,a=0,i=0,O=0,s=0;for(o=0;o=0&&" "===(u=t.charAt(A));A--);u&&rp.test(u)||(z=!0)}}else void 0===p?(s=o+1,p=t.slice(0,o).trim()):l();function l(){(M||(M=[])).push(t.slice(s,o).trim()),s=o+1}if(void 0===p?p=t.slice(0,o).trim():0!==s&&l(),M)for(o=0;o-1?{exp:t.slice(0,pp),key:'"'+t.slice(pp+1)+'"'}:{exp:t,key:null};np=t,pp=Mp=bp=0;for(;!Lp();)yp(op=gp())?Np(op):91===op&&_p(op);return{exp:t.slice(0,Mp),key:t.slice(Mp+1,bp)}}(t);return null===n.key?"".concat(t,"=").concat(e):"$set(".concat(n.exp,", ").concat(n.key,", ").concat(e,")")}function gp(){return np.charCodeAt(++pp)}function Lp(){return pp>=ep}function yp(t){return 34===t||39===t}function _p(t){var e=1;for(Mp=pp;!Lp();)if(yp(t=gp()))Np(t);else if(91===t&&e++,93===t&&e--,0===e){bp=pp;break}}function Np(t){for(var e=t;!Lp()&&(t=gp())!==e;);}var Ep,Tp="__r",Bp="__c";function Cp(t,e,n){var o=Ep;return function p(){null!==e.apply(null,arguments)&&Xp(t,p,n,o)}}var wp=cn&&!(ot&&Number(ot[1])<=53);function Sp(t,e,n,o){if(wp){var p=Ge,M=e;e=M._wrapper=function(t){if(t.target===t.currentTarget||t.timeStamp>=p||t.timeStamp<=0||t.target.ownerDocument!==document)return M.apply(this,arguments)}}Ep.addEventListener(t,e,Mt?{capture:n,passive:o}:n)}function Xp(t,e,n,o){(o||Ep).removeEventListener(t,e._wrapper||e,n)}function xp(t,e){if(!M(t.data.on)||!M(e.data.on)){var n=e.data.on||{},o=t.data.on||{};Ep=e.elm||t.elm,function(t){if(b(t[Tp])){var e=J?"change":"input";t[e]=[].concat(t[Tp],t[e]||[]),delete t[Tp]}b(t[Bp])&&(t.change=[].concat(t[Bp],t.change||[]),delete t[Bp])}(n),Ft(n,o,Sp,Xp,Cp,e.context),Ep=void 0}}var kp,Ip={create:xp,update:xp,destroy:function(t){return xp(t,Io)}};function Dp(t,e){if(!M(t.data.domProps)||!M(e.data.domProps)){var n,o,p=e.elm,r=t.data.domProps||{},z=e.data.domProps||{};for(n in(b(z.__ob__)||c(z._v_attr_proxy))&&(z=e.data.domProps=B({},z)),r)n in z||(p[n]="");for(n in z){if(o=z[n],"textContent"===n||"innerHTML"===n){if(e.children&&(e.children.length=0),o===r[n])continue;1===p.childNodes.length&&p.removeChild(p.childNodes[0])}if("value"===n&&"PROGRESS"!==p.tagName){p._value=o;var a=M(o)?"":String(o);Pp(p,a)&&(p.value=a)}else if("innerHTML"===n&&No(p.tagName)&&M(p.innerHTML)){(kp=kp||document.createElement("div")).innerHTML="".concat(o,"");for(var i=kp.firstChild;p.firstChild;)p.removeChild(p.firstChild);for(;i.firstChild;)p.appendChild(i.firstChild)}else if(o!==r[n])try{p[n]=o}catch(t){}}}}function Pp(t,e){return!t.composing&&("OPTION"===t.tagName||function(t,e){var n=!0;try{n=document.activeElement!==t}catch(t){}return n&&t.value!==e}(t,e)||function(t,e){var n=t.value,o=t._vModifiers;if(b(o)){if(o.number)return d(n)!==d(e);if(o.trim)return n.trim()!==e.trim()}return n!==e}(t,e))}var Up={create:Dp,update:Dp},jp=m((function(t){var e={},n=/:(.+)/;return t.split(/;(?![^(]*\))/g).forEach((function(t){if(t){var o=t.split(n);o.length>1&&(e[o[0].trim()]=o[1].trim())}})),e}));function Hp(t){var e=Fp(t.style);return t.staticStyle?B(t.staticStyle,e):e}function Fp(t){return Array.isArray(t)?C(t):"string"==typeof t?jp(t):t}var Gp,Yp=/^--/,$p=/\s*!important$/,Vp=function(t,e,n){if(Yp.test(e))t.style.setProperty(e,n);else if($p.test(n))t.style.setProperty(N(e),n.replace($p,""),"important");else{var o=Qp(e);if(Array.isArray(n))for(var p=0,M=n.length;p-1?e.split(tM).forEach((function(e){return t.classList.add(e)})):t.classList.add(e);else{var n=" ".concat(t.getAttribute("class")||""," ");n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function nM(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(tM).forEach((function(e){return t.classList.remove(e)})):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{for(var n=" ".concat(t.getAttribute("class")||""," "),o=" "+e+" ";n.indexOf(o)>=0;)n=n.replace(o," ");(n=n.trim())?t.setAttribute("class",n):t.removeAttribute("class")}}function oM(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&B(e,pM(t.name||"v")),B(e,t),e}return"string"==typeof t?pM(t):void 0}}var pM=m((function(t){return{enterClass:"".concat(t,"-enter"),enterToClass:"".concat(t,"-enter-to"),enterActiveClass:"".concat(t,"-enter-active"),leaveClass:"".concat(t,"-leave"),leaveToClass:"".concat(t,"-leave-to"),leaveActiveClass:"".concat(t,"-leave-active")}})),MM=K&&!Z,bM="transition",cM="animation",rM="transition",zM="transitionend",aM="animation",iM="animationend";MM&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(rM="WebkitTransition",zM="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(aM="WebkitAnimation",iM="webkitAnimationEnd"));var OM=K?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(t){return t()};function sM(t){OM((function(){OM(t)}))}function AM(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),eM(t,e))}function uM(t,e){t._transitionClasses&&W(t._transitionClasses,e),nM(t,e)}function lM(t,e,n){var o=fM(t,e),p=o.type,M=o.timeout,b=o.propCount;if(!p)return n();var c=p===bM?zM:iM,r=0,z=function(){t.removeEventListener(c,a),n()},a=function(e){e.target===t&&++r>=b&&z()};setTimeout((function(){r0&&(n=bM,a=b,i=M.length):e===cM?z>0&&(n=cM,a=z,i=r.length):i=(n=(a=Math.max(b,z))>0?b>z?bM:cM:null)?n===bM?M.length:r.length:0,{type:n,timeout:a,propCount:i,hasTransform:n===bM&&dM.test(o[rM+"Property"])}}function qM(t,e){for(;t.length1}function gM(t,e){!0!==e.data.show&&WM(e)}var LM=function(t){var e,n,o={},z=t.modules,a=t.nodeOps;for(e=0;eA?h(t,M(n[d+1])?null:n[d+1].elm,n,s,d,o):s>d&&v(e,i,A)}(i,u,d,n,z):b(d)?(b(t.text)&&a.setTextContent(i,""),h(i,null,d,0,d.length-1,n)):b(u)?v(u,0,u.length-1):b(t.text)&&a.setTextContent(i,""):t.text!==e.text&&a.setTextContent(i,e.text),b(A)&&b(s=A.hook)&&b(s=s.postpatch)&&s(t,e)}}}function L(t,e,n){if(c(n)&&b(t.parent))t.parent.data.pendingInsert=e;else for(var o=0;o-1,b.selected!==M&&(b.selected=M);else if(x(TM(b),o))return void(t.selectedIndex!==c&&(t.selectedIndex=c));p||(t.selectedIndex=-1)}}function EM(t,e){return e.every((function(e){return!x(e,t)}))}function TM(t){return"_value"in t?t._value:t.value}function BM(t){t.target.composing=!0}function CM(t){t.target.composing&&(t.target.composing=!1,wM(t.target,"input"))}function wM(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function SM(t){return!t.componentInstance||t.data&&t.data.transition?t:SM(t.componentInstance._vnode)}var XM={bind:function(t,e,n){var o=e.value,p=(n=SM(n)).data&&n.data.transition,M=t.__vOriginalDisplay="none"===t.style.display?"":t.style.display;o&&p?(n.data.show=!0,WM(n,(function(){t.style.display=M}))):t.style.display=o?M:"none"},update:function(t,e,n){var o=e.value;!o!=!e.oldValue&&((n=SM(n)).data&&n.data.transition?(n.data.show=!0,o?WM(n,(function(){t.style.display=t.__vOriginalDisplay})):vM(n,(function(){t.style.display="none"}))):t.style.display=o?t.__vOriginalDisplay:"none")},unbind:function(t,e,n,o,p){p||(t.style.display=t.__vOriginalDisplay)}},xM={model:yM,show:XM},kM={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function IM(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?IM(Ne(e.children)):t}function DM(t){var e={},n=t.$options;for(var o in n.propsData)e[o]=t[o];var p=n._parentListeners;for(var o in p)e[L(o)]=p[o];return e}function PM(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}var UM=function(t){return t.tag||fe(t)},jM=function(t){return"show"===t.name},HM={name:"transition",props:kM,abstract:!0,render:function(t){var e=this,n=this.$slots.default;if(n&&(n=n.filter(UM)).length){0;var o=this.mode;0;var p=n[0];if(function(t){for(;t=t.parent;)if(t.data.transition)return!0}(this.$vnode))return p;var M=IM(p);if(!M)return p;if(this._leaving)return PM(t,p);var b="__transition-".concat(this._uid,"-");M.key=null==M.key?M.isComment?b+"comment":b+M.tag:r(M.key)?0===String(M.key).indexOf(b)?M.key:b+M.key:M.key;var c=(M.data||(M.data={})).transition=DM(this),z=this._vnode,a=IM(z);if(M.data.directives&&M.data.directives.some(jM)&&(M.data.show=!0),a&&a.data&&!function(t,e){return e.key===t.key&&e.tag===t.tag}(M,a)&&!fe(a)&&(!a.componentInstance||!a.componentInstance._vnode.isComment)){var i=a.data.transition=B({},c);if("out-in"===o)return this._leaving=!0,Gt(i,"afterLeave",(function(){e._leaving=!1,e.$forceUpdate()})),PM(t,p);if("in-out"===o){if(fe(M))return z;var O,s=function(){O()};Gt(c,"afterEnter",s),Gt(c,"enterCancelled",s),Gt(i,"delayLeave",(function(t){O=t}))}}return p}}},FM=B({tag:String,moveClass:String},kM);delete FM.mode;var GM={props:FM,beforeMount:function(){var t=this,e=this._update;this._update=function(n,o){var p=Se(t);t.__patch__(t._vnode,t.kept,!1,!0),t._vnode=t.kept,p(),e.call(t,n,o)}},render:function(t){for(var e=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),o=this.prevChildren=this.children,p=this.$slots.default||[],M=this.children=[],b=DM(this),c=0;c-1?Bo[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:Bo[t]=/HTMLUnknownElement/.test(e.toString())},B(no.options.directives,xM),B(no.options.components,KM),no.prototype.__patch__=K?LM:w,no.prototype.$mount=function(t,e){return function(t,e,n){var o;t.$el=e,t.$options.render||(t.$options.render=ut),Ie(t,"beforeMount"),o=function(){t._update(t._render(),n)},new vn(t,o,w,{before:function(){t._isMounted&&!t._isDestroyed&&Ie(t,"beforeUpdate")}},!0),n=!1;var p=t._preWatchers;if(p)for(var M=0;M\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,rb=/^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+?\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,zb="[a-zA-Z_][\\-\\.0-9_a-zA-Z".concat(F.source,"]*"),ab="((?:".concat(zb,"\\:)?").concat(zb,")"),ib=new RegExp("^<".concat(ab)),Ob=/^\s*(\/?)>/,sb=new RegExp("^<\\/".concat(ab,"[^>]*>")),Ab=/^]+>/i,ub=/^",""":'"',"&":"&"," ":"\n"," ":"\t","'":"'"},hb=/&(?:lt|gt|quot|amp|#39);/g,Wb=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,vb=f("pre,textarea",!0),Rb=function(t,e){return t&&vb(t)&&"\n"===e[0]};function mb(t,e){var n=e?Wb:hb;return t.replace(n,(function(t){return qb[t]}))}function gb(t,e){for(var n,o,p=[],M=e.expectHTML,b=e.isUnaryTag||S,c=e.canBeLeftOpenTag||S,r=0,z=function(){if(n=t,o&&db(o)){var z=0,O=o.toLowerCase(),s=fb[O]||(fb[O]=new RegExp("([\\s\\S]*?)(]*>)","i"));v=t.replace(s,(function(t,n,o){return z=o.length,db(O)||"noscript"===O||(n=n.replace(//g,"$1").replace(//g,"$1")),Rb(O,n)&&(n=n.slice(1)),e.chars&&e.chars(n),""}));r+=t.length-v.length,t=v,i(O,r-z,r)}else{var A=t.indexOf("<");if(0===A){if(ub.test(t)){var u=t.indexOf("--\x3e");if(u>=0)return e.shouldKeepComment&&e.comment&&e.comment(t.substring(4,u),r,r+u+3),a(u+3),"continue"}if(lb.test(t)){var l=t.indexOf("]>");if(l>=0)return a(l+2),"continue"}var d=t.match(Ab);if(d)return a(d[0].length),"continue";var f=t.match(sb);if(f){var q=r;return a(f[0].length),i(f[1],q,r),"continue"}var h=function(){var e=t.match(ib);if(e){var n={tagName:e[1],attrs:[],start:r};a(e[0].length);for(var o=void 0,p=void 0;!(o=t.match(Ob))&&(p=t.match(rb)||t.match(cb));)p.start=r,a(p[0].length),p.end=r,n.attrs.push(p);if(o)return n.unarySlash=o[1],a(o[0].length),n.end=r,n}}();if(h)return function(t){var n=t.tagName,r=t.unarySlash;M&&("p"===o&&bb(n)&&i(o),c(n)&&o===n&&i(n));for(var z=b(n)||!!r,a=t.attrs.length,O=new Array(a),s=0;s=0){for(v=t.slice(A);!(sb.test(v)||ib.test(v)||ub.test(v)||lb.test(v)||(R=v.indexOf("<",1))<0);)A+=R,v=t.slice(A);W=t.substring(0,A)}A<0&&(W=t),W&&a(W.length),e.chars&&W&&e.chars(W,r-W.length,r)}if(t===n)return e.chars&&e.chars(t),"break"};t;){if("break"===z())break}function a(e){r+=e,t=t.substring(e)}function i(t,n,M){var b,c;if(null==n&&(n=r),null==M&&(M=r),t)for(c=t.toLowerCase(),b=p.length-1;b>=0&&p[b].lowerCasedTag!==c;b--);else b=0;if(b>=0){for(var z=p.length-1;z>=b;z--)e.end&&e.end(p[z].tag,n,M);p.length=b,o=b&&p[b-1].tag}else"br"===c?e.start&&e.start(t,[],!0,n,M):"p"===c&&(e.start&&e.start(t,[],!1,n,M),e.end&&e.end(t,n,M))}i()}var Lb,yb,_b,Nb,Eb,Tb,Bb,Cb,wb=/^@|^v-on:/,Sb=/^v-|^@|^:|^#/,Xb=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,xb=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,kb=/^\(|\)$/g,Ib=/^\[.*\]$/,Db=/:(.*)$/,Pb=/^:|^\.|^v-bind:/,Ub=/\.[^.\]]+(?=[^\]]*$)/g,jb=/^v-slot(:|$)|^#/,Hb=/[\r\n]/,Fb=/[ \f\t\r\n]+/g,Gb=m(ob),Yb="_empty_";function $b(t,e,n){return{type:1,tag:t,attrsList:e,attrsMap:ec(e),rawAttrsMap:{},parent:n,children:[]}}function Vb(t,e){Lb=e.warn||ip,Tb=e.isPreTag||S,Bb=e.mustUseProp||S,Cb=e.getTagNamespace||S;var n=e.isReservedTag||S;_b=Op(e.modules,"transformNode"),Nb=Op(e.modules,"preTransformNode"),Eb=Op(e.modules,"postTransformNode"),yb=e.delimiters;var o,p,M=[],b=!1!==e.preserveWhitespace,c=e.whitespace,r=!1,z=!1;function a(t){if(i(t),r||t.processed||(t=Kb(t,e)),M.length||t===o||o.if&&(t.elseif||t.else)&&Jb(o,{exp:t.elseif,block:t}),p&&!t.forbidden)if(t.elseif||t.else)b=t,c=function(t){for(var e=t.length;e--;){if(1===t[e].type)return t[e];t.pop()}}(p.children),c&&c.if&&Jb(c,{exp:b.elseif,block:b});else{if(t.slotScope){var n=t.slotTarget||'"default"';(p.scopedSlots||(p.scopedSlots={}))[n]=t}p.children.push(t),t.parent=p}var b,c;t.children=t.children.filter((function(t){return!t.slotScope})),i(t),t.pre&&(r=!1),Tb(t.tag)&&(z=!1);for(var a=0;ar&&(c.push(M=t.slice(r,p)),b.push(JSON.stringify(M)));var z=zp(o[1].trim());b.push("_s(".concat(z,")")),c.push({"@binding":z}),r=p+o[0].length}return r-1")+("true"===M?":(".concat(e,")"):":_q(".concat(e,",").concat(M,")"))),fp(t,"change","var $$a=".concat(e,",")+"$$el=$event.target,"+"$$c=$$el.checked?(".concat(M,"):(").concat(b,");")+"if(Array.isArray($$a)){"+"var $$v=".concat(o?"_n("+p+")":p,",")+"$$i=_i($$a,$$v);"+"if($$el.checked){$$i<0&&(".concat(mp(e,"$$a.concat([$$v])"),")}")+"else{$$i>-1&&(".concat(mp(e,"$$a.slice(0,$$i).concat($$a.slice($$i+1))"),")}")+"}else{".concat(mp(e,"$$c"),"}"),null,!0)}(t,o,p);else if("input"===M&&"radio"===b)!function(t,e,n){var o=n&&n.number,p=qp(t,"value")||"null";p=o?"_n(".concat(p,")"):p,sp(t,"checked","_q(".concat(e,",").concat(p,")")),fp(t,"change",mp(e,p),null,!0)}(t,o,p);else if("input"===M||"textarea"===M)!function(t,e,n){var o=t.attrsMap.type;0;var p=n||{},M=p.lazy,b=p.number,c=p.trim,r=!M&&"range"!==o,z=M?"change":"range"===o?Tp:"input",a="$event.target.value";c&&(a="$event.target.value.trim()");b&&(a="_n(".concat(a,")"));var i=mp(e,a);r&&(i="if($event.target.composing)return;".concat(i));sp(t,"value","(".concat(e,")")),fp(t,z,i,null,!0),(c||b)&&fp(t,"blur","$forceUpdate()")}(t,o,p);else{if(!H.isReservedTag(M))return Rp(t,o,p),!1}return!0},text:function(t,e){e.value&&sp(t,"textContent","_s(".concat(e.value,")"),e)},html:function(t,e){e.value&&sp(t,"innerHTML","_s(".concat(e.value,")"),e)}},ac={expectHTML:!0,modules:bc,directives:zc,isPreTag:function(t){return"pre"===t},isUnaryTag:pb,mustUseProp:so,canBeLeftOpenTag:Mb,isReservedTag:Eo,getTagNamespace:To,staticKeys:function(t){return t.reduce((function(t,e){return t.concat(e.staticKeys||[])}),[]).join(",")}(bc)},ic=m((function(t){return f("type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap"+(t?","+t:""))}));function Oc(t,e){t&&(cc=ic(e.staticKeys||""),rc=e.isReservedTag||S,sc(t),Ac(t,!1))}function sc(t){if(t.static=function(t){if(2===t.type)return!1;if(3===t.type)return!0;return!(!t.pre&&(t.hasBindings||t.if||t.for||q(t.tag)||!rc(t.tag)||function(t){for(;t.parent;){if("template"!==(t=t.parent).tag)return!1;if(t.for)return!0}return!1}(t)||!Object.keys(t).every(cc)))}(t),1===t.type){if(!rc(t.tag)&&"slot"!==t.tag&&null==t.attrsMap["inline-template"])return;for(var e=0,n=t.children.length;e|^function(?:\s+[\w$]+)?\s*\(/,lc=/\([^)]*?\);*$/,dc=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/,fc={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},qc={esc:["Esc","Escape"],tab:"Tab",enter:"Enter",space:[" ","Spacebar"],up:["Up","ArrowUp"],left:["Left","ArrowLeft"],right:["Right","ArrowRight"],down:["Down","ArrowDown"],delete:["Backspace","Delete","Del"]},hc=function(t){return"if(".concat(t,")return null;")},Wc={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:hc("$event.target !== $event.currentTarget"),ctrl:hc("!$event.ctrlKey"),shift:hc("!$event.shiftKey"),alt:hc("!$event.altKey"),meta:hc("!$event.metaKey"),left:hc("'button' in $event && $event.button !== 0"),middle:hc("'button' in $event && $event.button !== 1"),right:hc("'button' in $event && $event.button !== 2")};function vc(t,e){var n=e?"nativeOn:":"on:",o="",p="";for(var M in t){var b=Rc(t[M]);t[M]&&t[M].dynamic?p+="".concat(M,",").concat(b,","):o+='"'.concat(M,'":').concat(b,",")}return o="{".concat(o.slice(0,-1),"}"),p?n+"_d(".concat(o,",[").concat(p.slice(0,-1),"])"):n+o}function Rc(t){if(!t)return"function(){}";if(Array.isArray(t))return"[".concat(t.map((function(t){return Rc(t)})).join(","),"]");var e=dc.test(t.value),n=uc.test(t.value),o=dc.test(t.value.replace(lc,""));if(t.modifiers){var p="",M="",b=[],c=function(e){if(Wc[e])M+=Wc[e],fc[e]&&b.push(e);else if("exact"===e){var n=t.modifiers;M+=hc(["ctrl","shift","alt","meta"].filter((function(t){return!n[t]})).map((function(t){return"$event.".concat(t,"Key")})).join("||"))}else b.push(e)};for(var r in t.modifiers)c(r);b.length&&(p+=function(t){return"if(!$event.type.indexOf('key')&&"+"".concat(t.map(mc).join("&&"),")return null;")}(b)),M&&(p+=M);var z=e?"return ".concat(t.value,".apply(null, arguments)"):n?"return (".concat(t.value,").apply(null, arguments)"):o?"return ".concat(t.value):t.value;return"function($event){".concat(p).concat(z,"}")}return e||n?t.value:"function($event){".concat(o?"return ".concat(t.value):t.value,"}")}function mc(t){var e=parseInt(t,10);if(e)return"$event.keyCode!==".concat(e);var n=fc[t],o=qc[t];return"_k($event.keyCode,"+"".concat(JSON.stringify(t),",")+"".concat(JSON.stringify(n),",")+"$event.key,"+"".concat(JSON.stringify(o))+")"}var gc={on:function(t,e){t.wrapListeners=function(t){return"_g(".concat(t,",").concat(e.value,")")}},bind:function(t,e){t.wrapData=function(n){return"_b(".concat(n,",'").concat(t.tag,"',").concat(e.value,",").concat(e.modifiers&&e.modifiers.prop?"true":"false").concat(e.modifiers&&e.modifiers.sync?",true":"",")")}},cloak:w},Lc=function(t){this.options=t,this.warn=t.warn||ip,this.transforms=Op(t.modules,"transformCode"),this.dataGenFns=Op(t.modules,"genData"),this.directives=B(B({},gc),t.directives);var e=t.isReservedTag||S;this.maybeComponent=function(t){return!!t.component||!e(t.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function yc(t,e){var n=new Lc(e),o=t?"script"===t.tag?"null":_c(t,n):'_c("div")';return{render:"with(this){return ".concat(o,"}"),staticRenderFns:n.staticRenderFns}}function _c(t,e){if(t.parent&&(t.pre=t.pre||t.parent.pre),t.staticRoot&&!t.staticProcessed)return Nc(t,e);if(t.once&&!t.onceProcessed)return Ec(t,e);if(t.for&&!t.forProcessed)return Cc(t,e);if(t.if&&!t.ifProcessed)return Tc(t,e);if("template"!==t.tag||t.slotTarget||e.pre){if("slot"===t.tag)return function(t,e){var n=t.slotName||'"default"',o=xc(t,e),p="_t(".concat(n).concat(o?",function(){return ".concat(o,"}"):""),M=t.attrs||t.dynamicAttrs?Dc((t.attrs||[]).concat(t.dynamicAttrs||[]).map((function(t){return{name:L(t.name),value:t.value,dynamic:t.dynamic}}))):null,b=t.attrsMap["v-bind"];!M&&!b||o||(p+=",null");M&&(p+=",".concat(M));b&&(p+="".concat(M?"":",null",",").concat(b));return p+")"}(t,e);var n=void 0;if(t.component)n=function(t,e,n){var o=e.inlineTemplate?null:xc(e,n,!0);return"_c(".concat(t,",").concat(wc(e,n)).concat(o?",".concat(o):"",")")}(t.component,t,e);else{var o=void 0,p=e.maybeComponent(t);(!t.plain||t.pre&&p)&&(o=wc(t,e));var M=void 0,b=e.options.bindings;p&&b&&!1!==b.__isScriptSetup&&(M=function(t,e){var n=L(e),o=y(n),p=function(p){return t[e]===p?e:t[n]===p?n:t[o]===p?o:void 0},M=p("setup-const")||p("setup-reactive-const");if(M)return M;var b=p("setup-let")||p("setup-ref")||p("setup-maybe-ref");if(b)return b}(b,t.tag)),M||(M="'".concat(t.tag,"'"));var c=t.inlineTemplate?null:xc(t,e,!0);n="_c(".concat(M).concat(o?",".concat(o):"").concat(c?",".concat(c):"",")")}for(var r=0;r>>0}(b)):"",")")}(t,t.scopedSlots,e),",")),t.model&&(n+="model:{value:".concat(t.model.value,",callback:").concat(t.model.callback,",expression:").concat(t.model.expression,"},")),t.inlineTemplate){var M=function(t,e){var n=t.children[0];0;if(n&&1===n.type){var o=yc(n,e.options);return"inlineTemplate:{render:function(){".concat(o.render,"},staticRenderFns:[").concat(o.staticRenderFns.map((function(t){return"function(){".concat(t,"}")})).join(","),"]}")}}(t,e);M&&(n+="".concat(M,","))}return n=n.replace(/,$/,"")+"}",t.dynamicAttrs&&(n="_b(".concat(n,',"').concat(t.tag,'",').concat(Dc(t.dynamicAttrs),")")),t.wrapData&&(n=t.wrapData(n)),t.wrapListeners&&(n=t.wrapListeners(n)),n}function Sc(t){return 1===t.type&&("slot"===t.tag||t.children.some(Sc))}function Xc(t,e){var n=t.attrsMap["slot-scope"];if(t.if&&!t.ifProcessed&&!n)return Tc(t,e,Xc,"null");if(t.for&&!t.forProcessed)return Cc(t,e,Xc);var o=t.slotScope===Yb?"":String(t.slotScope),p="function(".concat(o,"){")+"return ".concat("template"===t.tag?t.if&&n?"(".concat(t.if,")?").concat(xc(t,e)||"undefined",":undefined"):xc(t,e)||"undefined":_c(t,e),"}"),M=o?"":",proxy:true";return"{key:".concat(t.slotTarget||'"default"',",fn:").concat(p).concat(M,"}")}function xc(t,e,n,o,p){var M=t.children;if(M.length){var b=M[0];if(1===M.length&&b.for&&"template"!==b.tag&&"slot"!==b.tag){var c=n?e.maybeComponent(b)?",1":",0":"";return"".concat((o||_c)(b,e)).concat(c)}var r=n?function(t,e){for(var n=0,o=0;o':'
',Fc.innerHTML.indexOf(" ")>0}var Vc=!!K&&$c(!1),Kc=!!K&&$c(!0),Qc=m((function(t){var e=wo(t);return e&&e.innerHTML})),Jc=no.prototype.$mount;no.prototype.$mount=function(t,e){if((t=t&&wo(t))===document.body||t===document.documentElement)return this;var n=this.$options;if(!n.render){var o=n.template;if(o)if("string"==typeof o)"#"===o.charAt(0)&&(o=Qc(o));else{if(!o.nodeType)return this;o=o.innerHTML}else t&&(o=function(t){if(t.outerHTML)return t.outerHTML;var e=document.createElement("div");return e.appendChild(t.cloneNode(!0)),e.innerHTML}(t));if(o){0;var p=Yc(o,{outputSourceRange:!1,shouldDecodeNewlines:Vc,shouldDecodeNewlinesForHref:Kc,delimiters:n.delimiters,comments:n.comments},this),M=p.render,b=p.staticRenderFns;n.render=M,n.staticRenderFns=b}}return Jc.call(this,t,e)},no.compile=Yc;var Zc=n(2543),tr=n.n(Zc),er=n(4743),nr=n.n(er);const or={computed:{Telescope:function(t){function e(){return t.apply(this,arguments)}return e.toString=function(){return t.toString()},e}((function(){return Telescope}))},methods:{timeAgo:function(t){nr().updateLocale("en",{relativeTime:{future:"in %s",past:"%s ago",s:function(t){return t+"s ago"},ss:"%ds ago",m:"1m ago",mm:"%dm ago",h:"1h ago",hh:"%dh ago",d:"1d ago",dd:"%dd ago",M:"a month ago",MM:"%d months ago",y:"a year ago",yy:"%d years ago"}});var e=nr()().diff(t,"seconds"),n=nr()("2018-01-01").startOf("day").seconds(e);return e>300?nr()(t).fromNow(!0):e<60?n.format("s")+"s ago":n.format("m:ss")+"m ago"},localTime:function(t){return nr()(t).local().format("MMMM Do YYYY, h:mm:ss A")},truncate:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:70;return tr().truncate(t,{length:e,separator:/,? +/})},debouncer:tr().debounce((function(t){return t()}),500),alertError:function(t){this.$root.alert.type="error",this.$root.alert.autoClose=!1,this.$root.alert.message=t},alertSuccess:function(t,e){this.$root.alert.type="success",this.$root.alert.autoClose=e,this.$root.alert.message=t},alertConfirm:function(t,e,n){this.$root.alert.type="confirmation",this.$root.alert.autoClose=!1,this.$root.alert.message=t,this.$root.alert.confirmationProceed=e,this.$root.alert.confirmationCancel=n}}};var pr=n(4335);const Mr=[{path:"/",redirect:"/requests"},{path:"/mail/:id",name:"mail-preview",component:n(583).A},{path:"/mail",name:"mail",component:n(1574).A},{path:"/exceptions/:id",name:"exception-preview",component:n(3781).A},{path:"/exceptions",name:"exceptions",component:n(2977).A},{path:"/dumps",name:"dumps",component:n(93).A},{path:"/logs/:id",name:"log-preview",component:n(5356).A},{path:"/logs",name:"logs",component:n(8170).A},{path:"/notifications/:id",name:"notification-preview",component:n(5841).A},{path:"/notifications",name:"notifications",component:n(4969).A},{path:"/jobs/:id",name:"job-preview",component:n(8813).A},{path:"/jobs",name:"jobs",component:n(1202).A},{path:"/batches/:id",name:"batch-preview",component:n(9622).A},{path:"/batches",name:"batches",component:n(8888).A},{path:"/events/:id",name:"event-preview",component:n(1119).A},{path:"/events",name:"events",component:n(7380).A},{path:"/cache/:id",name:"cache-preview",component:n(7362).A},{path:"/cache",name:"cache",component:n(8613).A},{path:"/queries/:id",name:"query-preview",component:n(1891).A},{path:"/queries",name:"queries",component:n(5873).A},{path:"/models/:id",name:"model-preview",component:n(5333).A},{path:"/models",name:"models",component:n(9440).A},{path:"/requests/:id",name:"request-preview",component:n(8827).A},{path:"/requests",name:"requests",component:n(2806).A},{path:"/commands/:id",name:"command-preview",component:n(4145).A},{path:"/commands",name:"commands",component:n(346).A},{path:"/schedule/:id",name:"schedule-preview",component:n(9655).A},{path:"/schedule",name:"schedule",component:n(3524).A},{path:"/redis/:id",name:"redis-preview",component:n(6393).A},{path:"/redis",name:"redis",component:n(8872).A},{path:"/monitored-tags",name:"monitored-tags",component:n(5441).A},{path:"/gates/:id",name:"gate-preview",component:n(1905).A},{path:"/gates",name:"gates",component:n(2707).A},{path:"/views/:id",name:"view-preview",component:n(6703).A},{path:"/views",name:"views",component:n(3308).A},{path:"/client-requests/:id",name:"client-request-preview",component:n(6204).A},{path:"/client-requests",name:"client-requests",component:n(5899).A}];function br(t,e){for(var n in e)t[n]=e[n];return t}var cr=/[!'()*]/g,rr=function(t){return"%"+t.charCodeAt(0).toString(16)},zr=/%2C/g,ar=function(t){return encodeURIComponent(t).replace(cr,rr).replace(zr,",")};function ir(t){try{return decodeURIComponent(t)}catch(t){0}return t}var Or=function(t){return null==t||"object"==typeof t?t:String(t)};function sr(t){var e={};return(t=t.trim().replace(/^(\?|#|&)/,""))?(t.split("&").forEach((function(t){var n=t.replace(/\+/g," ").split("="),o=ir(n.shift()),p=n.length>0?ir(n.join("=")):null;void 0===e[o]?e[o]=p:Array.isArray(e[o])?e[o].push(p):e[o]=[e[o],p]})),e):e}function Ar(t){var e=t?Object.keys(t).map((function(e){var n=t[e];if(void 0===n)return"";if(null===n)return ar(e);if(Array.isArray(n)){var o=[];return n.forEach((function(t){void 0!==t&&(null===t?o.push(ar(e)):o.push(ar(e)+"="+ar(t)))})),o.join("&")}return ar(e)+"="+ar(n)})).filter((function(t){return t.length>0})).join("&"):null;return e?"?"+e:""}var ur=/\/?$/;function lr(t,e,n,o){var p=o&&o.options.stringifyQuery,M=e.query||{};try{M=dr(M)}catch(t){}var b={name:e.name||t&&t.name,meta:t&&t.meta||{},path:e.path||"/",hash:e.hash||"",query:M,params:e.params||{},fullPath:hr(e,p),matched:t?qr(t):[]};return n&&(b.redirectedFrom=hr(n,p)),Object.freeze(b)}function dr(t){if(Array.isArray(t))return t.map(dr);if(t&&"object"==typeof t){var e={};for(var n in t)e[n]=dr(t[n]);return e}return t}var fr=lr(null,{path:"/"});function qr(t){for(var e=[];t;)e.unshift(t),t=t.parent;return e}function hr(t,e){var n=t.path,o=t.query;void 0===o&&(o={});var p=t.hash;return void 0===p&&(p=""),(n||"/")+(e||Ar)(o)+p}function Wr(t,e,n){return e===fr?t===e:!!e&&(t.path&&e.path?t.path.replace(ur,"")===e.path.replace(ur,"")&&(n||t.hash===e.hash&&vr(t.query,e.query)):!(!t.name||!e.name)&&(t.name===e.name&&(n||t.hash===e.hash&&vr(t.query,e.query)&&vr(t.params,e.params))))}function vr(t,e){if(void 0===t&&(t={}),void 0===e&&(e={}),!t||!e)return t===e;var n=Object.keys(t).sort(),o=Object.keys(e).sort();return n.length===o.length&&n.every((function(n,p){var M=t[n];if(o[p]!==n)return!1;var b=e[n];return null==M||null==b?M===b:"object"==typeof M&&"object"==typeof b?vr(M,b):String(M)===String(b)}))}function Rr(t){for(var e=0;e=0&&(e=t.slice(o),t=t.slice(0,o));var p=t.indexOf("?");return p>=0&&(n=t.slice(p+1),t=t.slice(0,p)),{path:t,query:n,hash:e}}(p.path||""),z=e&&e.path||"/",a=r.path?Lr(r.path,z,n||p.append):z,i=function(t,e,n){void 0===e&&(e={});var o,p=n||sr;try{o=p(t||"")}catch(t){o={}}for(var M in e){var b=e[M];o[M]=Array.isArray(b)?b.map(Or):Or(b)}return o}(r.query,p.query,o&&o.options.parseQuery),O=p.hash||r.hash;return O&&"#"!==O.charAt(0)&&(O="#"+O),{_normalized:!0,path:a,query:i,hash:O}}var $r,Vr=function(){},Kr={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(t){var e=this,n=this.$router,o=this.$route,p=n.resolve(this.to,o,this.append),M=p.location,b=p.route,c=p.href,r={},z=n.options.linkActiveClass,a=n.options.linkExactActiveClass,i=null==z?"router-link-active":z,O=null==a?"router-link-exact-active":a,s=null==this.activeClass?i:this.activeClass,A=null==this.exactActiveClass?O:this.exactActiveClass,u=b.redirectedFrom?lr(null,Yr(b.redirectedFrom),null,n):b;r[A]=Wr(o,u,this.exactPath),r[s]=this.exact||this.exactPath?r[A]:function(t,e){return 0===t.path.replace(ur,"/").indexOf(e.path.replace(ur,"/"))&&(!e.hash||t.hash===e.hash)&&function(t,e){for(var n in e)if(!(n in t))return!1;return!0}(t.query,e.query)}(o,u);var l=r[A]?this.ariaCurrentValue:null,d=function(t){Qr(t)&&(e.replace?n.replace(M,Vr):n.push(M,Vr))},f={click:Qr};Array.isArray(this.event)?this.event.forEach((function(t){f[t]=d})):f[this.event]=d;var q={class:r},h=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:c,route:b,navigate:d,isActive:r[s],isExactActive:r[A]});if(h){if(1===h.length)return h[0];if(h.length>1||!h.length)return 0===h.length?t():t("span",{},h)}if("a"===this.tag)q.on=f,q.attrs={href:c,"aria-current":l};else{var W=Jr(this.$slots.default);if(W){W.isStatic=!1;var v=W.data=br({},W.data);for(var R in v.on=v.on||{},v.on){var m=v.on[R];R in f&&(v.on[R]=Array.isArray(m)?m:[m])}for(var g in f)g in v.on?v.on[g].push(f[g]):v.on[g]=d;var L=W.data.attrs=br({},W.data.attrs);L.href=c,L["aria-current"]=l}else q.on=f}return t(this.tag,q,this.$slots.default)}};function Qr(t){if(!(t.metaKey||t.altKey||t.ctrlKey||t.shiftKey||t.defaultPrevented||void 0!==t.button&&0!==t.button)){if(t.currentTarget&&t.currentTarget.getAttribute){var e=t.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(e))return}return t.preventDefault&&t.preventDefault(),!0}}function Jr(t){if(t)for(var e,n=0;n-1&&(c.params[O]=n.params[O]);return c.path=Gr(a.path,c.params),r(a,c,b)}if(c.path){c.params={};for(var s=0;s-1}function Ez(t,e){return Nz(t)&&t._isRouter&&(null==e||t.type===e)}function Tz(t,e,n){var o=function(p){p>=t.length?n():t[p]?e(t[p],(function(){o(p+1)})):o(p+1)};o(0)}function Bz(t){return function(e,n,o){var p=!1,M=0,b=null;Cz(t,(function(t,e,n,c){if("function"==typeof t&&void 0===t.cid){p=!0,M++;var r,z=Xz((function(e){var p;((p=e).__esModule||Sz&&"Module"===p[Symbol.toStringTag])&&(e=e.default),t.resolved="function"==typeof e?e:$r.extend(e),n.components[c]=e,--M<=0&&o()})),a=Xz((function(t){var e="Failed to resolve async component "+c+": "+t;b||(b=Nz(t)?t:new Error(e),o(b))}));try{r=t(z,a)}catch(t){a(t)}if(r)if("function"==typeof r.then)r.then(z,a);else{var i=r.component;i&&"function"==typeof i.then&&i.then(z,a)}}})),p||o()}}function Cz(t,e){return wz(t.map((function(t){return Object.keys(t.components).map((function(n){return e(t.components[n],t.instances[n],t,n)}))})))}function wz(t){return Array.prototype.concat.apply([],t)}var Sz="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function Xz(t){var e=!1;return function(){for(var n=[],o=arguments.length;o--;)n[o]=arguments[o];if(!e)return e=!0,t.apply(this,n)}}var xz=function(t,e){this.router=t,this.base=function(t){if(!t)if(Zr){var e=document.querySelector("base");t=(t=e&&e.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else t="/";"/"!==t.charAt(0)&&(t="/"+t);return t.replace(/\/$/,"")}(e),this.current=fr,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function kz(t,e,n,o){var p=Cz(t,(function(t,o,p,M){var b=function(t,e){"function"!=typeof t&&(t=$r.extend(t));return t.options[e]}(t,e);if(b)return Array.isArray(b)?b.map((function(t){return n(t,o,p,M)})):n(b,o,p,M)}));return wz(o?p.reverse():p)}function Iz(t,e){if(e)return function(){return t.apply(e,arguments)}}xz.prototype.listen=function(t){this.cb=t},xz.prototype.onReady=function(t,e){this.ready?t():(this.readyCbs.push(t),e&&this.readyErrorCbs.push(e))},xz.prototype.onError=function(t){this.errorCbs.push(t)},xz.prototype.transitionTo=function(t,e,n){var o,p=this;try{o=this.router.match(t,this.current)}catch(t){throw this.errorCbs.forEach((function(e){e(t)})),t}var M=this.current;this.confirmTransition(o,(function(){p.updateRoute(o),e&&e(o),p.ensureURL(),p.router.afterHooks.forEach((function(t){t&&t(o,M)})),p.ready||(p.ready=!0,p.readyCbs.forEach((function(t){t(o)})))}),(function(t){n&&n(t),t&&!p.ready&&(Ez(t,mz.redirected)&&M===fr||(p.ready=!0,p.readyErrorCbs.forEach((function(e){e(t)}))))}))},xz.prototype.confirmTransition=function(t,e,n){var o=this,p=this.current;this.pending=t;var M,b,c=function(t){!Ez(t)&&Nz(t)&&o.errorCbs.length&&o.errorCbs.forEach((function(e){e(t)})),n&&n(t)},r=t.matched.length-1,z=p.matched.length-1;if(Wr(t,p)&&r===z&&t.matched[r]===p.matched[z])return this.ensureURL(),t.hash&&Oz(this.router,p,t,!1),c(((b=yz(M=p,t,mz.duplicated,'Avoided redundant navigation to current location: "'+M.fullPath+'".')).name="NavigationDuplicated",b));var a=function(t,e){var n,o=Math.max(t.length,e.length);for(n=0;n0)){var e=this.router,n=e.options.scrollBehavior,o=Wz&&n;o&&this.listeners.push(iz());var p=function(){var n=t.current,p=Pz(t.base);t.current===fr&&p===t._startLocation||t.transitionTo(p,(function(t){o&&Oz(e,t,n,!0)}))};window.addEventListener("popstate",p),this.listeners.push((function(){window.removeEventListener("popstate",p)}))}},e.prototype.go=function(t){window.history.go(t)},e.prototype.push=function(t,e,n){var o=this,p=this.current;this.transitionTo(t,(function(t){vz(yr(o.base+t.fullPath)),Oz(o.router,t,p,!1),e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var o=this,p=this.current;this.transitionTo(t,(function(t){Rz(yr(o.base+t.fullPath)),Oz(o.router,t,p,!1),e&&e(t)}),n)},e.prototype.ensureURL=function(t){if(Pz(this.base)!==this.current.fullPath){var e=yr(this.base+this.current.fullPath);t?vz(e):Rz(e)}},e.prototype.getCurrentLocation=function(){return Pz(this.base)},e}(xz);function Pz(t){var e=window.location.pathname,n=e.toLowerCase(),o=t.toLowerCase();return!t||n!==o&&0!==n.indexOf(yr(o+"/"))||(e=e.slice(t.length)),(e||"/")+window.location.search+window.location.hash}var Uz=function(t){function e(e,n,o){t.call(this,e,n),o&&function(t){var e=Pz(t);if(!/^\/#/.test(e))return window.location.replace(yr(t+"/#"+e)),!0}(this.base)||jz()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.setupListeners=function(){var t=this;if(!(this.listeners.length>0)){var e=this.router.options.scrollBehavior,n=Wz&&e;n&&this.listeners.push(iz());var o=function(){var e=t.current;jz()&&t.transitionTo(Hz(),(function(o){n&&Oz(t.router,o,e,!0),Wz||Yz(o.fullPath)}))},p=Wz?"popstate":"hashchange";window.addEventListener(p,o),this.listeners.push((function(){window.removeEventListener(p,o)}))}},e.prototype.push=function(t,e,n){var o=this,p=this.current;this.transitionTo(t,(function(t){Gz(t.fullPath),Oz(o.router,t,p,!1),e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var o=this,p=this.current;this.transitionTo(t,(function(t){Yz(t.fullPath),Oz(o.router,t,p,!1),e&&e(t)}),n)},e.prototype.go=function(t){window.history.go(t)},e.prototype.ensureURL=function(t){var e=this.current.fullPath;Hz()!==e&&(t?Gz(e):Yz(e))},e.prototype.getCurrentLocation=function(){return Hz()},e}(xz);function jz(){var t=Hz();return"/"===t.charAt(0)||(Yz("/"+t),!1)}function Hz(){var t=window.location.href,e=t.indexOf("#");return e<0?"":t=t.slice(e+1)}function Fz(t){var e=window.location.href,n=e.indexOf("#");return(n>=0?e.slice(0,n):e)+"#"+t}function Gz(t){Wz?vz(Fz(t)):window.location.hash=t}function Yz(t){Wz?Rz(Fz(t)):window.location.replace(Fz(t))}var $z=function(t){function e(e,n){t.call(this,e,n),this.stack=[],this.index=-1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.push=function(t,e,n){var o=this;this.transitionTo(t,(function(t){o.stack=o.stack.slice(0,o.index+1).concat(t),o.index++,e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var o=this;this.transitionTo(t,(function(t){o.stack=o.stack.slice(0,o.index).concat(t),e&&e(t)}),n)},e.prototype.go=function(t){var e=this,n=this.index+t;if(!(n<0||n>=this.stack.length)){var o=this.stack[n];this.confirmTransition(o,(function(){var t=e.current;e.index=n,e.updateRoute(o),e.router.afterHooks.forEach((function(e){e&&e(o,t)}))}),(function(t){Ez(t,mz.duplicated)&&(e.index=n)}))}},e.prototype.getCurrentLocation=function(){var t=this.stack[this.stack.length-1];return t?t.fullPath:"/"},e.prototype.ensureURL=function(){},e}(xz),Vz=function(t){void 0===t&&(t={}),this.app=null,this.apps=[],this.options=t,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=oz(t.routes||[],this);var e=t.mode||"hash";switch(this.fallback="history"===e&&!Wz&&!1!==t.fallback,this.fallback&&(e="hash"),Zr||(e="abstract"),this.mode=e,e){case"history":this.history=new Dz(this,t.base);break;case"hash":this.history=new Uz(this,t.base,this.fallback);break;case"abstract":this.history=new $z(this,t.base)}},Kz={currentRoute:{configurable:!0}};Vz.prototype.match=function(t,e,n){return this.matcher.match(t,e,n)},Kz.currentRoute.get=function(){return this.history&&this.history.current},Vz.prototype.init=function(t){var e=this;if(this.apps.push(t),t.$once("hook:destroyed",(function(){var n=e.apps.indexOf(t);n>-1&&e.apps.splice(n,1),e.app===t&&(e.app=e.apps[0]||null),e.app||e.history.teardown()})),!this.app){this.app=t;var n=this.history;if(n instanceof Dz||n instanceof Uz){var o=function(t){n.setupListeners(),function(t){var o=n.current,p=e.options.scrollBehavior;Wz&&p&&"fullPath"in t&&Oz(e,t,o,!1)}(t)};n.transitionTo(n.getCurrentLocation(),o,o)}n.listen((function(t){e.apps.forEach((function(e){e._route=t}))}))}},Vz.prototype.beforeEach=function(t){return Jz(this.beforeHooks,t)},Vz.prototype.beforeResolve=function(t){return Jz(this.resolveHooks,t)},Vz.prototype.afterEach=function(t){return Jz(this.afterHooks,t)},Vz.prototype.onReady=function(t,e){this.history.onReady(t,e)},Vz.prototype.onError=function(t){this.history.onError(t)},Vz.prototype.push=function(t,e,n){var o=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise((function(e,n){o.history.push(t,e,n)}));this.history.push(t,e,n)},Vz.prototype.replace=function(t,e,n){var o=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise((function(e,n){o.history.replace(t,e,n)}));this.history.replace(t,e,n)},Vz.prototype.go=function(t){this.history.go(t)},Vz.prototype.back=function(){this.go(-1)},Vz.prototype.forward=function(){this.go(1)},Vz.prototype.getMatchedComponents=function(t){var e=t?t.matched?t:this.resolve(t).route:this.currentRoute;return e?[].concat.apply([],e.matched.map((function(t){return Object.keys(t.components).map((function(e){return t.components[e]}))}))):[]},Vz.prototype.resolve=function(t,e,n){var o=Yr(t,e=e||this.history.current,n,this),p=this.match(o,e),M=p.redirectedFrom||p.fullPath,b=function(t,e,n){var o="hash"===n?"#"+e:e;return t?yr(t+"/"+o):o}(this.history.base,M,this.mode);return{location:o,route:p,href:b,normalizedTo:o,resolved:p}},Vz.prototype.getRoutes=function(){return this.matcher.getRoutes()},Vz.prototype.addRoute=function(t,e){this.matcher.addRoute(t,e),this.history.current!==fr&&this.history.transitionTo(this.history.getCurrentLocation())},Vz.prototype.addRoutes=function(t){this.matcher.addRoutes(t),this.history.current!==fr&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(Vz.prototype,Kz);var Qz=Vz;function Jz(t,e){return t.push(e),function(){var n=t.indexOf(e);n>-1&&t.splice(n,1)}}Vz.install=function t(e){if(!t.installed||$r!==e){t.installed=!0,$r=e;var n=function(t){return void 0!==t},o=function(t,e){var o=t.$options._parentVnode;n(o)&&n(o=o.data)&&n(o=o.registerRouteInstance)&&o(t,e)};e.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),e.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,o(this,this)},destroyed:function(){o(this)}}),Object.defineProperty(e.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(e.prototype,"$route",{get:function(){return this._routerRoot._route}}),e.component("RouterView",mr),e.component("RouterLink",Kr);var p=e.config.optionMergeStrategies;p.beforeRouteEnter=p.beforeRouteLeave=p.beforeRouteUpdate=p.created}},Vz.version="3.6.5",Vz.isNavigationFailure=Ez,Vz.NavigationFailureType=mz,Vz.START_LOCATION=fr,Zr&&window.Vue&&window.Vue.use(Vz);var Zz=n(7551),ta=n.n(Zz),ea=n(5072),na=n.n(ea),oa=n(2930),pa={insert:"head",singleton:!1};na()(oa.A,pa);oa.A.locals;n(2754);var Ma=document.head.querySelector('meta[name="csrf-token"]');Ma&&(pr.A.defaults.headers.common["X-CSRF-TOKEN"]=Ma.content),no.use(Qz),window.Popper=n(8851).default,nr().tz.setDefault(Telescope.timezone),window.Telescope.basePath="/"+window.Telescope.path;var ba=window.Telescope.basePath+"/";""!==window.Telescope.path&&"/"!==window.Telescope.path||(ba="/",window.Telescope.basePath="");var ca=new Qz({routes:Mr,mode:"history",base:ba});no.component("vue-json-pretty",ta()),no.component("related-entries",n(8117).A),no.component("index-screen",n(4980).A),no.component("preview-screen",n(9416).A),no.component("alert",n(4445).A),no.component("copy-clipboard",n(1858).A),no.mixin(or),new no({el:"#telescope",router:ca,data:function(){return{alert:{type:null,autoClose:0,message:"",confirmationProceed:null,confirmationCancel:null},autoLoadsNewEntries:"1"===localStorage.autoLoadsNewEntries,recording:Telescope.recording}},created:function(){window.addEventListener("keydown",this.keydownListener)},destroyed:function(){window.removeEventListener("keydown",this.keydownListener)},methods:{autoLoadNewEntries:function(){this.autoLoadsNewEntries?(this.autoLoadsNewEntries=!1,localStorage.autoLoadsNewEntries=0):(this.autoLoadsNewEntries=!0,localStorage.autoLoadsNewEntries=1)},toggleRecording:function(){pr.A.post(Telescope.basePath+"/telescope-api/toggle-recording"),window.Telescope.recording=!Telescope.recording,this.recording=!this.recording},clearEntries:function(){(!(arguments.length>0&&void 0!==arguments[0])||arguments[0])&&!confirm("Are you sure you want to delete all Telescope data?")||pr.A.delete(Telescope.basePath+"/telescope-api/entries").then((function(t){return location.reload()}))},keydownListener:function(t){t.metaKey&&"k"===t.key&&this.clearEntries(!1)}}})},8217:(t,e,n)=>{"use strict";n.d(e,{A:()=>o});const o={methods:{cacheActionTypeClass:function(t){return"hit"===t?"success":"set"===t?"info":"forget"===t?"warning":"missed"===t?"danger":void 0},composerTypeClass:function(t){return"composer"===t?"info":"creator"===t?"success":void 0},gateResultClass:function(t){return"allowed"===t?"success":"denied"===t?"danger":void 0},jobStatusClass:function(t){return"pending"===t?"secondary":"processed"===t?"success":"failed"===t?"danger":void 0},logLevelClass:function(t){return"debug"===t?"success":"info"===t?"info":"notice"===t?"secondary":"warning"===t?"warning":"error"===t||"critical"===t||"alert"===t||"emergency"===t?"danger":void 0},modelActionClass:function(t){return"created"==t?"success":"updated"==t?"info":"retrieved"==t?"secondary":"deleted"==t||"forceDeleted"==t?"danger":void 0},requestStatusClass:function(t){return t?t<300?"success":t<400?"info":t<500?"warning":t>=500?"danger":void 0:"danger"},requestMethodClass:function(t){return"GET"==t||"OPTIONS"==t?"secondary":"POST"==t||"PATCH"==t||"PUT"==t?"info":"DELETE"==t?"danger":void 0}}}},7526:(t,e)=>{"use strict";e.byteLength=function(t){var e=c(t),n=e[0],o=e[1];return 3*(n+o)/4-o},e.toByteArray=function(t){var e,n,M=c(t),b=M[0],r=M[1],z=new p(function(t,e,n){return 3*(e+n)/4-n}(0,b,r)),a=0,i=r>0?b-4:b;for(n=0;n>16&255,z[a++]=e>>8&255,z[a++]=255&e;2===r&&(e=o[t.charCodeAt(n)]<<2|o[t.charCodeAt(n+1)]>>4,z[a++]=255&e);1===r&&(e=o[t.charCodeAt(n)]<<10|o[t.charCodeAt(n+1)]<<4|o[t.charCodeAt(n+2)]>>2,z[a++]=e>>8&255,z[a++]=255&e);return z},e.fromByteArray=function(t){for(var e,o=t.length,p=o%3,M=[],b=16383,c=0,z=o-p;cz?z:c+b));1===p?(e=t[o-1],M.push(n[e>>2]+n[e<<4&63]+"==")):2===p&&(e=(t[o-2]<<8)+t[o-1],M.push(n[e>>10]+n[e>>4&63]+n[e<<2&63]+"="));return M.join("")};for(var n=[],o=[],p="undefined"!=typeof Uint8Array?Uint8Array:Array,M="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",b=0;b<64;++b)n[b]=M[b],o[M.charCodeAt(b)]=b;function c(t){var e=t.length;if(e%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var n=t.indexOf("=");return-1===n&&(n=e),[n,n===e?0:4-n%4]}function r(t,e,o){for(var p,M,b=[],c=e;c>18&63]+n[M>>12&63]+n[M>>6&63]+n[63&M]);return b.join("")}o["-".charCodeAt(0)]=62,o["_".charCodeAt(0)]=63},2754:function(t,e,n){!function(t,e,n){"use strict";function o(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var p=o(e),M=o(n);function b(t,e){for(var n=0;n=b)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}};f.jQueryDetection(),d();var q="alert",h="4.6.2",W="bs.alert",v="."+W,R=".data-api",m=p.default.fn[q],g="alert",L="fade",y="show",_="close"+v,N="closed"+v,E="click"+v+R,T='[data-dismiss="alert"]',B=function(){function t(t){this._element=t}var e=t.prototype;return e.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.dispose=function(){p.default.removeData(this._element,W),this._element=null},e._getRootElement=function(t){var e=f.getSelectorFromElement(t),n=!1;return e&&(n=document.querySelector(e)),n||(n=p.default(t).closest("."+g)[0]),n},e._triggerCloseEvent=function(t){var e=p.default.Event(_);return p.default(t).trigger(e),e},e._removeElement=function(t){var e=this;if(p.default(t).removeClass(y),p.default(t).hasClass(L)){var n=f.getTransitionDurationFromElement(t);p.default(t).one(f.TRANSITION_END,(function(n){return e._destroyElement(t,n)})).emulateTransitionEnd(n)}else this._destroyElement(t)},e._destroyElement=function(t){p.default(t).detach().trigger(N).remove()},t._jQueryInterface=function(e){return this.each((function(){var n=p.default(this),o=n.data(W);o||(o=new t(this),n.data(W,o)),"close"===e&&o[e](this)}))},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},c(t,null,[{key:"VERSION",get:function(){return h}}]),t}();p.default(document).on(E,T,B._handleDismiss(new B)),p.default.fn[q]=B._jQueryInterface,p.default.fn[q].Constructor=B,p.default.fn[q].noConflict=function(){return p.default.fn[q]=m,B._jQueryInterface};var C="button",w="4.6.2",S="bs.button",X="."+S,x=".data-api",k=p.default.fn[C],I="active",D="btn",P="focus",U="click"+X+x,j="focus"+X+x+" blur"+X+x,H="load"+X+x,F='[data-toggle^="button"]',G='[data-toggle="buttons"]',Y='[data-toggle="button"]',$='[data-toggle="buttons"] .btn',V='input:not([type="hidden"])',K=".active",Q=".btn",J=function(){function t(t){this._element=t,this.shouldAvoidTriggerChange=!1}var e=t.prototype;return e.toggle=function(){var t=!0,e=!0,n=p.default(this._element).closest(G)[0];if(n){var o=this._element.querySelector(V);if(o){if("radio"===o.type)if(o.checked&&this._element.classList.contains(I))t=!1;else{var M=n.querySelector(K);M&&p.default(M).removeClass(I)}t&&("checkbox"!==o.type&&"radio"!==o.type||(o.checked=!this._element.classList.contains(I)),this.shouldAvoidTriggerChange||p.default(o).trigger("change")),o.focus(),e=!1}}this._element.hasAttribute("disabled")||this._element.classList.contains("disabled")||(e&&this._element.setAttribute("aria-pressed",!this._element.classList.contains(I)),t&&p.default(this._element).toggleClass(I))},e.dispose=function(){p.default.removeData(this._element,S),this._element=null},t._jQueryInterface=function(e,n){return this.each((function(){var o=p.default(this),M=o.data(S);M||(M=new t(this),o.data(S,M)),M.shouldAvoidTriggerChange=n,"toggle"===e&&M[e]()}))},c(t,null,[{key:"VERSION",get:function(){return w}}]),t}();p.default(document).on(U,F,(function(t){var e=t.target,n=e;if(p.default(e).hasClass(D)||(e=p.default(e).closest(Q)[0]),!e||e.hasAttribute("disabled")||e.classList.contains("disabled"))t.preventDefault();else{var o=e.querySelector(V);if(o&&(o.hasAttribute("disabled")||o.classList.contains("disabled")))return void t.preventDefault();"INPUT"!==n.tagName&&"LABEL"===e.tagName||J._jQueryInterface.call(p.default(e),"toggle","INPUT"===n.tagName)}})).on(j,F,(function(t){var e=p.default(t.target).closest(Q)[0];p.default(e).toggleClass(P,/^focus(in)?$/.test(t.type))})),p.default(window).on(H,(function(){for(var t=[].slice.call(document.querySelectorAll($)),e=0,n=t.length;e0,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var e=t.prototype;return e.next=function(){this._isSliding||this._slide(dt)},e.nextWhenVisible=function(){var t=p.default(this._element);!document.hidden&&t.is(":visible")&&"hidden"!==t.css("visibility")&&this.next()},e.prev=function(){this._isSliding||this._slide(ft)},e.pause=function(t){t||(this._isPaused=!0),this._element.querySelector(kt)&&(f.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},e.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},e.to=function(t){var e=this;this._activeElement=this._element.querySelector(St);var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)p.default(this._element).one(vt,(function(){return e.to(t)}));else{if(n===t)return this.pause(),void this.cycle();var o=t>n?dt:ft;this._slide(o,this._items[t])}},e.dispose=function(){p.default(this._element).off(nt),p.default.removeData(this._element,et),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},e._getConfig=function(t){return t=r({},Ut,t),f.typeCheckConfig(Z,t,jt),t},e._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=rt)){var e=t/this.touchDeltaX;this.touchDeltaX=0,e>0&&this.prev(),e<0&&this.next()}},e._addEventListeners=function(){var t=this;this._config.keyboard&&p.default(this._element).on(Rt,(function(e){return t._keydown(e)})),"hover"===this._config.pause&&p.default(this._element).on(mt,(function(e){return t.pause(e)})).on(gt,(function(e){return t.cycle(e)})),this._config.touch&&this._addTouchEventListeners()},e._addTouchEventListeners=function(){var t=this;if(this._touchSupported){var e=function(e){t._pointerEvent&&Ht[e.originalEvent.pointerType.toUpperCase()]?t.touchStartX=e.originalEvent.clientX:t._pointerEvent||(t.touchStartX=e.originalEvent.touches[0].clientX)},n=function(e){t.touchDeltaX=e.originalEvent.touches&&e.originalEvent.touches.length>1?0:e.originalEvent.touches[0].clientX-t.touchStartX},o=function(e){t._pointerEvent&&Ht[e.originalEvent.pointerType.toUpperCase()]&&(t.touchDeltaX=e.originalEvent.clientX-t.touchStartX),t._handleSwipe(),"hover"===t._config.pause&&(t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout((function(e){return t.cycle(e)}),ct+t._config.interval))};p.default(this._element.querySelectorAll(xt)).on(Tt,(function(t){return t.preventDefault()})),this._pointerEvent?(p.default(this._element).on(Nt,(function(t){return e(t)})),p.default(this._element).on(Et,(function(t){return o(t)})),this._element.classList.add(lt)):(p.default(this._element).on(Lt,(function(t){return e(t)})),p.default(this._element).on(yt,(function(t){return n(t)})),p.default(this._element).on(_t,(function(t){return o(t)})))}},e._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case Mt:t.preventDefault(),this.prev();break;case bt:t.preventDefault(),this.next()}},e._getItemIndex=function(t){return this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(Xt)):[],this._items.indexOf(t)},e._getItemByDirection=function(t,e){var n=t===dt,o=t===ft,p=this._getItemIndex(e),M=this._items.length-1;if((o&&0===p||n&&p===M)&&!this._config.wrap)return e;var b=(p+(t===ft?-1:1))%this._items.length;return-1===b?this._items[this._items.length-1]:this._items[b]},e._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),o=this._getItemIndex(this._element.querySelector(St)),M=p.default.Event(Wt,{relatedTarget:t,direction:e,from:o,to:n});return p.default(this._element).trigger(M),M},e._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var e=[].slice.call(this._indicatorsElement.querySelectorAll(wt));p.default(e).removeClass(at);var n=this._indicatorsElement.children[this._getItemIndex(t)];n&&p.default(n).addClass(at)}},e._updateInterval=function(){var t=this._activeElement||this._element.querySelector(St);if(t){var e=parseInt(t.getAttribute("data-interval"),10);e?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=e):this._config.interval=this._config.defaultInterval||this._config.interval}},e._slide=function(t,e){var n,o,M,b=this,c=this._element.querySelector(St),r=this._getItemIndex(c),z=e||c&&this._getItemByDirection(t,c),a=this._getItemIndex(z),i=Boolean(this._interval);if(t===dt?(n=st,o=At,M=qt):(n=Ot,o=ut,M=ht),z&&p.default(z).hasClass(at))this._isSliding=!1;else if(!this._triggerSlideEvent(z,M).isDefaultPrevented()&&c&&z){this._isSliding=!0,i&&this.pause(),this._setActiveIndicatorElement(z),this._activeElement=z;var O=p.default.Event(vt,{relatedTarget:z,direction:M,from:r,to:a});if(p.default(this._element).hasClass(it)){p.default(z).addClass(o),f.reflow(z),p.default(c).addClass(n),p.default(z).addClass(n);var s=f.getTransitionDurationFromElement(c);p.default(c).one(f.TRANSITION_END,(function(){p.default(z).removeClass(n+" "+o).addClass(at),p.default(c).removeClass(at+" "+o+" "+n),b._isSliding=!1,setTimeout((function(){return p.default(b._element).trigger(O)}),0)})).emulateTransitionEnd(s)}else p.default(c).removeClass(at),p.default(z).addClass(at),this._isSliding=!1,p.default(this._element).trigger(O);i&&this.cycle()}},t._jQueryInterface=function(e){return this.each((function(){var n=p.default(this).data(et),o=r({},Ut,p.default(this).data());"object"==typeof e&&(o=r({},o,e));var M="string"==typeof e?e:o.slide;if(n||(n=new t(this,o),p.default(this).data(et,n)),"number"==typeof e)n.to(e);else if("string"==typeof M){if(void 0===n[M])throw new TypeError('No method named "'+M+'"');n[M]()}else o.interval&&o.ride&&(n.pause(),n.cycle())}))},t._dataApiClickHandler=function(e){var n=f.getSelectorFromElement(this);if(n){var o=p.default(n)[0];if(o&&p.default(o).hasClass(zt)){var M=r({},p.default(o).data(),p.default(this).data()),b=this.getAttribute("data-slide-to");b&&(M.interval=!1),t._jQueryInterface.call(p.default(o),M),b&&p.default(o).data(et).to(b),e.preventDefault()}}},c(t,null,[{key:"VERSION",get:function(){return tt}},{key:"Default",get:function(){return Ut}}]),t}();p.default(document).on(Ct,Dt,Ft._dataApiClickHandler),p.default(window).on(Bt,(function(){for(var t=[].slice.call(document.querySelectorAll(Pt)),e=0,n=t.length;e0&&(this._selector=b,this._triggerArray.push(M))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var e=t.prototype;return e.toggle=function(){p.default(this._element).hasClass(Jt)?this.hide():this.show()},e.show=function(){var e,n,o=this;if(!(this._isTransitioning||p.default(this._element).hasClass(Jt)||(this._parent&&0===(e=[].slice.call(this._parent.querySelectorAll(ze)).filter((function(t){return"string"==typeof o._config.parent?t.getAttribute("data-parent")===o._config.parent:t.classList.contains(Zt)}))).length&&(e=null),e&&(n=p.default(e).not(this._selector).data($t))&&n._isTransitioning))){var M=p.default.Event(pe);if(p.default(this._element).trigger(M),!M.isDefaultPrevented()){e&&(t._jQueryInterface.call(p.default(e).not(this._selector),"hide"),n||p.default(e).data($t,null));var b=this._getDimension();p.default(this._element).removeClass(Zt).addClass(te),this._element.style[b]=0,this._triggerArray.length&&p.default(this._triggerArray).removeClass(ee).attr("aria-expanded",!0),this.setTransitioning(!0);var c=function(){p.default(o._element).removeClass(te).addClass(Zt+" "+Jt),o._element.style[b]="",o.setTransitioning(!1),p.default(o._element).trigger(Me)},r="scroll"+(b[0].toUpperCase()+b.slice(1)),z=f.getTransitionDurationFromElement(this._element);p.default(this._element).one(f.TRANSITION_END,c).emulateTransitionEnd(z),this._element.style[b]=this._element[r]+"px"}}},e.hide=function(){var t=this;if(!this._isTransitioning&&p.default(this._element).hasClass(Jt)){var e=p.default.Event(be);if(p.default(this._element).trigger(e),!e.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",f.reflow(this._element),p.default(this._element).addClass(te).removeClass(Zt+" "+Jt);var o=this._triggerArray.length;if(o>0)for(var M=0;M0},e._getOffset=function(){var t=this,e={};return"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t._config.offset(e.offsets,t._element)),e}:e.offset=this._config.offset,e},e._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(t.modifiers.applyStyle={enabled:!1}),r({},t,this._config.popperConfig)},t._jQueryInterface=function(e){return this.each((function(){var n=p.default(this).data(le);if(n||(n=new t(this,"object"==typeof e?e:null),p.default(this).data(le,n)),"string"==typeof e){if(void 0===n[e])throw new TypeError('No method named "'+e+'"');n[e]()}}))},t._clearMenus=function(e){if(!e||e.which!==ge&&("keyup"!==e.type||e.which===ve))for(var n=[].slice.call(document.querySelectorAll(Ue)),o=0,M=n.length;o0&&b--,e.which===me&&bdocument.documentElement.clientHeight;n||(this._element.style.overflowY="hidden"),this._element.classList.add(ln);var o=f.getTransitionDurationFromElement(this._dialog);p.default(this._element).off(f.TRANSITION_END),p.default(this._element).one(f.TRANSITION_END,(function(){t._element.classList.remove(ln),n||p.default(t._element).one(f.TRANSITION_END,(function(){t._element.style.overflowY=""})).emulateTransitionEnd(t._element,o)})).emulateTransitionEnd(o),this._element.focus()}},e._showElement=function(t){var e=this,n=p.default(this._element).hasClass(An),o=this._dialog?this._dialog.querySelector(En):null;this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),p.default(this._dialog).hasClass(zn)&&o?o.scrollTop=0:this._element.scrollTop=0,n&&f.reflow(this._element),p.default(this._element).addClass(un),this._config.focus&&this._enforceFocus();var M=p.default.Event(Wn,{relatedTarget:t}),b=function(){e._config.focus&&e._element.focus(),e._isTransitioning=!1,p.default(e._element).trigger(M)};if(n){var c=f.getTransitionDurationFromElement(this._dialog);p.default(this._dialog).one(f.TRANSITION_END,b).emulateTransitionEnd(c)}else b()},e._enforceFocus=function(){var t=this;p.default(document).off(vn).on(vn,(function(e){document!==e.target&&t._element!==e.target&&0===p.default(t._element).has(e.target).length&&t._element.focus()}))},e._setEscapeEvent=function(){var t=this;this._isShown?p.default(this._element).on(gn,(function(e){t._config.keyboard&&e.which===rn?(e.preventDefault(),t.hide()):t._config.keyboard||e.which!==rn||t._triggerBackdropTransition()})):this._isShown||p.default(this._element).off(gn)},e._setResizeEvent=function(){var t=this;this._isShown?p.default(window).on(Rn,(function(e){return t.handleUpdate(e)})):p.default(window).off(Rn)},e._hideModal=function(){var t=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._showBackdrop((function(){p.default(document.body).removeClass(sn),t._resetAdjustments(),t._resetScrollbar(),p.default(t._element).trigger(qn)}))},e._removeBackdrop=function(){this._backdrop&&(p.default(this._backdrop).remove(),this._backdrop=null)},e._showBackdrop=function(t){var e=this,n=p.default(this._element).hasClass(An)?An:"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className=On,n&&this._backdrop.classList.add(n),p.default(this._backdrop).appendTo(document.body),p.default(this._element).on(mn,(function(t){e._ignoreBackdropClick?e._ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"===e._config.backdrop?e._triggerBackdropTransition():e.hide())})),n&&f.reflow(this._backdrop),p.default(this._backdrop).addClass(un),!t)return;if(!n)return void t();var o=f.getTransitionDurationFromElement(this._backdrop);p.default(this._backdrop).one(f.TRANSITION_END,t).emulateTransitionEnd(o)}else if(!this._isShown&&this._backdrop){p.default(this._backdrop).removeClass(un);var M=function(){e._removeBackdrop(),t&&t()};if(p.default(this._element).hasClass(An)){var b=f.getTransitionDurationFromElement(this._backdrop);p.default(this._backdrop).one(f.TRANSITION_END,M).emulateTransitionEnd(b)}else M()}else t&&t()},e._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},e._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},e._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=Math.round(t.left+t.right)
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",customClass:"",sanitize:!0,sanitizeFn:null,whiteList:In,popperConfig:null},ao={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string|function)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",whiteList:"object",popperConfig:"(null|object)"},io={HIDE:"hide"+Yn,HIDDEN:"hidden"+Yn,SHOW:"show"+Yn,SHOWN:"shown"+Yn,INSERTED:"inserted"+Yn,CLICK:"click"+Yn,FOCUSIN:"focusin"+Yn,FOCUSOUT:"focusout"+Yn,MOUSEENTER:"mouseenter"+Yn,MOUSELEAVE:"mouseleave"+Yn},Oo=function(){function t(t,e){if(void 0===M.default)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var e=t.prototype;return e.enable=function(){this._isEnabled=!0},e.disable=function(){this._isEnabled=!1},e.toggleEnabled=function(){this._isEnabled=!this._isEnabled},e.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=p.default(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),p.default(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(p.default(this.getTipElement()).hasClass(Zn))return void this._leave(null,this);this._enter(null,this)}},e.dispose=function(){clearTimeout(this._timeout),p.default.removeData(this.element,this.constructor.DATA_KEY),p.default(this.element).off(this.constructor.EVENT_KEY),p.default(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&p.default(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},e.show=function(){var t=this;if("none"===p.default(this.element).css("display"))throw new Error("Please use show on visible elements");var e=p.default.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){p.default(this.element).trigger(e);var n=f.findShadowRoot(this.element),o=p.default.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(e.isDefaultPrevented()||!o)return;var b=this.getTipElement(),c=f.getUID(this.constructor.NAME);b.setAttribute("id",c),this.element.setAttribute("aria-describedby",c),this.setContent(),this.config.animation&&p.default(b).addClass(Jn);var r="function"==typeof this.config.placement?this.config.placement.call(this,b,this.element):this.config.placement,z=this._getAttachment(r);this.addAttachmentClass(z);var a=this._getContainer();p.default(b).data(this.constructor.DATA_KEY,this),p.default.contains(this.element.ownerDocument.documentElement,this.tip)||p.default(b).appendTo(a),p.default(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new M.default(this.element,b,this._getPopperConfig(z)),p.default(b).addClass(Zn),p.default(b).addClass(this.config.customClass),"ontouchstart"in document.documentElement&&p.default(document.body).children().on("mouseover",null,p.default.noop);var i=function(){t.config.animation&&t._fixTransition();var e=t._hoverState;t._hoverState=null,p.default(t.element).trigger(t.constructor.Event.SHOWN),e===eo&&t._leave(null,t)};if(p.default(this.tip).hasClass(Jn)){var O=f.getTransitionDurationFromElement(this.tip);p.default(this.tip).one(f.TRANSITION_END,i).emulateTransitionEnd(O)}else i()}},e.hide=function(t){var e=this,n=this.getTipElement(),o=p.default.Event(this.constructor.Event.HIDE),M=function(){e._hoverState!==to&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),p.default(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(p.default(this.element).trigger(o),!o.isDefaultPrevented()){if(p.default(n).removeClass(Zn),"ontouchstart"in document.documentElement&&p.default(document.body).children().off("mouseover",null,p.default.noop),this._activeTrigger[bo]=!1,this._activeTrigger[Mo]=!1,this._activeTrigger[po]=!1,p.default(this.tip).hasClass(Jn)){var b=f.getTransitionDurationFromElement(n);p.default(n).one(f.TRANSITION_END,M).emulateTransitionEnd(b)}else M();this._hoverState=""}},e.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},e.isWithContent=function(){return Boolean(this.getTitle())},e.addAttachmentClass=function(t){p.default(this.getTipElement()).addClass(Vn+"-"+t)},e.getTipElement=function(){return this.tip=this.tip||p.default(this.config.template)[0],this.tip},e.setContent=function(){var t=this.getTipElement();this.setElementContent(p.default(t.querySelectorAll(no)),this.getTitle()),p.default(t).removeClass(Jn+" "+Zn)},e.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=jn(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?p.default(e).parent().is(t)||t.empty().append(e):t.text(p.default(e).text())},e.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},e._getPopperConfig=function(t){var e=this;return r({},{placement:t,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:oo},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}},this.config.popperConfig)},e._getOffset=function(){var t=this,e={};return"function"==typeof this.config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t.config.offset(e.offsets,t.element)),e}:e.offset=this.config.offset,e},e._getContainer=function(){return!1===this.config.container?document.body:f.isElement(this.config.container)?p.default(this.config.container):p.default(document).find(this.config.container)},e._getAttachment=function(t){return ro[t.toUpperCase()]},e._setListeners=function(){var t=this;this.config.trigger.split(" ").forEach((function(e){if("click"===e)p.default(t.element).on(t.constructor.Event.CLICK,t.config.selector,(function(e){return t.toggle(e)}));else if(e!==co){var n=e===po?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,o=e===po?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;p.default(t.element).on(n,t.config.selector,(function(e){return t._enter(e)})).on(o,t.config.selector,(function(e){return t._leave(e)}))}})),this._hideModalHandler=function(){t.element&&t.hide()},p.default(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=r({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},e._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},e._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||p.default(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),p.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Mo:po]=!0),p.default(e.getTipElement()).hasClass(Zn)||e._hoverState===to?e._hoverState=to:(clearTimeout(e._timeout),e._hoverState=to,e.config.delay&&e.config.delay.show?e._timeout=setTimeout((function(){e._hoverState===to&&e.show()}),e.config.delay.show):e.show())},e._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||p.default(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),p.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Mo:po]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=eo,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout((function(){e._hoverState===eo&&e.hide()}),e.config.delay.hide):e.hide())},e._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},e._getConfig=function(t){var e=p.default(this.element).data();return Object.keys(e).forEach((function(t){-1!==Qn.indexOf(t)&&delete e[t]})),"number"==typeof(t=r({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),f.typeCheckConfig(Hn,t,this.constructor.DefaultType),t.sanitize&&(t.template=jn(t.template,t.whiteList,t.sanitizeFn)),t},e._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},e._cleanTipClass=function(){var t=p.default(this.getTipElement()),e=t.attr("class").match(Kn);null!==e&&e.length&&t.removeClass(e.join(""))},e._handlePopperPlacementChange=function(t){this.tip=t.instance.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},e._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(p.default(t).removeClass(Jn),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},t._jQueryInterface=function(e){return this.each((function(){var n=p.default(this),o=n.data(Gn),M="object"==typeof e&&e;if((o||!/dispose|hide/.test(e))&&(o||(o=new t(this,M),n.data(Gn,o)),"string"==typeof e)){if(void 0===o[e])throw new TypeError('No method named "'+e+'"');o[e]()}}))},c(t,null,[{key:"VERSION",get:function(){return Fn}},{key:"Default",get:function(){return zo}},{key:"NAME",get:function(){return Hn}},{key:"DATA_KEY",get:function(){return Gn}},{key:"Event",get:function(){return io}},{key:"EVENT_KEY",get:function(){return Yn}},{key:"DefaultType",get:function(){return ao}}]),t}();p.default.fn[Hn]=Oo._jQueryInterface,p.default.fn[Hn].Constructor=Oo,p.default.fn[Hn].noConflict=function(){return p.default.fn[Hn]=$n,Oo._jQueryInterface};var so="popover",Ao="4.6.2",uo="bs.popover",lo="."+uo,fo=p.default.fn[so],qo="bs-popover",ho=new RegExp("(^|\\s)"+qo+"\\S+","g"),Wo="fade",vo="show",Ro=".popover-header",mo=".popover-body",go=r({},Oo.Default,{placement:"right",trigger:"click",content:"",template:''}),Lo=r({},Oo.DefaultType,{content:"(string|element|function)"}),yo={HIDE:"hide"+lo,HIDDEN:"hidden"+lo,SHOW:"show"+lo,SHOWN:"shown"+lo,INSERTED:"inserted"+lo,CLICK:"click"+lo,FOCUSIN:"focusin"+lo,FOCUSOUT:"focusout"+lo,MOUSEENTER:"mouseenter"+lo,MOUSELEAVE:"mouseleave"+lo},_o=function(t){function e(){return t.apply(this,arguments)||this}z(e,t);var n=e.prototype;return n.isWithContent=function(){return this.getTitle()||this._getContent()},n.addAttachmentClass=function(t){p.default(this.getTipElement()).addClass(qo+"-"+t)},n.getTipElement=function(){return this.tip=this.tip||p.default(this.config.template)[0],this.tip},n.setContent=function(){var t=p.default(this.getTipElement());this.setElementContent(t.find(Ro),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(mo),e),t.removeClass(Wo+" "+vo)},n._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},n._cleanTipClass=function(){var t=p.default(this.getTipElement()),e=t.attr("class").match(ho);null!==e&&e.length>0&&t.removeClass(e.join(""))},e._jQueryInterface=function(t){return this.each((function(){var n=p.default(this).data(uo),o="object"==typeof t?t:null;if((n||!/dispose|hide/.test(t))&&(n||(n=new e(this,o),p.default(this).data(uo,n)),"string"==typeof t)){if(void 0===n[t])throw new TypeError('No method named "'+t+'"');n[t]()}}))},c(e,null,[{key:"VERSION",get:function(){return Ao}},{key:"Default",get:function(){return go}},{key:"NAME",get:function(){return so}},{key:"DATA_KEY",get:function(){return uo}},{key:"Event",get:function(){return yo}},{key:"EVENT_KEY",get:function(){return lo}},{key:"DefaultType",get:function(){return Lo}}]),e}(Oo);p.default.fn[so]=_o._jQueryInterface,p.default.fn[so].Constructor=_o,p.default.fn[so].noConflict=function(){return p.default.fn[so]=fo,_o._jQueryInterface};var No="scrollspy",Eo="4.6.2",To="bs.scrollspy",Bo="."+To,Co=".data-api",wo=p.default.fn[No],So="dropdown-item",Xo="active",xo="activate"+Bo,ko="scroll"+Bo,Io="load"+Bo+Co,Do="offset",Po="position",Uo='[data-spy="scroll"]',jo=".nav, .list-group",Ho=".nav-link",Fo=".nav-item",Go=".list-group-item",Yo=".dropdown",$o=".dropdown-item",Vo=".dropdown-toggle",Ko={offset:10,method:"auto",target:""},Qo={offset:"number",method:"string",target:"(string|element)"},Jo=function(){function t(t,e){var n=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+" "+Ho+","+this._config.target+" "+Go+","+this._config.target+" "+$o,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,p.default(this._scrollElement).on(ko,(function(t){return n._process(t)})),this.refresh(),this._process()}var e=t.prototype;return e.refresh=function(){var t=this,e=this._scrollElement===this._scrollElement.window?Do:Po,n="auto"===this._config.method?e:this._config.method,o=n===Po?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map((function(t){var e,M=f.getSelectorFromElement(t);if(M&&(e=document.querySelector(M)),e){var b=e.getBoundingClientRect();if(b.width||b.height)return[p.default(e)[n]().top+o,M]}return null})).filter(Boolean).sort((function(t,e){return t[0]-e[0]})).forEach((function(e){t._offsets.push(e[0]),t._targets.push(e[1])}))},e.dispose=function(){p.default.removeData(this._element,To),p.default(this._scrollElement).off(Bo),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},e._getConfig=function(t){if("string"!=typeof(t=r({},Ko,"object"==typeof t&&t?t:{})).target&&f.isElement(t.target)){var e=p.default(t.target).attr("id");e||(e=f.getUID(No),p.default(t.target).attr("id",e)),t.target="#"+e}return f.typeCheckConfig(No,t,Qo),t},e._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},e._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},e._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},e._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var o=this._targets[this._targets.length-1];this._activeTarget!==o&&this._activate(o)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var p=this._offsets.length;p--;)this._activeTarget!==this._targets[p]&&t>=this._offsets[p]&&(void 0===this._offsets[p+1]||t{"use strict";var o=n(7526),p=n(251),M=n(4634);function b(){return r.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function c(t,e){if(b()=b())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+b().toString(16)+" bytes");return 0|t}function A(t,e){if(r.isBuffer(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var n=t.length;if(0===n)return 0;for(var o=!1;;)switch(e){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return P(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return U(t).length;default:if(o)return P(t).length;e=(""+e).toLowerCase(),o=!0}}function u(t,e,n){var o=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return E(this,e,n);case"utf8":case"utf-8":return L(this,e,n);case"ascii":return _(this,e,n);case"latin1":case"binary":return N(this,e,n);case"base64":return g(this,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return T(this,e,n);default:if(o)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),o=!0}}function l(t,e,n){var o=t[e];t[e]=t[n],t[n]=o}function d(t,e,n,o,p){if(0===t.length)return-1;if("string"==typeof n?(o=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=p?0:t.length-1),n<0&&(n=t.length+n),n>=t.length){if(p)return-1;n=t.length-1}else if(n<0){if(!p)return-1;n=0}if("string"==typeof e&&(e=r.from(e,o)),r.isBuffer(e))return 0===e.length?-1:f(t,e,n,o,p);if("number"==typeof e)return e&=255,r.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?p?Uint8Array.prototype.indexOf.call(t,e,n):Uint8Array.prototype.lastIndexOf.call(t,e,n):f(t,[e],n,o,p);throw new TypeError("val must be string, number or Buffer")}function f(t,e,n,o,p){var M,b=1,c=t.length,r=e.length;if(void 0!==o&&("ucs2"===(o=String(o).toLowerCase())||"ucs-2"===o||"utf16le"===o||"utf-16le"===o)){if(t.length<2||e.length<2)return-1;b=2,c/=2,r/=2,n/=2}function z(t,e){return 1===b?t[e]:t.readUInt16BE(e*b)}if(p){var a=-1;for(M=n;Mc&&(n=c-r),M=n;M>=0;M--){for(var i=!0,O=0;Op&&(o=p):o=p;var M=e.length;if(M%2!=0)throw new TypeError("Invalid hex string");o>M/2&&(o=M/2);for(var b=0;b>8,p=n%256,M.push(p),M.push(o);return M}(e,t.length-n),t,n,o)}function g(t,e,n){return 0===e&&n===t.length?o.fromByteArray(t):o.fromByteArray(t.slice(e,n))}function L(t,e,n){n=Math.min(t.length,n);for(var o=[],p=e;p239?4:z>223?3:z>191?2:1;if(p+i<=n)switch(i){case 1:z<128&&(a=z);break;case 2:128==(192&(M=t[p+1]))&&(r=(31&z)<<6|63&M)>127&&(a=r);break;case 3:M=t[p+1],b=t[p+2],128==(192&M)&&128==(192&b)&&(r=(15&z)<<12|(63&M)<<6|63&b)>2047&&(r<55296||r>57343)&&(a=r);break;case 4:M=t[p+1],b=t[p+2],c=t[p+3],128==(192&M)&&128==(192&b)&&128==(192&c)&&(r=(15&z)<<18|(63&M)<<12|(63&b)<<6|63&c)>65535&&r<1114112&&(a=r)}null===a?(a=65533,i=1):a>65535&&(a-=65536,o.push(a>>>10&1023|55296),a=56320|1023&a),o.push(a),p+=i}return function(t){var e=t.length;if(e<=y)return String.fromCharCode.apply(String,t);var n="",o=0;for(;o0&&(t=this.toString("hex",0,n).match(/.{2}/g).join(" "),this.length>n&&(t+=" ... ")),""},r.prototype.compare=function(t,e,n,o,p){if(!r.isBuffer(t))throw new TypeError("Argument must be a Buffer");if(void 0===e&&(e=0),void 0===n&&(n=t?t.length:0),void 0===o&&(o=0),void 0===p&&(p=this.length),e<0||n>t.length||o<0||p>this.length)throw new RangeError("out of range index");if(o>=p&&e>=n)return 0;if(o>=p)return-1;if(e>=n)return 1;if(this===t)return 0;for(var M=(p>>>=0)-(o>>>=0),b=(n>>>=0)-(e>>>=0),c=Math.min(M,b),z=this.slice(o,p),a=t.slice(e,n),i=0;ip)&&(n=p),t.length>0&&(n<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");o||(o="utf8");for(var M=!1;;)switch(o){case"hex":return q(this,t,e,n);case"utf8":case"utf-8":return h(this,t,e,n);case"ascii":return W(this,t,e,n);case"latin1":case"binary":return v(this,t,e,n);case"base64":return R(this,t,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return m(this,t,e,n);default:if(M)throw new TypeError("Unknown encoding: "+o);o=(""+o).toLowerCase(),M=!0}},r.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var y=4096;function _(t,e,n){var o="";n=Math.min(t.length,n);for(var p=e;po)&&(n=o);for(var p="",M=e;Mn)throw new RangeError("Trying to access beyond buffer length")}function C(t,e,n,o,p,M){if(!r.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>p||et.length)throw new RangeError("Index out of range")}function w(t,e,n,o){e<0&&(e=65535+e+1);for(var p=0,M=Math.min(t.length-n,2);p>>8*(o?p:1-p)}function S(t,e,n,o){e<0&&(e=4294967295+e+1);for(var p=0,M=Math.min(t.length-n,4);p>>8*(o?p:3-p)&255}function X(t,e,n,o,p,M){if(n+o>t.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function x(t,e,n,o,M){return M||X(t,0,n,4),p.write(t,e,n,o,23,4),n+4}function k(t,e,n,o,M){return M||X(t,0,n,8),p.write(t,e,n,o,52,8),n+8}r.prototype.slice=function(t,e){var n,o=this.length;if((t=~~t)<0?(t+=o)<0&&(t=0):t>o&&(t=o),(e=void 0===e?o:~~e)<0?(e+=o)<0&&(e=0):e>o&&(e=o),e0&&(p*=256);)o+=this[t+--e]*p;return o},r.prototype.readUInt8=function(t,e){return e||B(t,1,this.length),this[t]},r.prototype.readUInt16LE=function(t,e){return e||B(t,2,this.length),this[t]|this[t+1]<<8},r.prototype.readUInt16BE=function(t,e){return e||B(t,2,this.length),this[t]<<8|this[t+1]},r.prototype.readUInt32LE=function(t,e){return e||B(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},r.prototype.readUInt32BE=function(t,e){return e||B(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},r.prototype.readIntLE=function(t,e,n){t|=0,e|=0,n||B(t,e,this.length);for(var o=this[t],p=1,M=0;++M=(p*=128)&&(o-=Math.pow(2,8*e)),o},r.prototype.readIntBE=function(t,e,n){t|=0,e|=0,n||B(t,e,this.length);for(var o=e,p=1,M=this[t+--o];o>0&&(p*=256);)M+=this[t+--o]*p;return M>=(p*=128)&&(M-=Math.pow(2,8*e)),M},r.prototype.readInt8=function(t,e){return e||B(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},r.prototype.readInt16LE=function(t,e){e||B(t,2,this.length);var n=this[t]|this[t+1]<<8;return 32768&n?4294901760|n:n},r.prototype.readInt16BE=function(t,e){e||B(t,2,this.length);var n=this[t+1]|this[t]<<8;return 32768&n?4294901760|n:n},r.prototype.readInt32LE=function(t,e){return e||B(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},r.prototype.readInt32BE=function(t,e){return e||B(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},r.prototype.readFloatLE=function(t,e){return e||B(t,4,this.length),p.read(this,t,!0,23,4)},r.prototype.readFloatBE=function(t,e){return e||B(t,4,this.length),p.read(this,t,!1,23,4)},r.prototype.readDoubleLE=function(t,e){return e||B(t,8,this.length),p.read(this,t,!0,52,8)},r.prototype.readDoubleBE=function(t,e){return e||B(t,8,this.length),p.read(this,t,!1,52,8)},r.prototype.writeUIntLE=function(t,e,n,o){(t=+t,e|=0,n|=0,o)||C(this,t,e,n,Math.pow(2,8*n)-1,0);var p=1,M=0;for(this[e]=255&t;++M=0&&(M*=256);)this[e+p]=t/M&255;return e+n},r.prototype.writeUInt8=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,1,255,0),r.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},r.prototype.writeUInt16LE=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,2,65535,0),r.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):w(this,t,e,!0),e+2},r.prototype.writeUInt16BE=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,2,65535,0),r.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):w(this,t,e,!1),e+2},r.prototype.writeUInt32LE=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,4,4294967295,0),r.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):S(this,t,e,!0),e+4},r.prototype.writeUInt32BE=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,4,4294967295,0),r.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):S(this,t,e,!1),e+4},r.prototype.writeIntLE=function(t,e,n,o){if(t=+t,e|=0,!o){var p=Math.pow(2,8*n-1);C(this,t,e,n,p-1,-p)}var M=0,b=1,c=0;for(this[e]=255&t;++M=0&&(b*=256);)t<0&&0===c&&0!==this[e+M+1]&&(c=1),this[e+M]=(t/b|0)-c&255;return e+n},r.prototype.writeInt8=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,1,127,-128),r.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},r.prototype.writeInt16LE=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,2,32767,-32768),r.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):w(this,t,e,!0),e+2},r.prototype.writeInt16BE=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,2,32767,-32768),r.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):w(this,t,e,!1),e+2},r.prototype.writeInt32LE=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,4,2147483647,-2147483648),r.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):S(this,t,e,!0),e+4},r.prototype.writeInt32BE=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),r.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):S(this,t,e,!1),e+4},r.prototype.writeFloatLE=function(t,e,n){return x(this,t,e,!0,n)},r.prototype.writeFloatBE=function(t,e,n){return x(this,t,e,!1,n)},r.prototype.writeDoubleLE=function(t,e,n){return k(this,t,e,!0,n)},r.prototype.writeDoubleBE=function(t,e,n){return k(this,t,e,!1,n)},r.prototype.copy=function(t,e,n,o){if(n||(n=0),o||0===o||(o=this.length),e>=t.length&&(e=t.length),e||(e=0),o>0&&o=this.length)throw new RangeError("sourceStart out of bounds");if(o<0)throw new RangeError("sourceEnd out of bounds");o>this.length&&(o=this.length),t.length-e=0;--p)t[p+e]=this[p+n];else if(M<1e3||!r.TYPED_ARRAY_SUPPORT)for(p=0;p>>=0,n=void 0===n?this.length:n>>>0,t||(t=0),"number"==typeof t)for(M=e;M55295&&n<57344){if(!p){if(n>56319){(e-=3)>-1&&M.push(239,191,189);continue}if(b+1===o){(e-=3)>-1&&M.push(239,191,189);continue}p=n;continue}if(n<56320){(e-=3)>-1&&M.push(239,191,189),p=n;continue}n=65536+(p-55296<<10|n-56320)}else p&&(e-=3)>-1&&M.push(239,191,189);if(p=null,n<128){if((e-=1)<0)break;M.push(n)}else if(n<2048){if((e-=2)<0)break;M.push(n>>6|192,63&n|128)}else if(n<65536){if((e-=3)<0)break;M.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;M.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return M}function U(t){return o.toByteArray(function(t){if((t=function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}(t).replace(I,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function j(t,e,n,o){for(var p=0;p=e.length||p>=t.length);++p)e[p+n]=t[p];return p}},7965:(t,e,n)=>{"use strict";var o=n(6426),p={"text/plain":"Text","text/html":"Url",default:"Text"};t.exports=function(t,e){var n,M,b,c,r,z=!1;e||(e={}),e.debug;try{if(M=o(),b=document.createRange(),c=document.getSelection(),(r=document.createElement("span")).textContent=t,r.ariaHidden="true",r.style.all="unset",r.style.position="fixed",r.style.top=0,r.style.clip="rect(0, 0, 0, 0)",r.style.whiteSpace="pre",r.style.webkitUserSelect="text",r.style.MozUserSelect="text",r.style.msUserSelect="text",r.style.userSelect="text",r.addEventListener("copy",(function(n){if(n.stopPropagation(),e.format)if(n.preventDefault(),void 0===n.clipboardData){window.clipboardData.clearData();var o=p[e.format]||p.default;window.clipboardData.setData(o,t)}else n.clipboardData.clearData(),n.clipboardData.setData(e.format,t);e.onCopy&&(n.preventDefault(),e.onCopy(n.clipboardData))})),document.body.appendChild(r),b.selectNodeContents(r),c.addRange(b),!document.execCommand("copy"))throw new Error("copy command was unsuccessful");z=!0}catch(o){try{window.clipboardData.setData(e.format||"text",t),e.onCopy&&e.onCopy(window.clipboardData),z=!0}catch(o){n=function(t){var e=(/mac os x/i.test(navigator.userAgent)?"⌘":"Ctrl")+"+C";return t.replace(/#{\s*key\s*}/g,e)}("message"in e?e.message:"Copy to clipboard: #{key}, Enter"),window.prompt(n,t)}}finally{c&&("function"==typeof c.removeRange?c.removeRange(b):c.removeAllRanges()),r&&document.body.removeChild(r),M()}return z}},251:(t,e)=>{e.read=function(t,e,n,o,p){var M,b,c=8*p-o-1,r=(1<>1,a=-7,i=n?p-1:0,O=n?-1:1,s=t[e+i];for(i+=O,M=s&(1<<-a)-1,s>>=-a,a+=c;a>0;M=256*M+t[e+i],i+=O,a-=8);for(b=M&(1<<-a)-1,M>>=-a,a+=o;a>0;b=256*b+t[e+i],i+=O,a-=8);if(0===M)M=1-z;else{if(M===r)return b?NaN:1/0*(s?-1:1);b+=Math.pow(2,o),M-=z}return(s?-1:1)*b*Math.pow(2,M-o)},e.write=function(t,e,n,o,p,M){var b,c,r,z=8*M-p-1,a=(1<>1,O=23===p?Math.pow(2,-24)-Math.pow(2,-77):0,s=o?0:M-1,A=o?1:-1,u=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(c=isNaN(e)?1:0,b=a):(b=Math.floor(Math.log(e)/Math.LN2),e*(r=Math.pow(2,-b))<1&&(b--,r*=2),(e+=b+i>=1?O/r:O*Math.pow(2,1-i))*r>=2&&(b++,r/=2),b+i>=a?(c=0,b=a):b+i>=1?(c=(e*r-1)*Math.pow(2,p),b+=i):(c=e*Math.pow(2,i-1)*Math.pow(2,p),b=0));p>=8;t[n+s]=255&c,s+=A,c/=256,p-=8);for(b=b<0;t[n+s]=255&b,s+=A,b/=256,z-=8);t[n+s-A]|=128*u}},4634:t=>{var e={}.toString;t.exports=Array.isArray||function(t){return"[object Array]"==e.call(t)}},4692:function(t,e){var n;!function(e,n){"use strict";"object"==typeof t.exports?t.exports=e.document?n(e,!0):function(t){if(!t.document)throw new Error("jQuery requires a window with a document");return n(t)}:n(e)}("undefined"!=typeof window?window:this,(function(o,p){"use strict";var M=[],b=Object.getPrototypeOf,c=M.slice,r=M.flat?function(t){return M.flat.call(t)}:function(t){return M.concat.apply([],t)},z=M.push,a=M.indexOf,i={},O=i.toString,s=i.hasOwnProperty,A=s.toString,u=A.call(Object),l={},d=function(t){return"function"==typeof t&&"number"!=typeof t.nodeType&&"function"!=typeof t.item},f=function(t){return null!=t&&t===t.window},q=o.document,h={type:!0,src:!0,nonce:!0,noModule:!0};function W(t,e,n){var o,p,M=(n=n||q).createElement("script");if(M.text=t,e)for(o in h)(p=e[o]||e.getAttribute&&e.getAttribute(o))&&M.setAttribute(o,p);n.head.appendChild(M).parentNode.removeChild(M)}function v(t){return null==t?t+"":"object"==typeof t||"function"==typeof t?i[O.call(t)]||"object":typeof t}var R="3.7.1",m=/HTML$/i,g=function(t,e){return new g.fn.init(t,e)};function L(t){var e=!!t&&"length"in t&&t.length,n=v(t);return!d(t)&&!f(t)&&("array"===n||0===e||"number"==typeof e&&e>0&&e-1 in t)}function y(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}g.fn=g.prototype={jquery:R,constructor:g,length:0,toArray:function(){return c.call(this)},get:function(t){return null==t?c.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=g.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return g.each(this,t)},map:function(t){return this.pushStack(g.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(c.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(g.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(g.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+T+")"+T+"*"),P=new RegExp(T+"|>"),U=new RegExp(x),j=new RegExp("^"+C+"$"),H={ID:new RegExp("^#("+C+")"),CLASS:new RegExp("^\\.("+C+")"),TAG:new RegExp("^("+C+"|[*])"),ATTR:new RegExp("^"+w),PSEUDO:new RegExp("^"+x),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+T+"*(even|odd|(([+-]|)(\\d*)n|)"+T+"*(?:([+-]|)"+T+"*(\\d+)|))"+T+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+T+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+T+"*((?:-\\d)?\\d*)"+T+"*\\)|)(?=[^-]|$)","i")},F=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,V=new RegExp("\\\\[\\da-fA-F]{1,6}"+T+"?|\\\\([^\\r\\n\\f])","g"),K=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},Q=function(){rt()},J=Ot((function(t){return!0===t.disabled&&y(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{u.apply(M=c.call(S.childNodes),S.childNodes),M[S.childNodes.length].nodeType}catch(t){u={apply:function(t,e){X.apply(t,c.call(e))},call:function(t){X.apply(t,c.call(arguments,1))}}}function Z(t,e,n,o){var p,M,b,c,z,a,s,A=e&&e.ownerDocument,f=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==f&&9!==f&&11!==f)return n;if(!o&&(rt(e),e=e||r,i)){if(11!==f&&(z=Y.exec(t)))if(p=z[1]){if(9===f){if(!(b=e.getElementById(p)))return n;if(b.id===p)return u.call(n,b),n}else if(A&&(b=A.getElementById(p))&&Z.contains(e,b)&&b.id===p)return u.call(n,b),n}else{if(z[2])return u.apply(n,e.getElementsByTagName(t)),n;if((p=z[3])&&e.getElementsByClassName)return u.apply(n,e.getElementsByClassName(p)),n}if(!(R[t+" "]||O&&O.test(t))){if(s=t,A=e,1===f&&(P.test(t)||D.test(t))){for((A=$.test(t)&&ct(e.parentNode)||e)==e&&l.scope||((c=e.getAttribute("id"))?c=g.escapeSelector(c):e.setAttribute("id",c=d)),M=(a=at(t)).length;M--;)a[M]=(c?"#"+c:":scope")+" "+it(a[M]);s=a.join(",")}try{return u.apply(n,A.querySelectorAll(s)),n}catch(e){R(t,!0)}finally{c===d&&e.removeAttribute("id")}}}return ft(t.replace(B,"$1"),e,n,o)}function tt(){var t=[];return function n(o,p){return t.push(o+" ")>e.cacheLength&&delete n[t.shift()],n[o+" "]=p}}function et(t){return t[d]=!0,t}function nt(t){var e=r.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function ot(t){return function(e){return y(e,"input")&&e.type===t}}function pt(t){return function(e){return(y(e,"input")||y(e,"button"))&&e.type===t}}function Mt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&J(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function bt(t){return et((function(e){return e=+e,et((function(n,o){for(var p,M=t([],n.length,e),b=M.length;b--;)n[p=M[b]]&&(n[p]=!(o[p]=n[p]))}))}))}function ct(t){return t&&void 0!==t.getElementsByTagName&&t}function rt(t){var n,o=t?t.ownerDocument||t:S;return o!=r&&9===o.nodeType&&o.documentElement?(z=(r=o).documentElement,i=!g.isXMLDoc(r),A=z.matches||z.webkitMatchesSelector||z.msMatchesSelector,z.msMatchesSelector&&S!=r&&(n=r.defaultView)&&n.top!==n&&n.addEventListener("unload",Q),l.getById=nt((function(t){return z.appendChild(t).id=g.expando,!r.getElementsByName||!r.getElementsByName(g.expando).length})),l.disconnectedMatch=nt((function(t){return A.call(t,"*")})),l.scope=nt((function(){return r.querySelectorAll(":scope")})),l.cssHas=nt((function(){try{return r.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),l.getById?(e.filter.ID=function(t){var e=t.replace(V,K);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&i){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(V,K);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&i){var n,o,p,M=e.getElementById(t);if(M){if((n=M.getAttributeNode("id"))&&n.value===t)return[M];for(p=e.getElementsByName(t),o=0;M=p[o++];)if((n=M.getAttributeNode("id"))&&n.value===t)return[M]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&i)return e.getElementsByClassName(t)},O=[],nt((function(t){var e;z.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||O.push("\\["+T+"*(?:value|"+L+")"),t.querySelectorAll("[id~="+d+"-]").length||O.push("~="),t.querySelectorAll("a#"+d+"+*").length||O.push(".#.+[+~]"),t.querySelectorAll(":checked").length||O.push(":checked"),(e=r.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),z.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&O.push(":enabled",":disabled"),(e=r.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||O.push("\\["+T+"*name"+T+"*="+T+"*(?:''|\"\")")})),l.cssHas||O.push(":has"),O=O.length&&new RegExp(O.join("|")),m=function(t,e){if(t===e)return b=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!l.sortDetached&&e.compareDocumentPosition(t)===n?t===r||t.ownerDocument==S&&Z.contains(S,t)?-1:e===r||e.ownerDocument==S&&Z.contains(S,e)?1:p?a.call(p,t)-a.call(p,e):0:4&n?-1:1)},r):r}for(t in Z.matches=function(t,e){return Z(t,null,null,e)},Z.matchesSelector=function(t,e){if(rt(t),i&&!R[e+" "]&&(!O||!O.test(e)))try{var n=A.call(t,e);if(n||l.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){R(e,!0)}return Z(e,r,null,[t]).length>0},Z.contains=function(t,e){return(t.ownerDocument||t)!=r&&rt(t),g.contains(t,e)},Z.attr=function(t,n){(t.ownerDocument||t)!=r&&rt(t);var o=e.attrHandle[n.toLowerCase()],p=o&&s.call(e.attrHandle,n.toLowerCase())?o(t,n,!i):void 0;return void 0!==p?p:t.getAttribute(n)},Z.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},g.uniqueSort=function(t){var e,n=[],o=0,M=0;if(b=!l.sortStable,p=!l.sortStable&&c.call(t,0),N.call(t,m),b){for(;e=t[M++];)e===t[M]&&(o=n.push(M));for(;o--;)E.call(t,n[o],1)}return p=null,t},g.fn.uniqueSort=function(){return this.pushStack(g.uniqueSort(c.apply(this)))},e=g.expr={cacheLength:50,createPseudo:et,match:H,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(V,K),t[3]=(t[3]||t[4]||t[5]||"").replace(V,K),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||Z.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&Z.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return H.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&U.test(n)&&(e=at(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(V,K).toLowerCase();return"*"===t?function(){return!0}:function(t){return y(t,e)}},CLASS:function(t){var e=h[t+" "];return e||(e=new RegExp("(^|"+T+")"+t+"("+T+"|$)"))&&h(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(o){var p=Z.attr(o,t);return null==p?"!="===e:!e||(p+="","="===e?p===n:"!="===e?p!==n:"^="===e?n&&0===p.indexOf(n):"*="===e?n&&p.indexOf(n)>-1:"$="===e?n&&p.slice(-n.length)===n:"~="===e?(" "+p.replace(k," ")+" ").indexOf(n)>-1:"|="===e&&(p===n||p.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,o,p){var M="nth"!==t.slice(0,3),b="last"!==t.slice(-4),c="of-type"===e;return 1===o&&0===p?function(t){return!!t.parentNode}:function(e,n,r){var z,a,i,O,s,A=M!==b?"nextSibling":"previousSibling",u=e.parentNode,l=c&&e.nodeName.toLowerCase(),q=!r&&!c,h=!1;if(u){if(M){for(;A;){for(i=e;i=i[A];)if(c?y(i,l):1===i.nodeType)return!1;s=A="only"===t&&!s&&"nextSibling"}return!0}if(s=[b?u.firstChild:u.lastChild],b&&q){for(h=(O=(z=(a=u[d]||(u[d]={}))[t]||[])[0]===f&&z[1])&&z[2],i=O&&u.childNodes[O];i=++O&&i&&i[A]||(h=O=0)||s.pop();)if(1===i.nodeType&&++h&&i===e){a[t]=[f,O,h];break}}else if(q&&(h=O=(z=(a=e[d]||(e[d]={}))[t]||[])[0]===f&&z[1]),!1===h)for(;(i=++O&&i&&i[A]||(h=O=0)||s.pop())&&(!(c?y(i,l):1===i.nodeType)||!++h||(q&&((a=i[d]||(i[d]={}))[t]=[f,h]),i!==e)););return(h-=p)===o||h%o==0&&h/o>=0}}},PSEUDO:function(t,n){var o,p=e.pseudos[t]||e.setFilters[t.toLowerCase()]||Z.error("unsupported pseudo: "+t);return p[d]?p(n):p.length>1?(o=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var o,M=p(t,n),b=M.length;b--;)t[o=a.call(t,M[b])]=!(e[o]=M[b])})):function(t){return p(t,0,o)}):p}},pseudos:{not:et((function(t){var e=[],n=[],o=dt(t.replace(B,"$1"));return o[d]?et((function(t,e,n,p){for(var M,b=o(t,null,p,[]),c=t.length;c--;)(M=b[c])&&(t[c]=!(e[c]=M))})):function(t,p,M){return e[0]=t,o(e,null,M,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return Z(t,e).length>0}})),contains:et((function(t){return t=t.replace(V,K),function(e){return(e.textContent||g.text(e)).indexOf(t)>-1}})),lang:et((function(t){return j.test(t||"")||Z.error("unsupported lang: "+t),t=t.replace(V,K).toLowerCase(),function(e){var n;do{if(n=i?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=o.location&&o.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===z},focus:function(t){return t===function(){try{return r.activeElement}catch(t){}}()&&r.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:Mt(!1),disabled:Mt(!0),checked:function(t){return y(t,"input")&&!!t.checked||y(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return F.test(t.nodeName)},button:function(t){return y(t,"input")&&"button"===t.type||y(t,"button")},text:function(t){var e;return y(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:bt((function(){return[0]})),last:bt((function(t,e){return[e-1]})),eq:bt((function(t,e,n){return[n<0?n+e:n]})),even:bt((function(t,e){for(var n=0;ne?e:n;--o>=0;)t.push(o);return t})),gt:bt((function(t,e,n){for(var o=n<0?n+e:n;++o1?function(e,n,o){for(var p=t.length;p--;)if(!t[p](e,n,o))return!1;return!0}:t[0]}function At(t,e,n,o,p){for(var M,b=[],c=0,r=t.length,z=null!=e;c-1&&(M[z]=!(b[z]=O))}}else s=At(s===b?s.splice(d,s.length):s),p?p(null,b,s,r):u.apply(b,s)}))}function lt(t){for(var o,p,M,b=t.length,c=e.relative[t[0].type],r=c||e.relative[" "],z=c?1:0,i=Ot((function(t){return t===o}),r,!0),O=Ot((function(t){return a.call(o,t)>-1}),r,!0),s=[function(t,e,p){var M=!c&&(p||e!=n)||((o=e).nodeType?i(t,e,p):O(t,e,p));return o=null,M}];z1&&st(s),z>1&&it(t.slice(0,z-1).concat({value:" "===t[z-2].type?"*":""})).replace(B,"$1"),p,z0,M=t.length>0,b=function(b,c,z,a,O){var s,A,l,d=0,q="0",h=b&&[],W=[],v=n,R=b||M&&e.find.TAG("*",O),m=f+=null==v?1:Math.random()||.1,L=R.length;for(O&&(n=c==r||c||O);q!==L&&null!=(s=R[q]);q++){if(M&&s){for(A=0,c||s.ownerDocument==r||(rt(s),z=!i);l=t[A++];)if(l(s,c||r,z)){u.call(a,s);break}O&&(f=m)}p&&((s=!l&&s)&&d--,b&&h.push(s))}if(d+=q,p&&q!==d){for(A=0;l=o[A++];)l(h,W,c,z);if(b){if(d>0)for(;q--;)h[q]||W[q]||(W[q]=_.call(a));W=At(W)}u.apply(a,W),O&&!b&&W.length>0&&d+o.length>1&&g.uniqueSort(a)}return O&&(f=m,n=v),h};return p?et(b):b}(b,M)),c.selector=t}return c}function ft(t,n,o,p){var M,b,c,r,z,a="function"==typeof t&&t,O=!p&&at(t=a.selector||t);if(o=o||[],1===O.length){if((b=O[0]=O[0].slice(0)).length>2&&"ID"===(c=b[0]).type&&9===n.nodeType&&i&&e.relative[b[1].type]){if(!(n=(e.find.ID(c.matches[0].replace(V,K),n)||[])[0]))return o;a&&(n=n.parentNode),t=t.slice(b.shift().value.length)}for(M=H.needsContext.test(t)?0:b.length;M--&&(c=b[M],!e.relative[r=c.type]);)if((z=e.find[r])&&(p=z(c.matches[0].replace(V,K),$.test(b[0].type)&&ct(n.parentNode)||n))){if(b.splice(M,1),!(t=p.length&&it(b)))return u.apply(o,p),o;break}}return(a||dt(t,O))(p,n,!i,o,!n||$.test(t)&&ct(n.parentNode)||n),o}zt.prototype=e.filters=e.pseudos,e.setFilters=new zt,l.sortStable=d.split("").sort(m).join("")===d,rt(),l.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(r.createElement("fieldset"))})),g.find=Z,g.expr[":"]=g.expr.pseudos,g.unique=g.uniqueSort,Z.compile=dt,Z.select=ft,Z.setDocument=rt,Z.tokenize=at,Z.escape=g.escapeSelector,Z.getText=g.text,Z.isXML=g.isXMLDoc,Z.selectors=g.expr,Z.support=g.support,Z.uniqueSort=g.uniqueSort}();var x=function(t,e,n){for(var o=[],p=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(p&&g(t).is(n))break;o.push(t)}return o},k=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},I=g.expr.match.needsContext,D=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function P(t,e,n){return d(e)?g.grep(t,(function(t,o){return!!e.call(t,o,t)!==n})):e.nodeType?g.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?g.grep(t,(function(t){return a.call(e,t)>-1!==n})):g.filter(e,t,n)}g.filter=function(t,e,n){var o=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===o.nodeType?g.find.matchesSelector(o,t)?[o]:[]:g.find.matches(t,g.grep(e,(function(t){return 1===t.nodeType})))},g.fn.extend({find:function(t){var e,n,o=this.length,p=this;if("string"!=typeof t)return this.pushStack(g(t).filter((function(){for(e=0;e1?g.uniqueSort(n):n},filter:function(t){return this.pushStack(P(this,t||[],!1))},not:function(t){return this.pushStack(P(this,t||[],!0))},is:function(t){return!!P(this,"string"==typeof t&&I.test(t)?g(t):t||[],!1).length}});var U,j=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(g.fn.init=function(t,e,n){var o,p;if(!t)return this;if(n=n||U,"string"==typeof t){if(!(o="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:j.exec(t))||!o[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(o[1]){if(e=e instanceof g?e[0]:e,g.merge(this,g.parseHTML(o[1],e&&e.nodeType?e.ownerDocument||e:q,!0)),D.test(o[1])&&g.isPlainObject(e))for(o in e)d(this[o])?this[o](e[o]):this.attr(o,e[o]);return this}return(p=q.getElementById(o[2]))&&(this[0]=p,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):d(t)?void 0!==n.ready?n.ready(t):t(g):g.makeArray(t,this)}).prototype=g.fn,U=g(q);var H=/^(?:parents|prev(?:Until|All))/,F={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}g.fn.extend({has:function(t){var e=g(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&g.find.matchesSelector(n,t))){M.push(n);break}return this.pushStack(M.length>1?g.uniqueSort(M):M)},index:function(t){return t?"string"==typeof t?a.call(g(t),this[0]):a.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(g.uniqueSort(g.merge(this.get(),g(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),g.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return x(t,"parentNode")},parentsUntil:function(t,e,n){return x(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return x(t,"nextSibling")},prevAll:function(t){return x(t,"previousSibling")},nextUntil:function(t,e,n){return x(t,"nextSibling",n)},prevUntil:function(t,e,n){return x(t,"previousSibling",n)},siblings:function(t){return k((t.parentNode||{}).firstChild,t)},children:function(t){return k(t.firstChild)},contents:function(t){return null!=t.contentDocument&&b(t.contentDocument)?t.contentDocument:(y(t,"template")&&(t=t.content||t),g.merge([],t.childNodes))}},(function(t,e){g.fn[t]=function(n,o){var p=g.map(this,e,n);return"Until"!==t.slice(-5)&&(o=n),o&&"string"==typeof o&&(p=g.filter(o,p)),this.length>1&&(F[t]||g.uniqueSort(p),H.test(t)&&p.reverse()),this.pushStack(p)}}));var Y=/[^\x20\t\r\n\f]+/g;function $(t){return t}function V(t){throw t}function K(t,e,n,o){var p;try{t&&d(p=t.promise)?p.call(t).done(e).fail(n):t&&d(p=t.then)?p.call(t,e,n):e.apply(void 0,[t].slice(o))}catch(t){n.apply(void 0,[t])}}g.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return g.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):g.extend({},t);var e,n,o,p,M=[],b=[],c=-1,r=function(){for(p=p||t.once,o=e=!0;b.length;c=-1)for(n=b.shift();++c-1;)M.splice(n,1),n<=c&&c--})),this},has:function(t){return t?g.inArray(t,M)>-1:M.length>0},empty:function(){return M&&(M=[]),this},disable:function(){return p=b=[],M=n="",this},disabled:function(){return!M},lock:function(){return p=b=[],n||e||(M=n=""),this},locked:function(){return!!p},fireWith:function(t,n){return p||(n=[t,(n=n||[]).slice?n.slice():n],b.push(n),e||r()),this},fire:function(){return z.fireWith(this,arguments),this},fired:function(){return!!o}};return z},g.extend({Deferred:function(t){var e=[["notify","progress",g.Callbacks("memory"),g.Callbacks("memory"),2],["resolve","done",g.Callbacks("once memory"),g.Callbacks("once memory"),0,"resolved"],["reject","fail",g.Callbacks("once memory"),g.Callbacks("once memory"),1,"rejected"]],n="pending",p={state:function(){return n},always:function(){return M.done(arguments).fail(arguments),this},catch:function(t){return p.then(null,t)},pipe:function(){var t=arguments;return g.Deferred((function(n){g.each(e,(function(e,o){var p=d(t[o[4]])&&t[o[4]];M[o[1]]((function(){var t=p&&p.apply(this,arguments);t&&d(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this,p?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,p){var M=0;function b(t,e,n,p){return function(){var c=this,r=arguments,z=function(){var o,z;if(!(t=M&&(n!==V&&(c=void 0,r=[o]),e.rejectWith(c,r))}};t?a():(g.Deferred.getErrorHook?a.error=g.Deferred.getErrorHook():g.Deferred.getStackHook&&(a.error=g.Deferred.getStackHook()),o.setTimeout(a))}}return g.Deferred((function(o){e[0][3].add(b(0,o,d(p)?p:$,o.notifyWith)),e[1][3].add(b(0,o,d(t)?t:$)),e[2][3].add(b(0,o,d(n)?n:V))})).promise()},promise:function(t){return null!=t?g.extend(t,p):p}},M={};return g.each(e,(function(t,o){var b=o[2],c=o[5];p[o[1]]=b.add,c&&b.add((function(){n=c}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),b.add(o[3].fire),M[o[0]]=function(){return M[o[0]+"With"](this===M?void 0:this,arguments),this},M[o[0]+"With"]=b.fireWith})),p.promise(M),t&&t.call(M,M),M},when:function(t){var e=arguments.length,n=e,o=Array(n),p=c.call(arguments),M=g.Deferred(),b=function(t){return function(n){o[t]=this,p[t]=arguments.length>1?c.call(arguments):n,--e||M.resolveWith(o,p)}};if(e<=1&&(K(t,M.done(b(n)).resolve,M.reject,!e),"pending"===M.state()||d(p[n]&&p[n].then)))return M.then();for(;n--;)K(p[n],b(n),M.reject);return M.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;g.Deferred.exceptionHook=function(t,e){o.console&&o.console.warn&&t&&Q.test(t.name)&&o.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},g.readyException=function(t){o.setTimeout((function(){throw t}))};var J=g.Deferred();function Z(){q.removeEventListener("DOMContentLoaded",Z),o.removeEventListener("load",Z),g.ready()}g.fn.ready=function(t){return J.then(t).catch((function(t){g.readyException(t)})),this},g.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--g.readyWait:g.isReady)||(g.isReady=!0,!0!==t&&--g.readyWait>0||J.resolveWith(q,[g]))}}),g.ready.then=J.then,"complete"===q.readyState||"loading"!==q.readyState&&!q.documentElement.doScroll?o.setTimeout(g.ready):(q.addEventListener("DOMContentLoaded",Z),o.addEventListener("load",Z));var tt=function(t,e,n,o,p,M,b){var c=0,r=t.length,z=null==n;if("object"===v(n))for(c in p=!0,n)tt(t,e,c,n[c],!0,M,b);else if(void 0!==o&&(p=!0,d(o)||(b=!0),z&&(b?(e.call(t,o),e=null):(z=e,e=function(t,e,n){return z.call(g(t),n)})),e))for(;c1,null,!0)},removeData:function(t){return this.each((function(){rt.remove(this,t)}))}}),g.extend({queue:function(t,e,n){var o;if(t)return e=(e||"fx")+"queue",o=ct.get(t,e),n&&(!o||Array.isArray(n)?o=ct.access(t,e,g.makeArray(n)):o.push(n)),o||[]},dequeue:function(t,e){e=e||"fx";var n=g.queue(t,e),o=n.length,p=n.shift(),M=g._queueHooks(t,e);"inprogress"===p&&(p=n.shift(),o--),p&&("fx"===e&&n.unshift("inprogress"),delete M.stop,p.call(t,(function(){g.dequeue(t,e)}),M)),!o&&M&&M.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return ct.get(t,n)||ct.access(t,n,{empty:g.Callbacks("once memory").add((function(){ct.remove(t,[e+"queue",n])}))})}}),g.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,yt=/^$|^module$|\/(?:java|ecma)script/i;Rt=q.createDocumentFragment().appendChild(q.createElement("div")),(mt=q.createElement("input")).setAttribute("type","radio"),mt.setAttribute("checked","checked"),mt.setAttribute("name","t"),Rt.appendChild(mt),l.checkClone=Rt.cloneNode(!0).cloneNode(!0).lastChild.checked,Rt.innerHTML="",l.noCloneChecked=!!Rt.cloneNode(!0).lastChild.defaultValue,Rt.innerHTML="",l.option=!!Rt.lastChild;var _t={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Nt(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&y(t,e)?g.merge([t],n):n}function Et(t,e){for(var n=0,o=t.length;n",""]);var Tt=/<|&#?\w+;/;function Bt(t,e,n,o,p){for(var M,b,c,r,z,a,i=e.createDocumentFragment(),O=[],s=0,A=t.length;s-1)p&&p.push(M);else if(z=lt(M),b=Nt(i.appendChild(M),"script"),z&&Et(b),n)for(a=0;M=b[a++];)yt.test(M.type||"")&&n.push(M);return i}var Ct=/^([^.]*)(?:\.(.+)|)/;function wt(){return!0}function St(){return!1}function Xt(t,e,n,o,p,M){var b,c;if("object"==typeof e){for(c in"string"!=typeof n&&(o=o||n,n=void 0),e)Xt(t,c,n,o,e[c],M);return t}if(null==o&&null==p?(p=n,o=n=void 0):null==p&&("string"==typeof n?(p=o,o=void 0):(p=o,o=n,n=void 0)),!1===p)p=St;else if(!p)return t;return 1===M&&(b=p,p=function(t){return g().off(t),b.apply(this,arguments)},p.guid=b.guid||(b.guid=g.guid++)),t.each((function(){g.event.add(this,e,p,o,n)}))}function xt(t,e,n){n?(ct.set(t,e,!1),g.event.add(t,e,{namespace:!1,handler:function(t){var n,o=ct.get(this,e);if(1&t.isTrigger&&this[e]){if(o)(g.event.special[e]||{}).delegateType&&t.stopPropagation();else if(o=c.call(arguments),ct.set(this,e,o),this[e](),n=ct.get(this,e),ct.set(this,e,!1),o!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else o&&(ct.set(this,e,g.event.trigger(o[0],o.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=wt)}})):void 0===ct.get(t,e)&&g.event.add(t,e,wt)}g.event={global:{},add:function(t,e,n,o,p){var M,b,c,r,z,a,i,O,s,A,u,l=ct.get(t);if(Mt(t))for(n.handler&&(n=(M=n).handler,p=M.selector),p&&g.find.matchesSelector(ut,p),n.guid||(n.guid=g.guid++),(r=l.events)||(r=l.events=Object.create(null)),(b=l.handle)||(b=l.handle=function(e){return void 0!==g&&g.event.triggered!==e.type?g.event.dispatch.apply(t,arguments):void 0}),z=(e=(e||"").match(Y)||[""]).length;z--;)s=u=(c=Ct.exec(e[z])||[])[1],A=(c[2]||"").split(".").sort(),s&&(i=g.event.special[s]||{},s=(p?i.delegateType:i.bindType)||s,i=g.event.special[s]||{},a=g.extend({type:s,origType:u,data:o,handler:n,guid:n.guid,selector:p,needsContext:p&&g.expr.match.needsContext.test(p),namespace:A.join(".")},M),(O=r[s])||((O=r[s]=[]).delegateCount=0,i.setup&&!1!==i.setup.call(t,o,A,b)||t.addEventListener&&t.addEventListener(s,b)),i.add&&(i.add.call(t,a),a.handler.guid||(a.handler.guid=n.guid)),p?O.splice(O.delegateCount++,0,a):O.push(a),g.event.global[s]=!0)},remove:function(t,e,n,o,p){var M,b,c,r,z,a,i,O,s,A,u,l=ct.hasData(t)&&ct.get(t);if(l&&(r=l.events)){for(z=(e=(e||"").match(Y)||[""]).length;z--;)if(s=u=(c=Ct.exec(e[z])||[])[1],A=(c[2]||"").split(".").sort(),s){for(i=g.event.special[s]||{},O=r[s=(o?i.delegateType:i.bindType)||s]||[],c=c[2]&&new RegExp("(^|\\.)"+A.join("\\.(?:.*\\.|)")+"(\\.|$)"),b=M=O.length;M--;)a=O[M],!p&&u!==a.origType||n&&n.guid!==a.guid||c&&!c.test(a.namespace)||o&&o!==a.selector&&("**"!==o||!a.selector)||(O.splice(M,1),a.selector&&O.delegateCount--,i.remove&&i.remove.call(t,a));b&&!O.length&&(i.teardown&&!1!==i.teardown.call(t,A,l.handle)||g.removeEvent(t,s,l.handle),delete r[s])}else for(s in r)g.event.remove(t,s+e[z],n,o,!0);g.isEmptyObject(r)&&ct.remove(t,"handle events")}},dispatch:function(t){var e,n,o,p,M,b,c=new Array(arguments.length),r=g.event.fix(t),z=(ct.get(this,"events")||Object.create(null))[r.type]||[],a=g.event.special[r.type]||{};for(c[0]=r,e=1;e=1))for(;z!==this;z=z.parentNode||this)if(1===z.nodeType&&("click"!==t.type||!0!==z.disabled)){for(M=[],b={},n=0;n-1:g.find(p,this,null,[z]).length),b[p]&&M.push(o);M.length&&c.push({elem:z,handlers:M})}return z=this,r\s*$/g;function Pt(t,e){return y(t,"table")&&y(11!==e.nodeType?e:e.firstChild,"tr")&&g(t).children("tbody")[0]||t}function Ut(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function jt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Ht(t,e){var n,o,p,M,b,c;if(1===e.nodeType){if(ct.hasData(t)&&(c=ct.get(t).events))for(p in ct.remove(e,"handle events"),c)for(n=0,o=c[p].length;n1&&"string"==typeof A&&!l.checkClone&&It.test(A))return t.each((function(p){var M=t.eq(p);u&&(e[0]=A.call(this,p,M.html())),Gt(M,e,n,o)}));if(O&&(M=(p=Bt(e,t[0].ownerDocument,!1,t,o)).firstChild,1===p.childNodes.length&&(p=M),M||o)){for(c=(b=g.map(Nt(p,"script"),Ut)).length;i0&&Et(b,!r&&Nt(t,"script")),c},cleanData:function(t){for(var e,n,o,p=g.event.special,M=0;void 0!==(n=t[M]);M++)if(Mt(n)){if(e=n[ct.expando]){if(e.events)for(o in e.events)p[o]?g.event.remove(n,o):g.removeEvent(n,o,e.handle);n[ct.expando]=void 0}n[rt.expando]&&(n[rt.expando]=void 0)}}}),g.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?g.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Pt(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Pt(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(g.cleanData(Nt(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return g.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,o=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!kt.test(t)&&!_t[(Lt.exec(t)||["",""])[1].toLowerCase()]){t=g.htmlPrefilter(t);try{for(;n=0&&(r+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-M-r-c-.5))||0),r+z}function ae(t,e,n){var o=Kt(t),p=(!l.boxSizingReliable()||n)&&"border-box"===g.css(t,"boxSizing",!1,o),M=p,b=Zt(t,e,o),c="offset"+e[0].toUpperCase()+e.slice(1);if($t.test(b)){if(!n)return b;b="auto"}return(!l.boxSizingReliable()&&p||!l.reliableTrDimensions()&&y(t,"tr")||"auto"===b||!parseFloat(b)&&"inline"===g.css(t,"display",!1,o))&&t.getClientRects().length&&(p="border-box"===g.css(t,"boxSizing",!1,o),(M=c in t)&&(b=t[c])),(b=parseFloat(b)||0)+ze(t,e,n||(p?"border":"content"),M,o,b)+"px"}function ie(t,e,n,o,p){return new ie.prototype.init(t,e,n,o,p)}g.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Zt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,o){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var p,M,b,c=pt(e),r=Vt.test(e),z=t.style;if(r||(e=pe(c)),b=g.cssHooks[e]||g.cssHooks[c],void 0===n)return b&&"get"in b&&void 0!==(p=b.get(t,!1,o))?p:z[e];"string"===(M=typeof n)&&(p=st.exec(n))&&p[1]&&(n=qt(t,e,p),M="number"),null!=n&&n==n&&("number"!==M||r||(n+=p&&p[3]||(g.cssNumber[c]?"":"px")),l.clearCloneStyle||""!==n||0!==e.indexOf("background")||(z[e]="inherit"),b&&"set"in b&&void 0===(n=b.set(t,n,o))||(r?z.setProperty(e,n):z[e]=n))}},css:function(t,e,n,o){var p,M,b,c=pt(e);return Vt.test(e)||(e=pe(c)),(b=g.cssHooks[e]||g.cssHooks[c])&&"get"in b&&(p=b.get(t,!0,n)),void 0===p&&(p=Zt(t,e,o)),"normal"===p&&e in ce&&(p=ce[e]),""===n||n?(M=parseFloat(p),!0===n||isFinite(M)?M||0:p):p}}),g.each(["height","width"],(function(t,e){g.cssHooks[e]={get:function(t,n,o){if(n)return!Me.test(g.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ae(t,e,o):Qt(t,be,(function(){return ae(t,e,o)}))},set:function(t,n,o){var p,M=Kt(t),b=!l.scrollboxSize()&&"absolute"===M.position,c=(b||o)&&"border-box"===g.css(t,"boxSizing",!1,M),r=o?ze(t,e,o,c,M):0;return c&&b&&(r-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(M[e])-ze(t,e,"border",!1,M)-.5)),r&&(p=st.exec(n))&&"px"!==(p[3]||"px")&&(t.style[e]=n,n=g.css(t,e)),re(0,n,r)}}})),g.cssHooks.marginLeft=te(l.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Zt(t,"marginLeft"))||t.getBoundingClientRect().left-Qt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),g.each({margin:"",padding:"",border:"Width"},(function(t,e){g.cssHooks[t+e]={expand:function(n){for(var o=0,p={},M="string"==typeof n?n.split(" "):[n];o<4;o++)p[t+At[o]+e]=M[o]||M[o-2]||M[0];return p}},"margin"!==t&&(g.cssHooks[t+e].set=re)})),g.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var o,p,M={},b=0;if(Array.isArray(e)){for(o=Kt(t),p=e.length;b1)}}),g.Tween=ie,ie.prototype={constructor:ie,init:function(t,e,n,o,p,M){this.elem=t,this.prop=n,this.easing=p||g.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=o,this.unit=M||(g.cssNumber[n]?"":"px")},cur:function(){var t=ie.propHooks[this.prop];return t&&t.get?t.get(this):ie.propHooks._default.get(this)},run:function(t){var e,n=ie.propHooks[this.prop];return this.options.duration?this.pos=e=g.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):ie.propHooks._default.set(this),this}},ie.prototype.init.prototype=ie.prototype,ie.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=g.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){g.fx.step[t.prop]?g.fx.step[t.prop](t):1!==t.elem.nodeType||!g.cssHooks[t.prop]&&null==t.elem.style[pe(t.prop)]?t.elem[t.prop]=t.now:g.style(t.elem,t.prop,t.now+t.unit)}}},ie.propHooks.scrollTop=ie.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},g.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},g.fx=ie.prototype.init,g.fx.step={};var Oe,se,Ae=/^(?:toggle|show|hide)$/,ue=/queueHooks$/;function le(){se&&(!1===q.hidden&&o.requestAnimationFrame?o.requestAnimationFrame(le):o.setTimeout(le,g.fx.interval),g.fx.tick())}function de(){return o.setTimeout((function(){Oe=void 0})),Oe=Date.now()}function fe(t,e){var n,o=0,p={height:t};for(e=e?1:0;o<4;o+=2-e)p["margin"+(n=At[o])]=p["padding"+n]=t;return e&&(p.opacity=p.width=t),p}function qe(t,e,n){for(var o,p=(he.tweeners[e]||[]).concat(he.tweeners["*"]),M=0,b=p.length;M1)},removeAttr:function(t){return this.each((function(){g.removeAttr(this,t)}))}}),g.extend({attr:function(t,e,n){var o,p,M=t.nodeType;if(3!==M&&8!==M&&2!==M)return void 0===t.getAttribute?g.prop(t,e,n):(1===M&&g.isXMLDoc(t)||(p=g.attrHooks[e.toLowerCase()]||(g.expr.match.bool.test(e)?We:void 0)),void 0!==n?null===n?void g.removeAttr(t,e):p&&"set"in p&&void 0!==(o=p.set(t,n,e))?o:(t.setAttribute(e,n+""),n):p&&"get"in p&&null!==(o=p.get(t,e))?o:null==(o=g.find.attr(t,e))?void 0:o)},attrHooks:{type:{set:function(t,e){if(!l.radioValue&&"radio"===e&&y(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,o=0,p=e&&e.match(Y);if(p&&1===t.nodeType)for(;n=p[o++];)t.removeAttribute(n)}}),We={set:function(t,e,n){return!1===e?g.removeAttr(t,n):t.setAttribute(n,n),n}},g.each(g.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=ve[e]||g.find.attr;ve[e]=function(t,e,o){var p,M,b=e.toLowerCase();return o||(M=ve[b],ve[b]=p,p=null!=n(t,e,o)?b:null,ve[b]=M),p}}));var Re=/^(?:input|select|textarea|button)$/i,me=/^(?:a|area)$/i;function ge(t){return(t.match(Y)||[]).join(" ")}function Le(t){return t.getAttribute&&t.getAttribute("class")||""}function ye(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}g.fn.extend({prop:function(t,e){return tt(this,g.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[g.propFix[t]||t]}))}}),g.extend({prop:function(t,e,n){var o,p,M=t.nodeType;if(3!==M&&8!==M&&2!==M)return 1===M&&g.isXMLDoc(t)||(e=g.propFix[e]||e,p=g.propHooks[e]),void 0!==n?p&&"set"in p&&void 0!==(o=p.set(t,n,e))?o:t[e]=n:p&&"get"in p&&null!==(o=p.get(t,e))?o:t[e]},propHooks:{tabIndex:{get:function(t){var e=g.find.attr(t,"tabindex");return e?parseInt(e,10):Re.test(t.nodeName)||me.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),l.optSelected||(g.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),g.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){g.propFix[this.toLowerCase()]=this})),g.fn.extend({addClass:function(t){var e,n,o,p,M,b;return d(t)?this.each((function(e){g(this).addClass(t.call(this,e,Le(this)))})):(e=ye(t)).length?this.each((function(){if(o=Le(this),n=1===this.nodeType&&" "+ge(o)+" "){for(M=0;M-1;)n=n.replace(" "+p+" "," ");b=ge(n),o!==b&&this.setAttribute("class",b)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,o,p,M,b=typeof t,c="string"===b||Array.isArray(t);return d(t)?this.each((function(n){g(this).toggleClass(t.call(this,n,Le(this),e),e)})):"boolean"==typeof e&&c?e?this.addClass(t):this.removeClass(t):(n=ye(t),this.each((function(){if(c)for(M=g(this),p=0;p-1)return!0;return!1}});var _e=/\r/g;g.fn.extend({val:function(t){var e,n,o,p=this[0];return arguments.length?(o=d(t),this.each((function(n){var p;1===this.nodeType&&(null==(p=o?t.call(this,n,g(this).val()):t)?p="":"number"==typeof p?p+="":Array.isArray(p)&&(p=g.map(p,(function(t){return null==t?"":t+""}))),(e=g.valHooks[this.type]||g.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,p,"value")||(this.value=p))}))):p?(e=g.valHooks[p.type]||g.valHooks[p.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(p,"value"))?n:"string"==typeof(n=p.value)?n.replace(_e,""):null==n?"":n:void 0}}),g.extend({valHooks:{option:{get:function(t){var e=g.find.attr(t,"value");return null!=e?e:ge(g.text(t))}},select:{get:function(t){var e,n,o,p=t.options,M=t.selectedIndex,b="select-one"===t.type,c=b?null:[],r=b?M+1:p.length;for(o=M<0?r:b?M:0;o-1)&&(n=!0);return n||(t.selectedIndex=-1),M}}}}),g.each(["radio","checkbox"],(function(){g.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=g.inArray(g(t).val(),e)>-1}},l.checkOn||(g.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Ne=o.location,Ee={guid:Date.now()},Te=/\?/;g.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new o.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||g.error("Invalid XML: "+(n?g.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Be=/^(?:focusinfocus|focusoutblur)$/,Ce=function(t){t.stopPropagation()};g.extend(g.event,{trigger:function(t,e,n,p){var M,b,c,r,z,a,i,O,A=[n||q],u=s.call(t,"type")?t.type:t,l=s.call(t,"namespace")?t.namespace.split("."):[];if(b=O=c=n=n||q,3!==n.nodeType&&8!==n.nodeType&&!Be.test(u+g.event.triggered)&&(u.indexOf(".")>-1&&(l=u.split("."),u=l.shift(),l.sort()),z=u.indexOf(":")<0&&"on"+u,(t=t[g.expando]?t:new g.Event(u,"object"==typeof t&&t)).isTrigger=p?2:3,t.namespace=l.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+l.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:g.makeArray(e,[t]),i=g.event.special[u]||{},p||!i.trigger||!1!==i.trigger.apply(n,e))){if(!p&&!i.noBubble&&!f(n)){for(r=i.delegateType||u,Be.test(r+u)||(b=b.parentNode);b;b=b.parentNode)A.push(b),c=b;c===(n.ownerDocument||q)&&A.push(c.defaultView||c.parentWindow||o)}for(M=0;(b=A[M++])&&!t.isPropagationStopped();)O=b,t.type=M>1?r:i.bindType||u,(a=(ct.get(b,"events")||Object.create(null))[t.type]&&ct.get(b,"handle"))&&a.apply(b,e),(a=z&&b[z])&&a.apply&&Mt(b)&&(t.result=a.apply(b,e),!1===t.result&&t.preventDefault());return t.type=u,p||t.isDefaultPrevented()||i._default&&!1!==i._default.apply(A.pop(),e)||!Mt(n)||z&&d(n[u])&&!f(n)&&((c=n[z])&&(n[z]=null),g.event.triggered=u,t.isPropagationStopped()&&O.addEventListener(u,Ce),n[u](),t.isPropagationStopped()&&O.removeEventListener(u,Ce),g.event.triggered=void 0,c&&(n[z]=c)),t.result}},simulate:function(t,e,n){var o=g.extend(new g.Event,n,{type:t,isSimulated:!0});g.event.trigger(o,null,e)}}),g.fn.extend({trigger:function(t,e){return this.each((function(){g.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return g.event.trigger(t,e,n,!0)}});var we=/\[\]$/,Se=/\r?\n/g,Xe=/^(?:submit|button|image|reset|file)$/i,xe=/^(?:input|select|textarea|keygen)/i;function ke(t,e,n,o){var p;if(Array.isArray(e))g.each(e,(function(e,p){n||we.test(t)?o(t,p):ke(t+"["+("object"==typeof p&&null!=p?e:"")+"]",p,n,o)}));else if(n||"object"!==v(e))o(t,e);else for(p in e)ke(t+"["+p+"]",e[p],n,o)}g.param=function(t,e){var n,o=[],p=function(t,e){var n=d(e)?e():e;o[o.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!g.isPlainObject(t))g.each(t,(function(){p(this.name,this.value)}));else for(n in t)ke(n,t[n],e,p);return o.join("&")},g.fn.extend({serialize:function(){return g.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=g.prop(this,"elements");return t?g.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!g(this).is(":disabled")&&xe.test(this.nodeName)&&!Xe.test(t)&&(this.checked||!gt.test(t))})).map((function(t,e){var n=g(this).val();return null==n?null:Array.isArray(n)?g.map(n,(function(t){return{name:e.name,value:t.replace(Se,"\r\n")}})):{name:e.name,value:n.replace(Se,"\r\n")}})).get()}});var Ie=/%20/g,De=/#.*$/,Pe=/([?&])_=[^&]*/,Ue=/^(.*?):[ \t]*([^\r\n]*)$/gm,je=/^(?:GET|HEAD)$/,He=/^\/\//,Fe={},Ge={},Ye="*/".concat("*"),$e=q.createElement("a");function Ve(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var o,p=0,M=e.toLowerCase().match(Y)||[];if(d(n))for(;o=M[p++];)"+"===o[0]?(o=o.slice(1)||"*",(t[o]=t[o]||[]).unshift(n)):(t[o]=t[o]||[]).push(n)}}function Ke(t,e,n,o){var p={},M=t===Ge;function b(c){var r;return p[c]=!0,g.each(t[c]||[],(function(t,c){var z=c(e,n,o);return"string"!=typeof z||M||p[z]?M?!(r=z):void 0:(e.dataTypes.unshift(z),b(z),!1)})),r}return b(e.dataTypes[0])||!p["*"]&&b("*")}function Qe(t,e){var n,o,p=g.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((p[n]?t:o||(o={}))[n]=e[n]);return o&&g.extend(!0,t,o),t}$e.href=Ne.href,g.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ne.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Ne.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":g.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Qe(Qe(t,g.ajaxSettings),e):Qe(g.ajaxSettings,t)},ajaxPrefilter:Ve(Fe),ajaxTransport:Ve(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,p,M,b,c,r,z,a,i,O,s=g.ajaxSetup({},e),A=s.context||s,u=s.context&&(A.nodeType||A.jquery)?g(A):g.event,l=g.Deferred(),d=g.Callbacks("once memory"),f=s.statusCode||{},h={},W={},v="canceled",R={readyState:0,getResponseHeader:function(t){var e;if(z){if(!b)for(b={};e=Ue.exec(M);)b[e[1].toLowerCase()+" "]=(b[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=b[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return z?M:null},setRequestHeader:function(t,e){return null==z&&(t=W[t.toLowerCase()]=W[t.toLowerCase()]||t,h[t]=e),this},overrideMimeType:function(t){return null==z&&(s.mimeType=t),this},statusCode:function(t){var e;if(t)if(z)R.always(t[R.status]);else for(e in t)f[e]=[f[e],t[e]];return this},abort:function(t){var e=t||v;return n&&n.abort(e),m(0,e),this}};if(l.promise(R),s.url=((t||s.url||Ne.href)+"").replace(He,Ne.protocol+"//"),s.type=e.method||e.type||s.method||s.type,s.dataTypes=(s.dataType||"*").toLowerCase().match(Y)||[""],null==s.crossDomain){r=q.createElement("a");try{r.href=s.url,r.href=r.href,s.crossDomain=$e.protocol+"//"+$e.host!=r.protocol+"//"+r.host}catch(t){s.crossDomain=!0}}if(s.data&&s.processData&&"string"!=typeof s.data&&(s.data=g.param(s.data,s.traditional)),Ke(Fe,s,e,R),z)return R;for(i in(a=g.event&&s.global)&&0==g.active++&&g.event.trigger("ajaxStart"),s.type=s.type.toUpperCase(),s.hasContent=!je.test(s.type),p=s.url.replace(De,""),s.hasContent?s.data&&s.processData&&0===(s.contentType||"").indexOf("application/x-www-form-urlencoded")&&(s.data=s.data.replace(Ie,"+")):(O=s.url.slice(p.length),s.data&&(s.processData||"string"==typeof s.data)&&(p+=(Te.test(p)?"&":"?")+s.data,delete s.data),!1===s.cache&&(p=p.replace(Pe,"$1"),O=(Te.test(p)?"&":"?")+"_="+Ee.guid+++O),s.url=p+O),s.ifModified&&(g.lastModified[p]&&R.setRequestHeader("If-Modified-Since",g.lastModified[p]),g.etag[p]&&R.setRequestHeader("If-None-Match",g.etag[p])),(s.data&&s.hasContent&&!1!==s.contentType||e.contentType)&&R.setRequestHeader("Content-Type",s.contentType),R.setRequestHeader("Accept",s.dataTypes[0]&&s.accepts[s.dataTypes[0]]?s.accepts[s.dataTypes[0]]+("*"!==s.dataTypes[0]?", "+Ye+"; q=0.01":""):s.accepts["*"]),s.headers)R.setRequestHeader(i,s.headers[i]);if(s.beforeSend&&(!1===s.beforeSend.call(A,R,s)||z))return R.abort();if(v="abort",d.add(s.complete),R.done(s.success),R.fail(s.error),n=Ke(Ge,s,e,R)){if(R.readyState=1,a&&u.trigger("ajaxSend",[R,s]),z)return R;s.async&&s.timeout>0&&(c=o.setTimeout((function(){R.abort("timeout")}),s.timeout));try{z=!1,n.send(h,m)}catch(t){if(z)throw t;m(-1,t)}}else m(-1,"No Transport");function m(t,e,b,r){var i,O,q,h,W,v=e;z||(z=!0,c&&o.clearTimeout(c),n=void 0,M=r||"",R.readyState=t>0?4:0,i=t>=200&&t<300||304===t,b&&(h=function(t,e,n){for(var o,p,M,b,c=t.contents,r=t.dataTypes;"*"===r[0];)r.shift(),void 0===o&&(o=t.mimeType||e.getResponseHeader("Content-Type"));if(o)for(p in c)if(c[p]&&c[p].test(o)){r.unshift(p);break}if(r[0]in n)M=r[0];else{for(p in n){if(!r[0]||t.converters[p+" "+r[0]]){M=p;break}b||(b=p)}M=M||b}if(M)return M!==r[0]&&r.unshift(M),n[M]}(s,R,b)),!i&&g.inArray("script",s.dataTypes)>-1&&g.inArray("json",s.dataTypes)<0&&(s.converters["text script"]=function(){}),h=function(t,e,n,o){var p,M,b,c,r,z={},a=t.dataTypes.slice();if(a[1])for(b in t.converters)z[b.toLowerCase()]=t.converters[b];for(M=a.shift();M;)if(t.responseFields[M]&&(n[t.responseFields[M]]=e),!r&&o&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),r=M,M=a.shift())if("*"===M)M=r;else if("*"!==r&&r!==M){if(!(b=z[r+" "+M]||z["* "+M]))for(p in z)if((c=p.split(" "))[1]===M&&(b=z[r+" "+c[0]]||z["* "+c[0]])){!0===b?b=z[p]:!0!==z[p]&&(M=c[0],a.unshift(c[1]));break}if(!0!==b)if(b&&t.throws)e=b(e);else try{e=b(e)}catch(t){return{state:"parsererror",error:b?t:"No conversion from "+r+" to "+M}}}return{state:"success",data:e}}(s,h,R,i),i?(s.ifModified&&((W=R.getResponseHeader("Last-Modified"))&&(g.lastModified[p]=W),(W=R.getResponseHeader("etag"))&&(g.etag[p]=W)),204===t||"HEAD"===s.type?v="nocontent":304===t?v="notmodified":(v=h.state,O=h.data,i=!(q=h.error))):(q=v,!t&&v||(v="error",t<0&&(t=0))),R.status=t,R.statusText=(e||v)+"",i?l.resolveWith(A,[O,v,R]):l.rejectWith(A,[R,v,q]),R.statusCode(f),f=void 0,a&&u.trigger(i?"ajaxSuccess":"ajaxError",[R,s,i?O:q]),d.fireWith(A,[R,v]),a&&(u.trigger("ajaxComplete",[R,s]),--g.active||g.event.trigger("ajaxStop")))}return R},getJSON:function(t,e,n){return g.get(t,e,n,"json")},getScript:function(t,e){return g.get(t,void 0,e,"script")}}),g.each(["get","post"],(function(t,e){g[e]=function(t,n,o,p){return d(n)&&(p=p||o,o=n,n=void 0),g.ajax(g.extend({url:t,type:e,dataType:p,data:n,success:o},g.isPlainObject(t)&&t))}})),g.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),g._evalUrl=function(t,e,n){return g.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){g.globalEval(t,e,n)}})},g.fn.extend({wrapAll:function(t){var e;return this[0]&&(d(t)&&(t=t.call(this[0])),e=g(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return d(t)?this.each((function(e){g(this).wrapInner(t.call(this,e))})):this.each((function(){var e=g(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=d(t);return this.each((function(n){g(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){g(this).replaceWith(this.childNodes)})),this}}),g.expr.pseudos.hidden=function(t){return!g.expr.pseudos.visible(t)},g.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},g.ajaxSettings.xhr=function(){try{return new o.XMLHttpRequest}catch(t){}};var Je={0:200,1223:204},Ze=g.ajaxSettings.xhr();l.cors=!!Ze&&"withCredentials"in Ze,l.ajax=Ze=!!Ze,g.ajaxTransport((function(t){var e,n;if(l.cors||Ze&&!t.crossDomain)return{send:function(p,M){var b,c=t.xhr();if(c.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(b in t.xhrFields)c[b]=t.xhrFields[b];for(b in t.mimeType&&c.overrideMimeType&&c.overrideMimeType(t.mimeType),t.crossDomain||p["X-Requested-With"]||(p["X-Requested-With"]="XMLHttpRequest"),p)c.setRequestHeader(b,p[b]);e=function(t){return function(){e&&(e=n=c.onload=c.onerror=c.onabort=c.ontimeout=c.onreadystatechange=null,"abort"===t?c.abort():"error"===t?"number"!=typeof c.status?M(0,"error"):M(c.status,c.statusText):M(Je[c.status]||c.status,c.statusText,"text"!==(c.responseType||"text")||"string"!=typeof c.responseText?{binary:c.response}:{text:c.responseText},c.getAllResponseHeaders()))}},c.onload=e(),n=c.onerror=c.ontimeout=e("error"),void 0!==c.onabort?c.onabort=n:c.onreadystatechange=function(){4===c.readyState&&o.setTimeout((function(){e&&n()}))},e=e("abort");try{c.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),g.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),g.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return g.globalEval(t),t}}}),g.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),g.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(o,p){e=g("