ignition/LICENSE.md000064400000002075150247714250010003 0ustar00The MIT License (MIT) Copyright (c) Spatie Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ignition/composer.json000064400000003654150247714250011125 0ustar00{ "name": "spatie/ignition", "description": "A beautiful error page for PHP applications.", "keywords": [ "error", "page", "laravel", "flare" ], "authors": [ { "name": "Spatie", "email": "info@spatie.be", "role": "Developer" } ], "homepage": "https://flareapp.io/ignition", "license": "MIT", "require": { "php": "^8.0", "ext-json": "*", "ext-mbstring": "*", "spatie/flare-client-php": "^1.1", "symfony/console": "^5.4|^6.0", "symfony/var-dumper": "^5.4|^6.0" }, "require-dev": { "mockery/mockery": "^1.4", "phpstan/extension-installer": "^1.1", "phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-phpunit": "^1.0", "symfony/process": "^5.4|^6.0", "pestphp/pest": "^1.20" }, "config": { "sort-packages": true, "allow-plugins": { "phpstan/extension-installer": true, "pestphp/pest-plugin": true } }, "autoload": { "psr-4": { "Spatie\\Ignition\\": "src" } }, "autoload-dev": { "psr-4": { "Spatie\\Ignition\\Tests\\": "tests" } }, "minimum-stability": "dev", "prefer-stable": true, "scripts": { "analyse": "vendor/bin/phpstan analyse", "format": "vendor/bin/php-cs-fixer fix --allow-risky=yes", "test": "vendor/bin/pest", "test-coverage": "vendor/bin/phpunit --coverage-html coverage" }, "support": { "issues": "https://github.com/spatie/ignition/issues", "forum": "https://twitter.com/flareappio", "source": "https://github.com/spatie/ignition", "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction" }, "extra": { "branch-alias": { "dev-main": "1.4.x-dev" } } } ignition/src/Solutions/SuggestImportSolution.php000064400000001140150247714250016237 0ustar00class = $class; } public function getSolutionTitle(): string { return 'A class import is missing'; } public function getSolutionDescription(): string { return 'You have a missing class import. Try importing this class: `'.$this->class.'`.'; } public function getDocumentationLinks(): array { return []; } } ignition/src/Solutions/SolutionProviders/BadMethodCallSolutionProvider.php000064400000005233150247714250023302 0ustar00getClassAndMethodFromExceptionMessage($throwable->getMessage()))) { return false; } return true; } public function getSolutions(Throwable $throwable): array { return [ BaseSolution::create('Bad Method Call') ->setSolutionDescription($this->getSolutionDescription($throwable)), ]; } public function getSolutionDescription(Throwable $throwable): string { if (! $this->canSolve($throwable)) { return ''; } /** @phpstan-ignore-next-line */ extract($this->getClassAndMethodFromExceptionMessage($throwable->getMessage()), EXTR_OVERWRITE); $possibleMethod = $this->findPossibleMethod($class ?? '', $method ?? ''); $class ??= 'UnknownClass'; return "Did you mean {$class}::{$possibleMethod?->name}() ?"; } /** * @param string $message * * @return null|array */ protected function getClassAndMethodFromExceptionMessage(string $message): ?array { if (! preg_match(self::REGEX, $message, $matches)) { return null; } return [ 'class' => $matches[1], 'method' => $matches[2], ]; } /** * @param class-string $class * @param string $invalidMethodName * * @return \ReflectionMethod|null */ protected function findPossibleMethod(string $class, string $invalidMethodName): ?ReflectionMethod { return $this->getAvailableMethods($class) ->sortByDesc(function (ReflectionMethod $method) use ($invalidMethodName) { similar_text($invalidMethodName, $method->name, $percentage); return $percentage; })->first(); } /** * @param class-string $class * * @return \Illuminate\Support\Collection */ protected function getAvailableMethods(string $class): Collection { $class = new ReflectionClass($class); return Collection::make($class->getMethods()); } } ignition/src/Solutions/SolutionProviders/MergeConflictSolutionProvider.php000064400000004070150247714250023376 0ustar00hasMergeConflictExceptionMessage($throwable)) { return false; } $file = (string)file_get_contents($throwable->getFile()); if (! str_contains($file, '=======')) { return false; } if (! str_contains($file, '>>>>>>>')) { return false; } return true; } public function getSolutions(Throwable $throwable): array { $file = (string)file_get_contents($throwable->getFile()); preg_match('/\>\>\>\>\>\>\> (.*?)\n/', $file, $matches); $source = $matches[1]; $target = $this->getCurrentBranch(basename($throwable->getFile())); return [ BaseSolution::create("Merge conflict from branch '$source' into $target") ->setSolutionDescription('You have a Git merge conflict. To undo your merge do `git reset --hard HEAD`'), ]; } protected function getCurrentBranch(string $directory): string { $branch = "'".trim((string)shell_exec("cd {$directory}; git branch | grep \\* | cut -d ' ' -f2"))."'"; if ($branch === "''") { $branch = 'current branch'; } return $branch; } protected function hasMergeConflictExceptionMessage(Throwable $throwable): bool { // For PHP 7.x and below if (Str::startsWith($throwable->getMessage(), 'syntax error, unexpected \'<<\'')) { return true; } // For PHP 8+ if (Str::startsWith($throwable->getMessage(), 'syntax error, unexpected token "<<"')) { return true; } return false; } } ignition/src/Solutions/SolutionProviders/UndefinedPropertySolutionProvider.php000064400000006726150247714250024335 0ustar00getClassAndPropertyFromExceptionMessage($throwable->getMessage()))) { return false; } if (! $this->similarPropertyExists($throwable)) { return false; } return true; } public function getSolutions(Throwable $throwable): array { return [ BaseSolution::create('Unknown Property') ->setSolutionDescription($this->getSolutionDescription($throwable)), ]; } public function getSolutionDescription(Throwable $throwable): string { if (! $this->canSolve($throwable) || ! $this->similarPropertyExists($throwable)) { return ''; } extract( /** @phpstan-ignore-next-line */ $this->getClassAndPropertyFromExceptionMessage($throwable->getMessage()), EXTR_OVERWRITE, ); $possibleProperty = $this->findPossibleProperty($class ?? '', $property ?? ''); $class = $class ?? ''; return "Did you mean {$class}::\${$possibleProperty->name} ?"; } protected function similarPropertyExists(Throwable $throwable): bool { /** @phpstan-ignore-next-line */ extract($this->getClassAndPropertyFromExceptionMessage($throwable->getMessage()), EXTR_OVERWRITE); $possibleProperty = $this->findPossibleProperty($class ?? '', $property ?? ''); return $possibleProperty !== null; } /** * @param string $message * * @return null|array */ protected function getClassAndPropertyFromExceptionMessage(string $message): ?array { if (! preg_match(self::REGEX, $message, $matches)) { return null; } return [ 'class' => $matches[1], 'property' => $matches[2], ]; } /** * @param class-string $class * @param string $invalidPropertyName * * @return mixed */ protected function findPossibleProperty(string $class, string $invalidPropertyName): mixed { return $this->getAvailableProperties($class) ->sortByDesc(function (ReflectionProperty $property) use ($invalidPropertyName) { similar_text($invalidPropertyName, $property->name, $percentage); return $percentage; }) ->filter(function (ReflectionProperty $property) use ($invalidPropertyName) { similar_text($invalidPropertyName, $property->name, $percentage); return $percentage >= self::MINIMUM_SIMILARITY; })->first(); } /** * @param class-string $class * * @return Collection */ protected function getAvailableProperties(string $class): Collection { $class = new ReflectionClass($class); return Collection::make($class->getProperties()); } } ignition/src/Solutions/SolutionProviders/SolutionProviderRepository.php000064400000006547150247714250023047 0ustar00|HasSolutionsForThrowable> */ protected Collection $solutionProviders; /** @param array|HasSolutionsForThrowable> $solutionProviders */ public function __construct(array $solutionProviders = []) { $this->solutionProviders = Collection::make($solutionProviders); } public function registerSolutionProvider(string|HasSolutionsForThrowable $solutionProvider): SolutionProviderRepositoryContract { $this->solutionProviders->push($solutionProvider); return $this; } public function registerSolutionProviders(array $solutionProviderClasses): SolutionProviderRepositoryContract { $this->solutionProviders = $this->solutionProviders->merge($solutionProviderClasses); return $this; } public function getSolutionsForThrowable(Throwable $throwable): array { $solutions = []; if ($throwable instanceof Solution) { $solutions[] = $throwable; } if ($throwable instanceof ProvidesSolution) { $solutions[] = $throwable->getSolution(); } $providedSolutions = $this ->initialiseSolutionProviderRepositories() ->filter(function (HasSolutionsForThrowable $solutionProvider) use ($throwable) { try { return $solutionProvider->canSolve($throwable); } catch (Throwable $exception) { return false; } }) ->map(function (HasSolutionsForThrowable $solutionProvider) use ($throwable) { try { return $solutionProvider->getSolutions($throwable); } catch (Throwable $exception) { return []; } }) ->flatten() ->toArray(); return array_merge($solutions, $providedSolutions); } public function getSolutionForClass(string $solutionClass): ?Solution { if (! class_exists($solutionClass)) { return null; } if (! in_array(Solution::class, class_implements($solutionClass) ?: [])) { return null; } if (! function_exists('app')) { return null; } return app($solutionClass); } /** @return Collection */ protected function initialiseSolutionProviderRepositories(): Collection { return $this->solutionProviders ->filter(fn (HasSolutionsForThrowable|string $provider) => in_array(HasSolutionsForThrowable::class, class_implements($provider) ?: [])) ->map(function (string|HasSolutionsForThrowable $provider): HasSolutionsForThrowable { if (is_string($provider)) { return new $provider; } return $provider; }); } } ignition/src/Solutions/SolutionTransformer.php000064400000001463150247714250015735 0ustar00|string|false> */ class SolutionTransformer implements Arrayable { protected Solution $solution; public function __construct(Solution $solution) { $this->solution = $solution; } /** @return array|string|false> */ public function toArray(): array { return [ 'class' => get_class($this->solution), 'title' => $this->solution->getSolutionTitle(), 'links' => $this->solution->getDocumentationLinks(), 'description' => $this->solution->getSolutionDescription(), 'is_runnable' => false, ]; } } ignition/src/Solutions/SuggestCorrectVariableNameSolution.php000064400000001576150247714250020652 0ustar00variableName = $variableName; $this->viewFile = $viewFile; $this->suggested = $suggested; } public function getSolutionTitle(): string { return 'Possible typo $'.$this->variableName; } public function getDocumentationLinks(): array { return []; } public function getSolutionDescription(): string { return "Did you mean `$$this->suggested`?"; } public function isRunnable(): bool { return false; } } ignition/src/Contracts/Solution.php000064400000000411150247714250013443 0ustar00 */ public function getDocumentationLinks(): array; } ignition/src/Contracts/BaseSolution.php000064400000002556150247714250014252 0ustar00 */ protected array $links = []; public static function create(string $title = ''): static { // It's important to keep the return type as static because // the old Facade Ignition contracts extend from this method. /** @phpstan-ignore-next-line */ return new static($title); } public function __construct(string $title = '') { $this->title = $title; } public function getSolutionTitle(): string { return $this->title; } public function setSolutionTitle(string $title): self { $this->title = $title; return $this; } public function getSolutionDescription(): string { return $this->description; } public function setSolutionDescription(string $description): self { $this->description = $description; return $this; } /** @return array */ public function getDocumentationLinks(): array { return $this->links; } /** @param array $links */ public function setDocumentationLinks(array $links): self { $this->links = $links; return $this; } } ignition/src/Contracts/HasSolutionsForThrowable.php000064400000000522150247714250016604 0ustar00 */ public function getSolutions(Throwable $throwable): array; } ignition/src/Contracts/SolutionProviderRepository.php000064400000001602150247714250017261 0ustar00|HasSolutionsForThrowable $solutionProvider * * @return $this */ public function registerSolutionProvider(string $solutionProvider): self; /** * @param array|HasSolutionsForThrowable> $solutionProviders * * @return $this */ public function registerSolutionProviders(array $solutionProviders): self; /** * @param Throwable $throwable * * @return array */ public function getSolutionsForThrowable(Throwable $throwable): array; /** * @param class-string $solutionClass * * @return null|Solution */ public function getSolutionForClass(string $solutionClass): ?Solution; } ignition/src/Contracts/ConfigManager.php000064400000000516150247714250014335 0ustar00 */ public function load(): array; /** @param array $options */ public function save(array $options): bool; /** @return array */ public function getPersistentInfo(): array; } ignition/src/Contracts/ProvidesSolution.php000064400000000310150247714250015155 0ustar00 $parameters */ public function run(array $parameters = []): void; /** @return array */ public function getRunParameters(): array; } ignition/src/ErrorPage/ErrorPageViewModel.php000064400000006577150247714250015302 0ustar00 $solutions * @param string|null $solutionTransformerClass */ public function __construct( protected ?Throwable $throwable, protected IgnitionConfig $ignitionConfig, protected Report $report, protected array $solutions, protected ?string $solutionTransformerClass = null, protected string $customHtmlHead = '', protected string $customHtmlBody = '' ) { $this->solutionTransformerClass ??= SolutionTransformer::class; } public function throwableString(): string { if (! $this->throwable) { return ''; } $throwableString = sprintf( "%s: %s in file %s on line %d\n\n%s\n", get_class($this->throwable), $this->throwable->getMessage(), $this->throwable->getFile(), $this->throwable->getLine(), $this->report->getThrowable()?->getTraceAsString() ); return htmlspecialchars($throwableString); } public function title(): string { return htmlspecialchars($this->report->getMessage()); } /** * @return array */ public function config(): array { return $this->ignitionConfig->toArray(); } public function theme(): string { return $this->config()['theme'] ?? 'auto'; } /** * @return array */ public function solutions(): array { return array_map(function (Solution $solution) { /** @var class-string $transformerClass */ $transformerClass = $this->solutionTransformerClass; /** @var SolutionTransformer $transformer */ $transformer = new $transformerClass($solution); return ($transformer)->toArray(); }, $this->solutions); } /** * @return array */ public function report(): array { return $this->report->toArray(); } public function jsonEncode(mixed $data): string { $jsonOptions = JSON_PARTIAL_OUTPUT_ON_ERROR | JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT; return (string)json_encode($data, $jsonOptions); } public function getAssetContents(string $asset): string { $assetPath = __DIR__."/../../resources/compiled/{$asset}"; return (string)file_get_contents($assetPath); } /** * @return array */ public function shareableReport(): array { return (new ReportTrimmer())->trim($this->report()); } public function updateConfigEndpoint(): string { // TODO: Should be based on Ignition config return '/_ignition/update-config'; } public function customHtmlHead(): string { return $this->customHtmlHead; } public function customHtmlBody(): string { return $this->customHtmlBody; } } ignition/src/ErrorPage/Renderer.php000064400000000531150247714250013326 0ustar00 $data * * @return void */ public function render(array $data): void { $viewFile = __DIR__ . '/../../resources/views/errorPage.php'; extract($data, EXTR_OVERWRITE); include $viewFile; } } ignition/src/Ignition.php000064400000023471150247714250011462 0ustar00 */ protected array $middleware = []; protected IgnitionConfig $ignitionConfig; protected ContextProviderDetector $contextProviderDetector; protected SolutionProviderRepositoryContract $solutionProviderRepository; protected ?bool $inProductionEnvironment = null; protected ?string $solutionTransformerClass = null; /** @var ArrayObject */ protected ArrayObject $documentationLinkResolvers; protected string $customHtmlHead = ''; protected string $customHtmlBody = ''; public static function make(): self { return new self(); } public function __construct() { $this->flare = Flare::make(); $this->ignitionConfig = IgnitionConfig::loadFromConfigFile(); $this->solutionProviderRepository = new SolutionProviderRepository($this->getDefaultSolutionProviders()); $this->documentationLinkResolvers = new ArrayObject(); $this->contextProviderDetector = new BaseContextProviderDetector(); $this->middleware[] = new AddSolutions($this->solutionProviderRepository); $this->middleware[] = new AddDocumentationLinks($this->documentationLinkResolvers); } public function setSolutionTransformerClass(string $solutionTransformerClass): self { $this->solutionTransformerClass = $solutionTransformerClass; return $this; } /** @param callable(Throwable): mixed $callable */ public function resolveDocumentationLink(callable $callable): self { $this->documentationLinkResolvers[] = $callable; return $this; } public function setConfig(IgnitionConfig $ignitionConfig): self { $this->ignitionConfig = $ignitionConfig; return $this; } public function runningInProductionEnvironment(bool $boolean = true): self { $this->inProductionEnvironment = $boolean; return $this; } public function getFlare(): Flare { return $this->flare; } public function setFlare(Flare $flare): self { $this->flare = $flare; return $this; } public function setSolutionProviderRepository(SolutionProviderRepositoryContract $solutionProviderRepository): self { $this->solutionProviderRepository = $solutionProviderRepository; return $this; } public function shouldDisplayException(bool $shouldDisplayException): self { $this->shouldDisplayException = $shouldDisplayException; return $this; } public function applicationPath(string $applicationPath): self { $this->applicationPath = $applicationPath; return $this; } /** * @param string $name * @param string $messageLevel * @param array $metaData * * @return $this */ public function glow( string $name, string $messageLevel = MessageLevels::INFO, array $metaData = [] ): self { $this->flare->glow($name, $messageLevel, $metaData); return $this; } /** * @param array> $solutionProviders * * @return $this */ public function addSolutionProviders(array $solutionProviders): self { $this->solutionProviderRepository->registerSolutionProviders($solutionProviders); return $this; } /** @deprecated Use `setTheme('dark')` instead */ public function useDarkMode(): self { return $this->setTheme('dark'); } /** @deprecated Use `setTheme($theme)` instead */ public function theme(string $theme): self { return $this->setTheme($theme); } public function setTheme(string $theme): self { $this->ignitionConfig->setOption('theme', $theme); return $this; } public function setEditor(string $editor): self { $this->ignitionConfig->setOption('editor', $editor); return $this; } public function sendToFlare(?string $apiKey): self { $this->flareApiKey = $apiKey ?? ''; return $this; } public function configureFlare(callable $callable): self { ($callable)($this->flare); return $this; } /** * @param FlareMiddleware|array $middleware * * @return $this */ public function registerMiddleware(array|FlareMiddleware $middleware): self { if (! is_array($middleware)) { $middleware = [$middleware]; } foreach ($middleware as $singleMiddleware) { $this->middleware = array_merge($this->middleware, $middleware); } return $this; } public function setContextProviderDetector(ContextProviderDetector $contextProviderDetector): self { $this->contextProviderDetector = $contextProviderDetector; return $this; } public function reset(): self { $this->flare->reset(); return $this; } public function register(): self { error_reporting(-1); /** @phpstan-ignore-next-line */ set_error_handler([$this, 'renderError']); /** @phpstan-ignore-next-line */ set_exception_handler([$this, 'handleException']); return $this; } /** * @param int $level * @param string $message * @param string $file * @param int $line * @param array $context * * @return void * @throws \ErrorException */ public function renderError( int $level, string $message, string $file = '', int $line = 0, array $context = [] ): void { throw new ErrorException($message, 0, $level, $file, $line); } /** * This is the main entry point for the framework agnostic Ignition package. * Displays the Ignition page and optionally sends a report to Flare. */ public function handleException(Throwable $throwable): Report { $this->setUpFlare(); $report = $this->createReport($throwable); if ($this->shouldDisplayException && $this->inProductionEnvironment !== true) { $this->renderException($throwable, $report); } if ($this->flare->apiTokenSet() && $this->inProductionEnvironment !== false) { $this->flare->report($throwable, report: $report); } return $report; } /** * This is the main entrypoint for laravel-ignition. It only renders the exception. * Sending the report to Flare is handled in the laravel-ignition log handler. */ public function renderException(Throwable $throwable, ?Report $report = null): void { $this->setUpFlare(); $report ??= $this->createReport($throwable); $viewModel = new ErrorPageViewModel( $throwable, $this->ignitionConfig, $report, $this->solutionProviderRepository->getSolutionsForThrowable($throwable), $this->solutionTransformerClass, $this->customHtmlHead, $this->customHtmlBody ); (new Renderer())->render(['viewModel' => $viewModel]); } /** * Add custom HTML which will be added to the head tag of the error page. */ public function addCustomHtmlToHead(string $html): self { $this->customHtmlHead .= $html; return $this; } /** * Add custom HTML which will be added to the body tag of the error page. */ public function addCustomHtmlToBody(string $html): self { $this->customHtmlBody .= $html; return $this; } protected function setUpFlare(): self { if (! $this->flare->apiTokenSet()) { $this->flare->setApiToken($this->flareApiKey ?? ''); } $this->flare->setContextProviderDetector($this->contextProviderDetector); foreach ($this->middleware as $singleMiddleware) { $this->flare->registerMiddleware($singleMiddleware); } if ($this->applicationPath !== '') { $this->flare->applicationPath($this->applicationPath); } return $this; } /** @return array> */ protected function getDefaultSolutionProviders(): array { return [ BadMethodCallSolutionProvider::class, MergeConflictSolutionProvider::class, UndefinedPropertySolutionProvider::class, ]; } protected function createReport(Throwable $throwable): Report { return $this->flare->createReport($throwable); } } ignition/src/Config/IgnitionConfig.php000064400000014457150247714250014021 0ustar00> */ class IgnitionConfig implements Arrayable { private ConfigManager $manager; public static function loadFromConfigFile(): self { return (new self())->loadConfigFile(); } /** * @param array $options */ public function __construct(protected array $options = []) { $defaultOptions = $this->getDefaultOptions(); $this->options = array_merge($defaultOptions, $options); $this->manager = $this->initConfigManager(); } public function setOption(string $name, string $value): self { $this->options[$name] = $value; return $this; } private function initConfigManager(): ConfigManager { try { /** @phpstan-ignore-next-line */ return app(ConfigManager::class); } catch (Throwable) { return new FileConfigManager(); } } /** @param array $options */ public function merge(array $options): self { $this->options = array_merge($this->options, $options); return $this; } public function loadConfigFile(): self { $this->merge($this->getConfigOptions()); return $this; } /** @return array */ public function getConfigOptions(): array { return $this->manager->load(); } /** * @param array $options * @return bool */ public function saveValues(array $options): bool { return $this->manager->save($options); } public function hideSolutions(): bool { return $this->options['hide_solutions'] ?? false; } public function editor(): ?string { return $this->options['editor'] ?? null; } /** * @return array $options */ public function editorOptions(): array { return $this->options['editor_options'] ?? []; } public function remoteSitesPath(): ?string { return $this->options['remote_sites_path'] ?? null; } public function localSitesPath(): ?string { return $this->options['local_sites_path'] ?? null; } public function theme(): ?string { return $this->options['theme'] ?? null; } public function shareButtonEnabled(): bool { return (bool)($this->options['enable_share_button'] ?? false); } public function shareEndpoint(): string { return $this->options['share_endpoint'] ?? $this->getDefaultOptions()['share_endpoint']; } public function runnableSolutionsEnabled(): bool { return (bool)($this->options['enable_runnable_solutions'] ?? false); } /** @return array> */ public function toArray(): array { return [ 'editor' => $this->editor(), 'theme' => $this->theme(), 'hideSolutions' => $this->hideSolutions(), 'remoteSitesPath' => $this->remoteSitesPath(), 'localSitesPath' => $this->localSitesPath(), 'enableShareButton' => $this->shareButtonEnabled(), 'enableRunnableSolutions' => $this->runnableSolutionsEnabled(), 'directorySeparator' => DIRECTORY_SEPARATOR, 'editorOptions' => $this->editorOptions(), 'shareEndpoint' => $this->shareEndpoint(), ]; } /** * @return array $options */ protected function getDefaultOptions(): array { return [ 'share_endpoint' => 'https://flareapp.io/api/public-reports', 'theme' => 'light', 'editor' => 'vscode', 'editor_options' => [ 'sublime' => [ 'label' => 'Sublime', 'url' => 'subl://open?url=file://%path&line=%line', ], 'textmate' => [ 'label' => 'TextMate', 'url' => 'txmt://open?url=file://%path&line=%line', ], 'emacs' => [ 'label' => 'Emacs', 'url' => 'emacs://open?url=file://%path&line=%line', ], 'macvim' => [ 'label' => 'MacVim', 'url' => 'mvim://open/?url=file://%path&line=%line', ], 'phpstorm' => [ 'label' => 'PhpStorm', 'url' => 'phpstorm://open?file=%path&line=%line', ], 'idea' => [ 'label' => 'Idea', 'url' => 'idea://open?file=%path&line=%line', ], 'vscode' => [ 'label' => 'VS Code', 'url' => 'vscode://file/%path:%line', ], 'vscode-insiders' => [ 'label' => 'VS Code Insiders', 'url' => 'vscode-insiders://file/%path:%line', ], 'vscode-remote' => [ 'label' => 'VS Code Remote', 'url' => 'vscode://vscode-remote/%path:%line', ], 'vscode-insiders-remote' => [ 'label' => 'VS Code Insiders Remote', 'url' => 'vscode-insiders://vscode-remote/%path:%line', ], 'vscodium' => [ 'label' => 'VS Codium', 'url' => 'vscodium://file/%path:%line', ], 'atom' => [ 'label' => 'Atom', 'url' => 'atom://core/open/file?filename=%path&line=%line', ], 'nova' => [ 'label' => 'Nova', 'url' => 'nova://core/open/file?filename=%path&line=%line', ], 'netbeans' => [ 'label' => 'NetBeans', 'url' => 'netbeans://open/?f=%path:%line', ], 'xdebug' => [ 'label' => 'Xdebug', 'url' => 'xdebug://%path@%line', ], ], ]; } } ignition/src/Config/FileConfigManager.php000064400000006677150247714250014420 0ustar00path = $this->initPath($path); $this->file = $this->initFile(); } protected function initPath(string $path): string { $path = $this->retrievePath($path); if (! $this->isValidWritablePath($path)) { return ''; } return $this->preparePath($path); } protected function retrievePath(string $path): string { if ($path !== '') { return $path; } return $this->initPathFromEnvironment(); } protected function isValidWritablePath(string $path): bool { return @file_exists($path) && @is_writable($path); } protected function preparePath(string $path): string { return rtrim($path, DIRECTORY_SEPARATOR); } protected function initPathFromEnvironment(): string { if (! empty($_SERVER['HOMEDRIVE']) && ! empty($_SERVER['HOMEPATH'])) { return $_SERVER['HOMEDRIVE'] . $_SERVER['HOMEPATH']; } if (! empty(getenv('HOME'))) { return getenv('HOME'); } return ''; } protected function initFile(): string { return $this->path . DIRECTORY_SEPARATOR . self::SETTINGS_FILE_NAME; } /** {@inheritDoc} */ public function load(): array { return $this->readFromFile(); } /** @return array */ protected function readFromFile(): array { if (! $this->isValidFile()) { return []; } $content = (string)file_get_contents($this->file); $settings = json_decode($content, true) ?? []; return $settings; } protected function isValidFile(): bool { return $this->isValidPath() && @file_exists($this->file) && @is_writable($this->file); } protected function isValidPath(): bool { return trim($this->path) !== ''; } /** {@inheritDoc} */ public function save(array $options): bool { if (! $this->createFile()) { return false; } return $this->saveToFile($options); } protected function createFile(): bool { if (! $this->isValidPath()) { return false; } if (@file_exists($this->file)) { return true; } return (file_put_contents($this->file, '') !== false); } /** * @param array $options * * @return bool */ protected function saveToFile(array $options): bool { try { $content = json_encode($options, JSON_THROW_ON_ERROR); } catch (Throwable) { return false; } return $this->writeToFile($content); } protected function writeToFile(string $content): bool { if (! $this->isValidFile()) { return false; } return (file_put_contents($this->file, $content) !== false); } /** {@inheritDoc} */ public function getPersistentInfo(): array { return [ 'name' => self::SETTINGS_FILE_NAME, 'path' => $this->path, 'file' => $this->file, ]; } } ignition/resources/views/errorPage.php000064400000004122150247714250014200 0ustar00 <?= $viewModel->title() ?> customHtmlHead() ?>
customHtmlBody() ?> ignition/resources/compiled/.gitignore000064400000000051150247714250014165 0ustar00* !.gitignore !ignition.css !ignition.js ignition/resources/compiled/ignition.css000064400000124131150247714250014535 0ustar00/* ! tailwindcss v3.0.15 | MIT License | https://tailwindcss.com */*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,Helvetica Neue,Arial,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input:-ms-input-placeholder,textarea:-ms-input-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:after,:before{--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scroll-snap-strictness:proximity;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,0.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent;--tw-shadow:0 0 transparent;--tw-shadow-colored:0 0 transparent}html{font-size:max(13px,min(1.3vw,16px));overflow-x:hidden;overflow-y:scroll;font-feature-settings:"calt" 0;-webkit-marquee-increment:1vw}:after,:before,:not(iframe){position:relative}:focus{outline:0!important}body{font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,Helvetica Neue,Arial,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5;width:100%;color:rgba(31,41,55,var(--tw-text-opacity))}.dark body,body{--tw-text-opacity:1}.dark body{color:rgba(229,231,235,var(--tw-text-opacity))}body{background-color:rgba(229,231,235,var(--tw-bg-opacity))}.dark body,body{--tw-bg-opacity:1}.dark body{background-color:rgba(17,24,39,var(--tw-bg-opacity))}@media (color-index:48){html.auto body{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity));--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}}@media (color:48842621){html.auto body{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity));--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}}@media (prefers-color-scheme:dark){html.auto body{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity));--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}}.scroll-target:target{content:"";display:block;position:absolute;top:-6rem}pre.sf-dump{display:block;white-space:pre;padding:5px;overflow:visible!important;overflow:initial!important}pre.sf-dump:after{content:"";visibility:hidden;display:block;height:0;clear:both}pre.sf-dump span{display:inline}pre.sf-dump a{text-decoration:none;cursor:pointer;border:0;outline:none;color:inherit}pre.sf-dump img{max-width:50em;max-height:50em;margin:.5em 0 0;padding:0;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAHUlEQVQY02O8zAABilCaiQEN0EeA8QuUcX9g3QEAAjcC5piyhyEAAAAASUVORK5CYII=) #d3d3d3}pre.sf-dump .sf-dump-ellipsis{display:inline-block;overflow:visible;text-overflow:ellipsis;max-width:5em;white-space:nowrap;overflow:hidden;vertical-align:top}pre.sf-dump .sf-dump-ellipsis+.sf-dump-ellipsis{max-width:none}pre.sf-dump code{display:inline;padding:0;background:none}.sf-dump-key.sf-dump-highlight,.sf-dump-private.sf-dump-highlight,.sf-dump-protected.sf-dump-highlight,.sf-dump-public.sf-dump-highlight,.sf-dump-str.sf-dump-highlight{background:rgba(111,172,204,.3);border:1px solid #7da0b1;border-radius:3px}.sf-dump-key.sf-dump-highlight-active,.sf-dump-private.sf-dump-highlight-active,.sf-dump-protected.sf-dump-highlight-active,.sf-dump-public.sf-dump-highlight-active,.sf-dump-str.sf-dump-highlight-active{background:rgba(253,175,0,.4);border:1px solid orange;border-radius:3px}pre.sf-dump .sf-dump-search-hidden{display:none!important}pre.sf-dump .sf-dump-search-wrapper{font-size:0;white-space:nowrap;margin-bottom:5px;display:flex;position:-webkit-sticky;position:sticky;top:5px}pre.sf-dump .sf-dump-search-wrapper>*{vertical-align:top;box-sizing:border-box;height:21px;font-weight:400;border-radius:0;background:#fff;color:#757575;border:1px solid #bbb}pre.sf-dump .sf-dump-search-wrapper>input.sf-dump-search-input{padding:3px;height:21px;font-size:12px;border-right:none;border-top-left-radius:3px;border-bottom-left-radius:3px;color:#000;min-width:15px;width:100%}pre.sf-dump .sf-dump-search-wrapper>.sf-dump-search-input-next,pre.sf-dump .sf-dump-search-wrapper>.sf-dump-search-input-previous{background:#f2f2f2;outline:none;border-left:none;font-size:0;line-height:0}pre.sf-dump .sf-dump-search-wrapper>.sf-dump-search-input-next{border-top-right-radius:3px;border-bottom-right-radius:3px}pre.sf-dump .sf-dump-search-wrapper>.sf-dump-search-input-next>svg,pre.sf-dump .sf-dump-search-wrapper>.sf-dump-search-input-previous>svg{pointer-events:none;width:12px;height:12px}pre.sf-dump .sf-dump-search-wrapper>.sf-dump-search-count{display:inline-block;padding:0 5px;margin:0;border-left:none;line-height:21px;font-size:12px}.hljs-comment,.hljs-quote{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.dark .hljs-comment,.dark .hljs-quote{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.hljs-comment.hljs-doctag{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.dark .hljs-comment.hljs-doctag{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.hljs-doctag,.hljs-formula,.hljs-keyword,.hljs-name{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.dark .hljs-doctag,.dark .hljs-formula,.dark .hljs-keyword,.dark .hljs-name{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.hljs-attr,.hljs-deletion,.hljs-function.hljs-keyword,.hljs-literal,.hljs-section,.hljs-selector-tag{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.hljs-addition,.hljs-attribute,.hljs-meta-string,.hljs-regexp,.hljs-string{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.dark .hljs-addition,.dark .hljs-attribute,.dark .hljs-meta-string,.dark .hljs-regexp,.dark .hljs-string{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.hljs-built_in,.hljs-class .hljs-title,.hljs-template-tag,.hljs-template-variable{--tw-text-opacity:1;color:rgba(249,115,22,var(--tw-text-opacity))}.hljs-number,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-string.hljs-subst,.hljs-type{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.dark .hljs-number,.dark .hljs-selector-attr,.dark .hljs-selector-class,.dark .hljs-selector-pseudo,.dark .hljs-string.hljs-subst,.dark .hljs-type{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-operator,.hljs-selector-id,.hljs-symbol,.hljs-title,.hljs-variable{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.dark .hljs-bullet,.dark .hljs-link,.dark .hljs-meta,.dark .hljs-operator,.dark .hljs-selector-id,.dark .hljs-symbol,.dark .hljs-title,.dark .hljs-variable{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.hljs-strong,.hljs-title{font-weight:700}.hljs-emphasis{font-style:italic}.hljs-link{-webkit-text-decoration-line:underline;text-decoration-line:underline}.language-sql .hljs-keyword{text-transform:uppercase}.mask-fade-x{-webkit-mask-image:linear-gradient(90deg,transparent 0,#000 1rem,#000 calc(100% - 3rem),transparent calc(100% - 1rem))}.mask-fade-r{-webkit-mask-image:linear-gradient(90deg,#000 0,#000 calc(100% - 3rem),transparent calc(100% - 1rem))}.mask-fade-y{-webkit-mask-image:linear-gradient(180deg,#000 calc(100% - 2.5rem),transparent)}.mask-fade-frames{-webkit-mask-image:linear-gradient(180deg,#000 calc(100% - 4rem),transparent)}.scrollbar::-webkit-scrollbar,.scrollbar::-webkit-scrollbar-corner{width:2px;height:2px}.scrollbar::-webkit-scrollbar-track{background-color:transparent}.scrollbar::-webkit-scrollbar-thumb{background-color:rgba(239,68,68,.9)}.scrollbar-lg::-webkit-scrollbar,.scrollbar-lg::-webkit-scrollbar-corner{width:4px;height:4px}.scrollbar-lg::-webkit-scrollbar-track{background-color:transparent}.scrollbar-lg::-webkit-scrollbar-thumb{background-color:rgba(239,68,68,.9)}.scrollbar-hidden-x{-ms-overflow-style:none;scrollbar-width:none;overflow-x:scroll}.scrollbar-hidden-x::-webkit-scrollbar{display:none}.scrollbar-hidden-y{-ms-overflow-style:none;scrollbar-width:none;overflow-y:scroll}.scrollbar-hidden-y::-webkit-scrollbar{display:none}main pre.sf-dump{display:block!important;z-index:0!important;padding:0!important;font-size:.875rem!important;line-height:1.25rem!important}.sf-dump-key.sf-dump-highlight,.sf-dump-private.sf-dump-highlight,.sf-dump-protected.sf-dump-highlight,.sf-dump-public.sf-dump-highlight,.sf-dump-str.sf-dump-highlight{background-color:rgba(139,92,246,.1)!important}.sf-dump-key.sf-dump-highlight-active,.sf-dump-private.sf-dump-highlight-active,.sf-dump-protected.sf-dump-highlight-active,.sf-dump-public.sf-dump-highlight-active,.sf-dump-str.sf-dump-highlight-active{background-color:rgba(245,158,11,.1)!important}pre.sf-dump .sf-dump-search-wrapper{align-items:center}pre.sf-dump .sf-dump-search-wrapper>*{border-width:0!important}pre.sf-dump .sf-dump-search-wrapper>input.sf-dump-search-input{font-size:.75rem!important;line-height:1rem!important;--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.dark pre.sf-dump .sf-dump-search-wrapper>input.sf-dump-search-input{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}pre.sf-dump .sf-dump-search-wrapper>input.sf-dump-search-input{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.dark pre.sf-dump .sf-dump-search-wrapper>input.sf-dump-search-input{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}pre.sf-dump .sf-dump-search-wrapper>input.sf-dump-search-input{height:2rem!important;padding-left:.5rem!important;padding-right:.5rem!important}pre.sf-dump .sf-dump-search-wrapper>.sf-dump-search-input-next,pre.sf-dump .sf-dump-search-wrapper>.sf-dump-search-input-previous{background-color:transparent!important;--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.dark pre.sf-dump .sf-dump-search-wrapper>.sf-dump-search-input-next,.dark pre.sf-dump .sf-dump-search-wrapper>.sf-dump-search-input-previous{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}pre.sf-dump .sf-dump-search-wrapper>.sf-dump-search-input-next:hover,pre.sf-dump .sf-dump-search-wrapper>.sf-dump-search-input-previous:hover{--tw-text-opacity:1!important;color:rgba(99,102,241,var(--tw-text-opacity))!important}pre.sf-dump .sf-dump-search-wrapper>.sf-dump-search-input-next,pre.sf-dump .sf-dump-search-wrapper>.sf-dump-search-input-previous{padding-left:.25rem;padding-right:.25rem}pre.sf-dump .sf-dump-search-wrapper svg path{fill:currentColor}pre.sf-dump .sf-dump-search-wrapper>.sf-dump-search-count{font-size:.75rem!important;line-height:1rem!important;line-height:1.5!important;padding-left:1rem!important;padding-right:1rem!important;--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.dark pre.sf-dump .sf-dump-search-wrapper>.sf-dump-search-count{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}pre.sf-dump .sf-dump-search-wrapper>.sf-dump-search-count{background-color:transparent!important}pre.sf-dump,pre.sf-dump .sf-dump-default{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important;background-color:transparent!important;--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.dark pre.sf-dump,.dark pre.sf-dump .sf-dump-default{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}pre.sf-dump .sf-dump-num{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.dark pre.sf-dump .sf-dump-num{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}pre.sf-dump .sf-dump-const{font-weight:400!important;--tw-text-opacity:1!important;color:rgba(139,92,246,var(--tw-text-opacity))!important}pre.sf-dump .sf-dump-str{font-weight:400!important;--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.dark pre.sf-dump .sf-dump-str{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}pre.sf-dump .sf-dump-note{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.dark pre.sf-dump .sf-dump-note{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}pre.sf-dump .sf-dump-ref{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.dark pre.sf-dump .sf-dump-ref{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}pre.sf-dump .sf-dump-private,pre.sf-dump .sf-dump-protected,pre.sf-dump .sf-dump-public{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.dark pre.sf-dump .sf-dump-private,.dark pre.sf-dump .sf-dump-protected,.dark pre.sf-dump .sf-dump-public{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}pre.sf-dump .sf-dump-meta{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.dark pre.sf-dump .sf-dump-meta{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}pre.sf-dump .sf-dump-key{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.dark pre.sf-dump .sf-dump-key{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}pre.sf-dump .sf-dump-index{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.dark pre.sf-dump .sf-dump-index{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}pre.sf-dump .sf-dump-ellipsis{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.dark pre.sf-dump .sf-dump-ellipsis{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}pre.sf-dump .sf-dump-toggle{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.dark pre.sf-dump .sf-dump-toggle{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}pre.sf-dump .sf-dump-toggle:hover{--tw-text-opacity:1!important;color:rgba(99,102,241,var(--tw-text-opacity))!important}pre.sf-dump .sf-dump-toggle span{display:inline-flex!important;align-items:center!important;justify-content:center!important;width:1rem!important;height:1rem!important;font-size:9px;background-color:rgba(107,114,128,.05)}.dark pre.sf-dump .sf-dump-toggle span{background-color:rgba(0,0,0,.1)}pre.sf-dump .sf-dump-toggle span:hover{--tw-bg-opacity:1!important;background-color:rgba(255,255,255,var(--tw-bg-opacity))!important}.dark pre.sf-dump .sf-dump-toggle span:hover{--tw-bg-opacity:1!important;background-color:rgba(17,24,39,var(--tw-bg-opacity))!important}pre.sf-dump .sf-dump-toggle span{border-radius:9999px;--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}pre.sf-dump .sf-dump-toggle span,pre.sf-dump .sf-dump-toggle span:hover{box-shadow:0 0 transparent,0 0 transparent,var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}pre.sf-dump .sf-dump-toggle span:hover{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px -1px rgba(0,0,0,0.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);--tw-text-opacity:1!important;color:rgba(99,102,241,var(--tw-text-opacity))!important}pre.sf-dump .sf-dump-toggle span{top:-2px}pre.sf-dump .sf-dump-toggle:hover span{--tw-bg-opacity:1!important;background-color:rgba(255,255,255,var(--tw-bg-opacity))!important}.dark pre.sf-dump .sf-dump-toggle:hover span{--tw-bg-opacity:1!important;background-color:rgba(17,24,39,var(--tw-bg-opacity))!important}.\~text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.dark .\~text-gray-500{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.\~text-violet-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.dark .\~text-violet-500{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.\~text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.dark .\~text-gray-600{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.\~text-indigo-600{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.dark .\~text-indigo-600{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.hover\:\~text-indigo-600:hover{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.dark .hover\:\~text-indigo-600:hover{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.\~text-blue-600{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.dark .\~text-blue-600{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.\~text-violet-600{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.dark .\~text-violet-600{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.hover\:\~text-violet-600:hover{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.dark .hover\:\~text-violet-600:hover{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.\~text-emerald-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.dark .\~text-emerald-600{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.\~text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.dark .\~text-red-600{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.\~text-orange-600{--tw-text-opacity:1;color:rgba(234,88,12,var(--tw-text-opacity))}.dark .\~text-orange-600{--tw-text-opacity:1;color:rgba(251,146,60,var(--tw-text-opacity))}.\~text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.dark .\~text-gray-700{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.\~text-indigo-700{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.dark .\~text-indigo-700{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.\~text-blue-700{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.dark .\~text-blue-700{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.\~text-violet-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.dark .\~text-violet-700{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.\~text-emerald-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.dark .\~text-emerald-700{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.\~text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.dark .\~text-red-700{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.\~text-orange-700{--tw-text-opacity:1;color:rgba(194,65,12,var(--tw-text-opacity))}.dark .\~text-orange-700{--tw-text-opacity:1;color:rgba(254,215,170,var(--tw-text-opacity))}.\~text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.dark .\~text-gray-800{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.\~bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.dark .\~bg-white{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.\~bg-body{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.dark .\~bg-body{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.\~bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.dark .\~bg-gray-100{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.\~bg-gray-200\/50{background-color:rgba(229,231,235,.5)}.dark .\~bg-gray-200\/50{background-color:rgba(55,65,81,.1)}.\~bg-gray-500\/5{background-color:rgba(107,114,128,.05)}.dark .\~bg-gray-500\/5{background-color:rgba(0,0,0,.1)}.hover\:\~bg-gray-500\/5:hover{background-color:rgba(107,114,128,.05)}.dark .hover\:\~bg-gray-500\/5:hover{background-color:rgba(17,24,39,.2)}.\~bg-gray-500\/10{background-color:rgba(107,114,128,.1)}.dark .\~bg-gray-500\/10{background-color:rgba(17,24,39,.4)}.\~bg-red-500\/10{background-color:rgba(239,68,68,.1)}.dark .\~bg-red-500\/10{background-color:rgba(239,68,68,.2)}.hover\:\~bg-red-500\/10:hover{background-color:rgba(239,68,68,.1)}.\~bg-red-500\/20,.dark .hover\:\~bg-red-500\/10:hover{background-color:rgba(239,68,68,.2)}.dark .\~bg-red-500\/20{background-color:rgba(239,68,68,.4)}.\~bg-red-500\/30{background-color:rgba(239,68,68,.3)}.dark .\~bg-red-500\/30{background-color:rgba(239,68,68,.6)}.\~bg-dropdown{--tw-bg-opacity:1!important;background-color:rgba(255,255,255,var(--tw-bg-opacity))!important}.dark .\~bg-dropdown{--tw-bg-opacity:1!important;background-color:rgba(55,65,81,var(--tw-bg-opacity))!important}.\~border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.dark .\~border-gray-200{border-color:rgba(107,114,128,.2)}.\~border-b-dropdown{--tw-border-opacity:1!important;border-bottom-color:rgba(255,255,255,var(--tw-border-opacity))!important}.dark .\~border-b-dropdown{--tw-border-opacity:1!important;border-bottom-color:rgba(55,65,81,var(--tw-border-opacity))!important}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.sticky{position:-webkit-sticky;position:sticky}.inset-0{right:0;left:0}.inset-0,.inset-y-0{top:0;bottom:0}.top-0{top:0}.left-0{left:0}.right-2{right:.5rem}.top-2\.5{top:.625rem}.top-2{top:.5rem}.top-10{top:2.5rem}.right-1\/2{right:50%}.right-0{right:0}.left-4{left:1rem}.left-1\/2{left:50%}.left-0\.5{left:.125rem}.top-0\.5{top:.125rem}.top-\[7\.5rem\]{top:7.5rem}.top-3{top:.75rem}.right-4{right:1rem}.-top-3{top:-.75rem}.-right-3{right:-.75rem}.right-3{right:.75rem}.-bottom-3{bottom:-.75rem}.left-10{left:2.5rem}.z-50{z-index:50}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.col-span-2{grid-column:span 2/span 2}.mx-auto{margin-left:auto;margin-right:auto}.my-20{margin-top:5rem;margin-bottom:5rem}.mx-0\.5{margin-left:.125rem;margin-right:.125rem}.mx-0{margin-left:0;margin-right:0}.-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.my-4{margin-top:1rem;margin-bottom:1rem}.-my-px{margin-top:-1px;margin-bottom:-1px}.mr-0\.5{margin-right:.125rem}.mr-0{margin-right:0}.mt-1\.5{margin-top:.375rem}.mt-1{margin-top:.25rem}.-ml-3{margin-left:-.75rem}.-mr-3{margin-right:-.75rem}.mr-1\.5{margin-right:.375rem}.mr-1{margin-right:.25rem}.mt-2{margin-top:.5rem}.-ml-1{margin-left:-.25rem}.mr-2{margin-right:.5rem}.mb-1{margin-bottom:.25rem}.mt-3{margin-top:.75rem}.mb-2{margin-bottom:.5rem}.mr-10{margin-right:2.5rem}.ml-auto{margin-left:auto}.mb-4{margin-bottom:1rem}.-ml-6{margin-left:-1.5rem}.-mb-2{margin-bottom:-.5rem}.mr-4{margin-right:1rem}.mt-4{margin-top:1rem}.mt-\[-4px\]{margin-top:-4px}.ml-1\.5{margin-left:.375rem}.ml-1{margin-left:.25rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-20{height:5rem}.h-10{height:2.5rem}.h-2{height:.5rem}.h-0{height:0}.h-12{height:3rem}.h-4{height:1rem}.h-3{height:.75rem}.h-8{height:2rem}.h-6{height:1.5rem}.h-9{height:2.25rem}.h-full{height:100%}.h-\[4px\]{height:4px}.h-16{height:4rem}.h-5{height:1.25rem}.max-h-32{max-height:8rem}.max-h-\[33vh\]{max-height:33vh}.w-full{width:100%}.w-2{width:.5rem}.w-0{width:0}.w-6{width:1.5rem}.w-3{width:.75rem}.w-32{width:8rem}.w-9{width:2.25rem}.w-4{width:1rem}.w-8{width:2rem}.min-w-0{min-width:0}.min-w-\[8rem\]{min-width:8rem}.min-w-\[1rem\]{min-width:1rem}.max-w-4xl{max-width:56rem}.max-w-max{max-width:-webkit-max-content;max-width:-moz-max-content;max-width:max-content}.flex-none{flex:none}.flex-shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.origin-top-right{transform-origin:top right}.origin-bottom{transform-origin:bottom}.origin-top-left{transform-origin:top left}.translate-x-0{--tw-translate-x:0px}.translate-x-0,.translate-y-10{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-10{--tw-translate-y:2.5rem}.translate-y-0{--tw-translate-y:0px}.translate-x-6,.translate-y-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-6{--tw-translate-x:1.5rem}.-translate-x-6{--tw-translate-x:-1.5rem}.-translate-x-1\/2,.-translate-x-6{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-1\/2{--tw-translate-x:-50%}.rotate-180{--tw-rotate:180deg}.-rotate-180,.rotate-180{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-180{--tw-rotate:-180deg}.-rotate-90{--tw-rotate:-90deg}.-rotate-90,.scale-90{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-90{--tw-scale-x:.9;--tw-scale-y:.9}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-flow-col{grid-auto-flow:column}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-10{gap:2.5rem}.gap-2{gap:.5rem}.gap-6{gap:1.5rem}.gap-4{gap:1rem}.gap-3{gap:.75rem}.gap-px{gap:1px}.gap-1{gap:.25rem}.gap-y-2{row-gap:.5rem}.space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1px*var(--tw-space-x-reverse));margin-left:calc(1px*(1 - var(--tw-space-x-reverse)))}.self-start{align-self:flex-start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-hidden{overflow-y:hidden}.overflow-x-scroll{overflow-x:scroll}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.rounded-full{border-radius:9999px}.rounded-none{border-radius:0}.rounded-sm{border-radius:.125rem}.rounded-lg{border-radius:.5rem}.rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.border-\[10px\]{border-width:10px}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-t-0{border-top-width:0}.border-r{border-right-width:1px}.border-transparent{border-color:transparent}.border-red-500\/25{border-color:rgba(239,68,68,.25)}.border-violet-500\/25{border-color:rgba(139,92,246,.25)}.border-emerald-500\/25{border-color:rgba(16,185,129,.25)}.border-gray-800\/20{border-color:rgba(31,41,55,.2)}.border-red-500\/50{border-color:rgba(239,68,68,.5)}.border-orange-500\/50{border-color:rgba(249,115,22,.5)}.border-emerald-500\/50{border-color:rgba(16,185,129,.5)}.border-indigo-500\/50{border-color:rgba(99,102,241,.5)}.border-violet-600\/50{border-color:rgba(124,58,237,.5)}.border-gray-500\/50{border-color:rgba(107,114,128,.5)}.bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.bg-red-600{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.bg-violet-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.bg-gray-300\/50{background-color:rgba(209,213,219,.5)}.bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.bg-indigo-600{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.bg-gray-900\/30{background-color:rgba(17,24,39,.3)}.bg-emerald-600{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.bg-emerald-300{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.bg-emerald-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(254,252,232,var(--tw-bg-opacity))}.bg-emerald-500\/5{background-color:rgba(16,185,129,.05)}.bg-red-800\/5{background-color:rgba(153,27,27,.05)}.bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.bg-opacity-20{--tw-bg-opacity:0.2}.bg-dots-darker{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='30' height='30' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1.227 0c.687 0 1.227.54 1.227 1.227s-.54 1.227-1.227 1.227S0 1.914 0 1.227.54 0 1.227 0z' fill='rgba(0,0,0,0.07)'/%3E%3C/svg%3E")}.from-gray-700\/50{--tw-gradient-from:rgba(55,65,81,0.5);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.via-transparent{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.bg-center{background-position:50%}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-0{padding-top:0;padding-bottom:0}.pr-8{padding-right:2rem}.pl-4{padding-left:1rem}.pt-10{padding-top:2.5rem}.pr-12{padding-right:3rem}.pt-2{padding-top:.5rem}.pb-1\.5{padding-bottom:.375rem}.pb-1{padding-bottom:.25rem}.pr-10{padding-right:2.5rem}.pl-6{padding-left:1.5rem}.pb-16{padding-bottom:4rem}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-base{font-size:1rem;line-height:1.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-\[8px\]{font-size:8px}.font-semibold{font-weight:600}.font-medium{font-weight:500}.font-bold{font-weight:700}.font-normal{font-weight:400}.uppercase{text-transform:uppercase}.italic{font-style:italic}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-loose{line-height:2}.tracking-wider{letter-spacing:.05em}.text-red-50{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.text-red-100{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.text-emerald-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.text-indigo-100{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.text-emerald-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.text-yellow-500{--tw-text-opacity:1;color:rgba(234,179,8,var(--tw-text-opacity))}.text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.text-opacity-75{--tw-text-opacity:0.75}.underline{-webkit-text-decoration-line:underline;text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-50{opacity:.5}.opacity-80{opacity:.8}.opacity-0{opacity:0}.opacity-100{opacity:1}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -4px rgba(0,0,0,0.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow,.shadow-lg{box-shadow:0 0 transparent,0 0 transparent,var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px -1px rgba(0,0,0,0.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.shadow-2xl,.shadow-inner{box-shadow:0 0 transparent,0 0 transparent,var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -2px rgba(0,0,0,0.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:0 0 transparent,0 0 transparent,var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.shadow-gray-500\/20{--tw-shadow-color:rgba(107,114,128,0.2);--tw-shadow:var(--tw-shadow-colored)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-animation{transition-property:transform,box-shadow,opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,fill,stroke,-webkit-text-decoration-color;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,-webkit-text-decoration-color;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition{transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.delay-100{transition-delay:.1s}.duration-100{transition-duration:.1s}.duration-300{transition-duration:.3s}.duration-150{transition-duration:.15s}.duration-1000{transition-duration:1s}.duration-500{transition-duration:.5s}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.line-clamp-none{-webkit-line-clamp:unset}.first-letter\:uppercase:first-letter{text-transform:uppercase}.hover\:text-red-500:hover{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.hover\:text-violet-500:hover{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.hover\:text-indigo-500:hover{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.hover\:text-emerald-800:hover{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.hover\:text-red-800:hover{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.hover\:text-emerald-700:hover{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.hover\:underline:hover{-webkit-text-decoration-line:underline;text-decoration-line:underline}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -4px rgba(0,0,0,0.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.hover\:shadow-lg:hover,.hover\:shadow-md:hover{box-shadow:0 0 transparent,0 0 transparent,var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -2px rgba(0,0,0,0.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.active\:translate-y-px:active{--tw-translate-y:1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.active\:shadow-inner:active{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color)}.active\:shadow-inner:active,.active\:shadow-sm:active{box-shadow:0 0 transparent,0 0 transparent,var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.active\:shadow-sm:active{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.group:hover .group-hover\:scale-100{--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:text-amber-400{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.group:hover .group-hover\:text-amber-300{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.group:hover .group-hover\:text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.group:hover .group-hover\:opacity-50{opacity:.5}.group:hover .group-hover\:opacity-100{opacity:1}.peer:checked~.peer-checked\:translate-x-2{--tw-translate-x:0.5rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.peer:checked~.peer-checked\:bg-emerald-300{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.dark .dark\:bg-gray-800\/50{background-color:rgba(31,41,55,.5)}.dark .dark\:bg-black\/10{background-color:rgba(0,0,0,.1)}.dark .dark\:bg-yellow-500\/10{background-color:rgba(234,179,8,.1)}.dark .dark\:bg-red-500\/10{background-color:rgba(239,68,68,.1)}.dark .dark\:bg-dots-lighter{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='30' height='30' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1.227 0c.687 0 1.227.54 1.227 1.227s-.54 1.227-1.227 1.227S0 1.914 0 1.227.54 0 1.227 0z' fill='rgba(255,255,255,0.07)'/%3E%3C/svg%3E")}.dark .dark\:bg-gradient-to-bl{background-image:linear-gradient(to bottom left,var(--tw-gradient-stops))}.dark .dark\:shadow-none{--tw-shadow:0 0 transparent;--tw-shadow-colored:0 0 transparent;box-shadow:0 0 transparent,0 0 transparent,var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.dark .dark\:ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),0 0 transparent;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 transparent)}.dark .dark\:ring-inset{--tw-ring-inset:inset}.dark .dark\:ring-white\/5{--tw-ring-color:hsla(0,0%,100%,0.05)}@media (min-width:640px){.sm\:-ml-5{margin-left:-1.25rem}.sm\:-mr-5{margin-right:-1.25rem}.sm\:block{display:block}.sm\:inline-flex{display:inline-flex}.sm\:px-10{padding-left:2.5rem;padding-right:2.5rem}.sm\:px-5{padding-left:1.25rem;padding-right:1.25rem}}@media (min-width:1024px){.lg\:absolute{position:absolute}.lg\:mr-20{margin-right:5rem}.lg\:flex{display:flex}.lg\:max-h-\[none\]{max-height:none}.lg\:w-1\/3{width:33.333333%}.lg\:w-2\/5{width:40%}.lg\:max-w-\[90rem\]{max-width:90rem}.lg\:grid-cols-\[33\.33\%\2c 66\.66\%\]{grid-template-columns:33.33% 66.66%}.lg\:grid-rows-\[57rem\]{grid-template-rows:57rem}.lg\:justify-start{justify-content:flex-start}.lg\:border-t-0{border-top-width:0}.lg\:px-10{padding-left:2.5rem;padding-right:2.5rem}}ignition/resources/compiled/ignition.js000064400002655777150247714250014414 0ustar00function e(){return(e=Object.assign||function(e){for(var t=1;t1?t-1:0),r=1;r1?t-1:0),r=1;r1){for(var u=Array(c),f=0;f1){for(var p=Array(d),m=0;m import('./MyComponent'))",t);var r=e;r._status=1,r._result=n}},function(t){if(0===e._status){var n=e;n._status=2,n._result=t}})}if(1===e._status)return e._result;throw e._result}function se(e){return"string"==typeof e||"function"==typeof e||e===t.Fragment||e===t.Profiler||e===m||e===t.StrictMode||e===t.Suspense||e===s||e===h||"object"==typeof e&&null!==e&&(e.$$typeof===u||e.$$typeof===c||e.$$typeof===a||e.$$typeof===o||e.$$typeof===i||e.$$typeof===p||e.$$typeof===f||e[0]===d)}function ce(){var e=E.current;if(null===e)throw Error("Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem.");return e}var ue,fe,de,pe,me,he,ge,ve=0;function ye(){}ye.__reactDisabledLog=!0;var Ee,be=S.ReactCurrentDispatcher;function Te(e,t,n){if(void 0===Ee)try{throw Error()}catch(e){var r=e.stack.trim().match(/\n( *(at )?)/);Ee=r&&r[1]||""}return"\n"+Ee+e}var Ne,Re=!1,Se="function"==typeof WeakMap?WeakMap:Map;function we(t,n){if(!t||Re)return"";var r,a=Ne.get(t);if(void 0!==a)return a;Re=!0;var o,i=Error.prepareStackTrace;Error.prepareStackTrace=void 0,o=be.current,be.current=null,function(){if(0===ve){ue=console.log,fe=console.info,de=console.warn,pe=console.error,me=console.group,he=console.groupCollapsed,ge=console.groupEnd;var e={configurable:!0,enumerable:!0,value:ye,writable:!0};Object.defineProperties(console,{info:e,log:e,warn:e,error:e,group:e,groupCollapsed:e,groupEnd:e})}ve++}();try{if(n){var l=function(){throw Error()};if(Object.defineProperty(l.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(l,[])}catch(e){r=e}Reflect.construct(t,[],l)}else{try{l.call()}catch(e){r=e}t.call(l.prototype)}}else{try{throw Error()}catch(e){r=e}t()}}catch(e){if(e&&r&&"string"==typeof e.stack){for(var s=e.stack.split("\n"),c=r.stack.split("\n"),u=s.length-1,f=c.length-1;u>=1&&f>=0&&s[u]!==c[f];)f--;for(;u>=1&&f>=0;u--,f--)if(s[u]!==c[f]){if(1!==u||1!==f)do{if(u--,--f<0||s[u]!==c[f]){var d="\n"+s[u].replace(" at new "," at ");return"function"==typeof t&&Ne.set(t,d),d}}while(u>=1&&f>=0);break}}}finally{Re=!1,be.current=o,function(){if(0==--ve){var t={configurable:!0,enumerable:!0,writable:!0};Object.defineProperties(console,{log:e({},t,{value:ue}),info:e({},t,{value:fe}),warn:e({},t,{value:de}),error:e({},t,{value:pe}),group:e({},t,{value:me}),groupCollapsed:e({},t,{value:he}),groupEnd:e({},t,{value:ge})})}ve<0&&O("disabledDepth fell below zero. This is a bug in React. Please file an issue.")}(),Error.prepareStackTrace=i}var p=t?t.displayName||t.name:"",m=p?Te(p):"";return"function"==typeof t&&Ne.set(t,m),m}function Oe(e,t,n){return we(e,!1)}function Ce(e,n,r){if(null==e)return"";if("function"==typeof e)return we(e,function(e){var t=e.prototype;return!(!t||!t.isReactComponent)}(e));if("string"==typeof e)return Te(e);switch(e){case t.Suspense:return Te("Suspense");case s:return Te("SuspenseList")}if("object"==typeof e)switch(e.$$typeof){case i:return Oe(e.render);case c:return Ce(e.type,n,r);case f:return Oe(e._render);case u:var a=e._payload,o=e._init;try{return Ce(o(a),n,r)}catch(e){}}return""}Ne=new Se;var Ae,Ie={},ke=S.ReactDebugCurrentFrame;function xe(e){if(e){var t=e._owner,n=Ce(e.type,e._source,t?t.type:null);ke.setExtraStackFrame(n)}else ke.setExtraStackFrame(null)}function _e(e){if(e){var t=e._owner;R(Ce(e.type,e._source,t?t.type:null))}else R(null)}function Le(){if(b.current){var e=z(b.current.type);if(e)return"\n\nCheck the render method of `"+e+"`."}return""}function Pe(e){return null!=e?function(e){return void 0!==e?"\n\nCheck your code at "+e.fileName.replace(/^.*[\\\/]/,"")+":"+e.lineNumber+".":""}(e.__source):""}Ae=!1;var Me={};function De(e,t){if(e._store&&!e._store.validated&&null==e.key){e._store.validated=!0;var n=function(e){var t=Le();if(!t){var n="string"==typeof e?e:e.displayName||e.name;n&&(t="\n\nCheck the top-level render call using <"+n+">.")}return t}(t);if(!Me[n]){Me[n]=!0;var r="";e&&e._owner&&e._owner!==b.current&&(r=" It was passed a child from "+z(e._owner.type)+"."),_e(e),O('Each child in a list should have a unique "key" prop.%s%s See https://reactjs.org/link/warning-keys for more information.',n,r),_e(null)}}}function Ue(e,t){if("object"==typeof e)if(Array.isArray(e))for(var n=0;n",i=" Did you accidentally export a JSX literal instead of a component?"):l=typeof e,O("React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s",l,i)}var c=Q.apply(this,arguments);if(null==c)return c;if(o)for(var u=2;u is not supported and will be removed in a future major release. Did you mean to render instead?")),n.Provider},set:function(e){n.Provider=e}},_currentValue:{get:function(){return n._currentValue},set:function(e){n._currentValue=e}},_currentValue2:{get:function(){return n._currentValue2},set:function(e){n._currentValue2=e}},_threadCount:{get:function(){return n._threadCount},set:function(e){n._threadCount=e}},Consumer:{get:function(){return r||(r=!0,O("Rendering is not supported and will be removed in a future major release. Did you mean to render instead?")),n.Consumer}},displayName:{get:function(){return n.displayName},set:function(e){l||(w("Setting `displayName` on Context.Consumer has no effect. You should set it directly on the context with Context.displayName = '%s'.",e),l=!0)}}}),n.Consumer=s,n._currentRenderer=null,n._currentRenderer2=null,n},t.createElement=Ve,t.createFactory=function(e){var t=ze.bind(null,e);return t.type=e,He||(He=!0,w("React.createFactory() is deprecated and will be removed in a future major release. Consider using JSX or use React.createElement() directly instead.")),Object.defineProperty(t,"type",{enumerable:!1,get:function(){return w("Factory.type is deprecated. Access the class directly before passing it to createFactory."),Object.defineProperty(this,"type",{value:e}),e}}),t},t.createRef=function(){var e={current:null};return Object.seal(e),e},t.forwardRef=function(e){null!=e&&e.$$typeof===c?O("forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))."):"function"!=typeof e?O("forwardRef requires a render function but was given %s.",null===e?"null":typeof e):0!==e.length&&2!==e.length&&O("forwardRef render functions accept exactly two parameters: props and ref. %s",1===e.length?"Did you forget to use the ref parameter?":"Any additional parameter will be undefined."),null!=e&&(null==e.defaultProps&&null==e.propTypes||O("forwardRef render functions do not support propTypes or defaultProps. Did you accidentally pass a React component?"));var t,n={$$typeof:i,render:e};return Object.defineProperty(n,"displayName",{enumerable:!1,configurable:!0,get:function(){return t},set:function(n){t=n,null==e.displayName&&(e.displayName=n)}}),n},t.isValidElement=ee,t.lazy=function(e){var t,n,r={$$typeof:u,_payload:{_status:-1,_result:e},_init:le};return Object.defineProperties(r,{defaultProps:{configurable:!0,get:function(){return t},set:function(e){O("React.lazy(...): It is not supported to assign `defaultProps` to a lazy component import. Either specify them where the component is defined, or create a wrapping component around it."),t=e,Object.defineProperty(r,"defaultProps",{enumerable:!0})}},propTypes:{configurable:!0,get:function(){return n},set:function(e){O("React.lazy(...): It is not supported to assign `propTypes` to a lazy component import. Either specify them where the component is defined, or create a wrapping component around it."),n=e,Object.defineProperty(r,"propTypes",{enumerable:!0})}}}),r},t.memo=function(e,t){se(e)||O("memo: The first argument must be a component. Instead received: %s",null===e?"null":typeof e);var n,r={$$typeof:c,type:e,compare:void 0===t?null:t};return Object.defineProperty(r,"displayName",{enumerable:!1,configurable:!0,get:function(){return n},set:function(t){n=t,null==e.displayName&&(e.displayName=t)}}),r},t.useCallback=function(e,t){return ce().useCallback(e,t)},t.useContext=function(e,t){var n=ce();if(void 0!==t&&O("useContext() second argument is reserved for future use in React. Passing it is not supported. You passed: %s.%s",t,"number"==typeof t&&Array.isArray(arguments[2])?"\n\nDid you call array.map(useContext)? Calling Hooks inside a loop is not supported. Learn more at https://reactjs.org/link/rules-of-hooks":""),void 0!==e._context){var r=e._context;r.Consumer===e?O("Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be removed in a future major release. Did you mean to call useContext(Context) instead?"):r.Provider===e&&O("Calling useContext(Context.Provider) is not supported. Did you mean to call useContext(Context) instead?")}return n.useContext(e,t)},t.useDebugValue=function(e,t){return ce().useDebugValue(e,t)},t.useEffect=function(e,t){return ce().useEffect(e,t)},t.useImperativeHandle=function(e,t,n){return ce().useImperativeHandle(e,t,n)},t.useLayoutEffect=function(e,t){return ce().useLayoutEffect(e,t)},t.useMemo=function(e,t){return ce().useMemo(e,t)},t.useReducer=function(e,t,n){return ce().useReducer(e,t,n)},t.useRef=function(e){return ce().useRef(e)},t.useState=function(e){return ce().useState(e)},t.version="17.0.2"}()}),c=n(function(e){e.exports=s});n(function(e,t){var n,r,a,o;if("object"==typeof performance&&"function"==typeof performance.now){var i=performance;t.unstable_now=function(){return i.now()}}else{var l=Date,s=l.now();t.unstable_now=function(){return l.now()-s}}if("undefined"==typeof window||"function"!=typeof MessageChannel){var c=null,u=null,f=function(){if(null!==c)try{var e=t.unstable_now();c(!0,e),c=null}catch(e){throw setTimeout(f,0),e}};n=function(e){null!==c?setTimeout(n,0,e):(c=e,setTimeout(f,0))},r=function(e,t){u=setTimeout(e,t)},a=function(){clearTimeout(u)},t.unstable_shouldYield=function(){return!1},o=t.unstable_forceFrameRate=function(){}}else{var d=window.setTimeout,p=window.clearTimeout;if("undefined"!=typeof console){var m=window.cancelAnimationFrame;"function"!=typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),"function"!=typeof m&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")}var h=!1,g=null,v=-1,y=5,E=0;t.unstable_shouldYield=function(){return t.unstable_now()>=E},o=function(){},t.unstable_forceFrameRate=function(e){0>e||125>>1,a=e[r];if(!(void 0!==a&&0w(i,n))void 0!==s&&0>w(s,i)?(e[r]=s,e[l]=n,r=l):(e[r]=i,e[o]=n,r=o);else{if(!(void 0!==s&&0>w(s,n)))break e;e[r]=s,e[l]=n,r=l}}}return t}return null}function w(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}var O=[],C=[],A=1,I=null,k=3,x=!1,_=!1,L=!1;function P(e){for(var t=R(C);null!==t;){if(null===t.callback)S(C);else{if(!(t.startTime<=e))break;S(C),t.sortIndex=t.expirationTime,N(O,t)}t=R(C)}}function M(e){if(L=!1,P(e),!_)if(null!==R(O))_=!0,n(D);else{var t=R(C);null!==t&&r(M,t.startTime-e)}}function D(e,n){_=!1,L&&(L=!1,a()),x=!0;var o=k;try{for(P(n),I=R(O);null!==I&&(!(I.expirationTime>n)||e&&!t.unstable_shouldYield());){var i=I.callback;if("function"==typeof i){I.callback=null,k=I.priorityLevel;var l=i(I.expirationTime<=n);n=t.unstable_now(),"function"==typeof l?I.callback=l:I===R(O)&&S(O),P(n)}else S(O);I=R(O)}if(null!==I)var s=!0;else{var c=R(C);null!==c&&r(M,c.startTime-n),s=!1}return s}finally{I=null,k=o,x=!1}}var U=o;t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){_||x||(_=!0,n(D))},t.unstable_getCurrentPriorityLevel=function(){return k},t.unstable_getFirstCallbackNode=function(){return R(O)},t.unstable_next=function(e){switch(k){case 1:case 2:case 3:var t=3;break;default:t=k}var n=k;k=t;try{return e()}finally{k=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=U,t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=k;k=e;try{return t()}finally{k=n}},t.unstable_scheduleCallback=function(e,o,i){var l=t.unstable_now();switch(i="object"==typeof i&&null!==i&&"number"==typeof(i=i.delay)&&0l?(e.sortIndex=i,N(C,e),null===R(O)&&e===R(C)&&(L?a():L=!0,r(M,i-l))):(e.sortIndex=s,N(O,e),_||x||(_=!0,n(D))),e},t.unstable_wrapCallback=function(e){var t=k;return function(){var n=k;k=t;try{return e.apply(this,arguments)}finally{k=n}}}});var u=n(function(e,t){!function(){var e,n,r,a;if("object"==typeof performance&&"function"==typeof performance.now){var o=performance;t.unstable_now=function(){return o.now()}}else{var i=Date,l=i.now();t.unstable_now=function(){return i.now()-l}}if("undefined"==typeof window||"function"!=typeof MessageChannel){var s=null,c=null,u=function(){if(null!==s)try{var e=t.unstable_now();s(!0,e),s=null}catch(e){throw setTimeout(u,0),e}};e=function(t){null!==s?setTimeout(e,0,t):(s=t,setTimeout(u,0))},n=function(e,t){c=setTimeout(e,t)},r=function(){clearTimeout(c)},t.unstable_shouldYield=function(){return!1},a=t.unstable_forceFrameRate=function(){}}else{var f=window.setTimeout,d=window.clearTimeout;if("undefined"!=typeof console){var p=window.requestAnimationFrame,m=window.cancelAnimationFrame;"function"!=typeof p&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),"function"!=typeof m&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")}var h=!1,g=null,v=-1,y=5,E=0;t.unstable_shouldYield=function(){return t.unstable_now()>=E},a=function(){},t.unstable_forceFrameRate=function(e){e<0||e>125?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):y=e>0?Math.floor(1e3/e):5};var b=new MessageChannel,T=b.port2;b.port1.onmessage=function(){if(null!==g){var e=t.unstable_now();E=e+y;try{g(!0,e)?T.postMessage(null):(h=!1,g=null)}catch(e){throw T.postMessage(null),e}}else h=!1},e=function(e){g=e,h||(h=!0,T.postMessage(null))},n=function(e,n){v=f(function(){e(t.unstable_now())},n)},r=function(){d(v),v=-1}}function N(e,t){var n=e.length;e.push(t),function(e,t,n){for(var r=n;;){var a=r-1>>>1,o=e[a];if(!(void 0!==o&&w(o,t)>0))return;e[a]=t,e[r]=o,r=a}}(e,t,n)}function R(e){var t=e[0];return void 0===t?null:t}function S(e){var t=e[0];if(void 0!==t){var n=e.pop();return n!==t&&(e[0]=n,function(e,t,n){for(var r=0,a=e.length;ra)||e&&!t.unstable_shouldYield());){var o=I.callback;if("function"==typeof o){I.callback=null,k=I.priorityLevel;var i=o(I.expirationTime<=a);a=t.unstable_now(),"function"==typeof i?I.callback=i:I===R(O)&&S(O),P(a)}else S(O);I=R(O)}if(null!==I)return!0;var l=R(C);return null!==l&&n(M,l.startTime-a),!1}(e,a)}finally{I=null,k=o,x=!1}}var U=a;t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){_||x||(_=!0,e(D))},t.unstable_getCurrentPriorityLevel=function(){return k},t.unstable_getFirstCallbackNode=function(){return R(O)},t.unstable_next=function(e){var t;switch(k){case 1:case 2:case 3:t=3;break;default:t=k}var n=k;k=t;try{return e()}finally{k=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=U,t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=k;k=e;try{return t()}finally{k=n}},t.unstable_scheduleCallback=function(a,o,i){var l,s,c=t.unstable_now();if("object"==typeof i&&null!==i){var u=i.delay;l="number"==typeof u&&u>0?c+u:c}else l=c;switch(a){case 1:s=-1;break;case 2:s=250;break;case 5:s=1073741823;break;case 4:s=1e4;break;case 3:default:s=5e3}var f=l+s,d={id:A++,callback:o,priorityLevel:a,startTime:l,expirationTime:f,sortIndex:-1};return l>c?(d.sortIndex=l,N(C,d),null===R(O)&&d===R(C)&&(L?r():L=!0,n(M,l-c))):(d.sortIndex=f,N(O,d),_||x||(_=!0,e(D))),d},t.unstable_wrapCallback=function(e){var t=k;return function(){var n=k;k=t;try{return e.apply(this,arguments)}finally{k=n}}}}()}),f=n(function(e){e.exports=u});function d(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n