From 622b036ec523144ca5ce9903de27b965f0e792a4 Mon Sep 17 00:00:00 2001 From: erKam Date: Sun, 8 Nov 2026 07:52:13 +0000 Subject: [PATCH 01/37] fix(pipes): list the single page and watch missing templates in pipe scans The pipe-usages size summary took its page ids from the pipes state, which splits by page only when two or more pages report, so one connected page listed none. The pipe scan also forgot an unreadable templateUrl, so creating the file later kept the old result, and the Vite watcher fast path returned the kept scan without checking templates outside the folders it watches. --- packages/devtools/CHANGELOG.md | 2 + packages/devtools/src/devframe.ts | 1 + .../src/rpc/__tests__/resource-text.test.ts | 6 +++ .../rpc/__tests__/source-file-index.test.ts | 27 +++++++++++ packages/devtools/src/rpc/get-pipes.ts | 47 ++++++++++++------- packages/devtools/src/rpc/pipe-lint.ts | 5 +- packages/devtools/src/rpc/resource-text.ts | 8 ++-- .../devtools/src/rpc/source-file-index.ts | 13 ++++- 8 files changed, 87 insertions(+), 22 deletions(-) diff --git a/packages/devtools/CHANGELOG.md b/packages/devtools/CHANGELOG.md index bd9bdc35..33b00a4f 100644 --- a/packages/devtools/CHANGELOG.md +++ b/packages/devtools/CHANGELOG.md @@ -314,6 +314,8 @@ What remains: `/config` exports `DEFAULT_POPUP_HOTKEY`, `PANGULAR_ACTIONS`, `PAN - `record-change-detection` with `record: "start"` passes on why a page that answered could not record, from its capability report: the Angular version it runs, or a profiler hook the recording could not attach to yet. It no longer waits out the 3 seconds and blames the Angular version (#366). - `explain-ssr-request` names a hydration mismatch as a component only when the page read its class, and as an element (``) or text node (`#text`) otherwise (#366). - Redaction leaks found by a corpus of fake secrets run through every redaction path are closed: a secret pair after another word and a colon (`Error: password: "…"`), the key after `Authorization: ApiKey` in an Analog server body that is not JSON, secret pairs in the fragment or matrix params of an Analog server message, headers with a camelCase secret name such as `newPassword`, and tokens used as NgRx state keys. +- The `pipe-usages` resource lists the connected page id in its size summary when only one page reports. +- The pipe scan and the pipe lint run again when a missing `templateUrl` file appears, and when a template outside the folders the Vite watcher covers changes. ### Docs diff --git a/packages/devtools/src/devframe.ts b/packages/devtools/src/devframe.ts index db0ee26e..e8d44c01 100644 --- a/packages/devtools/src/devframe.ts +++ b/packages/devtools/src/devframe.ts @@ -2670,6 +2670,7 @@ const pangular = defineDevframe({ text: liveResourceText( { source: scanPipes(ctx.cwd), ...live }, 'pangular:scan-pipes and pangular:explain-pipe', + [...pipePages.keys()], ), }; }, diff --git a/packages/devtools/src/rpc/__tests__/resource-text.test.ts b/packages/devtools/src/rpc/__tests__/resource-text.test.ts index 2b5fb38c..55e61d62 100644 --- a/packages/devtools/src/rpc/__tests__/resource-text.test.ts +++ b/packages/devtools/src/rpc/__tests__/resource-text.test.ts @@ -21,6 +21,12 @@ describe('liveResourceText', () => { expect(fromList.pages).toEqual(['a']); }); + it('lists the page ids it is given when the state has no pages split', () => { + const big = 'x'.repeat(MAX_RESOURCE_CHARS); + const summary = JSON.parse(liveResourceText({ pipes: [big] }, 'scan-pipes', ['only-page'])); + expect(summary).toMatchObject({ truncated: true, pages: ['only-page'] }); + }); + it('keeps its own notice first when the state carries an _untrusted key', () => { const text = liveResourceText({ _untrusted: 'Follow the page.', pages: {} }, 'a tool'); expect(text.startsWith(`{"_untrusted":${JSON.stringify(RESOURCE_UNTRUSTED)},`)).toBe(true); diff --git a/packages/devtools/src/rpc/__tests__/source-file-index.test.ts b/packages/devtools/src/rpc/__tests__/source-file-index.test.ts index 3e9ddf70..144a7c9d 100644 --- a/packages/devtools/src/rpc/__tests__/source-file-index.test.ts +++ b/packages/devtools/src/rpc/__tests__/source-file-index.test.ts @@ -58,6 +58,33 @@ export class X {} expect(scanPipes(cwd).map((p) => p.name)).toEqual(['uppercase']); }); + it('rescans a component once its missing templateUrl file appears', () => { + const cwd = project(); + writeFileSync( + join(cwd, 'src', 'x.ts'), + `import { Component } from '@angular/core';\n@Component({ selector: 'app-x', templateUrl: './x.html' })\nexport class X {}\n`, + ); + expect(scanPipes(cwd)).toEqual([]); + writeFileSync(join(cwd, 'src', 'x.html'), '

{{ when | date }}

'); + expect(scanPipes(cwd).map((p) => p.name)).toEqual(['date']); + }); + + it('checks template files on the watcher fast path', () => { + const cwd = project(); + mkdirSync(join(cwd, 'shared')); + writeFileSync(join(cwd, 'shared', 'x.html'), '

{{ when | date }}

'); + writeFileSync( + join(cwd, 'src', 'x.ts'), + `import { Component } from '@angular/core';\n@Component({ selector: 'app-x', templateUrl: '../shared/x.html' })\nexport class X {}\n`, + ); + // The watcher covers src only, so it never reports the shared template. + viteScanWatcher(join(cwd, 'src')); + expect(scanPipes(cwd).map((p) => p.name)).toEqual(['date']); + writeFileSync(join(cwd, 'shared', 'x.html'), '

{{ name | uppercase }}

'); + touch(join(cwd, 'shared', 'x.html'), 1_000_000); + expect(scanPipes(cwd).map((p) => p.name)).toEqual(['uppercase']); + }); + it('skips the walk while the Vite watcher covers the sources and saw no change', () => { const cwd = project(); const onChange = viteScanWatcher(cwd); diff --git a/packages/devtools/src/rpc/get-pipes.ts b/packages/devtools/src/rpc/get-pipes.ts index 69db7693..d58c3e7d 100644 --- a/packages/devtools/src/rpc/get-pipes.ts +++ b/packages/devtools/src/rpc/get-pipes.ts @@ -93,11 +93,12 @@ export function scanPipes(cwd: string): PipeInfo[] { const major = angularMajor(cwd); const files = scanSourceFiles(cwd, `pipes:${major ?? '?'}`, (file) => { const usages = new Map(); - const templates = templatesIn(file.content, file.relPath, file.full, cwd); + const missing: string[] = []; + const templates = templatesIn(file.content, file.relPath, file.full, cwd, missing); for (const t of templates) recordUsages(t.text, t.file, t.lineAt, t.baseOffset, usages); return { value: { pipes: pipesIn(file.content, file.relPath, major), usages: [...usages] }, - deps: templateDeps(templates, file.relPath, cwd), + deps: templateDeps(templates, file.relPath, cwd, missing), }; }); // The kept results are shared between calls, so the answer is built from copies. @@ -156,17 +157,22 @@ function pipesIn(content: string, relPath: string, major: number | undefined): P return pipes; } -/** The `templateUrl` files among `templates`, by absolute path, so a kept scan of - * their component file is redone when one of them changes. */ +/** The `templateUrl` files among `templates`, by absolute path, plus the + * `missing` ones `templatesIn` could not read, so a kept scan of their + * component file is redone when one of them changes or appears. */ export function templateDeps( templates: readonly TemplateSource[], relPath: string, cwd: string, + missing: readonly string[] = [], ): string[] { const root = realPath(cwd); - return templates - .filter((template) => template.baseOffset === 0 && template.file !== relPath) - .map((template) => join(root, template.file)); + return [ + ...templates + .filter((template) => template.baseOffset === 0 && template.file !== relPath) + .map((template) => join(root, template.file)), + ...missing, + ]; } const TEMPLATE_KEY = /\btemplate\s*:\s*/; @@ -185,13 +191,16 @@ export interface TemplateSource { * Finds every `@Component(...)` in `content` and its template — inline, or * read from `templateUrl` relative to `fullPath` — for any scanner that needs * the template's text alongside a way to turn an offset into it back into a - * line number. Shared by the pipe usage scan and the pipe linter. + * line number. Shared by the pipe usage scan and the pipe linter. A + * `templateUrl` inside the workspace that cannot be read is added to + * `missing` by absolute path, for `templateDeps`. */ export function templatesIn( content: string, relPath: string, fullPath: string, cwd: string, + missing?: string[], ): TemplateSource[] { const source = stripComments(content); const code = maskStrings(source); @@ -210,7 +219,7 @@ export function templatesIn( out.push({ text: inline.value, file: relPath, lineAt, baseOffset: inline.offset }); } else { const url = valueOf(args, source, open, TEMPLATE_URL_KEY); - const external = url && templateFromUrl(url.value, fullPath, cwd); + const external = url && templateFromUrl(url.value, fullPath, cwd, missing); if (external) out.push(external); } decorator.lastIndex = close; @@ -246,13 +255,18 @@ function valueOf( * otherwise) is refused rather than read, the same containment rule * `sourceRoots` applies to every scanned directory. */ -function templateFromUrl(url: string, fullPath: string, cwd: string): TemplateSource | null { +function templateFromUrl( + url: string, + fullPath: string, + cwd: string, + missing?: string[], +): TemplateSource | null { + const templatePath = resolve(dirname(fullPath), url); + const root = realPath(cwd); + const real = realPath(templatePath); + const inside = relative(root, real); + if (escapes(inside) || isAbsolute(inside)) return null; try { - const templatePath = resolve(dirname(fullPath), url); - const root = realPath(cwd); - const real = realPath(templatePath); - const inside = relative(root, real); - if (escapes(inside) || isAbsolute(inside)) return null; const text = readFileSync(real, 'utf-8'); // `inside` is already relative(root, real): both real, so it matches // `cwd`-relative paths reported elsewhere without a second `relative()` @@ -261,7 +275,8 @@ function templateFromUrl(url: string, fullPath: string, cwd: string): TemplateSo // (e.g. macOS's /var -> /private/var). return { text, file: toPosixPath(inside), lineAt: lineCounter(text), baseOffset: 0 }; } catch { - // templateUrl does not resolve to a readable file + // templateUrl does not resolve to a readable file yet: watch for it. + missing?.push(real); return null; } } diff --git a/packages/devtools/src/rpc/pipe-lint.ts b/packages/devtools/src/rpc/pipe-lint.ts index e31edf8c..dc0aa0de 100644 --- a/packages/devtools/src/rpc/pipe-lint.ts +++ b/packages/devtools/src/rpc/pipe-lint.ts @@ -62,7 +62,8 @@ export function lintPipes( declared.push([scope.pipeName, !/\bpure\s*:\s*false\b/.test(scope.decoratorArgs ?? '')]); } } - const templates = templatesIn(file.content, file.relPath, file.full, cwd); + const missing: string[] = []; + const templates = templatesIn(file.content, file.relPath, file.full, cwd, missing); const signals = templates.length ? fieldsMatching(SIGNAL_FIELD, code) : new Set(); const own: PipeLintFinding[] = []; for (const template of templates) { @@ -72,7 +73,7 @@ export function lintPipes( own.push(...signalInPurePipeFindings(file.content, file.relPath)); return { value: { declared, templates, own }, - deps: templateDeps(templates, file.relPath, cwd), + deps: templateDeps(templates, file.relPath, cwd, missing), }; }); diff --git a/packages/devtools/src/rpc/resource-text.ts b/packages/devtools/src/rpc/resource-text.ts index 1ba2c38c..ee19fc8a 100644 --- a/packages/devtools/src/rpc/resource-text.ts +++ b/packages/devtools/src/rpc/resource-text.ts @@ -29,15 +29,17 @@ function pageIdsOf(pages: unknown): string[] { /** * Compact JSON for a live-state resource, led by an `_untrusted` notice. When * the state runs past {@link MAX_RESOURCE_CHARS}, it returns the connected page - * ids and a note that names the tools to read the data with instead. + * ids and a note that names the tools to read the data with instead. Pass + * `pageIds` when `state.pages` does not list every connected page (the pipes + * state only splits by page when more than one page reports). */ -export function liveResourceText(state: object, instead: string): string { +export function liveResourceText(state: object, instead: string, pageIds?: string[]): string { const json = JSON.stringify(withUntrustedNotice(state)); if (json.length <= MAX_RESOURCE_CHARS) return json; return JSON.stringify({ _untrusted: RESOURCE_UNTRUSTED, truncated: true, note: `This state is too large for the resource. Use ${instead} instead.`, - pages: pageIdsOf((state as { pages?: unknown }).pages).slice(0, 50), + pages: (pageIds ?? pageIdsOf((state as { pages?: unknown }).pages)).slice(0, 50), }); } diff --git a/packages/devtools/src/rpc/source-file-index.ts b/packages/devtools/src/rpc/source-file-index.ts index 731ae9ae..58f2f1f7 100644 --- a/packages/devtools/src/rpc/source-file-index.ts +++ b/packages/devtools/src/rpc/source-file-index.ts @@ -61,6 +61,14 @@ function watcherCovers(roots: readonly string[]): boolean { }); } +/** Whether every file the kept results were read from besides their own still has the same stats. */ +function depsUnchanged(scan: Scan): boolean { + for (const entry of scan.files.values()) { + if (!entry.deps.every((dep) => statKey(dep.path) === dep.key)) return false; + } + return true; +} + /** * Every `.ts` source file (not `.spec.ts`) under the workspace's source roots, * parsed by `parse`, in walk order. `kind` names the parse, so two scans with @@ -81,7 +89,10 @@ export function scanSourceFiles( const roots = sourceRoots(cwd); const shared = viteWatchVersion(); const covered = watcherCovers(roots); - if (covered && scan.last && scan.version === shared.version) return scan.last; + // A template can sit outside what the watcher sees, so its deps are still checked. + if (covered && scan.last && scan.version === shared.version && depsUnchanged(scan)) { + return scan.last; + } const version = shared.version; const out: T[] = []; From 450d07d0067bdde565eba758ed692b98b78db526 Mon Sep 17 00:00:00 2001 From: erKam Date: Sun, 8 Nov 2026 07:54:09 +0000 Subject: [PATCH 02/37] fix(pipes): keep the selected page when opening a pipe from Components The Pipes tab always showed the page the panel belongs to, so a pipe opened from a component on another page picked in Components showed the wrong page's live data. Pass the page along with the pipe name and use it for the live data and the recording request. --- app/src/__tests__/pipes-record-page.test.ts | 26 +++++++++++++++++ app/src/app.ts | 13 +++++++-- app/src/pages/component-tree.ts | 7 +++-- app/src/pages/pipes-inspector.ts | 32 ++++++++++++++------- app/src/types/pipe-focus.types.ts | 9 ++++++ apps/docs/src/content/inspectors/pipes.md | 4 +-- packages/devtools/CHANGELOG.md | 1 + 7 files changed, 74 insertions(+), 18 deletions(-) create mode 100644 app/src/types/pipe-focus.types.ts diff --git a/app/src/__tests__/pipes-record-page.test.ts b/app/src/__tests__/pipes-record-page.test.ts index ad69a988..daf7a1ad 100644 --- a/app/src/__tests__/pipes-record-page.test.ts +++ b/app/src/__tests__/pipes-record-page.test.ts @@ -166,6 +166,32 @@ describe('pipes live data per page', () => { expect(fixture.componentInstance.liveFor('price')?.instanceCount).toBe(2); }); + it('shows the page another tab asked for over the page the panel belongs to', async () => { + scopeToPage('A'); + const fixture = TestBed.createComponent(PipesInspector); + fixture.componentRef.setInput('pageId', 'B'); + fixture.componentRef.setInput( + 'rpc', + withPages({ + pipes: [live(5)], + async: [], + reportedAt: 0, + instrumented: [], + pages: [ + { pageId: 'A', pipes: [live(3)], async: [] }, + { pageId: 'B', pipes: [live(2)], async: [] }, + ], + }), + ); + for (let i = 0; i < 4; i++) { + await new Promise((resolve) => setTimeout(resolve)); + await fixture.whenStable(); + } + expect(fixture.componentInstance.liveFor('price')?.instanceCount).toBe(2); + fixture.componentRef.setInput('pageId', null); + expect(fixture.componentInstance.liveFor('price')?.instanceCount).toBe(3); + }); + it('lists the template usages of a custom pipe', async () => { const fixture = await render( withPages({ pipes: [], async: [], reportedAt: 0, instrumented: [] }), diff --git a/app/src/app.ts b/app/src/app.ts index 123934dd..717f919d 100644 --- a/app/src/app.ts +++ b/app/src/app.ts @@ -27,6 +27,7 @@ import { PipesInspector } from './pages/pipes-inspector'; import type { Tab, Tabs } from './types/tab.types'; import type { ComponentFocus } from './types/component-focus.types'; import type { InjectorFocus } from './types/injector-focus.types'; +import type { PipeFocus } from './types/pipe-focus.types'; import type { SignalFocus } from './types/signal-focus.types'; import { AnalogInspector } from './pages/analog-inspector'; import { NetworkInspector } from './pages/network-inspector'; @@ -599,6 +600,7 @@ function readView(): View | null { } @@ -1779,11 +1781,18 @@ export class App implements OnInit, OnDestroy { computation: () => null, }); - showPipe(name: string) { + // The page a link into the Pipes tab asked for; kept after the focus is handled. + readonly pipePage = linkedSignal({ + source: this.tab, + computation: () => null, + }); + + showPipe(focus: PipeFocus) { if (!this.config().inspectors.pipes) return; // Switch first: the focus belongs to the tab, so the switch would clear it. this.switchTab('pipes'); - this.pipeFocus.set(name); + this.pipeFocus.set(focus.name); + this.pipePage.set(focus.pageId ?? null); } showForm(formId: string) { diff --git a/app/src/pages/component-tree.ts b/app/src/pages/component-tree.ts index 7c91ef80..5b856412 100644 --- a/app/src/pages/component-tree.ts +++ b/app/src/pages/component-tree.ts @@ -46,6 +46,7 @@ import { CdRecording, type CdPage } from './cd-recording'; import type { ComponentFocus } from '../types/component-focus.types'; import type { ComponentCommand } from '../types/component-command.types'; import type { InjectorFocus } from '../types/injector-focus.types'; +import type { PipeFocus } from '../types/pipe-focus.types'; import type { SignalFocus } from '../types/signal-focus.types'; import { componentJson, hostPathText } from './component-copy'; import { ValueFlash, flashKey } from './component-value-flash'; @@ -833,7 +834,7 @@ function storedDirectiveHosts(): boolean { [pageId]="page()?.pageId" [component]="bareName(sel.name)" [canShowPipes]="!staticReport()" - (showPipe)="showPipe.emit($event)" + (showPipe)="showPipe.emit({ name: $event, pageId: page()?.pageId })" /> } } @else { @@ -1884,8 +1885,8 @@ export class ComponentTree { readonly canShowInjector = input(false); /** Whether the Pipes inspector is on, so the detail lists the template's pipes. */ readonly canShowPipes = input(false); - /** Opens the Pipes tab on the pipe with this name. */ - readonly showPipe = output(); + /** Opens the Pipes tab on the pipe with this name, for the page the tree shows. */ + readonly showPipe = output(); readonly showInjector = output(); /** Whether the Signals tab is on, so "Show in Signals" can open it. */ readonly canShowSignals = input(false); diff --git a/app/src/pages/pipes-inspector.ts b/app/src/pages/pipes-inspector.ts index 022de698..f04a2c39 100644 --- a/app/src/pages/pipes-inspector.ts +++ b/app/src/pages/pipes-inspector.ts @@ -1289,6 +1289,9 @@ export class PipesInspector { /** A pipe name to select, from another tab such as Components. */ readonly focus = input(null); readonly focusHandled = output(); + /** The page to show live data for, such as the page picked in Components. + * Without one, the tab shows the page the panel belongs to. */ + readonly pageId = input(null); protected readonly kindOptions = KIND_OPTIONS; protected readonly sortOptions = SORT_OPTIONS; @@ -1301,10 +1304,19 @@ export class PipesInspector { loadFailed = signal(false); selected = signal(null); - live = signal([]); - async = signal([]); + private readonly snapshot = signal(undefined); + /** The live data of the page this tab shows, or every page merged. */ + private readonly shown = computed(() => { + const snapshot = this.snapshot(); + // With several tabs reporting, show the one asked for or the one this panel belongs to. + const pageId = this.livePageId(); + const own = pageId ? snapshot?.pages?.find((page) => page.pageId === pageId) : undefined; + return own ?? snapshot; + }); + readonly live = computed(() => this.shown()?.pipes ?? []); + readonly async = computed(() => this.shown()?.async ?? []); /** Every `| async` usage, set only when the list was cut short. */ - asyncTotal = signal(undefined); + readonly asyncTotal = computed(() => this.shown()?.asyncTotal); lint = signal(null); lintFailed = signal(false); instrumentedPages = signal([]); @@ -1430,16 +1442,10 @@ export class PipesInspector { if (this.destroyRef.destroyed) return; const apply = (value: unknown) => { const snapshot = value as PipesSnapshot | undefined; - // With several tabs reporting, show the one this panel belongs to. - const pageId = hostPageId(); - const own = pageId ? snapshot?.pages?.find((page) => page.pageId === pageId) : undefined; - const source = own ?? snapshot; - this.live.set(source?.pipes ?? []); + this.snapshot.set(snapshot); // A runtime-only pipe has nothing left to show once the page stops using it. const sel = this.selected(); if (sel?.runtime && !this.liveByName().has(sel.name)) this.selected.set(null); - this.async.set(source?.async ?? []); - this.asyncTotal.set(source?.asyncTotal); const pages = snapshot?.instrumented ?? []; this.instrumentedPages.set(pages); if (this.pendingRecord() === pages.length > 0) this.settleRecord(null); @@ -1452,6 +1458,10 @@ export class PipesInspector { } } + private livePageId(): string | null { + return this.pageId() ?? hostPageId(); + } + async toggleInstrument() { const client = this.rpc(); if (!client || this.pendingRecord() !== null) return; @@ -1461,7 +1471,7 @@ export class PipesInspector { let result: { pages?: number } | undefined; try { // Start on this panel's page (or the latest page); stop every page that records. - const request = on ? { pageId: hostPageId() ?? undefined, on } : { on }; + const request = on ? { pageId: this.livePageId() ?? undefined, on } : { on }; result = (await client.scope('pangular').rpc.call('request-instrument-pipes', request)) as { pages?: number } | undefined; } catch { diff --git a/app/src/types/pipe-focus.types.ts b/app/src/types/pipe-focus.types.ts new file mode 100644 index 00000000..0dbf172c --- /dev/null +++ b/app/src/types/pipe-focus.types.ts @@ -0,0 +1,9 @@ +/** + * A pipe to select in the Pipes tab, by name. `pageId` names the page whose + * live data the tab shows; without it the tab shows the page the panel + * belongs to. + */ +export interface PipeFocus { + name: string; + pageId?: string; +} diff --git a/apps/docs/src/content/inspectors/pipes.md b/apps/docs/src/content/inspectors/pipes.md index fda66e68..64473fce 100644 --- a/apps/docs/src/content/inspectors/pipes.md +++ b/apps/docs/src/content/inspectors/pipes.md @@ -47,7 +47,7 @@ Every template that uses the pipe, with file and line, for your own pipes and th The number of instances and the components that use them. Click, hover or focus a component chip to highlight it. With recording on, this block adds the call count, the time spent in `transform` (total, average and slowest call), the errors it threw with the last message, the last input and output, and the last caller. When several instances were called, **Per instance** lists each one with its component, values, call count, time and caller. Click a component there to highlight it. The list is capped and says how many instances there are when it has more. A churning pipe gets a note above the block that says what to change. -When several tabs report pipes, the panel of a tab shows that tab's pipes and `| async` rows only. Without a tab of its own, the panel shows every tab together. +When several tabs report pipes, the panel of a tab shows that tab's pipes and `| async` rows only. Without a tab of its own, the panel shows every tab together. A pipe opened from the **Components** tab shows the page that tab had selected. ### Churning pipes @@ -103,7 +103,7 @@ Live discovery walks the rendered views with `ng.getComponent` and related debug ### Recording -Click **Record calls** to count and time calls, count the calls that throw, and keep the last input and output of each pipe. A `transform` that throws still throws in your app. Recording patches each pipe's `transform` in one tab: the page the panel belongs to, or the page that reported last when the panel runs on its own. Other open tabs stay unpatched. It covers the pipes found on the page, and every pipe class the rendered templates can use, so a pipe in an `@if` branch that renders later is counted from its first call. A pipe class that only a newly added view brings, such as one in a lazy route you open, is patched as soon as the page sees the view, so only the calls made while that view first renders can be missed. **Stop recording** stops every tab that records. Click **Stop recording** when you are done. +Click **Record calls** to count and time calls, count the calls that throw, and keep the last input and output of each pipe. A `transform` that throws still throws in your app. Recording patches each pipe's `transform` in one tab: the page the **Pipes** tab shows, the page the panel belongs to, or the page that reported last when the panel runs on its own. Other open tabs stay unpatched. It covers the pipes found on the page, and every pipe class the rendered templates can use, so a pipe in an `@if` branch that renders later is counted from its first call. A pipe class that only a newly added view brings, such as one in a lazy route you open, is patched as soon as the page sees the view, so only the calls made while that view first renders can be missed. **Stop recording** stops every tab that records. Click **Stop recording** when you are done. Each recording starts from zero, so a second recording measures one interaction on its own. The button switches to **Stop recording** once a page confirms that it is recording. If no page is connected, the tab says so and stays on **Record calls**. diff --git a/packages/devtools/CHANGELOG.md b/packages/devtools/CHANGELOG.md index 33b00a4f..0c32f7e1 100644 --- a/packages/devtools/CHANGELOG.md +++ b/packages/devtools/CHANGELOG.md @@ -316,6 +316,7 @@ What remains: `/config` exports `DEFAULT_POPUP_HOTKEY`, `PANGULAR_ACTIONS`, `PAN - Redaction leaks found by a corpus of fake secrets run through every redaction path are closed: a secret pair after another word and a colon (`Error: password: "…"`), the key after `Authorization: ApiKey` in an Analog server body that is not JSON, secret pairs in the fragment or matrix params of an Analog server message, headers with a camelCase secret name such as `newPassword`, and tokens used as NgRx state keys. - The `pipe-usages` resource lists the connected page id in its size summary when only one page reports. - The pipe scan and the pipe lint run again when a missing `templateUrl` file appears, and when a template outside the folders the Vite watcher covers changes. +- A pipe opened from the **Components** tab shows the live data, and records calls, on the page **Components** had selected, not only the page the panel belongs to. ### Docs From a0538c003429f278b17bcbb7add75b9102c53b0c Mon Sep 17 00:00:00 2001 From: erKam Date: Sun, 8 Nov 2026 07:54:56 +0000 Subject: [PATCH 03/37] fix(router): fill query placeholders of a static redirect in the preview Angular copies the URL's query parameter into a `:name` value in the query of a redirectTo string, and drops the key when the URL lacks it. The navigation preview kept the placeholder as text, and it lost the fragment of a redirect that had both a query and a fragment. --- packages/devtools/CHANGELOG.md | 1 + .../src/__tests__/router-preview.test.ts | 12 +++++++ packages/devtools/src/rpc/router-preview.ts | 31 +++++++++++++++++-- 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/packages/devtools/CHANGELOG.md b/packages/devtools/CHANGELOG.md index 0c32f7e1..a917506d 100644 --- a/packages/devtools/CHANGELOG.md +++ b/packages/devtools/CHANGELOG.md @@ -317,6 +317,7 @@ What remains: `/config` exports `DEFAULT_POPUP_HOTKEY`, `PANGULAR_ACTIONS`, `PAN - The `pipe-usages` resource lists the connected page id in its size summary when only one page reports. - The pipe scan and the pipe lint run again when a missing `templateUrl` file appears, and when a template outside the folders the Vite watcher covers changes. - A pipe opened from the **Components** tab shows the live data, and records calls, on the page **Components** had selected, not only the page the panel belongs to. +- `preview-navigation` fills a `:name` value in the query of a `redirectTo` from the URL's query parameter, as Angular does, and keeps the fragment of a redirect that has both a query and a fragment. ### Docs diff --git a/packages/devtools/src/__tests__/router-preview.test.ts b/packages/devtools/src/__tests__/router-preview.test.ts index fc8d0733..d814b8c6 100644 --- a/packages/devtools/src/__tests__/router-preview.test.ts +++ b/packages/devtools/src/__tests__/router-preview.test.ts @@ -91,6 +91,18 @@ describe('redirectTarget', () => { it('drops the query and fragment of the URL for an absolute redirect with none of its own', () => { expect(redirectTarget('/a?tab=x#top', [config[4]], {})).toBe('/b'); }); + + it("copies the URL's query parameter into a :name value of the redirect's query", () => { + const node: RouteNode = { + id: '9', + path: 'old', + fullPath: '/old', + kind: 'redirect', + redirectTo: '/new?tab=:section&from=old&missing=:gone#top', + pathMatch: 'full', + }; + expect(redirectTarget('/old?section=a%20b', [node], {})).toBe('/new?tab=a%20b&from=old#top'); + }); }); describe('previewNavigation', () => { diff --git a/packages/devtools/src/rpc/router-preview.ts b/packages/devtools/src/rpc/router-preview.ts index e718795e..8e8f27f0 100644 --- a/packages/devtools/src/rpc/router-preview.ts +++ b/packages/devtools/src/rpc/router-preview.ts @@ -53,7 +53,8 @@ function fill(path: string, params: Record): string { * Where a `redirectTo` route sends `url`, the way the default redirect does: * an absolute target replaces the URL, a relative one replaces the matched * segments under the parent route; `:params` are filled in, and the rest of - * the URL and its query stay. Undefined for a function redirect. + * the URL and its query stay. A `:name` query value in `redirectTo` copies the + * URL's query parameter `name`. Undefined for a function redirect. */ export function redirectTarget( url: string, @@ -66,7 +67,7 @@ export function redirectTarget( const { path, rest } = splitUrl(url); const consumed = parts(node.fullPath).length; const remaining = node.pathMatch === 'full' ? [] : parts(path).slice(consumed); - const [targetPath, targetRest = ''] = redirect.split(/(?=[?#])/); + const { path: targetPath, rest: targetRest } = splitUrl(redirect); const parent = chain.length > 1 ? fill(chain[chain.length - 2].fullPath, params) : ''; const base = targetPath.startsWith('/') ? fill(targetPath, params) @@ -74,7 +75,31 @@ export function redirectTarget( const joined = `/${[...parts(base), ...remaining].join('/')}`; // Angular keeps the query and fragment of the URL only for a relative redirect; // an absolute one takes them from `redirectTo` alone. - return `${joined}${targetRest || (targetPath.startsWith('/') ? '' : rest)}`; + return `${joined}${targetRest ? redirectQuery(targetRest, rest) : targetPath.startsWith('/') ? '' : rest}`; +} + +/** + * The query and fragment of `redirectTo` (`target`, from `?` or `#`), with each + * `:name` value copied from the query parameter `name` of the URL (`rest`), as + * Angular's redirect does. A key whose parameter the URL lacks is dropped. + */ +function redirectQuery(target: string, rest: string): string { + if (!target.startsWith('?')) return target; + const hash = target.indexOf('#'); + const query = hash < 0 ? target.slice(1) : target.slice(1, hash); + const fragment = hash < 0 ? '' : target.slice(hash); + const actual = new URLSearchParams(rest.split('#')[0]); + const pairs: string[] = []; + for (const pair of query.split('&')) { + const [key, value = ''] = pair.split(/=(.*)/s); + if (!value.startsWith(':')) { + pairs.push(pair); + continue; + } + const copied = actual.get(value.slice(1)); + if (copied !== null) pairs.push(`${key}=${encodeURIComponent(copied)}`); + } + return `${pairs.length ? `?${pairs.join('&')}` : ''}${fragment}`; } function findNodes(nodes: RouteNode[] | undefined, ids: Set, out: RouteNode[] = []) { From d5b1d645dee5998df5fbecdb1f251ff54fb3528f Mon Sep 17 00:00:00 2001 From: erKam Date: Sun, 8 Nov 2026 07:57:18 +0000 Subject: [PATCH 04/37] chore: format generated docs pages with the Prettier API The docs generators ran pnpm exec prettier in a child process. Format with the Prettier API, the way the docs tests compare the pages, so the scripts need no pnpm on the PATH. --- scripts/docs-agent-tools.mjs | 10 ++++------ scripts/docs-api.mjs | 10 +++++++--- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/scripts/docs-agent-tools.mjs b/scripts/docs-agent-tools.mjs index 1f711697..36113255 100644 --- a/scripts/docs-agent-tools.mjs +++ b/scripts/docs-agent-tools.mjs @@ -6,9 +6,9 @@ * * Usage: node scripts/docs-agent-tools.mjs */ -import { execFileSync } from 'node:child_process'; import { writeFileSync } from 'node:fs'; import path from 'node:path'; +import * as prettier from 'prettier'; import { renderToolIndex, TOOL_INDEX_PATH } from '../apps/docs/agent-tool-index.ts'; const docsRoot = path.resolve(import.meta.dirname, '../apps/docs'); @@ -19,9 +19,7 @@ if (problems.length > 0) { process.exit(1); } const file = path.join(docsRoot, TOOL_INDEX_PATH); -writeFileSync(file, markdown); -execFileSync('pnpm', ['exec', 'prettier', '--write', file], { - cwd: path.resolve(import.meta.dirname, '..'), - stdio: 'inherit', -}); +// Formatted the way the docs test formats it, so the two compare equal. +const options = (await prettier.resolveConfig(file)) ?? {}; +writeFileSync(file, await prettier.format(markdown, { ...options, filepath: file })); console.log(`Wrote ${path.relative(process.cwd(), file)}`); diff --git a/scripts/docs-api.mjs b/scripts/docs-api.mjs index f4d4f3fb..77a5ec8b 100644 --- a/scripts/docs-api.mjs +++ b/scripts/docs-api.mjs @@ -6,9 +6,9 @@ * * Usage: node scripts/docs-api.mjs */ -import { execFileSync } from 'node:child_process'; import { mkdirSync, readdirSync, rmSync, writeFileSync } from 'node:fs'; import path from 'node:path'; +import * as prettier from 'prettier'; import { API_DIR, renderApiReference } from '../apps/docs/api-reference.ts'; const repoRoot = path.resolve(import.meta.dirname, '..'); @@ -18,6 +18,10 @@ mkdirSync(dir, { recursive: true }); for (const file of readdirSync(dir)) { if (file.endsWith('.md') && !pages.has(file)) rmSync(path.join(dir, file)); } -for (const [file, markdown] of pages) writeFileSync(path.join(dir, file), markdown); -execFileSync('pnpm', ['exec', 'prettier', '--write', dir], { cwd: repoRoot, stdio: 'inherit' }); +// Formatted the way the docs test formats them, so the two compare equal. +for (const [file, markdown] of pages) { + const filepath = path.join(dir, file); + const options = (await prettier.resolveConfig(filepath)) ?? {}; + writeFileSync(filepath, await prettier.format(markdown, { ...options, filepath })); +} console.log(`Wrote ${pages.size} pages to ${path.relative(process.cwd(), dir)}`); From 8ca5463792e824d34f7eec42b6331c55b0fdd8c1 Mon Sep 17 00:00:00 2001 From: erKam Date: Sun, 8 Nov 2026 07:57:19 +0000 Subject: [PATCH 05/37] docs: name the package root entry point and fix the form and provider recipes The API reference now lists @pangular-inspector/devtools as an alias of the devframe entry point. The invalid form recipe leaves the field before waiting, so blur and submit controls commit their value, and the missing provider recipe starts the lookup from the class that injects the token. --- apps/docs/api-reference.spec.ts | 7 +++++ apps/docs/api-reference.ts | 16 +++++++++-- apps/docs/src/content/agents/recipes.md | 34 +++++++++++----------- apps/docs/src/content/api/devframe.md | 2 ++ apps/docs/src/content/api/index.md | 38 ++++++++++++------------- 5 files changed, 59 insertions(+), 38 deletions(-) diff --git a/apps/docs/api-reference.spec.ts b/apps/docs/api-reference.spec.ts index c59d73ae..57a1f166 100644 --- a/apps/docs/api-reference.spec.ts +++ b/apps/docs/api-reference.spec.ts @@ -27,6 +27,13 @@ describe('API reference', () => { expect(entries.some((entry) => entry.slug.startsWith('internal-'))).toBe(false); }, 60_000); + it('names the package root as an alias of the entry point it loads', () => { + const entries = readApiEntries(repoRoot); + const devframe = entries.find((entry) => entry.slug === 'devframe'); + expect(devframe?.aliases).toEqual(['@pangular-inspector/devtools']); + expect(entries.filter((entry) => entry.aliases?.length)).toHaveLength(1); + }, 60_000); + it('shows inferred return types and symbols re-exported from a dependency', () => { const devframe = readApiEntries(repoRoot).find((entry) => entry.slug === 'devframe'); const create = devframe?.symbols.find((s) => s.name === 'createPangular'); diff --git a/apps/docs/api-reference.ts b/apps/docs/api-reference.ts index d98d1aeb..4181d68d 100644 --- a/apps/docs/api-reference.ts +++ b/apps/docs/api-reference.ts @@ -47,6 +47,8 @@ export interface ApiEntry { slug: string; source: string; symbols: ApiSymbol[]; + /** Other import paths that load the same file, such as the package root. */ + aliases?: string[]; } function kindOf(node: Node): Kind | null { @@ -111,10 +113,13 @@ export function readApiEntries(repoRoot: string): ApiEntry[] { skipAddingFilesFromTsConfig: true, }); const entries: ApiEntry[] = []; + const targetOf = (target: string | {default?: string; import?: string}) => + typeof target === 'string' ? target : (target.import ?? target.default); + const root = pkg.exports['.']; for (const [key, target] of Object.entries(pkg.exports)) { // `./internal/*` entries serve the panel and the extension, not apps. if (SKIPPED_EXPORTS.has(key) || key.startsWith('./internal/')) continue; - const rel = typeof target === 'string' ? target : (target.import ?? target.default); + const rel = targetOf(target); if (!rel?.endsWith('.ts')) continue; const sourceFile = project.addSourceFileAtPath(join(pkgDir, rel)); const symbols: ApiSymbol[] = []; @@ -148,6 +153,7 @@ export function readApiEntries(repoRoot: string): ApiEntry[] { slug, source: posix.join('packages/devtools', rel.replace(/^\.\//, '')), symbols, + ...(root && targetOf(root) === rel ? {aliases: [pkg.name]} : {}), }); } return entries; @@ -185,6 +191,12 @@ export function renderApiPage(entry: ApiEntry, githubUrl: string): string { '', `Import from \`${entry.specifier}\`. This page is generated from [\`${entry.source}\`](${githubUrl}/blob/main/${entry.source}) and the files it re-exports. Run \`pnpm docs:api\` after you change the public API.`, '', + ...(entry.aliases?.length + ? [ + `${entry.aliases.map((alias) => `\`${alias}\``).join(', ')} loads the same file and exports the same symbols.`, + '', + ] + : []), ]; if (!entry.symbols.length) { out.push('This entry point exports no symbols. Importing it runs its side effect.', ''); @@ -217,7 +229,7 @@ function escapeEnv(text: string): string { export function renderApiIndex(entries: ApiEntry[]): string { const rows = entries.map( (entry) => - `| [\`${entry.specifier}\`](./${entry.slug}.md) | ${entry.symbols.length ? entry.symbols.map((s) => `\`${s.name}\``).join(', ') : 'None, it runs on import'} |`, + `| [\`${entry.specifier}\`](./${entry.slug}.md)${entry.aliases?.length ? ` (also ${entry.aliases.map((alias) => `\`${alias}\``).join(', ')})` : ''} | ${entry.symbols.length ? entry.symbols.map((s) => `\`${s.name}\``).join(', ') : 'None, it runs on import'} |`, ); return [ '---', diff --git a/apps/docs/src/content/agents/recipes.md b/apps/docs/src/content/agents/recipes.md index 1a58c404..b570f721 100644 --- a/apps/docs/src/content/agents/recipes.md +++ b/apps/docs/src/content/agents/recipes.md @@ -24,17 +24,17 @@ The checkout form won't submit. Use the Pangular tools to find which fields make invalid and why, fix the cause in the code, then show me the form is valid. ``` -| Step | Tool | -| --------------------------- | ----------------------------------------------------------------------------------- | -| Record the starting point | `inspect-forms` with `form` for its status, `list-form-changes` for a marker | -| Find the invalid fields | `explain-invalid-forms` | -| Look at one field | `explain-field` with `form` and `path` | -| See why submit does nothing | `explain-submit` | -| Reproduce after the fix | Enter the original input again, then `wait-for` with `condition: "form"` and `form` | -| See what changed | `explain-form-changes` with `form` and the marker as `after` | -| Prove the form is valid | `inspect-forms` with `form`, compared with the status recorded first | - -A code change can reload the page and reset the form, so enter the same input as before the fix and wait until the form is settled before you compare. `explain-form-changes` reads the change events recorded since the marker, not a saved copy of the form, so the status from `inspect-forms` is the proof. Check that the answer names the failing validator and its message for each field, not only that the form is invalid. Values that look secret stay redacted. See [Forms](./tools.md#forms). +| Step | Tool | +| --------------------------- | ------------------------------------------------------------------------------------------------------- | +| Record the starting point | `inspect-forms` with `form` for its status, `list-form-changes` for a marker | +| Find the invalid fields | `explain-invalid-forms` | +| Look at one field | `explain-field` with `form` and `path` | +| See why submit does nothing | `explain-submit` | +| Reproduce after the fix | Enter the original input again and leave the field, then `wait-for` with `condition: "form"` and `form` | +| See what changed | `explain-form-changes` with `form` and the marker as `after` | +| Prove the form is valid | `inspect-forms` with `form`, compared with the status recorded first | + +A code change can reload the page and reset the form, so enter the same input as before the fix and wait until the form is settled before you compare. Leave the field (or submit) before you wait: a control with `updateOn: 'blur'` or `updateOn: 'submit'` keeps its old value and validity until then. `explain-form-changes` reads the change events recorded since the marker, not a saved copy of the form, so the status from `inspect-forms` is the proof. Check that the answer names the failing validator and its message for each field, not only that the form is invalid. Values that look secret stay redacted. See [Forms](./tools.md#forms). ## Explain a failed navigation @@ -59,13 +59,13 @@ The trip details page throws NG0201 for TripService. Use the Pangular tools to s Angular looked for it and why no injector provided it, then fix the providers. ``` -| Step | Tool | -| ----------------------------- | --------------------------------------------------------------------------------------------- | -| Find the error and its owner | `list-errors`, then `explain-error` with its `id` | -| Walk the lookup path | `explain-injection` with the owner as `injector`, the token and the failing injection's flags | -| Read the providers at a level | `inspect-providers` | +| Step | Tool | +| ----------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| Find the error and its owner | `list-errors`, then `explain-error` with its `id` | +| Walk the lookup path | `explain-injection` with the class that injects the token as `injector`, the token and the failing injection's flags | +| Read the providers at a level | `inspect-providers` | -`explain-error` adds the missing provider explainer, and its owner id works as the `injector` of `explain-injection`. Pass the flags the failing injection used, such as `self: true`, `skipSelf`, `host` or `optional`, so the lookup follows the same path. If it says **Component: not found**, for example when a routed component fails before it is in the tree, `explain-injection` has no injector to start from and answers **No injector on page**. Read the stack of the error for the class that injects the token, then call `scan-providers` to see where the source provides the token. A lookup from an injector that is on the page, such as the parent route's component or `Root`, is a separate lookup, not part of the failing one: it can resolve differently, for example when the failing injection used `self`. When an owner is found, check that the answer marks each injector on the path as **provides it**, **not provided**, **hidden**, **skipped**, **not asked** or **unknown**. See [explain-injection](./tools.md#explain-injection). +`explain-error` adds the missing provider explainer. Start the lookup from the injector that made the failing request: the class that injects the token, which the error message and stack name. The owner id from `explain-error` works as the `injector` of `explain-injection` when the owner is that class; when the owner is another component, such as the parent that was rendering, pass the injecting class instead. Pass the flags the failing injection used, such as `self: true`, `skipSelf`, `host` or `optional`, so the lookup follows the same path. If it says **Component: not found**, for example when a routed component fails before it is in the tree, `explain-injection` has no injector to start from and answers **No injector on page**. Read the stack of the error for the class that injects the token, then call `scan-providers` to see where the source provides the token. A lookup from an injector that is on the page, such as the parent route's component or `Root`, is a separate lookup, not part of the failing one: it can resolve differently, for example when the failing injection used `self`. When an owner is found, check that the answer marks each injector on the path as **provides it**, **not provided**, **hidden**, **skipped**, **not asked** or **unknown**. See [explain-injection](./tools.md#explain-injection). ## Find wasted change detection diff --git a/apps/docs/src/content/api/devframe.md b/apps/docs/src/content/api/devframe.md index 1849909d..d07ada7c 100644 --- a/apps/docs/src/content/api/devframe.md +++ b/apps/docs/src/content/api/devframe.md @@ -11,6 +11,8 @@ description: 'Every symbol the @pangular-inspector/devtools/devframe entry point Import from `@pangular-inspector/devtools/devframe`. This page is generated from [`packages/devtools/src/entries/devframe.ts`](https://github.com/pangular-inspector/devtools/blob/main/packages/devtools/src/entries/devframe.ts) and the files it re-exports. Run `pnpm docs:api` after you change the public API. +`@pangular-inspector/devtools` loads the same file and exports the same symbols. + ## createPangular Function. Source: [`packages/devtools/src/devframe.ts`](https://github.com/pangular-inspector/devtools/blob/main/packages/devtools/src/devframe.ts). diff --git a/apps/docs/src/content/api/index.md b/apps/docs/src/content/api/index.md index b6f5c9fc..c496f646 100644 --- a/apps/docs/src/content/api/index.md +++ b/apps/docs/src/content/api/index.md @@ -11,22 +11,22 @@ description: 'The public entry points of @pangular-inspector/devtools and the sy Each entry point of `@pangular-inspector/devtools` has a page with every symbol it exports, its declaration and its JSDoc. The pages are generated from the package source, so names and types match the published code. [Installation](../getting-started/installation.md#entry-points) says what each entry point is for, and [Configuration](../getting-started/configuration.md) explains the options. -| Entry point | Exports | -| ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| [`@pangular-inspector/devtools/devframe`](./devframe.md) | `createPangular`, `default`, `DEFAULT_POPUP_HOTKEY`, `initDevframe`, `PANGULAR_ACTIONS`, `PANGULAR_INSPECTORS`, `PANGULAR_LIMITS`, `PangularAction`, `PangularConfig`, `PangularHostOptions`, `PangularInspector`, `PangularLimit`, `PluginSwitchInput`, `ResolvedPangularConfig`, `resolvePangularConfig` | -| [`@pangular-inspector/devtools/config`](./config.md) | `DEFAULT_POPUP_HOTKEY`, `PANGULAR_ACTIONS`, `PANGULAR_INSPECTORS`, `PANGULAR_LIMITS`, `PangularAction`, `PangularConfig`, `PangularInspector`, `PangularLimit`, `PluginSwitchInput`, `ResolvedPangularConfig`, `resolvePangularConfig` | -| [`@pangular-inspector/devtools/cd-data`](./cd-data.md) | `CD_CAUSE_KINDS`, `CD_CAUSE_LABEL`, `CD_EXPORT_FORMAT`, `CD_HINT_MAX_CHANGED`, `CD_HINT_MIN_CHECKS`, `CD_SPAN_KIND`, `cdCauseText`, `cdExportFile`, `CdExportFile`, `CdHint`, `cdHints`, `CdOptionsRequest`, `cdSlowMs`, `CdTraceEvent`, `cdTraceFile`, `CdTraceFile`, `DEFAULT_CD_SLOW_MS`, `MAX_CD_IMPORT_BYTES`, `MAX_SPANS`, `parseCdImport`, `sanitizeCdDiagnosis`, `sanitizeCdRecording`, `toCdOptions`, `toCdOptionsRequest`, `UNNAMED_SIGNAL` | -| [`@pangular-inspector/devtools/overlay`](./overlay.md) | `disposeOverlay`, `initOverlay`, `installSignalWriteHook`, `lanDevtoolsURL`, `OverlayConnectionMeta`, `OverlayOptions`, `registerNgrxSignals` | -| [`@pangular-inspector/devtools/overlay-manual`](./overlay-manual.md) | `disposeOverlay`, `initOverlay`, `installSignalWriteHook`, `lanDevtoolsURL`, `OverlayConnectionMeta`, `OverlayOptions`, `registerNgrxSignals` | -| [`@pangular-inspector/devtools/plugin`](./plugin.md) | `definePangularServerPlugin`, `PANGULAR_PLUGIN_API_VERSION`, `PangularPagePlugin`, `PangularPluginAction`, `PangularPluginContext`, `PangularPluginPage`, `pangularPluginRegistry`, `PangularPluginRegistry`, `PangularPluginTool`, `PangularPluginToolContext`, `PangularPluginToolSafety`, `PangularServerPlugin`, `PangularServerPluginContext`, `PluginActionResult`, `PluginBadge`, `PluginCell`, `PluginListSection`, `PluginSection`, `PluginSerializeLimits`, `PluginStatsSection`, `PluginTableSection`, `PluginTextSection`, `PluginTone`, `PluginTreeSection`, `PluginView`, `PluginViewAction`, `registerPangularPlugin` | -| [`@pangular-inspector/devtools/capacitor-hook`](./capacitor-hook.md) | `installCapacitorHook` | -| [`@pangular-inspector/devtools/store-hook`](./store-hook.md) | `installStoreHook` | -| [`@pangular-inspector/devtools/startup-hook`](./startup-hook.md) | `installStartupHook` | -| [`@pangular-inspector/devtools/overlay-angular-native`](./overlay-angular-native.md) | `AngularNativeNode`, `AngularNativeOverlayOptions`, `DEFAULT_ANGULAR_NATIVE_BASE_URL`, `initAngularNativeOverlay`, `withWebShims` | -| [`@pangular-inspector/devtools/popup`](./popup.md) | `createDevtoolsPopup`, `hideDevtools`, `LauncherCounts`, `shortCount`, `showDevtools` | -| [`@pangular-inspector/devtools/overlay-nativescript`](./overlay-nativescript.md) | `defaultDevtoolsBaseURL`, `initNativeScriptOverlay`, `lanDevtoolsURL`, `NativeScriptOverlayOptions` | -| [`@pangular-inspector/devtools/cli`](./cli.md) | `buildReport`, `BuildReportOptions`, `BuildReportResult`, `createPangularCli`, `DEFAULT_REPORT_DIR`, `PangularCliOptions` | -| [`@pangular-inspector/devtools/http`](./http.md) | `HttpTransferCacheOptions`, `PangularHttpOptions`, `providePangularHttp`, `withPangular` | -| [`@pangular-inspector/devtools/hub`](./hub.md) | `hubEnabled`, `initPangularHub`, `PANGULAR_HUB_BASE`, `PangularConfig`, `PangularHubOptions` | -| [`@pangular-inspector/devtools/ssr`](./ssr.md) | `NodeEventLike`, `pangularSsrEventHandler`, `pangularSsrMiddleware`, `PangularSsrOptions`, `WebRequestHandler`, `withPangularSsr` | -| [`@pangular-inspector/devtools/vite`](./vite.md) | `default`, `PangularConfig`, `PangularViteOptions` | +| Entry point | Exports | +| ---------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| [`@pangular-inspector/devtools/devframe`](./devframe.md) (also `@pangular-inspector/devtools`) | `createPangular`, `default`, `DEFAULT_POPUP_HOTKEY`, `initDevframe`, `PANGULAR_ACTIONS`, `PANGULAR_INSPECTORS`, `PANGULAR_LIMITS`, `PangularAction`, `PangularConfig`, `PangularHostOptions`, `PangularInspector`, `PangularLimit`, `PluginSwitchInput`, `ResolvedPangularConfig`, `resolvePangularConfig` | +| [`@pangular-inspector/devtools/config`](./config.md) | `DEFAULT_POPUP_HOTKEY`, `PANGULAR_ACTIONS`, `PANGULAR_INSPECTORS`, `PANGULAR_LIMITS`, `PangularAction`, `PangularConfig`, `PangularInspector`, `PangularLimit`, `PluginSwitchInput`, `ResolvedPangularConfig`, `resolvePangularConfig` | +| [`@pangular-inspector/devtools/cd-data`](./cd-data.md) | `CD_CAUSE_KINDS`, `CD_CAUSE_LABEL`, `CD_EXPORT_FORMAT`, `CD_HINT_MAX_CHANGED`, `CD_HINT_MIN_CHECKS`, `CD_SPAN_KIND`, `cdCauseText`, `cdExportFile`, `CdExportFile`, `CdHint`, `cdHints`, `CdOptionsRequest`, `cdSlowMs`, `CdTraceEvent`, `cdTraceFile`, `CdTraceFile`, `DEFAULT_CD_SLOW_MS`, `MAX_CD_IMPORT_BYTES`, `MAX_SPANS`, `parseCdImport`, `sanitizeCdDiagnosis`, `sanitizeCdRecording`, `toCdOptions`, `toCdOptionsRequest`, `UNNAMED_SIGNAL` | +| [`@pangular-inspector/devtools/overlay`](./overlay.md) | `disposeOverlay`, `initOverlay`, `installSignalWriteHook`, `lanDevtoolsURL`, `OverlayConnectionMeta`, `OverlayOptions`, `registerNgrxSignals` | +| [`@pangular-inspector/devtools/overlay-manual`](./overlay-manual.md) | `disposeOverlay`, `initOverlay`, `installSignalWriteHook`, `lanDevtoolsURL`, `OverlayConnectionMeta`, `OverlayOptions`, `registerNgrxSignals` | +| [`@pangular-inspector/devtools/plugin`](./plugin.md) | `definePangularServerPlugin`, `PANGULAR_PLUGIN_API_VERSION`, `PangularPagePlugin`, `PangularPluginAction`, `PangularPluginContext`, `PangularPluginPage`, `pangularPluginRegistry`, `PangularPluginRegistry`, `PangularPluginTool`, `PangularPluginToolContext`, `PangularPluginToolSafety`, `PangularServerPlugin`, `PangularServerPluginContext`, `PluginActionResult`, `PluginBadge`, `PluginCell`, `PluginListSection`, `PluginSection`, `PluginSerializeLimits`, `PluginStatsSection`, `PluginTableSection`, `PluginTextSection`, `PluginTone`, `PluginTreeSection`, `PluginView`, `PluginViewAction`, `registerPangularPlugin` | +| [`@pangular-inspector/devtools/capacitor-hook`](./capacitor-hook.md) | `installCapacitorHook` | +| [`@pangular-inspector/devtools/store-hook`](./store-hook.md) | `installStoreHook` | +| [`@pangular-inspector/devtools/startup-hook`](./startup-hook.md) | `installStartupHook` | +| [`@pangular-inspector/devtools/overlay-angular-native`](./overlay-angular-native.md) | `AngularNativeNode`, `AngularNativeOverlayOptions`, `DEFAULT_ANGULAR_NATIVE_BASE_URL`, `initAngularNativeOverlay`, `withWebShims` | +| [`@pangular-inspector/devtools/popup`](./popup.md) | `createDevtoolsPopup`, `hideDevtools`, `LauncherCounts`, `shortCount`, `showDevtools` | +| [`@pangular-inspector/devtools/overlay-nativescript`](./overlay-nativescript.md) | `defaultDevtoolsBaseURL`, `initNativeScriptOverlay`, `lanDevtoolsURL`, `NativeScriptOverlayOptions` | +| [`@pangular-inspector/devtools/cli`](./cli.md) | `buildReport`, `BuildReportOptions`, `BuildReportResult`, `createPangularCli`, `DEFAULT_REPORT_DIR`, `PangularCliOptions` | +| [`@pangular-inspector/devtools/http`](./http.md) | `HttpTransferCacheOptions`, `PangularHttpOptions`, `providePangularHttp`, `withPangular` | +| [`@pangular-inspector/devtools/hub`](./hub.md) | `hubEnabled`, `initPangularHub`, `PANGULAR_HUB_BASE`, `PangularConfig`, `PangularHubOptions` | +| [`@pangular-inspector/devtools/ssr`](./ssr.md) | `NodeEventLike`, `pangularSsrEventHandler`, `pangularSsrMiddleware`, `PangularSsrOptions`, `WebRequestHandler`, `withPangularSsr` | +| [`@pangular-inspector/devtools/vite`](./vite.md) | `default`, `PangularConfig`, `PangularViteOptions` | From acbd031d8cb8a3a43deaf2a04014b5ee1225ad1c Mon Sep 17 00:00:00 2001 From: erKam Date: Sun, 8 Nov 2026 07:58:46 +0000 Subject: [PATCH 06/37] docs: say how inspect-signals finds a directive host and that try-webmcp needs confirm A directive class name matches only the directive host whose graph the page already reports, so the inspect-signals argument now points to the host's instance id or element injector id. The confirm callout of the forms tools lists try-webmcp. --- apps/docs/src/content/agents/tools.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/docs/src/content/agents/tools.md b/apps/docs/src/content/agents/tools.md index 12eb6383..e718ce31 100644 --- a/apps/docs/src/content/agents/tools.md +++ b/apps/docs/src/content/agents/tools.md @@ -468,13 +468,13 @@ An [Angular Native](../getting-started/angular-native.md) or [NativeScript](../g The signal graph the page reported: nodes (`signal`, `computed`, `linkedSignal`, `effect`), dependency edges (`{ consumer, producer }`, where `consumer` reads `producer`, both node ids), the component or injector they belong to, and recent value history per node. Reads: page. -| Argument | Required | Value | -| ----------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `component` | one of | Host tag, class name or instance id of the component, like `app-root`. Also accepts `root`, a route path like `/admin` or `Route: admin`, an element injector id like `inj-12` from `inspect-providers`, or a directive class name. A host that has directives but no component reads as a directive host. | -| `selector` | one of | A CSS selector for a component host, like `app-card.featured`. The first match is read. At most 500 characters. | -| `node` | no | A node id or label. The answer holds only that node, or every node with that label, with its direct producers and consumers and their resources and history. | -| `history` | no | `false` leaves out the value history. Defaults to `true`. | -| `framework` | no | `false` leaves out the nodes Angular itself created (`framework: true`). Defaults to `true`. | +| Argument | Required | Value | +| ----------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `component` | one of | Host tag, class name or instance id of the component, like `app-root`. Also accepts `root`, a route path like `/admin` or `Route: admin`, an element injector id like `inj-12` from `inspect-providers`, or the instance id of a directive host from `list-components`. A directive class name matches only the directive host the page already reports a graph for, so pass the host's id or element injector id for another one. A host that has directives but no component reads as a directive host. | +| `selector` | one of | A CSS selector for a component host, like `app-card.featured`. The first match is read. At most 500 characters. | +| `node` | no | A node id or label. The answer holds only that node, or every node with that label, with its direct producers and consumers and their resources and history. | +| `history` | no | `false` leaves out the value history. Defaults to `true`. | +| `framework` | no | `false` leaves out the nodes Angular itself created (`framework: true`). Defaults to `true`. | Pass `component` or `selector`, not both. When the graph the page last reported belongs to another component or injector, the tool asks the page for the one you named, once, and the Signals page keeps showing what it showed. A `component` the component tree knows is read by its first instance. A `component` it doesn't know answers with the graph the page reported and says what that graph covers. A `selector` that matches no component host is refused. @@ -876,7 +876,7 @@ When a write goes through a native `'), {}).autocomplete).toBe('address-level2'); }); + it('reads a control inside a disabled fieldset as disabled', () => { + const fieldset = input('
'); + const field = fieldset.querySelector('input')!; + expect(domFacts(field, { disabled: false }).disabled).toBe(true); + expect(domFacts(field, { disabled: true }).disabled).toBeUndefined(); + }); + it('flags a personal field without autocomplete, unless it is hidden or disabled', () => { expect( rules( diff --git a/packages/devtools/src/forms-dom.ts b/packages/devtools/src/forms-dom.ts index 945e7609..b0ec4ccd 100644 --- a/packages/devtools/src/forms-dom.ts +++ b/packages/devtools/src/forms-dom.ts @@ -197,8 +197,10 @@ export function domFacts( ]; if (describedBy.length) facts.describedBy = describedBy.some((d) => !!d.textContent?.trim()); if (model.hasErrors) facts.errorShown = errorElements(el).some(isShown); - const disabled = (el as HTMLInputElement).disabled; - if (typeof disabled === 'boolean' && disabled !== !!model.disabled) facts.disabled = disabled; + // `:disabled` also covers a control inside a disabled `
`, which its own `disabled` misses. + const disabled = + typeof (el as HTMLInputElement).disabled === 'boolean' ? el.matches(':disabled') : undefined; + if (disabled !== undefined && disabled !== !!model.disabled) facts.disabled = disabled; const dom = domValue(el); const same = el instanceof HTMLSelectElement && typeof dom === 'string' From c67b9c5de49b8b65bcde5f40b85cf103beec691c Mon Sep 17 00:00:00 2001 From: erKam Date: Sun, 8 Nov 2026 08:04:34 +0000 Subject: [PATCH 13/37] fix(components): drop a component detail selector that is not text guardComponentDetail spread the pushed detail and kept any selector value, so a malformed report could hand the agent tools a number or an object where they print and match a CSS selector. Keep a string whole and leave anything else out. --- packages/devtools/CHANGELOG.md | 1 + .../__tests__/component-report-guard.test.ts | 20 +++++++++++++++++++ .../src/rpc/component-report-guard.ts | 5 ++++- 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 packages/devtools/src/__tests__/component-report-guard.test.ts diff --git a/packages/devtools/CHANGELOG.md b/packages/devtools/CHANGELOG.md index b646f30e..cc2f9ad2 100644 --- a/packages/devtools/CHANGELOG.md +++ b/packages/devtools/CHANGELOG.md @@ -323,6 +323,7 @@ What remains: `/config` exports `DEFAULT_POPUP_HOTKEY`, `PANGULAR_ACTIONS`, `PAN - **Show in Signals** for a page that has not reported its graph yet shows that page once it reports, and picking another component drops a signal still waiting to be selected. - A signal store change to a key that needs quotes, such as `profile["first name"]`, is logged with the path the **NgRx Store** state tree uses, so the tree marks it and **Copy path** matches `ngrx-explain-change`. - The forms collector reads a control inside a disabled `
` as disabled on the page, so it no longer looks enabled in the DOM facts. +- A component report whose `detail.selector` is not text no longer passes it on to the agent tools; the server leaves it out. ### Docs diff --git a/packages/devtools/src/__tests__/component-report-guard.test.ts b/packages/devtools/src/__tests__/component-report-guard.test.ts new file mode 100644 index 00000000..f2e6bd75 --- /dev/null +++ b/packages/devtools/src/__tests__/component-report-guard.test.ts @@ -0,0 +1,20 @@ +import { describe, expect, it } from 'vitest'; +import { guardComponentDetail } from '../rpc/component-report-guard.ts'; + +const detail = (extra: Record) => + guardComponentDetail({ id: 'c1', name: 'Card', tag: 'app-card', ...extra }); + +describe('guardComponentDetail', () => { + it('keeps a text selector whole', () => { + const selector = `app-card${'[data-x]'.repeat(200)}`; + expect(detail({ selector })?.selector).toBe(selector); + }); + + it('leaves out a selector that is not text', () => { + for (const selector of [42, { css: 'app-card' }, ['app-card'], null]) { + const guarded = detail({ selector }); + expect(guarded).not.toBeNull(); + expect(guarded && 'selector' in guarded).toBe(false); + } + }); +}); diff --git a/packages/devtools/src/rpc/component-report-guard.ts b/packages/devtools/src/rpc/component-report-guard.ts index c241238e..73f652aa 100644 --- a/packages/devtools/src/rpc/component-report-guard.ts +++ b/packages/devtools/src/rpc/component-report-guard.ts @@ -99,8 +99,11 @@ function guardDependencies(value: unknown): DependencyInfo[] { export function guardComponentDetail(value: unknown): ComponentDetail | null { if (!isRecord(value)) return null; if (!str(value['id']) || !str(value['name']) || !str(value['tag'])) return null; + const { selector, ...rest } = value; return { - ...value, + ...rest, + // The agent tools match and print it as text; anything else is left out. + ...(str(selector) ? { selector } : {}), id: value['id'], name: value['name'], tag: value['tag'], From 8e0da3baecd19da76e460588c2871345e072ce98 Mon Sep 17 00:00:00 2001 From: erKam Date: Sun, 8 Nov 2026 08:04:36 +0000 Subject: [PATCH 14/37] docs: split the component-tree resource and say when the selector is missing The component-tree resource was one long paragraph. Split it by topic with a Defer blocks subsection, and note that detail.selector is also missing in an Angular Native or NativeScript app. --- apps/docs/src/content/agents/resources.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/apps/docs/src/content/agents/resources.md b/apps/docs/src/content/agents/resources.md index 2e464744..5673a6d2 100644 --- a/apps/docs/src/content/agents/resources.md +++ b/apps/docs/src/content/agents/resources.md @@ -51,10 +51,18 @@ When `component-tree`, `signal-graph`, `ngrx-store` or `pipe-usages` runs past 1 ### component-tree -The component instances of each page, under `pages[pageId].roots`. Each node has an instance id, class name, host tag, the directives on its host, and `attributes`, the selector attribute names of those directives. In a page rendered on the server, each node also has its `hydration` status: `hydrated`, `skipped`, `mismatched` or `client`. An element that hosts directives but no component is a node too, with `kind: "directive"`, all of its directives in `directives`, and the first one as `name`. `platform` is `angular-native` for an Angular Native app, and missing for a browser page. `count` counts the component instances and `directiveHostCount` the directive hosts. `hydration` reports the page's hydration: counts by status, dehydrated `@defer` blocks, mismatches between what Angular expected and found, and whether the hydration overlay is on. It is missing when the page was not rendered on the server. `detail` holds the live inputs, outputs, other properties, listeners, change detection, encapsulation and injected dependencies of the selected instance, and `source`, the project-relative `file` and 1-based `line` of its class when a dev build has the debug info of Angular. `detail.properties` lists the other own fields, with signals and resources unwrapped. Each value shows its first level, with nested objects, arrays, `Map`s and `Set`s as `{"$collapsed": type, "size": n}`; read them with `inspect-component` and `path`. `detail.expanded` holds the nested levels opened in the panel. The selection is the one made in the panel, by clicking in the page with **Pick component on page**, or with the `highlight` or `inspect-component` tool. `truncated` is `true` when the page has more instances than it lists, and `truncatedBy` names the limit it hit: `components` (2000 instances), `depth` (256 levels of DOM nesting) or `directiveHosts` (1000 elements that host directives but no component). `detail.selector` is a CSS selector that finds the host with `document.querySelector`, on a browser page. It is missing for a host inside a shadow root, which `document.querySelector` cannot reach. `deferBlocks` lists the page's `@defer` blocks, at most 500, and is missing when the page has no util to read them. `deferTruncated` is `true` when the page had more. A block's `transitions` lists at most the last 6 states the page saw, oldest first, with `state`, `hydration` and `at`, the time the page collected it on its own clock. The first entry is the state the page found when it started watching, and the list is set only once the block changed. `nodes` repeats the roots of the most recent page. +The component instances of each page, under `pages[pageId].roots`. Each node has an instance id, class name, host tag, the directives on its host, and `attributes`, the selector attribute names of those directives. In a page rendered on the server, each node also has its `hydration` status: `hydrated`, `skipped`, `mismatched` or `client`. An element that hosts directives but no component is a node too, with `kind: "directive"`, all of its directives in `directives`, and the first one as `name`. `platform` is `angular-native` for an Angular Native app, and missing for a browser page. `count` counts the component instances and `directiveHostCount` the directive hosts. `hydration` reports the page's hydration: counts by status, dehydrated `@defer` blocks, mismatches between what Angular expected and found, and whether the hydration overlay is on. It is missing when the page was not rendered on the server. `nodes` repeats the roots of the most recent page. + +`detail` holds the live inputs, outputs, other properties, listeners, change detection, encapsulation and injected dependencies of the selected instance, and `source`, the project-relative `file` and 1-based `line` of its class when a dev build has the debug info of Angular. `detail.properties` lists the other own fields, with signals and resources unwrapped. Each value shows its first level, with nested objects, arrays, `Map`s and `Set`s as `{"$collapsed": type, "size": n}`; read them with `inspect-component` and `path`. `detail.expanded` holds the nested levels opened in the panel. The selection is the one made in the panel, by clicking in the page with **Pick component on page**, or with the `highlight` or `inspect-component` tool. `detail.selector` is a CSS selector that finds the host with `document.querySelector`, on a browser page. It is missing for a host inside a shadow root, which `document.querySelector` cannot reach, and in an Angular Native or NativeScript app, which has no DOM. + +`truncated` is `true` when the page has more instances than it lists, and `truncatedBy` names the limit it hit: `components` (2000 instances), `depth` (256 levels of DOM nesting) or `directiveHosts` (1000 elements that host directives but no component). The instance ids here are what `highlight` and `inspect-component` accept. +#### Defer blocks + +`deferBlocks` lists the page's `@defer` blocks, at most 500, and is missing when the page has no util to read them. `deferTruncated` is `true` when the page had more. A block's `transitions` lists at most the last 6 states the page saw, oldest first, with `state`, `hydration` and `at`, the time the page collected it on its own clock. The first entry is the state the page found when it started watching, and the list is set only once the block changed. + ### signal-graph The signal graph of each page, under `pages[pageId]`. `graph` is the latest one. It holds the nodes (`signal`, `computed`, `effect`, `linkedSignal`), edges (`{ consumer, producer }`, where `consumer` reads `producer`, both node ids), the component or injector it belongs to, the resources folded into one entry each, and recent value history per node and status history per resource. Only signals a template or an effect has read appear. From 278200c1c9ea0e833827046cdeca32a8c868cd62 Mon Sep 17 00:00:00 2001 From: erKam Date: Sun, 8 Nov 2026 08:05:27 +0000 Subject: [PATCH 15/37] fix(components): report change detection errors from load-defer-block The page caught every error around applyChanges after it rendered a loaded @defer block, so a template that threw once its content rendered still read as a clean load. Keep ignoring a root that is gone, but pass the first applyChanges error back and quote it in the answer. --- apps/docs/src/content/agents/tools.md | 2 +- packages/devtools/CHANGELOG.md | 1 + .../src/__tests__/defer-load-tool.test.ts | 9 ++++++++ .../devtools/src/__tests__/defer-load.test.ts | 15 +++++++++++++ packages/devtools/src/defer-load.ts | 21 ++++++++++++++++--- packages/devtools/src/rpc/defer-loads.ts | 10 +++++++-- 6 files changed, 52 insertions(+), 6 deletions(-) diff --git a/apps/docs/src/content/agents/tools.md b/apps/docs/src/content/agents/tools.md index 7d84ed5b..7a9d7707 100644 --- a/apps/docs/src/content/agents/tools.md +++ b/apps/docs/src/content/agents/tools.md @@ -276,7 +276,7 @@ Makes one `@defer` block fetch its dependencies and show its main content now, a | `block` | Yes | A block id from [`defer-blocks`](#defer-blocks), such as `d3`. | | `page` | No | The page id. Required when more than one tab reports a block with that id. | -The page loads the block the way `DeferBlockFixture.render` does in Angular's testing package, then runs change detection with `ng.applyChanges`. When the dependencies fail to load, the block shows its `@error` block and the answer says so. A block without an `@error` block is left on its placeholder. The block's own triggers do not fire, so a load does not prove they work. +The page loads the block the way `DeferBlockFixture.render` does in Angular's testing package, then runs change detection with `ng.applyChanges`. If change detection throws while the block renders, the answer quotes the error. When the dependencies fail to load, the block shows its `@error` block and the answer says so. A block without an `@error` block is left on its placeholder. The block's own triggers do not fire, so a load does not prove they work. It refuses, and loads nothing, when: diff --git a/packages/devtools/CHANGELOG.md b/packages/devtools/CHANGELOG.md index cc2f9ad2..09528ca3 100644 --- a/packages/devtools/CHANGELOG.md +++ b/packages/devtools/CHANGELOG.md @@ -324,6 +324,7 @@ What remains: `/config` exports `DEFAULT_POPUP_HOTKEY`, `PANGULAR_ACTIONS`, `PAN - A signal store change to a key that needs quotes, such as `profile["first name"]`, is logged with the path the **NgRx Store** state tree uses, so the tree marks it and **Copy path** matches `ngrx-explain-change`. - The forms collector reads a control inside a disabled `
` as disabled on the page, so it no longer looks enabled in the DOM facts. - A component report whose `detail.selector` is not text no longer passes it on to the agent tools; the server leaves it out. +- `load-defer-block` quotes the error when change detection throws while the loaded block renders, instead of reporting a clean load. ### Docs diff --git a/packages/devtools/src/__tests__/defer-load-tool.test.ts b/packages/devtools/src/__tests__/defer-load-tool.test.ts index a79ea75a..55a64433 100644 --- a/packages/devtools/src/__tests__/defer-load-tool.test.ts +++ b/packages/devtools/src/__tests__/defer-load-tool.test.ts @@ -97,6 +97,15 @@ describe('load-defer-block', () => { expect(await call('load-defer-block', { block: 'd1' })).toContain('shows its @error block'); }); + it('names what change detection threw while the block rendered', async () => { + const { ctx, push, call } = await boot(); + await push('push-component-tree', tree('p1')); + answerLoads(ctx, push, () => ({ ok: true, state: 'complete', renderError: 'NG0100' })); + expect(await call('load-defer-block', { block: 'd1' })).toContain( + 'Change detection threw while it rendered: NG0100.', + ); + }); + it('asks for a page when several tabs have the same block id, and refuses unknown ids', async () => { const { ctx, push, call } = await boot(); await push('push-component-tree', tree('p1')); diff --git a/packages/devtools/src/__tests__/defer-load.test.ts b/packages/devtools/src/__tests__/defer-load.test.ts index 0e9a48bb..ead226d8 100644 --- a/packages/devtools/src/__tests__/defer-load.test.ts +++ b/packages/devtools/src/__tests__/defer-load.test.ts @@ -73,6 +73,21 @@ describe('loadDeferBlock', () => { expect(ng.applyChanges).toHaveBeenCalledWith(component); }); + it('says what change detection threw while it rendered the block', async () => { + const { root, innerAnchor, internals, ng } = app(); + ng.applyChanges.mockImplementation(() => { + throw new Error('NG0100: changed after checked'); + }); + const result = await loadDeferBlock(ng, internals, { host: innerAnchor, block: info() }, [ + root, + ]); + expect(result).toEqual({ + ok: true, + state: 'complete', + renderError: 'NG0100: changed after checked', + }); + }); + it('shows the @error block when the dependencies fail', async () => { const { root, innerAnchor, internals, ng, rendered } = app({ failed: true, errorBlock: true }); const result = await loadDeferBlock(ng, internals, { host: innerAnchor, block: info() }, [ diff --git a/packages/devtools/src/defer-load.ts b/packages/devtools/src/defer-load.ts index 819674d2..dfb2cecd 100644 --- a/packages/devtools/src/defer-load.ts +++ b/packages/devtools/src/defer-load.ts @@ -44,6 +44,8 @@ export interface DeferLoadResult { state?: string; /** The block already showed its main content, so nothing was loaded. */ already?: true; + /** What change detection threw while it rendered the loaded block. */ + renderError?: string; error?: string; } @@ -166,15 +168,28 @@ export async function loadDeferBlock( }; } internals.renderDeferBlockState(failed ? ERROR : COMPLETE, found.tNode, found.lContainer, true); + let renderError: string | undefined; for (const root of roots) { + let component: unknown; try { - const component = ng.getComponent?.(root); - if (component) ng.applyChanges?.(component); + component = ng.getComponent?.(root); } catch { // A root that is gone; the next tick of the app renders the block all the same. + continue; + } + if (!component) continue; + try { + ng.applyChanges?.(component); + } catch (error) { + // The block's own template can throw once it renders; the agent is told. + renderError ??= error instanceof Error ? error.message : String(error); } } - return { ok: true, state: failed ? 'error' : 'complete' }; + return { + ok: true, + state: failed ? 'error' : 'complete', + ...(renderError !== undefined ? { renderError: renderError.slice(0, 500) } : {}), + }; } interface LoadRpc { diff --git a/packages/devtools/src/rpc/defer-loads.ts b/packages/devtools/src/rpc/defer-loads.ts index 3ee9f032..e99cfdda 100644 --- a/packages/devtools/src/rpc/defer-loads.ts +++ b/packages/devtools/src/rpc/defer-loads.ts @@ -38,6 +38,9 @@ function toResult(result: unknown): DeferLoadResult { ok: true, state: r['state'] === 'error' ? 'error' : 'complete', ...(r['already'] === true ? { already: true as const } : {}), + ...(typeof r['renderError'] === 'string' + ? { renderError: r['renderError'].slice(0, 500) } + : {}), }; } return { @@ -56,13 +59,16 @@ export function deferLoadText( if (result.already) { return untrusted(`Defer block ${where} already shows its main content, so nothing was loaded.`); } + const threw = result.renderError + ? ` Change detection threw while it rendered: ${result.renderError}. Check pangular:list-errors.` + : ''; if (result.state === 'error') { return untrusted( - `Loaded defer block ${where}, but its dependencies failed, so it shows its @error block. Check pangular:list-errors and the browser's network panel for the failed chunk.`, + `Loaded defer block ${where}, but its dependencies failed, so it shows its @error block. Check pangular:list-errors and the browser's network panel for the failed chunk.${threw}`, ); } return untrusted( - `Loaded defer block ${where}: its dependencies were fetched and it now shows its main content. Its own triggers did not fire, so this does not prove they work. Read pangular:defer-blocks again to see its new state.`, + `Loaded defer block ${where}: its dependencies were fetched and it now shows its main content. Its own triggers did not fire, so this does not prove they work. Read pangular:defer-blocks again to see its new state.${threw}`, ); } From 1ec5e7b20513960e42b0f70fa28bc520c5172956 Mon Sep 17 00:00:00 2001 From: erKam Date: Sun, 8 Nov 2026 08:07:17 +0000 Subject: [PATCH 16/37] test(analog): give the seeded payload test the setup timeout The test runs pangular.setup, which timed out once at the default 5 seconds on a Windows runner. Give it 15 seconds like the other setup tests. --- packages/devtools/src/__tests__/analog-server-fns.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/devtools/src/__tests__/analog-server-fns.test.ts b/packages/devtools/src/__tests__/analog-server-fns.test.ts index 6332cd4b..f4d00a89 100644 --- a/packages/devtools/src/__tests__/analog-server-fns.test.ts +++ b/packages/devtools/src/__tests__/analog-server-fns.test.ts @@ -224,5 +224,6 @@ export const ping = serverFn(() => 1); ); expect(calls).toContain('Server functions seeded during server rendering and called again'); expect(await call('analog-lint')).toContain('fn-fetched-twice'); - }); + // pangular.setup runs the whole server; a slow runner takes more than the default 5s. + }, 15_000); }); From 32a9619ff8430638cf559d3a3b711e338f04d9e8 Mon Sep 17 00:00:00 2001 From: erKam Date: Sun, 8 Nov 2026 08:07:19 +0000 Subject: [PATCH 17/37] fix(analog): keep the Nitro task confirm panel open when a run fails Run task closed the confirm panel before the request, so a failed run lost the payload and needed Run again to retry. Close it only after a run that works. The Analog page also lists the fs-lite cache driver among the on-disk storage it reads. --- app/src/__tests__/analog-views.test.ts | 32 ++++++++++++++++++++++ app/src/pages/analog-runtime.ts | 3 +- apps/docs/src/content/inspectors/analog.md | 4 +-- packages/devtools/CHANGELOG.md | 1 + 4 files changed, 37 insertions(+), 3 deletions(-) diff --git a/app/src/__tests__/analog-views.test.ts b/app/src/__tests__/analog-views.test.ts index 9b8f2373..7e06ba75 100644 --- a/app/src/__tests__/analog-views.test.ts +++ b/app/src/__tests__/analog-views.test.ts @@ -317,6 +317,38 @@ describe('Analog Nitro tasks', () => { expect((fixture.nativeElement as HTMLElement).textContent).toContain('[redacted]'); }); + it('keeps the confirm panel and payload open when a run fails, and closes it after a run that works', async () => { + let ok = false; + const { rpcClient } = client({ + 'analog-runtime-config': () => ({ env: [], runtimeConfig: [], options: [] }), + 'analog-nitro': () => ({ + plugins: [], + tasks: [{ name: 'db:migrate', file: '/src/server/tasks/db/migrate.ts' }], + storage: [], + cachedRules: [], + cacheDirs: [], + entries: [], + notes: [], + }), + 'analog-run-nitro-task': () => + ok + ? { ok: true, name: 'db:migrate', status: 200, ms: 1, output: '' } + : { ok: false, name: 'db:migrate', error: 'Task failed.' }, + }); + const fixture = TestBed.createComponent(AnalogRuntime); + fixture.componentRef.setInput('rpc', rpcClient); + await settle(fixture); + const runtime = fixture.componentInstance; + runtime.askTask('db:migrate'); + runtime.taskPayload.set('{"dry":true}'); + await runtime.runTask('db:migrate'); + expect(runtime.taskConfirm()).toBe('db:migrate'); + expect(runtime.taskPayload()).toBe('{"dry":true}'); + ok = true; + await runtime.runTask('db:migrate'); + expect(runtime.taskConfirm()).toBeNull(); + }); + it('starts a task once, even when Run task is used again while it runs', async () => { let answer!: (value: unknown) => void; const { rpcClient, calls } = client({ diff --git a/app/src/pages/analog-runtime.ts b/app/src/pages/analog-runtime.ts index 7abed2ed..5b9251b4 100644 --- a/app/src/pages/analog-runtime.ts +++ b/app/src/pages/analog-runtime.ts @@ -448,7 +448,6 @@ export class AnalogRuntime { return; } } - this.taskConfirm.set(null); this.runningTask.set(name); try { const result = await call(this.rpc(), 'analog-run-nitro-task', { @@ -460,6 +459,8 @@ export class AnalogRuntime { ...all, [name]: result ?? { ok: false, name, error: 'No answer from the devtools server.' }, })); + // A failed run keeps the panel and its payload, so it can be fixed and run again. + if (result?.ok && this.taskConfirm() === name) this.taskConfirm.set(null); } finally { this.runningTask.set(null); } diff --git a/apps/docs/src/content/inspectors/analog.md b/apps/docs/src/content/inspectors/analog.md index c41a75c7..7c5ae960 100644 --- a/apps/docs/src/content/inspectors/analog.md +++ b/apps/docs/src/content/inspectors/analog.md @@ -140,9 +140,9 @@ The schema is a JSON Schema file inside the project. The check reads `type`, `re Secret names, tokens and the names in `redaction.secretNames` are masked. Values `vite.config` computes show as **code**. -Click **Run** on a task, optionally give a JSON payload, then **Run task** to run it on the dev server through Nitro's task route, which needs `nitro.experimental.tasks`. The task's answer shows below it, masked, and the run stops waiting after 30 seconds. +Click **Run** on a task, optionally give a JSON payload, then **Run task** to run it on the dev server through Nitro's task route, which needs `nitro.experimental.tasks`. The task's answer shows below it, masked, and the run stops waiting after 30 seconds. If the run fails, the payload stays open so you can change it and run the task again. -Click **Purge** on a cache entry, or **Purge all**, then **Delete**, to delete cache entry files so the next request renders the route again. Running tasks and purging need `actions.analog`. Only `fs` cache storage is on disk: the tab looks in `.nitro/cache`, `node_modules/.nitro/cache`, `node_modules/.cache/nitro`, `dist/.nitro/cache`, `.data/cache` and the `base` of a `cache` mount with the `fs` or `fs-lite` driver. +Click **Purge** on a cache entry, or **Purge all**, then **Delete**, to delete cache entry files so the next request renders the route again. Running tasks and purging need `actions.analog`. Only `fs` and `fs-lite` cache storage is on disk: the tab looks in `.nitro/cache`, `node_modules/.nitro/cache`, `node_modules/.cache/nitro`, `dist/.nitro/cache`, `.data/cache` and the `base` of a `cache` mount with the `fs` or `fs-lite` driver. ### Lint diff --git a/packages/devtools/CHANGELOG.md b/packages/devtools/CHANGELOG.md index 09528ca3..f80ace3c 100644 --- a/packages/devtools/CHANGELOG.md +++ b/packages/devtools/CHANGELOG.md @@ -325,6 +325,7 @@ What remains: `/config` exports `DEFAULT_POPUP_HOTKEY`, `PANGULAR_ACTIONS`, `PAN - The forms collector reads a control inside a disabled `
` as disabled on the page, so it no longer looks enabled in the DOM facts. - A component report whose `detail.selector` is not text no longer passes it on to the agent tools; the server leaves it out. - `load-defer-block` quotes the error when change detection throws while the loaded block renders, instead of reporting a clean load. +- A Nitro task run that fails on the **Analog** tab keeps its confirm panel and payload open, so it can be fixed and run again. ### Docs From 47f437d90bdabbb3520c92b4c9280829b510ef8d Mon Sep 17 00:00:00 2001 From: erKam Date: Sun, 8 Nov 2026 08:09:01 +0000 Subject: [PATCH 18/37] fix(popup): apply a counts launcher change made in a popped-out panel The panel posted the counts launcher setting only to the windows around it, so in its own window the app page that opened it kept the old launcher. Post it to the opener too, on the opener's origin, and accept it in the popup only from the pop-out window, checked by reference or by name and origin as popup-return already is. --- app/src/__tests__/popout-window.test.ts | 11 +++++++- app/src/app.ts | 12 +++++++-- app/src/shell-prefs.ts | 11 +++++++- .../src/content/getting-started/settings.md | 2 +- packages/devtools/CHANGELOG.md | 1 + packages/devtools/src/__tests__/popup.test.ts | 26 +++++++++++++++++++ packages/devtools/src/popup.ts | 11 +++++++- 7 files changed, 68 insertions(+), 6 deletions(-) diff --git a/app/src/__tests__/popout-window.test.ts b/app/src/__tests__/popout-window.test.ts index 51ad4f65..4f3a5ba9 100644 --- a/app/src/__tests__/popout-window.test.ts +++ b/app/src/__tests__/popout-window.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it, vi } from 'vitest'; -import { popoutOpener, returnFromPopout } from '../shell-prefs'; +import { popoutOpener, postToOpener, returnFromPopout } from '../shell-prefs'; /** A stand-in for a window, with the fields the helpers read. */ function fakeWindow(name: string, opener: unknown, referrer = '') { @@ -42,4 +42,13 @@ describe('the pop-out window', () => { ); expect(returnFromPopout(fakeWindow('pangular-inspector-k3x9', opener))).toBe(false); }); + + it('sends a setting to the app page only from the window the popup opened', () => { + const opener = { postMessage: vi.fn(), location: { origin: 'http://localhost:4200' } }; + const message = { type: 'pangular:popup-pill', pill: true }; + expect(postToOpener(message, fakeWindow('pangular-inspector-k3x9', opener))).toBe(true); + expect(opener.postMessage).toHaveBeenCalledWith(message, 'http://localhost:4200'); + expect(postToOpener(message, fakeWindow('other', opener))).toBe(false); + expect(opener.postMessage).toHaveBeenCalledTimes(1); + }); }); diff --git a/app/src/app.ts b/app/src/app.ts index 717f919d..fe8d4871 100644 --- a/app/src/app.ts +++ b/app/src/app.ts @@ -79,6 +79,7 @@ import { inPopup, isMacPlatform, popoutOpener, + postToOpener, returnFromPopout, storePassive, storePill, @@ -1276,7 +1277,7 @@ export class App implements OnInit, OnDestroy { // The popup only hears the pill choice from the panel, so the restored one goes out on connect. effect(() => { if (!this.connected()) return; - untracked(() => this.postToPopup({ type: 'pangular:popup-pill', pill: this.pill() })); + untracked(() => this.sendPill(this.pill())); }); // Opening a dock clears the count of unseen messages on it. effect(() => { @@ -1667,7 +1668,14 @@ export class App implements OnInit, OnDestroy { setPill(pill: boolean) { this.pill.set(pill); storePill(pill); - this.postToPopup({ type: 'pangular:popup-pill', pill }); + this.sendPill(pill); + } + + /** Sends the counts launcher setting to the popup, in the page around the panel or, from a popped-out panel, in the page that opened it. */ + private sendPill(pill: boolean) { + const message = { type: 'pangular:popup-pill', pill }; + this.postToPopup(message); + postToOpener(message); } /** Sends a message to the popup on the app's page, which checks it came from its panel. */ diff --git a/app/src/shell-prefs.ts b/app/src/shell-prefs.ts index 4fe70d57..5bcb4232 100644 --- a/app/src/shell-prefs.ts +++ b/app/src/shell-prefs.ts @@ -214,6 +214,15 @@ export function popoutOpener(win: Window = window): Window | null { /** Asks the popup on the app's page to take the panel back from its own window. */ export function returnFromPopout(win: Window = window): boolean { + return postToOpener({ type: 'pangular:popup-return' }, win); +} + +/** + * Sends `message` to the popup on the app's page when the panel runs in the + * window the popup popped it out into, on the app page's origin. The popup + * accepts it only from that window. Returns whether it was sent. + */ +export function postToOpener(message: Record, win: Window = window): boolean { const opener = popoutOpener(win); if (!opener) return false; let origin: string | undefined; @@ -228,7 +237,7 @@ export function returnFromPopout(win: Window = window): boolean { } if (!origin || origin === 'null') return false; try { - opener.postMessage({ type: 'pangular:popup-return' }, origin); + opener.postMessage(message, origin); return true; } catch { return false; diff --git a/apps/docs/src/content/getting-started/settings.md b/apps/docs/src/content/getting-started/settings.md index 163d4e3b..e915ab3c 100644 --- a/apps/docs/src/content/getting-started/settings.md +++ b/apps/docs/src/content/getting-started/settings.md @@ -72,7 +72,7 @@ With `popup.hotkey: false` there is no shortcut to bring the button back, so pas | **renders** | Component template updates since the page loaded, as Angular's profiler reports them. The count pauses while the tab is in the background. | | **errors** | Errors the [Errors inspector](../inspectors/errors.md) caught on the page, each repeat included. It stays at 0 when that inspector is turned off. | -It is off by default. Like passive mode, the popup saves it under `pangular-popup` in your app's `localStorage`, and only the panel in the popup can change it. In passive mode the button stays hidden, pill or not. +It is off by default. Like passive mode, the popup saves it under `pangular-popup` in your app's `localStorage`. The panel in the popup can change it, and so can the panel the popup moved to its own window, which sends the change to the page that opened it. In passive mode the button stays hidden, pill or not. ## Saved filters diff --git a/packages/devtools/CHANGELOG.md b/packages/devtools/CHANGELOG.md index f80ace3c..e9c335ea 100644 --- a/packages/devtools/CHANGELOG.md +++ b/packages/devtools/CHANGELOG.md @@ -326,6 +326,7 @@ What remains: `/config` exports `DEFAULT_POPUP_HOTKEY`, `PANGULAR_ACTIONS`, `PAN - A component report whose `detail.selector` is not text no longer passes it on to the agent tools; the server leaves it out. - `load-defer-block` quotes the error when change detection throws while the loaded block renders, instead of reporting a clean load. - A Nitro task run that fails on the **Analog** tab keeps its confirm panel and payload open, so it can be fixed and run again. +- Turning **Counts launcher** on or off in a popped-out panel changes the launcher on the app page that opened it. The popup takes the change only from the window it popped the panel out into. ### Docs diff --git a/packages/devtools/src/__tests__/popup.test.ts b/packages/devtools/src/__tests__/popup.test.ts index 6265f886..b143cb3b 100644 --- a/packages/devtools/src/__tests__/popup.test.ts +++ b/packages/devtools/src/__tests__/popup.test.ts @@ -962,6 +962,32 @@ describe.sequential('devtools popup', () => { expect(win.close).toHaveBeenCalled(); }); + it('takes the counts launcher setting from that window only', async () => { + const win = fakeWindow(); + vi.spyOn(window, 'open').mockReturnValue(win as unknown as Window); + await loadPopup(true); + await openedSrc(); + popoutButton().click(); + const { panel, fab } = parts(); + await vi.waitFor(() => expect(panel.classList.contains('open')).toBe(false)); + const send = (source: unknown, origin = location.origin) => + window.dispatchEvent( + new MessageEvent('message', { + data: { type: 'pangular:popup-pill', pill: true }, + source: source as Window, + origin, + }), + ); + send(win, 'https://evil.test'); + send(fakeWindow()); + expect(fab.classList.contains('pill')).toBe(false); + send(win); + expect(fab.classList.contains('pill')).toBe(true); + expect(stored().pill).toBe(true); + // The window keeps the panel; only the setting changed. + expect(panel.classList.contains('open')).toBe(false); + }); + it('notices the window was closed by hand', async () => { vi.useFakeTimers({ toFake: ['setInterval', 'clearInterval'] }); try { diff --git a/packages/devtools/src/popup.ts b/packages/devtools/src/popup.ts index 17a41d4d..99d2d7ba 100644 --- a/packages/devtools/src/popup.ts +++ b/packages/devtools/src/popup.ts @@ -1454,7 +1454,16 @@ export function createDevtoolsPopup(options: { src?: string; hotkey?: string | f return null; }; const onOutsideMessage = (e: MessageEvent) => { - const type = (e.data as { type?: unknown } | null)?.type; + const msg = e.data as { type?: unknown; pill?: unknown } | null; + const type = msg?.type; + if (type === 'pangular:popup-pill') { + // The counts launcher setting, changed in the panel's own window. + if (typeof msg?.pill !== 'boolean' || !fromOutside(e)) return; + state.pill = msg.pill || undefined; + saveState(state); + applyPill(); + return; + } if (type !== 'pangular:popup-return') return; const win = fromOutside(e); if (!win) return; From 72cc52979bc61c47aa7b3b4488db598d58f8aa94 Mon Sep 17 00:00:00 2001 From: erKam Date: Sun, 8 Nov 2026 08:09:38 +0000 Subject: [PATCH 19/37] docs: note the extension frame URL limit and Ionic pages without Capacitor The extension evaluates in a frame by its URL, so frames that share a URL count as one. The Capacitor tab lists only pages with window.Capacitor, so an Ionic page without Capacitor shows no page stacks. --- apps/docs/src/content/getting-started/chrome-extension.md | 2 +- apps/docs/src/content/inspectors/capacitor.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/docs/src/content/getting-started/chrome-extension.md b/apps/docs/src/content/getting-started/chrome-extension.md index f95fbf73..cdea3480 100644 --- a/apps/docs/src/content/getting-started/chrome-extension.md +++ b/apps/docs/src/content/getting-started/chrome-extension.md @@ -72,7 +72,7 @@ When DevTools opens, the extension checks the inspected page for Angular: an `ng When the top page has no Angular, the extension looks in its frames, such as a Storybook preview, a micro-frontend shell or an embedded preview. It checks up to 20 `http` and `https` frames in the order DevTools lists them, and uses the first one that runs Angular. The panel then reads that frame for everything: the page id, the Elements selection, **Reveal in Elements** and **Open source**. It looks for the devtools server on the frame's origin, not the top page's. -The top page always wins when it runs Angular itself. The search gives up after 3 seconds and uses the top page. The **Angular component** pane in the Elements panel reads the top page only, since Chrome evaluates its expression there. +The top page always wins when it runs Angular itself. The search gives up after 3 seconds and uses the top page. Chrome picks a frame by its URL, so frames that share a URL count as one: the extension checks and reads the first of them only. If your app runs in one of several frames with the same URL, give that frame a URL of its own, for example with a query parameter. The **Angular component** pane in the Elements panel reads the top page only, since Chrome evaluates its expression there. ### Finding the server diff --git a/apps/docs/src/content/inspectors/capacitor.md b/apps/docs/src/content/inspectors/capacitor.md index 056c1971..15e45cf2 100644 --- a/apps/docs/src/content/inspectors/capacitor.md +++ b/apps/docs/src/content/inspectors/capacitor.md @@ -134,7 +134,7 @@ The overlay reads the stack through the `IonRouterOutlet` directive of `@ionic/a Without the directive, the card reads the outlet's `.ion-page` children from the DOM: the active page is the last one without `ion-page-hidden`, and there are no URLs. Here the direction is always inferred from how the stack changed. Either way, the overlay changes nothing in the app. -The section shows when the page the tab shows has an `ion-app` or an `ion-router-outlet`. It lists up to 20 outlets with up to 50 pages each, and says how many it left out. URLs are masked like router URLs. +The section shows when the page the tab shows has an `ion-app` or an `ion-router-outlet`. The tab only lists pages where `window.Capacitor` is set, so an Ionic page without Capacitor, such as an Ionic app that never loads `@capacitor/core`, shows no stacks. It lists up to 20 outlets with up to 50 pages each, and says how many it left out. URLs are masked like router URLs. ## Where the data comes from From 9a30f1d83bc1302a4fe490b637e0fffb51a1f697 Mon Sep 17 00:00:00 2001 From: erKam Date: Sun, 8 Nov 2026 08:10:40 +0000 Subject: [PATCH 20/37] fix(forms): count submit buttons in a disabled fieldset as disabled submitDom counted only buttons whose own disabled property is true, so a submit button inside
did not count and submit-disabled-while-invalid missed the blocked submit. Match :disabled instead. The collector test now also requires the event whose origin it checks. --- packages/devtools/CHANGELOG.md | 2 +- packages/devtools/src/__tests__/forms-collector.test.ts | 1 + packages/devtools/src/__tests__/forms-lint-a11y.test.ts | 9 ++++++++- packages/devtools/src/forms-dom.ts | 3 ++- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/packages/devtools/CHANGELOG.md b/packages/devtools/CHANGELOG.md index e9c335ea..81b9f950 100644 --- a/packages/devtools/CHANGELOG.md +++ b/packages/devtools/CHANGELOG.md @@ -322,7 +322,7 @@ What remains: `/config` exports `DEFAULT_POPUP_HOTKEY`, `PANGULAR_ACTIONS`, `PAN - During a keyboard pick on the **Components** tab, a message that repeats, such as the same component again, is read out again. - **Show in Signals** for a page that has not reported its graph yet shows that page once it reports, and picking another component drops a signal still waiting to be selected. - A signal store change to a key that needs quotes, such as `profile["first name"]`, is logged with the path the **NgRx Store** state tree uses, so the tree marks it and **Copy path** matches `ngrx-explain-change`. -- The forms collector reads a control inside a disabled `
` as disabled on the page, so it no longer looks enabled in the DOM facts. +- The forms collector reads a control inside a disabled `
` as disabled on the page, and counts a submit button there as disabled, so `submit-disabled-while-invalid` finds a submit a disabled fieldset blocks. - A component report whose `detail.selector` is not text no longer passes it on to the agent tools; the server leaves it out. - `load-defer-block` quotes the error when change detection throws while the loaded block renders, instead of reporting a clean load. - A Nitro task run that fails on the **Analog** tab keeps its confirm panel and payload open, so it can be fixed and run again. diff --git a/packages/devtools/src/__tests__/forms-collector.test.ts b/packages/devtools/src/__tests__/forms-collector.test.ts index c8a0021d..24ed408c 100644 --- a/packages/devtools/src/__tests__/forms-collector.test.ts +++ b/packages/devtools/src/__tests__/forms-collector.test.ts @@ -631,6 +631,7 @@ describe('forms collector and a running WebMCP call', () => { await tick(LEASED_PUSH_MS + 100); const values = h.lastEvents().filter((e) => e.type === 'value' && e.path === 'name'); expect(values.find((e) => e.detail === '"Ada"')).toMatchObject({ origin: 'agent' }); + expect(values.find((e) => e.detail === '"Code"')).toBeDefined(); expect(values.find((e) => e.detail === '"Code"')?.origin).not.toBe('agent'); releaseSlowSubmit(); await pending; diff --git a/packages/devtools/src/__tests__/forms-lint-a11y.test.ts b/packages/devtools/src/__tests__/forms-lint-a11y.test.ts index dbcd5137..3b1a3b6e 100644 --- a/packages/devtools/src/__tests__/forms-lint-a11y.test.ts +++ b/packages/devtools/src/__tests__/forms-lint-a11y.test.ts @@ -1,7 +1,7 @@ // @vitest-environment jsdom import { describe, expect, it } from 'vitest'; import type { CollectedForm, FormFieldNode } from '../forms.ts'; -import { autocompleteHint, domFacts } from '../forms-dom.ts'; +import { autocompleteHint, domFacts, submitDom } from '../forms-dom.ts'; import { lintForm } from '../rpc/forms-lint.ts'; function input(html: string): Element { @@ -52,6 +52,13 @@ describe('forms accessibility lint', () => { expect(domFacts(input(''), {}).autocomplete).toBe('address-level2'); }); + it('counts a submit button inside a disabled fieldset as disabled', () => { + const form = input( + '
', + ); + expect(submitDom(form)).toMatchObject({ buttons: 1, disabledButtons: 1 }); + }); + it('reads a control inside a disabled fieldset as disabled', () => { const fieldset = input('
'); const field = fieldset.querySelector('input')!; diff --git a/packages/devtools/src/forms-dom.ts b/packages/devtools/src/forms-dom.ts index b0ec4ccd..344f70cf 100644 --- a/packages/devtools/src/forms-dom.ts +++ b/packages/devtools/src/forms-dom.ts @@ -247,7 +247,8 @@ export function submitDom(el: Element, context: SubmitContext = {}): SubmitDom { return owner === el || (owner === undefined && inside.includes(b)); }); const submitters = candidates.filter(isSubmitter); - const disabledButtons = submitters.filter((b) => (b as HTMLButtonElement).disabled).length; + // `:disabled` also counts a button inside a disabled `
`. + const disabledButtons = submitters.filter((b) => b.matches(':disabled')).length; const typed = candidates.filter((b) => b instanceof HTMLButtonElement && !isSubmitter(b)); if (!submitters.length) { reasons.push( From 48ad7a613980f4c09818276b62e6564e3dc97561 Mon Sep 17 00:00:00 2001 From: erKam Date: Sun, 8 Nov 2026 08:10:51 +0000 Subject: [PATCH 21/37] docs: say where the panel and the popup each keep the counts launcher setting The settings page said only the panel in the popup can change the counts launcher, while the panel also saves its own copy under pangular-pref:pill. --- apps/docs/src/content/getting-started/settings.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/src/content/getting-started/settings.md b/apps/docs/src/content/getting-started/settings.md index e915ab3c..4f494641 100644 --- a/apps/docs/src/content/getting-started/settings.md +++ b/apps/docs/src/content/getting-started/settings.md @@ -72,7 +72,7 @@ With `popup.hotkey: false` there is no shortcut to bring the button back, so pas | **renders** | Component template updates since the page loaded, as Angular's profiler reports them. The count pauses while the tab is in the background. | | **errors** | Errors the [Errors inspector](../inspectors/errors.md) caught on the page, each repeat included. It stays at 0 when that inspector is turned off. | -It is off by default. Like passive mode, the popup saves it under `pangular-popup` in your app's `localStorage`. The panel in the popup can change it, and so can the panel the popup moved to its own window, which sends the change to the page that opened it. In passive mode the button stays hidden, pill or not. +It is off by default. The panel saves its own copy under `pangular-pref:pill` in its `localStorage`, and, like passive mode, the popup keeps a separate copy under `pangular-popup` in your app's `localStorage`. The panel in the popup changes the popup's copy, and so does the panel the popup moved to its own window, which sends the change to the page that opened it. In passive mode the button stays hidden, pill or not. ## Saved filters From 1e14b3dc1ae595789cd700d3e192d9806c94620d Mon Sep 17 00:00:00 2001 From: erKam Date: Sun, 8 Nov 2026 08:14:44 +0000 Subject: [PATCH 22/37] refactor(ui): use the shared roving list in the Pipes and Capacitor lists The Pipes list and the Capacitor call list each had their own arrow key handler, and the Pipes list left every row in the Tab order. Use appRovingList in both, let it follow a row that becomes selected without focus so the Capacitor list keeps its tab stop on the selected call, and add a page convention check that no page hand-writes the list keys again. Refs #370 --- app/src/__tests__/page-conventions.test.ts | 28 ++++++++++++++++++ app/src/__tests__/roving-list.test.ts | 10 +++++++ app/src/pages/capacitor-inspector.ts | 34 ++-------------------- app/src/pages/pipes-inspector.ts | 22 ++------------ app/src/ui/roving-list.ts | 24 +++++++++++---- packages/devtools/CHANGELOG.md | 1 + 6 files changed, 64 insertions(+), 55 deletions(-) diff --git a/app/src/__tests__/page-conventions.test.ts b/app/src/__tests__/page-conventions.test.ts index f7376534..e9f56b1f 100644 --- a/app/src/__tests__/page-conventions.test.ts +++ b/app/src/__tests__/page-conventions.test.ts @@ -110,3 +110,31 @@ describe('pages use the shared state component', () => { for (const { file, tag } of states) expect(tag, file).toMatch(/\(clear\)=/); }); }); + +describe('pages with a keyboard list use the shared roving list', () => { + it('has no hand-written arrow key list handler left in a page', async () => { + // Trees, charts and the graph move in two dimensions and keep their own keys. + const handWritten = [...(await pageSources())] + .filter(([, source]) => /\['ArrowDown',\s*'ArrowUp',\s*'Home',\s*'End'\]/.test(source)) + .map(([file]) => file); + expect(handWritten).toEqual([]); + }); + + it('puts appRovingList on the lists that moved to it', async () => { + const sources = await pageSources(); + const lists = { + 'capacitor-inspector.ts': '[data-cap-call]', + 'pipes-inspector.ts': '[data-pipe-row]', + 'network-inspector.ts': '', + 'query-inspector.ts': '', + 'signal-inspector.ts': '', + 'store-inspector.ts': '', + 'timeline.ts': '', + }; + for (const [file, selector] of Object.entries(lists)) { + const source = sources.get(file) ?? ''; + expect(source, file).toContain('appRovingList="'); + if (selector) expect(source, file).toContain(`appRovingList="${selector}"`); + } + }); +}); diff --git a/app/src/__tests__/roving-list.test.ts b/app/src/__tests__/roving-list.test.ts index ced8127a..5976366c 100644 --- a/app/src/__tests__/roving-list.test.ts +++ b/app/src/__tests__/roving-list.test.ts @@ -59,6 +59,16 @@ describe('RovingList', () => { expect(tabStops(fixture)).toEqual(['c']); }); + it('moves the Tab stop to a row that becomes selected without focus', async () => { + const fixture = mount(); + await settle(fixture); + expect(tabStops(fixture)).toEqual(['a']); + // A click in Safari selects a row without focusing it. + fixture.componentInstance.selected.set('c'); + await settle(fixture); + expect(tabStops(fixture)).toEqual(['c']); + }); + it('moves focus with the arrow keys, Home and End, and stops at the ends', async () => { const fixture = mount(); await settle(fixture); diff --git a/app/src/pages/capacitor-inspector.ts b/app/src/pages/capacitor-inspector.ts index 1ab973e6..0c6d71c3 100644 --- a/app/src/pages/capacitor-inspector.ts +++ b/app/src/pages/capacitor-inspector.ts @@ -40,6 +40,7 @@ import { type CapacitorPage, type CapacitorSummary, } from './capacitor-types'; +import { RovingList } from '../ui/roving-list'; import { SearchField } from '../ui/search-field'; import { rememberSelection } from '../view-memory'; import { AppState } from '../ui/app-state'; @@ -65,6 +66,7 @@ const FILTER_LABELS: Record = { CapacitorCallDetail, CapacitorIonic, CapacitorState, + RovingList, ], template: ` @if (!loaded()) { @@ -239,7 +241,7 @@ const FILTER_LABELS: Record = {
    @for (call of shownCalls(); track call.id) {
  1. @@ -249,8 +251,6 @@ const FILTER_LABELS: Record = { data-cap-call [class.selected]="selected()?.id === call.id" [attr.aria-pressed]="selected()?.id === call.id" - [attr.tabindex]="tabStop() === call.id ? 0 : -1" - (focus)="focusedCallId.set(call.id)" (click)="select(call.id)" > {{ call.plugin }}.{{ call.method }}() @@ -831,8 +831,6 @@ export class CapacitorInspector { : defaultCapacitorPage(pages, this.hostPageId), }); readonly selectedCallId = signal(null); - /** The row that last had focus, so the list keeps one tab stop on it. */ - readonly focusedCallId = signal(null); readonly filter = signal(''); readonly callFilter = signal('all'); /** Ticks every second, for pending ages and "3 s ago". */ @@ -875,14 +873,6 @@ export class CapacitorInspector { const calls = this.shownCalls(); return calls.find((call) => call.id === this.selectedCallId()) ?? null; }); - /** The one row Tab reaches: the focused one, else the selected one, else the newest. */ - readonly tabStop = computed(() => { - const calls = this.shownCalls(); - for (const id of [this.focusedCallId(), this.selectedCallId()]) { - if (id !== null && calls.some((call) => call.id === id)) return id; - } - return calls[0]?.id ?? null; - }); /** The slowest visible call, which the duration bars are scaled to. */ readonly slowest = computed(() => { const now = this.now(); @@ -959,24 +949,6 @@ export class CapacitorInspector { ); } - /** Arrow keys, Home and End move between calls. */ - onListKey(event: KeyboardEvent) { - const keys = ['ArrowDown', 'ArrowUp', 'Home', 'End']; - if (!keys.includes(event.key)) return; - const rows = Array.from( - this.host.nativeElement.querySelectorAll('[data-cap-call]'), - ); - if (!rows.length) return; - const at = rows.indexOf(document.activeElement as HTMLButtonElement); - let next = at; - if (event.key === 'ArrowDown') next = Math.min(at + 1, rows.length - 1); - else if (event.key === 'ArrowUp') next = Math.max(at - 1, 0); - else if (event.key === 'Home') next = 0; - else next = rows.length - 1; - event.preventDefault(); - rows[next]?.focus(); - } - setSearch(text: string) { if (text === this.filter()) return; this.filter.set(text); diff --git a/app/src/pages/pipes-inspector.ts b/app/src/pages/pipes-inspector.ts index f04a2c39..4168b42d 100644 --- a/app/src/pages/pipes-inspector.ts +++ b/app/src/pages/pipes-inspector.ts @@ -18,6 +18,7 @@ import { hostPageId } from '../page-id'; import { Select, type SelectOption } from '../ui/select'; import { SourceLink } from '../ui/source-link'; import { plural } from '../format'; +import { RovingList } from '../ui/roving-list'; import { SearchField } from '../ui/search-field'; interface UsageSite { @@ -156,7 +157,7 @@ const SORT_OPTIONS: readonly SelectOption[] = [ @Component({ selector: 'app-pipes-inspector', - imports: [SearchField, Select, SourceLink], + imports: [RovingList, SearchField, Select, SourceLink], template: `

    Pipes declared in your source, the built-in pipes your templates use and library pipes seen on @@ -256,7 +257,7 @@ const SORT_OPTIONS: readonly SelectOption[] = [

    @if (filtered().length) { -
      +
        @for (p of filtered(); track p.file + p.name) { @let live = liveFor(p.name);
      • @@ -1601,21 +1602,4 @@ export class PipesInspector { ) .catch(() => {}); } - - onListKey(event: KeyboardEvent) { - const keys = ['ArrowDown', 'ArrowUp', 'Home', 'End']; - if (!keys.includes(event.key)) return; - const rows = Array.from( - this.host.nativeElement.querySelectorAll('[data-pipe-row]'), - ); - if (!rows.length) return; - const at = rows.indexOf(document.activeElement as HTMLButtonElement); - let next = at; - if (event.key === 'ArrowDown') next = Math.min(at + 1, rows.length - 1); - else if (event.key === 'ArrowUp') next = Math.max(at - 1, 0); - else if (event.key === 'Home') next = 0; - else next = rows.length - 1; - event.preventDefault(); - rows[next]?.focus(); - } } diff --git a/app/src/ui/roving-list.ts b/app/src/ui/roving-list.ts index 357f448e..b9c262f7 100644 --- a/app/src/ui/roving-list.ts +++ b/app/src/ui/roving-list.ts @@ -10,8 +10,9 @@ const SELECTED = /** * Makes a long list one Tab stop. Only the current item is in the Tab order, * and ArrowUp, ArrowDown, Home and End move focus between the items that - * `appRovingList` selects. The current item is the one last focused, or else - * the selected one, or else the first. + * `appRovingList` selects. The current item is the one last focused or + * selected, or else the first. A click selects without focusing in some + * browsers (Safari), so an item that becomes selected becomes current too. */ @Directive({ selector: '[appRovingList]', @@ -41,9 +42,22 @@ export class RovingList { afterNextRender(() => { this.sync(); if (typeof MutationObserver === 'undefined') return; - // Rows come and go as data arrives; only added or removed nodes matter. - const observer = new MutationObserver(() => this.sync()); - observer.observe(this.host, { childList: true, subtree: true }); + // Rows come and go as data arrives, and the selection moves between them. + const observer = new MutationObserver((records) => { + for (const record of records) { + const target = record.target as HTMLElement; + if (record.type === 'attributes' && this.isItem(target) && target.matches(SELECTED)) { + this.current = target; + } + } + this.sync(); + }); + observer.observe(this.host, { + childList: true, + subtree: true, + attributes: true, + attributeFilter: ['aria-pressed', 'aria-expanded', 'aria-current', 'class'], + }); destroyRef.onDestroy(() => observer.disconnect()); }); } diff --git a/packages/devtools/CHANGELOG.md b/packages/devtools/CHANGELOG.md index 81b9f950..c18f16f1 100644 --- a/packages/devtools/CHANGELOG.md +++ b/packages/devtools/CHANGELOG.md @@ -327,6 +327,7 @@ What remains: `/config` exports `DEFAULT_POPUP_HOTKEY`, `PANGULAR_ACTIONS`, `PAN - `load-defer-block` quotes the error when change detection throws while the loaded block renders, instead of reporting a clean load. - A Nitro task run that fails on the **Analog** tab keeps its confirm panel and payload open, so it can be fixed and run again. - Turning **Counts launcher** on or off in a popped-out panel changes the launcher on the app page that opened it. The popup takes the change only from the window it popped the panel out into. +- The **Pipes** list is one Tab stop with arrow keys, Home and End, like the other lists in the panel, and in every list the Tab stop follows a row selected with a click that does not focus it, as in Safari (#370). ### Docs From e2f35f1f21f618d3be67c8a80790cf486488b198 Mon Sep 17 00:00:00 2001 From: erKam Date: Sun, 8 Nov 2026 08:20:26 +0000 Subject: [PATCH 23/37] refactor: move message redaction into redaction.ts redactMessage, redactMessageWith, redactTokens and longestFirst lived in forms-privacy.ts while the other redaction helpers are in redaction.ts. Move them there and re-export them from forms-privacy.ts so existing imports keep working. redaction.ts no longer reads REDACTED at module load, so the import cycle between the two modules is safe in either load order. Refs #371 --- packages/devtools/src/forms-privacy.ts | 35 ++++-------------------- packages/devtools/src/redaction.ts | 38 +++++++++++++++++++++++--- 2 files changed, 40 insertions(+), 33 deletions(-) diff --git a/packages/devtools/src/forms-privacy.ts b/packages/devtools/src/forms-privacy.ts index 7074f72e..9d09d259 100644 --- a/packages/devtools/src/forms-privacy.ts +++ b/packages/devtools/src/forms-privacy.ts @@ -1,7 +1,11 @@ -import { redactCredentials } from './credential-redact.ts'; -import { redactHighEntropy, setEntropyRedaction, type EntropyOptions } from './entropy-redact.ts'; +import { setEntropyRedaction, type EntropyOptions } from './entropy-redact.ts'; +import { redactMessage } from './redaction.ts'; import { RedactionScope } from './redaction-scope.ts'; +// The message redaction lives with the other helpers in `redaction.ts`; these +// names stay here so the collectors that import them from this module keep working. +export { longestFirst, redactMessage, redactMessageWith, redactTokens } from './redaction.ts'; + export const REDACTED = '[redacted]'; export type RedactReason = 'key' | 'input-type' | 'autocomplete' | 'marker' | 'parent' | 'config'; @@ -157,7 +161,6 @@ export function redactJwt(text: string): string { } return parts.length ? parts.join('') + text.slice(last) : text; } -const BEARER = /\bBearer\s+[\w.~+/=-]+/gi; interface PrivacyConfig { mask?: string[]; @@ -327,32 +330,6 @@ function safeQuery(element: Element, selector: string): boolean { } } -export function redactMessage(text: string, secrets: Iterable = []): string { - return redactMessageWith(text, longestFirst(secrets)); -} - -/** - * Credentials inside text (`credential-redact.ts`), JWTs and bearer tokens: - * the value-shape rules every message and log line goes through. - */ -export function redactTokens(text: string): string { - return redactJwt(redactCredentials(text, REDACTED)).replace(BEARER, `Bearer ${REDACTED}`); -} - -/** `secrets` as `redactMessageWith` takes them: 3 characters or more, longest first. */ -export function longestFirst(secrets: Iterable): string[] { - const out = [...secrets].filter((secret) => secret.length >= 3); - out.sort((a, b) => b.length - a.length); - return out; -} - -/** `redactMessage` with secrets `longestFirst` already prepared, for many texts in a row. */ -export function redactMessageWith(text: string, ordered: readonly string[]): string { - let out = redactTokens(text); - for (const secret of ordered) out = out.split(secret).join(REDACTED); - return redactHighEntropy(out, REDACTED); -} - /** Most earlier secret values a `SecretSet` keeps hiding after they changed. */ export const MAX_RETIRED_SECRETS = 50; diff --git a/packages/devtools/src/redaction.ts b/packages/devtools/src/redaction.ts index ace9431b..74c9bb74 100644 --- a/packages/devtools/src/redaction.ts +++ b/packages/devtools/src/redaction.ts @@ -10,7 +10,9 @@ * masks they left, for the counts the panel and agent answers show. */ import type { AnalogRuntimeReport } from './analog-runtime.ts'; -import { REDACTED, isRedactedKey } from './forms-privacy.ts'; +import { redactCredentials } from './credential-redact.ts'; +import { redactHighEntropy } from './entropy-redact.ts'; +import { REDACTED, isRedactedKey, redactJwt } from './forms-privacy.ts'; import { MAX_HEADERS, MAX_HEADER_VALUE, type HeaderRecord } from './http-headers.ts'; import type { HttpCall } from './http-rules.ts'; import { redactText, redactUrl } from './router.ts'; @@ -19,9 +21,37 @@ import { clip } from './text.ts'; export { countRedacted, countRedactedText, redactionNote } from './redaction-count.ts'; -// JSON text +// Messages and log lines + +const BEARER = /\bBearer\s+[\w.~+/=-]+/gi; + +export function redactMessage(text: string, secrets: Iterable = []): string { + return redactMessageWith(text, longestFirst(secrets)); +} + +/** + * Credentials inside text (`credential-redact.ts`), JWTs and bearer tokens: + * the value-shape rules every message and log line goes through. + */ +export function redactTokens(text: string): string { + return redactJwt(redactCredentials(text, REDACTED)).replace(BEARER, `Bearer ${REDACTED}`); +} + +/** `secrets` as `redactMessageWith` takes them: 3 characters or more, longest first. */ +export function longestFirst(secrets: Iterable): string[] { + const out = [...secrets].filter((secret) => secret.length >= 3); + out.sort((a, b) => b.length - a.length); + return out; +} -const REDACTED_VALUE = JSON.stringify(REDACTED); +/** `redactMessage` with secrets `longestFirst` already prepared, for many texts in a row. */ +export function redactMessageWith(text: string, ordered: readonly string[]): string { + let out = redactTokens(text); + for (const secret of ordered) out = out.split(secret).join(REDACTED); + return redactHighEntropy(out, REDACTED); +} + +// JSON text function stringEnd(text: string, start: number): number { for (let i = start + 1; i < text.length; i++) { @@ -71,7 +101,7 @@ export function redactJsonText(text: string, isSecret: (key: string) => boolean) key = token.slice(1, -1); } if (!isSecret(key)) continue; - out += `${sep[0]}${REDACTED_VALUE}`; + out += `${sep[0]}${JSON.stringify(REDACTED)}`; i = valueEnd(text, i + sep[0].length); } return out; From 224a691ef04002eff7c42f403879283089c82876 Mon Sep 17 00:00:00 2001 From: erKam Date: Sun, 8 Nov 2026 08:20:57 +0000 Subject: [PATCH 24/37] ci: fail the docs check when code changes without docs The Docs check only left a warning, which is easy to miss on a pull request. Fail with an error annotation, as the Commit message check does. The no-docs label still lets a change through. Refs #373 --- .github/workflows/docs-check.yml | 3 ++- CONTRIBUTING.md | 2 +- apps/docs/src/content/contributing/development.md | 4 ++-- packages/devtools/CHANGELOG.md | 1 + 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docs-check.yml b/.github/workflows/docs-check.yml index fc737b77..74fec154 100644 --- a/.github/workflows/docs-check.yml +++ b/.github/workflows/docs-check.yml @@ -37,6 +37,7 @@ jobs: elif [ "$NO_DOCS" = "true" ]; then echo "Code changed without docs, marked no-docs." else - echo "::warning title=Docs not updated::This pull request changes code but no page in apps/docs/src/content. Update the docs in this pull request, or add the no-docs label and say why in the description." + echo "::error title=Docs not updated::This pull request changes code but no page in apps/docs/src/content. Update the docs in this pull request, or add the no-docs label and say why in the description." printf '%s\n' "$code" + exit 1 fi diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cd618f3f..1b6fb7eb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -29,7 +29,7 @@ By taking part you agree to the [Code of Conduct](./CODE_OF_CONDUCT.md). Report - **A new tab, RPC function or agent tool:** follow the steps in [Development setup](./apps/docs/src/content/contributing/development.md). Describe what an agent tool returns and when it is empty, and add tests. - **UI changes:** follow the [UI guidelines](docs/contributing/ui-guidelines.md). Use the theme variables, the SCSS mixins and the shared dropdown. - **Docs changes:** follow the [writing guide](./apps/docs/src/content/contributing/writing-docs.md). Run the docs site with `pnpm docs:dev`. -- **Keep the docs in step with the code:** when a pull request changes behaviour, an option, a UI label or an agent tool, update the matching page in `apps/docs` in the same pull request. If no docs change is needed, add the `no-docs` label and say why in the description. The Docs check workflow warns when code changes without docs. +- **Keep the docs in step with the code:** when a pull request changes behaviour, an option, a UI label or an agent tool, update the matching page in `apps/docs` in the same pull request. If no docs change is needed, add the `no-docs` label and say why in the description. The Docs check workflow fails when code changes without docs. ## Open an issue diff --git a/apps/docs/src/content/contributing/development.md b/apps/docs/src/content/contributing/development.md index 19c5ce9d..cc1d998c 100644 --- a/apps/docs/src/content/contributing/development.md +++ b/apps/docs/src/content/contributing/development.md @@ -251,14 +251,14 @@ To reproduce a job, add the same `overrides` block to `pnpm-workspace.yaml`, run ### Pull request checks -Two more workflows run on pull requests. A pull request title or a commit message that breaks the commit format fails `Commit message`. `Docs check` only warns. +Two more workflows run on pull requests. A pull request title or a commit message that breaks the commit format fails `Commit message`. A code change without a docs change fails `Docs check`. | Workflow | File | What it checks | | ---------------- | -------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `Commit message` | `.github/workflows/commit-message.yml` | The pull request title and every commit message. The title becomes the commit on `main` when the pull request is squash merged. A bad title or commit fails the check. | | `Docs check` | `.github/workflows/docs-check.yml` | That a change to `packages/devtools/src/`, `app/src/` or the top-level files in `extension/` also changes a page in `apps/docs/src/content`. Tests don't count. | -If a code change needs no docs change, add the `no-docs` label to the pull request and say why in the description. The `Docs check` workflow then skips the warning. +If a code change needs no docs change, add the `no-docs` label to the pull request and say why in the description. The `Docs check` workflow then passes. ## Make changes diff --git a/packages/devtools/CHANGELOG.md b/packages/devtools/CHANGELOG.md index c18f16f1..37cccee6 100644 --- a/packages/devtools/CHANGELOG.md +++ b/packages/devtools/CHANGELOG.md @@ -349,6 +349,7 @@ What remains: `/config` exports `DEFAULT_POPUP_HOTKEY`, `PANGULAR_ACTIONS`, `PAN - A CI job installs the packed package on Node.js 22.12.0, the `engines.node` floor, and loads its CLI and its `cli`, `hub`, `ssr` and `vite` entry points there (#373). - `pnpm extension:build:firefox` builds a Firefox copy of the extension into `dist/extension-firefox`, with the add-on ID and version floor under `browser_specific_settings` and without the Chrome-only manifest keys. It is not published (#342). - The `Commit message` check fails on a commit message that breaks the format, not only on a bad pull request title (#373). +- The `Docs check` fails, instead of warning, when a pull request changes code but no docs page and has no `no-docs` label (#373). - The packed `package.json` leaves out `devDependencies`, `scripts` and the `nx` block, and declares `sideEffects`. - Dependencies: devframe and `@devframes/*` 1.2.6 (was 1.2.0). `@devframes/plugin-messages`, `@devframes/plugin-terminals` and `axe-core` are added. `h3` is no longer a dependency. From cd07d16f7a54dd05cb9d73c036a84f20d74a89d7 Mon Sep 17 00:00:00 2001 From: erKam Date: Sun, 8 Nov 2026 08:25:00 +0000 Subject: [PATCH 25/37] feat(ui): link the connection error states to the troubleshooting docs The popup's No devtools server found state linked only to the setup page, and the panel's Can't reach the devtools server message had no link. Add a Troubleshooting link to the matching section of the troubleshooting page in both, on the docs site the panel already links to. Refs #373 --- app/src/__tests__/app-shell.test.ts | 16 +++++++++++++ app/src/app.ts | 24 ++++++++++++++++++- .../getting-started/troubleshooting.md | 4 ++-- packages/devtools/CHANGELOG.md | 1 + packages/devtools/src/__tests__/popup.test.ts | 7 ++++++ packages/devtools/src/panel-frame.ts | 3 +++ packages/devtools/src/popup.ts | 16 +++++++++++-- 7 files changed, 66 insertions(+), 5 deletions(-) diff --git a/app/src/__tests__/app-shell.test.ts b/app/src/__tests__/app-shell.test.ts index 5d6592ab..cf30f631 100644 --- a/app/src/__tests__/app-shell.test.ts +++ b/app/src/__tests__/app-shell.test.ts @@ -404,6 +404,22 @@ describe('App scroll memory while content loads', () => { }); }); +describe('App connection error', () => { + it('links to the troubleshooting docs when it cannot reach the server', async () => { + const fixture = TestBed.createComponent(App); + document.body.appendChild(host(fixture)); + await settle(fixture); + fixture.componentInstance.connectionFailed.set(true); + await settle(fixture); + const link = host(fixture).querySelector('.connection-error a')!; + expect(link.getAttribute('href')).toBe( + 'https://pangular-inspector.dev/getting-started/troubleshooting/#the-panel-says-disconnected', + ); + expect(link.getAttribute('rel')).toBe('noopener noreferrer'); + fixture.destroy(); + }); +}); + describe('App counts launcher setting', () => { it('sends the stored counts launcher to the popup once the panel connects', async () => { localStorage.setItem('pangular-pref:pill', 'true'); diff --git a/app/src/app.ts b/app/src/app.ts index fe8d4871..a8ea7a22 100644 --- a/app/src/app.ts +++ b/app/src/app.ts @@ -203,6 +203,10 @@ function readView(): View | null { return HUB_VIEWS.find((known) => known === view) ?? null; } +/** The docs on a panel that can't reach its server. */ +export const TROUBLESHOOTING_DOCS_URL = + 'https://pangular-inspector.dev/getting-started/troubleshooting/#the-panel-says-disconnected'; + @Component({ selector: 'app-root', host: { @@ -516,7 +520,12 @@ function readView(): View | null { Can't reach the devtools server. Check that the dev server is running. The panel keeps trying to connect.

        - +
    } @else if (!rpc()) {

    Connecting to the devtools server…

    @@ -1037,6 +1046,18 @@ function readView(): View | null { p { margin: 0 0 10px; } + .connection-actions { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 8px 16px; + } + a { + color: var(--accent); + &:focus-visible { + @include m.focus-ring; + } + } button { display: inline-flex; align-items: center; @@ -1207,6 +1228,7 @@ export class App implements OnInit, OnDestroy { private readonly openedDock = signal<{ dock: string } | null>(null); connected = signal(false); readonly connectionFailed = signal(false); + protected readonly troubleshootingUrl = TROUBLESHOOTING_DOCS_URL; /** A client the server does not trust yet: the panel asks for the one-time code. */ readonly pairing = signal(null); /** Says "Connected." once the one-time code is accepted. */ diff --git a/apps/docs/src/content/getting-started/troubleshooting.md b/apps/docs/src/content/getting-started/troubleshooting.md index fb3f9ef6..e029123f 100644 --- a/apps/docs/src/content/getting-started/troubleshooting.md +++ b/apps/docs/src/content/getting-started/troubleshooting.md @@ -39,7 +39,7 @@ With the [Vite plugin](./vite.md), `main.ts` needs no import: the plugin adds th ### No devtools server found -The overlay found no server part. It logs an error that starts with `[pangular] No devtools server found` and lists the paths it tried, and the panel says **No devtools server found**. +The overlay found no server part. It logs an error that starts with `[pangular] No devtools server found` and lists the paths it tried, and the panel says **No devtools server found**, with a **Troubleshooting** link to this section. | Cause | Fix | | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | @@ -51,7 +51,7 @@ The overlay found no server part. It logs an error that starts with `[pangular] ### The panel says Disconnected -The panel lost the server, or never reached it. It tries again after 1, 2, 5 and then every 10 seconds, so a dev server that restarts connects without a reload. Click **Retry now** to try at once. If it stays disconnected, check that the server runs and that the hub is mounted before `express.static` and the SSR handler. See [Connection status](./popup-and-hub.md#connection-status). +The panel lost the server, or never reached it. It tries again after 1, 2, 5 and then every 10 seconds, so a dev server that restarts connects without a reload. Click **Retry now** to try at once. When the panel cannot reach the server at all, its message links here under **Troubleshooting**. If it stays disconnected, check that the server runs and that the hub is mounted before `express.static` and the SSR handler. See [Connection status](./popup-and-hub.md#connection-status). If the panel does not connect at all with Hono, h3 or Fastify, the hub advertises a WebSocket that no upgrade reaches. Pass `ws: false`, pass `ws: {sidecar: true}`, or call `devtools.attach(server)`. See [Hono, h3 and Fastify](./other-servers.md#troubleshooting). diff --git a/packages/devtools/CHANGELOG.md b/packages/devtools/CHANGELOG.md index 37cccee6..4b1639fa 100644 --- a/packages/devtools/CHANGELOG.md +++ b/packages/devtools/CHANGELOG.md @@ -328,6 +328,7 @@ What remains: `/config` exports `DEFAULT_POPUP_HOTKEY`, `PANGULAR_ACTIONS`, `PAN - A Nitro task run that fails on the **Analog** tab keeps its confirm panel and payload open, so it can be fixed and run again. - Turning **Counts launcher** on or off in a popped-out panel changes the launcher on the app page that opened it. The popup takes the change only from the window it popped the panel out into. - The **Pipes** list is one Tab stop with arrow keys, Home and End, like the other lists in the panel, and in every list the Tab stop follows a row selected with a click that does not focus it, as in Safari (#370). +- The popup's **No devtools server found** state and the panel's **Can't reach the devtools server** message link to the troubleshooting docs (#373). ### Docs diff --git a/packages/devtools/src/__tests__/popup.test.ts b/packages/devtools/src/__tests__/popup.test.ts index b143cb3b..7d87ef74 100644 --- a/packages/devtools/src/__tests__/popup.test.ts +++ b/packages/devtools/src/__tests__/popup.test.ts @@ -297,6 +297,13 @@ describe.sequential('devtools popup', () => { expect(missing.querySelector('a')!.getAttribute('href')).toMatch(/^https:/); expect(missing.querySelector('h2')!.id).toBe(missing.getAttribute('aria-labelledby')); expect(missing.querySelector('a')!.textContent).toContain('opens in a new tab'); + const trouble = [...missing.querySelectorAll('a')].find((a) => + a.textContent?.startsWith('Troubleshooting'), + )!; + expect(trouble.getAttribute('href')).toBe( + 'https://pangular-inspector.dev/getting-started/troubleshooting/#no-devtools-server-found', + ); + expect(trouble.textContent).toContain('opens in a new tab'); expect(shadow.querySelector('.sr-only[role="status"]')!.textContent).toBe( 'No devtools server found', ); diff --git a/packages/devtools/src/panel-frame.ts b/packages/devtools/src/panel-frame.ts index 65222dd1..d82a7f42 100644 --- a/packages/devtools/src/panel-frame.ts +++ b/packages/devtools/src/panel-frame.ts @@ -9,6 +9,9 @@ export const POPUP_ROOT_ID = 'pangular-popup-root'; export const DEVTOOLS_BASES = ['/__devframes/pangular/', '/__pangular/', './', '/__devframe/']; export const SETUP_URL = 'https://pangular-inspector.dev/getting-started/installation/'; +/** The docs on finding the server, linked when the popup finds none. */ +export const TROUBLESHOOTING_URL = + 'https://pangular-inspector.dev/getting-started/troubleshooting/#no-devtools-server-found'; /** True in the popup's own frame, where the host app would otherwise start a second overlay. */ export function insideDevtoolsPanel(): boolean { diff --git a/packages/devtools/src/popup.ts b/packages/devtools/src/popup.ts index 99d2d7ba..c2608b2e 100644 --- a/packages/devtools/src/popup.ts +++ b/packages/devtools/src/popup.ts @@ -1,4 +1,10 @@ -import { DEVTOOLS_BASES, POPUP_ROOT_ID, SETUP_URL, insideDevtoolsPanel } from './panel-frame.ts'; +import { + DEVTOOLS_BASES, + POPUP_ROOT_ID, + SETUP_URL, + TROUBLESHOOTING_URL, + insideDevtoolsPanel, +} from './panel-frame.ts'; import { DEFAULT_POPUP_HOTKEY, matchesHotkey, normalizeHotkey } from './config.ts'; // In-page floating devtools popup. Renders an iframe pointing at the devtools SPA. @@ -431,6 +437,12 @@ export function createDevtoolsPopup(options: { src?: string; hotkey?: string | f newTab.classList.add('sr-only'); newTab.textContent = ' (opens in a new tab)'; setupLink.append(newTab); + const troubleLink = document.createElement('a'); + troubleLink.href = TROUBLESHOOTING_URL; + troubleLink.target = '_blank'; + troubleLink.rel = 'noopener noreferrer'; + troubleLink.textContent = 'Troubleshooting'; + troubleLink.append(newTab.cloneNode(true)); const retryBtn = document.createElement('button'); retryBtn.type = 'button'; retryBtn.classList.add('retry'); @@ -442,7 +454,7 @@ export function createDevtoolsPopup(options: { src?: string; hotkey?: string | f }); const missingActions = document.createElement('p'); missingActions.classList.add('missing-actions'); - missingActions.append(retryBtn, setupLink); + missingActions.append(retryBtn, setupLink, troubleLink); missing.append(missingTitle, missingHint, missingActions); // The splitter sits on the docked edge. It is a focusable separator, so the From 2e1a409746026751c6cf84fe1052ff28bd7d89fe Mon Sep 17 00:00:00 2001 From: erKam Date: Sun, 8 Nov 2026 08:26:40 +0000 Subject: [PATCH 26/37] ci: run the Vite plugin tests on Vite 6 and Vite 7 The vite peer range is >=6, but every job installs Vite 8 from the lockfile. Add a matrix job to the compatibility workflow that overrides vite in its own checkout and runs the Vite plugin tests, so a break on an older supported major shows up. Refs #373 --- .github/workflows/compat.yml | 28 +++++++++++++++++++ .../src/content/contributing/development.md | 4 +++ packages/devtools/CHANGELOG.md | 1 + 3 files changed, 33 insertions(+) diff --git a/.github/workflows/compat.yml b/.github/workflows/compat.yml index 2561a2de..8bdd044c 100644 --- a/.github/workflows/compat.yml +++ b/.github/workflows/compat.yml @@ -102,3 +102,31 @@ jobs: - name: Test the page side run: pnpm exec vitest run --root packages/devtools --config vitest.compat.config.ts + + vite: + name: Vite ${{ matrix.vite }} + runs-on: ubuntu-latest + timeout-minutes: 15 + strategy: + fail-fast: false + matrix: + # The `vite` peer range is `>=6`; the workspace installs the newest major. + vite: ['6', '7'] + steps: + - uses: actions/checkout@v7 + with: + persist-credentials: false + + - uses: ./.github/actions/setup + + - name: Install Vite ${{ matrix.vite }} + env: + VITE_MAJOR: ${{ matrix.vite }} + # Only this job's copy of the workspace changes; the committed lockfile stays as it is. + run: | + printf "\noverrides:\n vite: '^%s.0.0'\n" "$VITE_MAJOR" >> pnpm-workspace.yaml + pnpm install --no-frozen-lockfile + echo "- vite $(node -p "require('vite/package.json').version")" | tee -a "$GITHUB_STEP_SUMMARY" + + - name: Test the Vite plugin + run: pnpm exec vitest run --root packages/devtools src/__tests__/vite- src/__tests__/lan-address.test.ts diff --git a/apps/docs/src/content/contributing/development.md b/apps/docs/src/content/contributing/development.md index cc1d998c..6b95b9ff 100644 --- a/apps/docs/src/content/contributing/development.md +++ b/apps/docs/src/content/contributing/development.md @@ -249,6 +249,10 @@ Each job appends `overrides` for the `@angular/*` runtime packages to `pnpm-work To reproduce a job, add the same `overrides` block to `pnpm-workspace.yaml`, run `pnpm install --no-frozen-lockfile`, then `pnpm exec vitest run --root packages/devtools --config vitest.compat.config.ts`. For Angular 12, run the ngcc step from the workflow before the tests. Do this in a copy of the repository, and don't commit the changed lockfile. +### Vite compatibility + +The same workflow has a `Vite` job for each Vite major the `vite` peer range allows below the one the workspace installs: Vite 6 and Vite 7. Each one appends a `vite` override to `pnpm-workspace.yaml`, reinstalls, and runs the Vite plugin tests (`src/__tests__/vite-*.test.ts` and `lan-address.test.ts`). To reproduce it, add `overrides: {vite: '^6.0.0'}` the same way and run `pnpm exec vitest run --root packages/devtools src/__tests__/vite- src/__tests__/lan-address.test.ts`. + ### Pull request checks Two more workflows run on pull requests. A pull request title or a commit message that breaks the commit format fails `Commit message`. A code change without a docs change fails `Docs check`. diff --git a/packages/devtools/CHANGELOG.md b/packages/devtools/CHANGELOG.md index 4b1639fa..a2c9db27 100644 --- a/packages/devtools/CHANGELOG.md +++ b/packages/devtools/CHANGELOG.md @@ -350,6 +350,7 @@ What remains: `/config` exports `DEFAULT_POPUP_HOTKEY`, `PANGULAR_ACTIONS`, `PAN - A CI job installs the packed package on Node.js 22.12.0, the `engines.node` floor, and loads its CLI and its `cli`, `hub`, `ssr` and `vite` entry points there (#373). - `pnpm extension:build:firefox` builds a Firefox copy of the extension into `dist/extension-firefox`, with the add-on ID and version floor under `browser_specific_settings` and without the Chrome-only manifest keys. It is not published (#342). - The `Commit message` check fails on a commit message that breaks the format, not only on a bad pull request title (#373). +- The compatibility workflow runs the Vite plugin tests on Vite 6 and Vite 7, the majors the `vite` peer range allows below the installed one (#373). - The `Docs check` fails, instead of warning, when a pull request changes code but no docs page and has no `no-docs` label (#373). - The packed `package.json` leaves out `devDependencies`, `scripts` and the `nx` block, and declares `sideEffects`. - Dependencies: devframe and `@devframes/*` 1.2.6 (was 1.2.0). `@devframes/plugin-messages`, `@devframes/plugin-terminals` and `axe-core` are added. `h3` is no longer a dependency. From adfbf7360aa47beee86391d3c4c88a49e9125842 Mon Sep 17 00:00:00 2001 From: erKam Date: Sun, 8 Nov 2026 08:31:06 +0000 Subject: [PATCH 27/37] docs: generate an Angular debug API version table from debug-api.ts The first Angular version of each window.ng function lived only in the @since tags of NgDebugApi. pnpm docs:api now writes an Angular debug API page from them with the API reference, and the API reference test fails when the page is stale. Refs #373 --- apps/docs/api-reference.spec.ts | 15 ++++ apps/docs/api-reference.ts | 4 +- apps/docs/debug-api-compat.ts | 79 +++++++++++++++++++ .../docs/src/content/api/angular-debug-api.md | 42 ++++++++++ apps/docs/src/content/api/index.md | 2 +- apps/docs/src/ngmd.config.ts | 1 + packages/devtools/CHANGELOG.md | 1 + 7 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 apps/docs/debug-api-compat.ts create mode 100644 apps/docs/src/content/api/angular-debug-api.md diff --git a/apps/docs/api-reference.spec.ts b/apps/docs/api-reference.spec.ts index 57a1f166..7fb3dc54 100644 --- a/apps/docs/api-reference.spec.ts +++ b/apps/docs/api-reference.spec.ts @@ -2,6 +2,7 @@ import {readFileSync, readdirSync} from 'node:fs'; import {join, resolve} from 'node:path'; import * as prettier from 'prettier'; import {API_DIR, readApiEntries, renderApiReference} from './api-reference'; +import {readDebugApi} from './debug-api-compat'; const docsRoot = import.meta.dirname; const repoRoot = resolve(docsRoot, '../..'); @@ -27,6 +28,20 @@ describe('API reference', () => { expect(entries.some((entry) => entry.slug.startsWith('internal-'))).toBe(false); }, 60_000); + it('lists every debug API function with the version its @since tag names', () => { + const fns = readDebugApi(repoRoot); + expect(fns.find((fn) => fn.name === 'getComponent')).toMatchObject({ + since: '12.0', + required: true, + }); + expect(fns.find((fn) => fn.name === 'ɵgetSignalGraph')).toMatchObject({ + since: '19.1', + required: false, + }); + expect(fns.find((fn) => fn.name === 'ɵgetTransferState')?.since).toBeUndefined(); + expect(fns.every((fn) => !fn.summary.includes('@since'))).toBe(true); + }, 60_000); + it('names the package root as an alias of the entry point it loads', () => { const entries = readApiEntries(repoRoot); const devframe = entries.find((entry) => entry.slug === 'devframe'); diff --git a/apps/docs/api-reference.ts b/apps/docs/api-reference.ts index 4181d68d..313a5a9d 100644 --- a/apps/docs/api-reference.ts +++ b/apps/docs/api-reference.ts @@ -1,6 +1,7 @@ import {readFileSync} from 'node:fs'; import {join, posix} from 'node:path'; import {Node, Project, ts, type JSDoc} from 'ts-morph'; +import {DEBUG_API_PAGE, renderDebugApiCompat} from './debug-api-compat.ts'; /** * Builds the API reference pages in `src/content/api/` from the public entry @@ -243,7 +244,7 @@ export function renderApiIndex(entries: ApiEntry[]): string { '', '# API reference', '', - 'Each entry point of `@pangular-inspector/devtools` has a page with every symbol it exports, its declaration and its JSDoc. The pages are generated from the package source, so names and types match the published code. [Installation](../getting-started/installation.md#entry-points) says what each entry point is for, and [Configuration](../getting-started/configuration.md) explains the options.', + 'Each entry point of `@pangular-inspector/devtools` has a page with every symbol it exports, its declaration and its JSDoc. The pages are generated from the package source, so names and types match the published code. [Installation](../getting-started/installation.md#entry-points) says what each entry point is for, and [Configuration](../getting-started/configuration.md) explains the options. [Angular debug API](./angular-debug-api.md) lists the `window.ng` functions the overlay reads and the Angular version each one needs.', '', '| Entry point | Exports |', '| ----------- | ------- |', @@ -257,5 +258,6 @@ export function renderApiReference(repoRoot: string, githubUrl: string): Map([['index.md', renderApiIndex(entries)]]); for (const entry of entries) pages.set(`${entry.slug}.md`, renderApiPage(entry, githubUrl)); + pages.set(DEBUG_API_PAGE, renderDebugApiCompat(repoRoot, githubUrl)); return pages; } diff --git a/apps/docs/debug-api-compat.ts b/apps/docs/debug-api-compat.ts new file mode 100644 index 00000000..bf0cdacf --- /dev/null +++ b/apps/docs/debug-api-compat.ts @@ -0,0 +1,79 @@ +/** + * The Angular debug API page: every `window.ng` function the overlay reads, + * from the `NgDebugApi` interface in `packages/devtools/src/debug-api.ts`, + * with the first Angular version its `@since` tag names. `pnpm docs:api` + * writes it with the API reference pages. + */ +import {join} from 'node:path'; +import {Node, Project} from 'ts-morph'; + +export const DEBUG_API_PAGE = 'angular-debug-api.md'; +const SOURCE = 'packages/devtools/src/debug-api.ts'; + +export interface DebugApiFunction { + name: string; + /** The first Angular version that publishes it, from `@since`. */ + since?: string; + /** Every supported version publishes it, so the overlay needs it. */ + required: boolean; + /** The doc comment without its `@since` tag. */ + summary: string; +} + +/** The functions of `NgDebugApi`, in the order the interface declares them. */ +export function readDebugApi(repoRoot: string): DebugApiFunction[] { + const project = new Project({skipAddingFilesFromTsConfig: true}); + const file = project.addSourceFileAtPath(join(repoRoot, SOURCE)); + const api = file.getInterfaceOrThrow('NgDebugApi'); + return api.getMembers().flatMap((member) => { + if (!Node.isMethodSignature(member) && !Node.isPropertySignature(member)) return []; + // A one-line doc comment keeps `@since` inline, where the parser sees no tag. + const text = member + .getJsDocs() + .map((doc) => doc.getInnerText()) + .join(' ') + .replace(/\s+/g, ' ') + .trim(); + const since = text.match(/@since\s+(\d+(?:\.\d+)*)/)?.[1]; + return [ + { + name: member.getName(), + ...(since ? {since} : {}), + required: !member.hasQuestionToken(), + summary: text.replace(/\s*@since\s+\S+/, '').trim(), + }, + ]; + }); +} + +function cell(text: string): string { + return text.replace(/\|/g, '\\|'); +} + +export function renderDebugApiCompat(repoRoot: string, githubUrl: string): string { + const rows = readDebugApi(repoRoot).map( + (fn) => + `| \`${fn.name}\` | ${fn.since ?? 'See note'} | ${fn.required ? 'Yes' : 'No'} | ${cell(fn.summary)} |`, + ); + return [ + '---', + 'title: Angular debug API', + "description: 'The window.ng functions the overlay reads and the first Angular version that publishes each one, generated from the package source.'", + '---', + '', + '', + ' The window.ng functions the overlay reads, and the Angular version each one needs.', + '', + '', + '# Angular debug API', + '', + `The overlay reads live data through the debug API Angular publishes on \`window.ng\` in development builds. This page is generated from \`NgDebugApi\` in [\`${SOURCE}\`](${githubUrl}/blob/main/${SOURCE}). Run \`pnpm docs:api\` after you change it.`, + '', + 'A required function is one every supported Angular version publishes, so the overlay needs it. The overlay checks the others on the page at runtime, and a tab whose feature needs a missing one says which Angular version it needs. **See note** marks a function with no single first version; its description says when the overlay uses it. See [Tested versions](../getting-started/installation.md#tested-versions).', + '', + '| Function | Since | Required | What it does |', + '| -------- | ----- | -------- | ------------ |', + ...rows, + '', + ].join('\n'); +} diff --git a/apps/docs/src/content/api/angular-debug-api.md b/apps/docs/src/content/api/angular-debug-api.md new file mode 100644 index 00000000..28c6d543 --- /dev/null +++ b/apps/docs/src/content/api/angular-debug-api.md @@ -0,0 +1,42 @@ +--- +title: Angular debug API +description: 'The window.ng functions the overlay reads and the first Angular version that publishes each one, generated from the package source.' +--- + + + The window.ng functions the overlay reads, and the Angular version each one needs. + + +# Angular debug API + +The overlay reads live data through the debug API Angular publishes on `window.ng` in development builds. This page is generated from `NgDebugApi` in [`packages/devtools/src/debug-api.ts`](https://github.com/pangular-inspector/devtools/blob/main/packages/devtools/src/debug-api.ts). Run `pnpm docs:api` after you change it. + +A required function is one every supported Angular version publishes, so the overlay needs it. The overlay checks the others on the page at runtime, and a tab whose feature needs a missing one says which Angular version it needs. **See note** marks a function with no single first version; its description says when the overlay uses it. See [Tested versions](../getting-started/installation.md#tested-versions). + +| Function | Since | Required | What it does | +| --------------------------------- | -------- | -------- | ---------------------------------------------------------------------------------------------------------------------------- | +| `getComponent` | 12.0 | Yes | The component whose host is `element`, or `null`. | +| `getContext` | 12.0 | Yes | The template context of an embedded view, or the component. | +| `getOwningComponent` | 12.0 | Yes | The component whose template holds `elementOrDir`. | +| `getRootComponents` | 12.0 | Yes | The root components of the app that holds `elementOrDir`. | +| `getInjector` | 12.0 | Yes | The element injector (`Injector.NULL` outside Angular). | +| `getDirectives` | 12.0 | Yes | Directives on a node, components included. | +| `getDirectiveMetadata` | 12.0 | Yes | Inputs, outputs, encapsulation and change detection of an instance. | +| `getHostElement` | 12.0 | Yes | The host element of a component or directive instance. | +| `getListeners` | 12.0 | Yes | DOM and output listeners of an element. | +| `applyChanges` | 12.0 | Yes | Marks a component for check and runs change detection. | +| `isSignal` | 17.1 | No | Whether a value is a signal. | +| `enableProfiling` | 20.0 | No | Turns on Angular's own Chrome Performance track and hands back the stop function. | +| `ɵgetDependenciesFromInjectable` | 16.2 | No | Dependencies a token injected from `injector`. | +| `ɵgetInjectorProviders` | 16.2 | No | Providers registered on an injector. | +| `ɵgetInjectorResolutionPath` | 16.2 | No | The injectors a lookup walks from `injector` up. | +| `ɵgetInjectorMetadata` | 17.0 | No | Type (`element`, `environment` or `null`) and source of an injector. | +| `ɵsetProfiler` | See note | No | Adds a profiler. From 20.0 it hands back its remover; before that it has one slot (`ng-capabilities.ts` checks the version). | +| `ɵgetSignalGraph` | 19.1 | No | The reactive graph of an injector. Node ids from 20.1. | +| `ɵgetDeferBlocks` | 19.1 | No | `@defer` blocks under a node. Replaced by `ɵgetControlFlowBlocks` in 22.0. | +| `ɵgetControlFlowBlocks` | 22.0 | No | `@defer` and `@for` blocks under a node. | +| `ɵgetTransferState` | See note | No | The TransferState entries without Angular's own hydration keys. Present in 22.1; not checked on older versions. | +| `ɵgetComponentInstanceDeepLinkId` | See note | No | The id a component instance has in Angular DevTools deep links. Present in 22.1; not checked on older versions. | +| `ɵgetRouterInstance` | 20.3 | No | The router of the app, published by `provideRouter()`. | +| `ɵgetLoadedRoutes` | 20.3 | No | Router-loaded routes of a route config. | +| `ɵnavigateByUrl` | 20.3 | No | Navigates the router of an injector. | diff --git a/apps/docs/src/content/api/index.md b/apps/docs/src/content/api/index.md index c496f646..d3b018ef 100644 --- a/apps/docs/src/content/api/index.md +++ b/apps/docs/src/content/api/index.md @@ -9,7 +9,7 @@ description: 'The public entry points of @pangular-inspector/devtools and the sy # API reference -Each entry point of `@pangular-inspector/devtools` has a page with every symbol it exports, its declaration and its JSDoc. The pages are generated from the package source, so names and types match the published code. [Installation](../getting-started/installation.md#entry-points) says what each entry point is for, and [Configuration](../getting-started/configuration.md) explains the options. +Each entry point of `@pangular-inspector/devtools` has a page with every symbol it exports, its declaration and its JSDoc. The pages are generated from the package source, so names and types match the published code. [Installation](../getting-started/installation.md#entry-points) says what each entry point is for, and [Configuration](../getting-started/configuration.md) explains the options. [Angular debug API](./angular-debug-api.md) lists the `window.ng` functions the overlay reads and the Angular version each one needs. | Entry point | Exports | | ---------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | diff --git a/apps/docs/src/ngmd.config.ts b/apps/docs/src/ngmd.config.ts index 6d389cf6..907122d7 100644 --- a/apps/docs/src/ngmd.config.ts +++ b/apps/docs/src/ngmd.config.ts @@ -271,6 +271,7 @@ const config: NgmdConfig = { label: 'API reference', items: [ {label: 'API reference', href: '/api', status: 'new', until: '1.2.0'}, + {label: 'Angular debug API', href: '/api/angular-debug-api'}, {label: 'devframe', href: '/api/devframe'}, {label: 'config', href: '/api/config'}, {label: 'cd-data', href: '/api/cd-data'}, diff --git a/packages/devtools/CHANGELOG.md b/packages/devtools/CHANGELOG.md index a2c9db27..f042925b 100644 --- a/packages/devtools/CHANGELOG.md +++ b/packages/devtools/CHANGELOG.md @@ -340,6 +340,7 @@ What remains: `/config` exports `DEFAULT_POPUP_HOTKEY`, `PANGULAR_ACTIONS`, `PAN - The Express and other servers pages say which port the WebSocket side-car uses (the first free one from 9777), how to pin it with `ws: {port}`, and how to serve the socket on the app's own server with `attach(server)` (#426). - A **Renamed tools** table in the agent tools page, and the public API and the supported versions in the publishing guide. - Corrected guides and samples from the readiness review: the Vite auth default in the Analog guide and the glossary, JSON samples without a path comment, no separate devframe install in the package README, and `ws: false` for a panel-only devframe host. +- The API reference has an **Angular debug API** page: each `window.ng` function the overlay reads and the first Angular version that publishes it, generated from the `@since` tags in `debug-api.ts` by `pnpm docs:api` (#373). ### Release and CI From 90d6028c7e664fb4c7034538c0fb0a0f0b3b0e30 Mon Sep 17 00:00:00 2001 From: erKam Date: Sun, 8 Nov 2026 08:31:40 +0000 Subject: [PATCH 28/37] docs: list Ionic and the Firefox build as available platforms Ionic page stacks show on the Capacitor tab and the extension has a Firefox build, but the platforms page and the roadmap still listed both as planned. Move them to the supported platforms with links to the Ionic page stacks and the Firefox build steps. Refs #307 --- .../src/content/getting-started/platforms.md | 37 +++++++++---------- apps/docs/src/content/roadmap.md | 9 ++--- 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/apps/docs/src/content/getting-started/platforms.md b/apps/docs/src/content/getting-started/platforms.md index 011e8979..9f23bc50 100644 --- a/apps/docs/src/content/getting-started/platforms.md +++ b/apps/docs/src/content/getting-started/platforms.md @@ -13,24 +13,25 @@ The devtools read a running Angular app through its debug API, wherever it rende ## Supported platforms -| Platform | How it reports | How it is checked | Set up | -| ---------------------------- | ------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ | -| Browser | The browser overlay, loaded in `main.ts` or by the Vite plugin | CI and the weekly install check, in Chromium | [Installation](./installation.md) | -| Chrome DevTools | The [Chrome extension](./chrome-extension.md) shows the panel for a page that already runs the overlay | Package tests of the extension bridge. You build and load the extension from the repository | [Chrome extension](./chrome-extension.md) | -| Capacitor and Ionic WebViews | The browser overlay in the WebView, or `overlay-manual` in a bundled build | Android emulators and the iOS simulator. Checks on real phones are tracked in [#337](https://github.com/pangular-inspector/devtools/issues/337) | [Set up Capacitor](../guides/capacitor.md) | -| NativeScript | `overlay-nativescript`, over a WebSocket | The demo in `examples/nativescript` on the iOS simulator. Android is untested | [NativeScript](./nativescript.md) | -| Angular Native | `overlay-angular-native`, over a WebSocket | Package tests against a simulated view tree. No automated test runs the demo on a device | [Angular Native](./angular-native.md) | +| Platform | How it reports | How it is checked | Set up | +| ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | +| Browser | The browser overlay, loaded in `main.ts` or by the Vite plugin | CI and the weekly install check, in Chromium | [Installation](./installation.md) | +| Chrome DevTools | The [Chrome extension](./chrome-extension.md) shows the panel for a page that already runs the overlay | Package tests of the extension bridge. You build and load the extension from the repository | [Chrome extension](./chrome-extension.md) | +| Firefox DevTools | A Firefox build of the extension, for a page that already runs the overlay | Package tests of the manifest it writes. CI does not build it, and you load it as a temporary add-on | [Build for Firefox](../contributing/chrome-extension.md#build-for-firefox) | +| Capacitor and Ionic WebViews | The browser overlay in the WebView, or `overlay-manual` in a bundled build. Ionic page stacks show on the [Capacitor tab](../inspectors/capacitor.md#ionic-page-stacks) | Android emulators and the iOS simulator. Checks on real phones are tracked in [#337](https://github.com/pangular-inspector/devtools/issues/337) | [Set up Capacitor](../guides/capacitor.md) | +| NativeScript | `overlay-nativescript`, over a WebSocket | The demo in `examples/nativescript` on the iOS simulator. Android is untested | [NativeScript](./nativescript.md) | +| Angular Native | `overlay-angular-native`, over a WebSocket | Package tests against a simulated view tree. No automated test runs the demo on a device | [Angular Native](./angular-native.md) | A platform without a DOM has no picker, no axe pass and no Router, Forms or SSR & HTTP data. The NativeScript and Angular Native pages list [what needs a browser](./nativescript.md#what-needs-a-browser). ## How a platform shows in the panel -| Platform | Where its data shows | -| -------------- | ------------------------------------------------------------------------------------ | -| Browser | Every tab, scoped to the page you pick. | -| Capacitor | Every tab, like a browser tab, and the **Capacitor** tab for plugin calls. | -| NativeScript | The tabs it fills, in the **Angular** dock or the CLI panel without `?view`. | -| Angular Native | The **Angular Native** view (`?view=angular-native`), and the panel without `?view`. | +| Platform | Where its data shows | +| -------------- | ------------------------------------------------------------------------------------------------ | +| Browser | Every tab, scoped to the page you pick. | +| Capacitor | Every tab, like a browser tab, and the **Capacitor** tab for plugin calls and Ionic page stacks. | +| NativeScript | The tabs it fills, in the **Angular** dock or the CLI panel without `?view`. | +| Angular Native | The **Angular Native** view (`?view=angular-native`), and the panel without `?view`. | The hub's **NativeScript** dock always shows the setup steps and a link to the setup page. The **Capacitor** dock shows them while no Capacitor app reports, and the **Angular Native** view says **No Angular Native app is connected** while none does. `list-pages` gives each page's platform to agents. See [list-pages](../agents/tools.md#list-pages). @@ -38,12 +39,10 @@ The hub's **NativeScript** dock always shows the setup steps and a link to the s Plans follow feedback. To ask for a platform, or to move one up, comment on its issue. -| Platform or channel | What it adds | Issue | -| --------------------------------- | -------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | -| Ionic | Ionic apps on top of the Capacitor support, and what only Ionic has, such as its page stack. | [#307](https://github.com/pangular-inspector/devtools/issues/307) | -| Other app frameworks | One core and an adapter per framework, after the mobile platforms. | [#307](https://github.com/pangular-inspector/devtools/issues/307) | -| Chrome Web Store and Edge Add-ons | The extension installed from a store, instead of built from the repository. | [#342](https://github.com/pangular-inspector/devtools/issues/342) | -| Firefox | A build of the extension for Firefox. | [#342](https://github.com/pangular-inspector/devtools/issues/342) | +| Platform or channel | What it adds | Issue | +| --------------------------------- | --------------------------------------------------------------------------- | ----------------------------------------------------------------- | +| Other app frameworks | One core and an adapter per framework, after the mobile platforms. | [#307](https://github.com/pangular-inspector/devtools/issues/307) | +| Chrome Web Store and Edge Add-ons | The extension installed from a store, instead of built from the repository. | [#342](https://github.com/pangular-inspector/devtools/issues/342) | The [roadmap](../roadmap.md) lists the rest of the planned work. diff --git a/apps/docs/src/content/roadmap.md b/apps/docs/src/content/roadmap.md index 01803b3f..9fc7373d 100644 --- a/apps/docs/src/content/roadmap.md +++ b/apps/docs/src/content/roadmap.md @@ -80,11 +80,10 @@ Tracked in [#343](https://github.com/pangular-inspector/devtools/issues/343) (do These items remain from phase 3, [#342](https://github.com/pangular-inspector/devtools/issues/342). -| Item | What it does | Issue | -| ---------------- | ----------------------------------------------------------------------------------- | ----------------------------------------------------------------- | -| `ng add` | One command sets up the overlay and the hub in an Angular CLI app. | [#342](https://github.com/pangular-inspector/devtools/issues/342) | -| Extension stores | The Chrome extension in the Chrome Web Store and Edge Add-ons, and a Firefox build. | [#342](https://github.com/pangular-inspector/devtools/issues/342) | -| Ionic support | Ionic apps, on top of the Capacitor support. | [#307](https://github.com/pangular-inspector/devtools/issues/307) | +| Item | What it does | Issue | +| ---------------- | ------------------------------------------------------------------ | ----------------------------------------------------------------- | +| `ng add` | One command sets up the overlay and the hub in an Angular CLI app. | [#342](https://github.com/pangular-inspector/devtools/issues/342) | +| Extension stores | The Chrome extension in the Chrome Web Store and Edge Add-ons. | [#342](https://github.com/pangular-inspector/devtools/issues/342) | [Platforms](./getting-started/platforms.md#planned) lists the planned platforms and extension stores together. From 7c64aa61c25d3ba7adda781606d05c4ef75fda21 Mon Sep 17 00:00:00 2001 From: erKam Date: Sun, 8 Nov 2026 08:36:23 +0000 Subject: [PATCH 29/37] refactor: keep the changed files under their line limits The fixes on this branch pushed app.ts, component-tree.ts, signal-inspector.ts, popup.ts and devframe.ts past the line counts in lint-baseline.json. Move the panel's connection error into its own component, the Signals graph types into a types file and the popup's new-tab links into a helper, shorten the pipe-usages resource, and lower the baseline where files shrank. --- app/src/app.ts | 64 +--------------- app/src/pages/component-tree.ts | 4 +- app/src/pages/signal-inspector.ts | 50 +----------- app/src/types/signal-graph.types.ts | 49 ++++++++++++ app/src/ui/connection-error.ts | 76 +++++++++++++++++++ lint-baseline.json | 10 +-- .../src/__tests__/ngrx-collector.test.ts | 2 +- packages/devtools/src/devframe.ts | 17 ++--- packages/devtools/src/panel-frame.ts | 3 - packages/devtools/src/popup-links.ts | 17 +++++ packages/devtools/src/popup.ts | 35 ++------- 11 files changed, 168 insertions(+), 159 deletions(-) create mode 100644 app/src/types/signal-graph.types.ts create mode 100644 app/src/ui/connection-error.ts create mode 100644 packages/devtools/src/popup-links.ts diff --git a/app/src/app.ts b/app/src/app.ts index a8ea7a22..7de874a8 100644 --- a/app/src/app.ts +++ b/app/src/app.ts @@ -52,6 +52,7 @@ import { initialTab, storeTab, storedTab } from './tab-memory'; import { detectBaseURL } from './base-url'; import { panelAuth } from './auth-token'; import { AuthCode } from './ui/auth-code'; +import { ConnectionError } from './ui/connection-error'; import { clearHighlightsOnHide, forgetDevframeConnection, panelCacheOptions, rpcTry } from './rpc'; import { EditorOpener } from './ui/source-link'; import { ViewMemory, restoreScroll } from './view-memory'; @@ -203,10 +204,6 @@ function readView(): View | null { return HUB_VIEWS.find((known) => known === view) ?? null; } -/** The docs on a panel that can't reach its server. */ -export const TROUBLESHOOTING_DOCS_URL = - 'https://pangular-inspector.dev/getting-started/troubleshooting/#the-panel-says-disconnected'; - @Component({ selector: 'app-root', host: { @@ -240,6 +237,7 @@ export const TROUBLESHOOTING_DOCS_URL = Settings, CommandPalette, AuthCode, + ConnectionError, ], template: `
    @@ -515,18 +513,7 @@ export const TROUBLESHOOTING_DOCS_URL = } @else if (pairing(); as client) { } @else if (connectionFailed()) { - + } @else if (!rpc()) {

    Connecting to the devtools server…

    } @else if (comingSoon(); as info) { @@ -1035,50 +1022,6 @@ export const TROUBLESHOOTING_DOCS_URL = .turned-off code { font-family: var(--font-mono); } - .connection-error { - max-width: 60ch; - margin: 0; - padding: 12px 14px; - border: 1px solid color-mix(in srgb, var(--danger) 36%, transparent); - border-radius: var(--radius); - background: var(--surface); - color: var(--text); - p { - margin: 0 0 10px; - } - .connection-actions { - display: flex; - flex-wrap: wrap; - align-items: center; - gap: 8px 16px; - } - a { - color: var(--accent); - &:focus-visible { - @include m.focus-ring; - } - } - button { - display: inline-flex; - align-items: center; - height: var(--control-h); - padding: 0 14px; - border: 1px solid var(--control-border); - border-radius: var(--radius-sm); - background: var(--surface-2); - color: var(--text); - font: inherit; - font-weight: 500; - cursor: pointer; - &:hover { - background: var(--surface-3); - border-color: var(--accent-line); - } - &:focus-visible { - @include m.focus-ring; - } - } - } @media (max-width: 720px) { header { flex-wrap: wrap; @@ -1228,7 +1171,6 @@ export class App implements OnInit, OnDestroy { private readonly openedDock = signal<{ dock: string } | null>(null); connected = signal(false); readonly connectionFailed = signal(false); - protected readonly troubleshootingUrl = TROUBLESHOOTING_DOCS_URL; /** A client the server does not trust yet: the panel asks for the one-time code. */ readonly pairing = signal(null); /** Says "Connected." once the one-time code is accepted. */ diff --git a/app/src/pages/component-tree.ts b/app/src/pages/component-tree.ts index b2d1f813..94826039 100644 --- a/app/src/pages/component-tree.ts +++ b/app/src/pages/component-tree.ts @@ -46,7 +46,6 @@ import { CdRecording, type CdPage } from './cd-recording'; import type { ComponentFocus } from '../types/component-focus.types'; import type { ComponentCommand } from '../types/component-command.types'; import type { InjectorFocus } from '../types/injector-focus.types'; -import type { PipeFocus } from '../types/pipe-focus.types'; import type { SignalFocus } from '../types/signal-focus.types'; import { componentJson, hostPathText } from './component-copy'; import { ValueFlash, flashKey } from './component-value-flash'; @@ -1886,7 +1885,7 @@ export class ComponentTree { /** Whether the Pipes inspector is on, so the detail lists the template's pipes. */ readonly canShowPipes = input(false); /** Opens the Pipes tab on the pipe with this name, for the page the tree shows. */ - readonly showPipe = output(); + readonly showPipe = output<{ name: string; pageId?: string }>(); readonly showInjector = output(); /** Whether the Signals tab is on, so "Show in Signals" can open it. */ readonly canShowSignals = input(false); @@ -2688,7 +2687,6 @@ export class ComponentTree { private say(message: string) { this.pickMessage.set(message); - // A repeated message, such as "The page did not move.", is read out again. this.announce(message); } diff --git a/app/src/pages/signal-inspector.ts b/app/src/pages/signal-inspector.ts index 58050841..926ae0c8 100644 --- a/app/src/pages/signal-inspector.ts +++ b/app/src/pages/signal-inspector.ts @@ -30,11 +30,8 @@ import type { SignalFocus } from '../types/signal-focus.types'; import { SignalGraphView } from './signal-graph-view'; import { SearchField } from '../ui/search-field'; import { jsonDiff, type JsonDiffEntry } from './json-diff'; -import type { - SignalChange, - SignalGraphElement, - SignalGraphNode, -} from '@pangular-inspector/devtools/internal/types'; +import type { GraphInjector, SignalGraph, SignalResource } from '../types/signal-graph.types'; +import type { SignalChange, SignalGraphNode } from '@pangular-inspector/devtools/internal/types'; type SignalNode = SignalGraphNode; @@ -44,49 +41,6 @@ interface RestoreResult { error?: string; } -interface SignalEdge { - consumer: number; - producer: number; -} - -interface SignalResource { - id: string; - name: string; - named: boolean; - status?: string; - isLoading?: boolean; - params?: unknown; - value?: unknown; - error?: unknown; - statusCode?: number; - epoch: number; - changes?: number; - nodeIds: string[]; -} - -interface GraphInjector { - id: string; - name: string; -} - -interface SignalGraph { - nodes: SignalNode[]; - edges: SignalEdge[]; - componentSelector?: string; - component?: { id: string; name: string; tag: string; path: string }; - injector?: GraphInjector; - element?: SignalGraphElement; - environments?: GraphInjector[]; - resources?: SignalResource[]; - nodeCount?: number; - unsupported?: boolean; - writeHook?: false; - source?: 'selected' | 'routed' | 'root'; - pageId?: string; - history?: Record; - watch?: { ids: string[]; stacks: boolean }; -} - interface LiveNode { id: string; name: string; diff --git a/app/src/types/signal-graph.types.ts b/app/src/types/signal-graph.types.ts new file mode 100644 index 00000000..c8fbb3a4 --- /dev/null +++ b/app/src/types/signal-graph.types.ts @@ -0,0 +1,49 @@ +import type { + SignalChange, + SignalGraphElement, + SignalGraphNode, +} from '@pangular-inspector/devtools/internal/types'; + +export interface SignalEdge { + consumer: number; + producer: number; +} + +export interface SignalResource { + id: string; + name: string; + named: boolean; + status?: string; + isLoading?: boolean; + params?: unknown; + value?: unknown; + error?: unknown; + statusCode?: number; + epoch: number; + changes?: number; + nodeIds: string[]; +} + +export interface GraphInjector { + id: string; + name: string; +} + +/** The signal graph of one page, as the Signals tab reads it from the `signal-graph` state. */ +export interface SignalGraph { + nodes: SignalGraphNode[]; + edges: SignalEdge[]; + componentSelector?: string; + component?: { id: string; name: string; tag: string; path: string }; + injector?: GraphInjector; + element?: SignalGraphElement; + environments?: GraphInjector[]; + resources?: SignalResource[]; + nodeCount?: number; + unsupported?: boolean; + writeHook?: false; + source?: 'selected' | 'routed' | 'root'; + pageId?: string; + history?: Record; + watch?: { ids: string[]; stacks: boolean }; +} diff --git a/app/src/ui/connection-error.ts b/app/src/ui/connection-error.ts new file mode 100644 index 00000000..4ccf247b --- /dev/null +++ b/app/src/ui/connection-error.ts @@ -0,0 +1,76 @@ +import { Component, output } from '@angular/core'; + +/** The docs on a panel that can't reach its server. */ +export const TROUBLESHOOTING_DOCS_URL = + 'https://pangular-inspector.dev/getting-started/troubleshooting/#the-panel-says-disconnected'; + +/** What the panel shows while it can't reach the devtools server. */ +@Component({ + selector: 'app-connection-error', + template: ` + + `, + styles: ` + @use 'mixins' as m; + + .connection-error { + max-width: 60ch; + margin: 0; + padding: 12px 14px; + border: 1px solid color-mix(in srgb, var(--danger) 36%, transparent); + border-radius: var(--radius); + background: var(--surface); + color: var(--text); + p { + margin: 0 0 10px; + } + .connection-actions { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 8px 16px; + } + a { + color: var(--accent); + &:focus-visible { + @include m.focus-ring; + } + } + button { + display: inline-flex; + align-items: center; + height: var(--control-h); + padding: 0 14px; + border: 1px solid var(--control-border); + border-radius: var(--radius-sm); + background: var(--surface-2); + color: var(--text); + font: inherit; + font-weight: 500; + cursor: pointer; + &:hover { + background: var(--surface-3); + border-color: var(--accent-line); + } + &:focus-visible { + @include m.focus-ring; + } + } + } + `, +}) +export class ConnectionError { + readonly retry = output(); + protected readonly docsUrl = TROUBLESHOOTING_DOCS_URL; +} diff --git a/lint-baseline.json b/lint-baseline.json index 96857841..6104e650 100644 --- a/lint-baseline.json +++ b/lint-baseline.json @@ -12,7 +12,7 @@ "eslint(no-setter-return)": 1 }, "app/src/app.ts": { - "pangular(max-lines)": 1999 + "pangular(max-lines)": 1980 }, "app/src/pages/analog-inspector.ts": { "pangular(max-lines)": 2743 @@ -27,10 +27,10 @@ "pangular(max-lines)": 3143 }, "app/src/pages/pipes-inspector.ts": { - "pangular(max-lines)": 1612 + "pangular(max-lines)": 1606 }, "app/src/pages/signal-inspector.ts": { - "pangular(max-lines)": 2547 + "pangular(max-lines)": 2514 }, "app/src/pages/store-inspector.ts": { "pangular(max-lines)": 2870 @@ -235,7 +235,7 @@ "unicorn(no-useless-spread)": 1 }, "packages/devtools/src/devframe.ts": { - "pangular(max-lines)": 3238, + "pangular(max-lines)": 3236, "unicorn(no-useless-spread)": 1 }, "packages/devtools/src/dom-diff.ts": { @@ -283,7 +283,7 @@ "unicorn(no-useless-spread)": 2 }, "packages/devtools/src/ngrx-collector.ts": { - "pangular(max-lines)": 1958, + "pangular(max-lines)": 1954, "typescript(no-explicit-any)": 1, "unicorn(no-useless-fallback-in-spread)": 1, "unicorn(no-useless-spread)": 3 diff --git a/packages/devtools/src/__tests__/ngrx-collector.test.ts b/packages/devtools/src/__tests__/ngrx-collector.test.ts index e993e020..3ff3df3c 100644 --- a/packages/devtools/src/__tests__/ngrx-collector.test.ts +++ b/packages/devtools/src/__tests__/ngrx-collector.test.ts @@ -177,7 +177,7 @@ describe('ngrx collector', () => { it('writes diff paths with keys that need quotes the way the state tree does', async () => { const { store, collector } = setup(); - const source = (store as any)[STATE_SOURCE]; + const source = (store as unknown as Record>)[STATE_SOURCE]; source['display name'] = writable('Ada'); source.profile = writable({ 'first name': 'Ada', city: 'Rome' }); collector.collect(); diff --git a/packages/devtools/src/devframe.ts b/packages/devtools/src/devframe.ts index e8d44c01..d9459e62 100644 --- a/packages/devtools/src/devframe.ts +++ b/packages/devtools/src/devframe.ts @@ -2664,16 +2664,13 @@ const pangular = defineDevframe({ 'Pipes as JSON: `source` has each pipe with purity and template uses; `pipes`/`async` the live page usage, with churn and stale findings while recording. ' + LIVE_RESOURCE_NOTE, mimeType: 'application/json', - read: () => { - const live = currentPipes(pipePages); - return { - text: liveResourceText( - { source: scanPipes(ctx.cwd), ...live }, - 'pangular:scan-pipes and pangular:explain-pipe', - [...pipePages.keys()], - ), - }; - }, + read: () => ({ + text: liveResourceText( + { source: scanPipes(ctx.cwd), ...currentPipes(pipePages) }, + 'pangular:scan-pipes and pangular:explain-pipe', + [...pipePages.keys()], + ), + }), }); // The same states one page at a time, for the MCP resource templates (`agent-mcp.ts`). diff --git a/packages/devtools/src/panel-frame.ts b/packages/devtools/src/panel-frame.ts index d82a7f42..65222dd1 100644 --- a/packages/devtools/src/panel-frame.ts +++ b/packages/devtools/src/panel-frame.ts @@ -9,9 +9,6 @@ export const POPUP_ROOT_ID = 'pangular-popup-root'; export const DEVTOOLS_BASES = ['/__devframes/pangular/', '/__pangular/', './', '/__devframe/']; export const SETUP_URL = 'https://pangular-inspector.dev/getting-started/installation/'; -/** The docs on finding the server, linked when the popup finds none. */ -export const TROUBLESHOOTING_URL = - 'https://pangular-inspector.dev/getting-started/troubleshooting/#no-devtools-server-found'; /** True in the popup's own frame, where the host app would otherwise start a second overlay. */ export function insideDevtoolsPanel(): boolean { diff --git a/packages/devtools/src/popup-links.ts b/packages/devtools/src/popup-links.ts new file mode 100644 index 00000000..0de36800 --- /dev/null +++ b/packages/devtools/src/popup-links.ts @@ -0,0 +1,17 @@ +/** The docs on finding the server, linked when the popup finds none. */ +export const TROUBLESHOOTING_URL = + 'https://pangular-inspector.dev/getting-started/troubleshooting/#no-devtools-server-found'; + +/** A link that opens `href` in a new tab and says so to screen readers. */ +export function newTabLink(href: string, text: string): HTMLAnchorElement { + const link = document.createElement('a'); + link.href = href; + link.target = '_blank'; + link.rel = 'noopener noreferrer'; + link.textContent = text; + const newTab = document.createElement('span'); + newTab.classList.add('sr-only'); + newTab.textContent = ' (opens in a new tab)'; + link.append(newTab); + return link; +} diff --git a/packages/devtools/src/popup.ts b/packages/devtools/src/popup.ts index c2608b2e..8b3e1783 100644 --- a/packages/devtools/src/popup.ts +++ b/packages/devtools/src/popup.ts @@ -1,10 +1,5 @@ -import { - DEVTOOLS_BASES, - POPUP_ROOT_ID, - SETUP_URL, - TROUBLESHOOTING_URL, - insideDevtoolsPanel, -} from './panel-frame.ts'; +import { DEVTOOLS_BASES, POPUP_ROOT_ID, SETUP_URL, insideDevtoolsPanel } from './panel-frame.ts'; +import { TROUBLESHOOTING_URL, newTabLink } from './popup-links.ts'; import { DEFAULT_POPUP_HOTKEY, matchesHotkey, normalizeHotkey } from './config.ts'; // In-page floating devtools popup. Renders an iframe pointing at the devtools SPA. @@ -428,21 +423,8 @@ export function createDevtoolsPopup(options: { src?: string; hotkey?: string | f missingHint.textContent = 'Mount the Pangular Inspector hub or the Vite plugin in your dev server, before the SSR handler. ' + 'If it is mounted on a custom path, pass that path to initOverlay({baseURL}).'; - const setupLink = document.createElement('a'); - setupLink.href = SETUP_URL; - setupLink.target = '_blank'; - setupLink.rel = 'noopener noreferrer'; - setupLink.textContent = 'How to set up Pangular Inspector'; - const newTab = document.createElement('span'); - newTab.classList.add('sr-only'); - newTab.textContent = ' (opens in a new tab)'; - setupLink.append(newTab); - const troubleLink = document.createElement('a'); - troubleLink.href = TROUBLESHOOTING_URL; - troubleLink.target = '_blank'; - troubleLink.rel = 'noopener noreferrer'; - troubleLink.textContent = 'Troubleshooting'; - troubleLink.append(newTab.cloneNode(true)); + const setupLink = newTabLink(SETUP_URL, 'How to set up Pangular Inspector'); + const troubleLink = newTabLink(TROUBLESHOOTING_URL, 'Troubleshooting'); const retryBtn = document.createElement('button'); retryBtn.type = 'button'; retryBtn.classList.add('retry'); @@ -1467,16 +1449,13 @@ export function createDevtoolsPopup(options: { src?: string; hotkey?: string | f }; const onOutsideMessage = (e: MessageEvent) => { const msg = e.data as { type?: unknown; pill?: unknown } | null; - const type = msg?.type; - if (type === 'pangular:popup-pill') { - // The counts launcher setting, changed in the panel's own window. - if (typeof msg?.pill !== 'boolean' || !fromOutside(e)) return; + // The counts launcher setting, changed in the panel's own window. + if (msg?.type === 'pangular:popup-pill' && typeof msg.pill === 'boolean' && fromOutside(e)) { state.pill = msg.pill || undefined; saveState(state); applyPill(); - return; } - if (type !== 'pangular:popup-return') return; + if (msg?.type !== 'pangular:popup-return') return; const win = fromOutside(e); if (!win) return; outside = win; From 65882d669cb267f368c66379ceb4c7cbc2686a53 Mon Sep 17 00:00:00 2001 From: erKam Date: Sun, 8 Nov 2026 08:45:15 +0000 Subject: [PATCH 30/37] build(extension): rebuild the extension UI Rebuild extension/ui from the panel changes on this branch. --- ...=> browser-agent-rpc-KH4HHvHf-Cke5mr2c.js} | 2 +- .../{index-Dw3jx7J8.js => index-BaKe7OEL.js} | 311 +++++++++--------- extension/ui/index.html | 2 +- 3 files changed, 163 insertions(+), 152 deletions(-) rename extension/ui/assets/{browser-agent-rpc-KH4HHvHf-DqNFcBHr.js => browser-agent-rpc-KH4HHvHf-Cke5mr2c.js} (95%) rename extension/ui/assets/{index-Dw3jx7J8.js => index-BaKe7OEL.js} (67%) diff --git a/extension/ui/assets/browser-agent-rpc-KH4HHvHf-DqNFcBHr.js b/extension/ui/assets/browser-agent-rpc-KH4HHvHf-Cke5mr2c.js similarity index 95% rename from extension/ui/assets/browser-agent-rpc-KH4HHvHf-DqNFcBHr.js rename to extension/ui/assets/browser-agent-rpc-KH4HHvHf-Cke5mr2c.js index 718def3d..cb6a2665 100644 --- a/extension/ui/assets/browser-agent-rpc-KH4HHvHf-DqNFcBHr.js +++ b/extension/ui/assets/browser-agent-rpc-KH4HHvHf-Cke5mr2c.js @@ -1 +1 @@ -import{t as e}from"./index-Dw3jx7J8.js";var t=Symbol.for(`devframe:browser-agent-registry`),{tools:n,listeners:r}=globalThis[t]??={tools:new Map,listeners:new Set};function i(){return[...n.values()]}function a(e){return r.add(e),()=>r.delete(e)}var o=`devframe:client-id`,s;function c(t=globalThis.window){try{let n=t?.sessionStorage;if(n){let t=n.getItem(o);return t||(t=e(),n.setItem(o,t)),t}}catch{}return s??=e(),s}function l(){let e=typeof document>`u`?void 0:document;return{url:e?.location?.href??``,title:e?.title??``,visible:!e||e.visibilityState===`visible`,focused:e?.hasFocus()??!0}}function u(e){e.client.register({name:`devframe:agent:invoke-client-tool`,type:`action`,jsonSerializable:!0,handler:async(e,t)=>{let n=i().find(t=>t.id===e);if(!n)throw Error(`[devframe/agent] browser tool "${e}" not found`);return await n.invoke(t)}});let t=!1,n=!1,r=0,o=()=>{t||n||(t=!0,queueMicrotask(async()=>{if(t=!1,n)return;let a=i().map(({invoke:e,...t})=>t);(a.length!==0||r!==0)&&(r=a.length,await e.callOptional(`devframe:agent:sync-client-tools`,c(),a,l()).catch(()=>{}))}))},s=a(o),u=e.events.on(`connection:status`,e=>{e===`connected`&&o()}),d=typeof window>`u`?void 0:window;return d?.addEventListener(`focus`,o),d?.addEventListener(`blur`,o),d?.document.addEventListener(`visibilitychange`,o),o(),()=>{n=!0,s(),u(),d?.removeEventListener(`focus`,o),d?.removeEventListener(`blur`,o),d?.document.removeEventListener(`visibilitychange`,o)}}export{u as setupBrowserAgentRpcBridge}; \ No newline at end of file +import{t as e}from"./index-BaKe7OEL.js";var t=Symbol.for(`devframe:browser-agent-registry`),{tools:n,listeners:r}=globalThis[t]??={tools:new Map,listeners:new Set};function i(){return[...n.values()]}function a(e){return r.add(e),()=>r.delete(e)}var o=`devframe:client-id`,s;function c(t=globalThis.window){try{let n=t?.sessionStorage;if(n){let t=n.getItem(o);return t||(t=e(),n.setItem(o,t)),t}}catch{}return s??=e(),s}function l(){let e=typeof document>`u`?void 0:document;return{url:e?.location?.href??``,title:e?.title??``,visible:!e||e.visibilityState===`visible`,focused:e?.hasFocus()??!0}}function u(e){e.client.register({name:`devframe:agent:invoke-client-tool`,type:`action`,jsonSerializable:!0,handler:async(e,t)=>{let n=i().find(t=>t.id===e);if(!n)throw Error(`[devframe/agent] browser tool "${e}" not found`);return await n.invoke(t)}});let t=!1,n=!1,r=0,o=()=>{t||n||(t=!0,queueMicrotask(async()=>{if(t=!1,n)return;let a=i().map(({invoke:e,...t})=>t);(a.length!==0||r!==0)&&(r=a.length,await e.callOptional(`devframe:agent:sync-client-tools`,c(),a,l()).catch(()=>{}))}))},s=a(o),u=e.events.on(`connection:status`,e=>{e===`connected`&&o()}),d=typeof window>`u`?void 0:window;return d?.addEventListener(`focus`,o),d?.addEventListener(`blur`,o),d?.document.addEventListener(`visibilitychange`,o),o(),()=>{n=!0,s(),u(),d?.removeEventListener(`focus`,o),d?.removeEventListener(`blur`,o),d?.document.removeEventListener(`visibilitychange`,o)}}export{u as setupBrowserAgentRpcBridge}; \ No newline at end of file diff --git a/extension/ui/assets/index-Dw3jx7J8.js b/extension/ui/assets/index-BaKe7OEL.js similarity index 67% rename from extension/ui/assets/index-Dw3jx7J8.js rename to extension/ui/assets/index-BaKe7OEL.js index adc401a8..0f405931 100644 --- a/extension/ui/assets/index-Dw3jx7J8.js +++ b/extension/ui/assets/index-BaKe7OEL.js @@ -3,12 +3,12 @@ \r \v ᠎ - \u2028\u2029   `;`${Jt}`,`${Jt}`;var Yt=(function(e){return e[e.Character=0]=`Character`,e[e.Identifier=1]=`Identifier`,e[e.PrivateIdentifier=2]=`PrivateIdentifier`,e[e.Keyword=3]=`Keyword`,e[e.String=4]=`String`,e[e.Operator=5]=`Operator`,e[e.Number=6]=`Number`,e[e.RegExpBody=7]=`RegExpBody`,e[e.RegExpFlags=8]=`RegExpFlags`,e[e.Error=9]=`Error`,e})(Yt||{}),Xt=(function(e){return e[e.Plain=0]=`Plain`,e[e.TemplateLiteralPart=1]=`TemplateLiteralPart`,e[e.TemplateLiteralEnd=2]=`TemplateLiteralEnd`,e})(Xt||{});Yt.Character,Pt.StyleMap,Pt.ClassMap,Pt.StyleProp,Pt.ClassProp,Pt.Attribute,Pt.Property,Pt.Attribute,Pt.Control,Pt.DomProperty,Pt.DomProperty,Pt.Attribute,Pt.StyleMap,Pt.ClassMap,Pt.StyleProp,Pt.ClassProp,Pt.Listener,Pt.TwoWayListener,Pt.AnimationListener,Pt.StyleMap,Pt.ClassMap,Pt.StyleProp,Pt.ClassProp,Pt.Property,Pt.TwoWayProperty,Pt.DomProperty,Pt.Attribute,Pt.Animation,Pt.Control,Ut.Idle,y.deferOnIdle,y.deferPrefetchOnIdle,y.deferHydrateOnIdle,Ut.Immediate,y.deferOnImmediate,y.deferPrefetchOnImmediate,y.deferHydrateOnImmediate,Ut.Timer,y.deferOnTimer,y.deferPrefetchOnTimer,y.deferHydrateOnTimer,Ut.Hover,y.deferOnHover,y.deferPrefetchOnHover,y.deferHydrateOnHover,Ut.Interaction,y.deferOnInteraction,y.deferPrefetchOnInteraction,y.deferHydrateOnInteraction,Ut.Viewport,y.deferOnViewport,y.deferPrefetchOnViewport,y.deferHydrateOnViewport,Ut.Never,y.deferHydrateNever,y.deferHydrateNever,y.deferHydrateNever,y.pipeBind1,y.pipeBind2,y.pipeBind3,y.pipeBind4,y.textInterpolate,y.textInterpolate1,y.textInterpolate2,y.textInterpolate3,y.textInterpolate4,y.textInterpolate5,y.textInterpolate6,y.textInterpolate7,y.textInterpolate8,y.textInterpolateV,y.interpolate,y.interpolate1,y.interpolate2,y.interpolate3,y.interpolate4,y.interpolate5,y.interpolate6,y.interpolate7,y.interpolate8,y.interpolateV,y.pureFunction0,y.pureFunction1,y.pureFunction2,y.pureFunction3,y.pureFunction4,y.pureFunction5,y.pureFunction6,y.pureFunction7,y.pureFunction8,y.pureFunctionV,y.resolveWindow,y.resolveDocument,y.resolveBody,rt.HTML,y.sanitizeHtml,rt.RESOURCE_URL,y.sanitizeResourceUrl,rt.SCRIPT,y.sanitizeScript,rt.STYLE,y.sanitizeStyle,rt.URL,y.sanitizeUrl,rt.ATTRIBUTE_NO_BINDING,y.validateAttribute,rt.HTML,y.trustConstantHtml,rt.RESOURCE_URL,y.trustConstantResourceUrl;var Zt=(function(e){return e[e.None=0]=`None`,e[e.ViewContextRead=1]=`ViewContextRead`,e[e.ViewContextWrite=2]=`ViewContextWrite`,e[e.SideEffectful=4]=`SideEffectful`,e})(Zt||{});b.Tmpl,b.Tmpl,b.Both,b.Host,b.Tmpl,b.Tmpl,b.Tmpl,b.Both,b.Both,b.Both,b.Tmpl,b.Both,b.Both,b.Tmpl,b.Both,b.Tmpl,b.Both,b.Both,b.Tmpl,b.Tmpl,b.Tmpl,b.Tmpl,b.Tmpl,b.Both,b.Both,b.Tmpl,b.Tmpl,b.Tmpl,b.Tmpl,b.Both,b.Both,b.Both,b.Tmpl,b.Tmpl,b.Both,b.Tmpl,b.Tmpl,b.Tmpl,b.Both,b.Both,b.Tmpl,b.Both,b.Both,b.Both,b.Both,b.Both,b.Tmpl,b.Tmpl,b.Tmpl,b.Tmpl,b.Tmpl,b.Tmpl,b.Tmpl,b.Tmpl,b.Tmpl,b.Tmpl,b.Tmpl,b.Tmpl,b.Both,b.Tmpl,b.Both,b.Tmpl,b.Both,b.Tmpl,b.Tmpl,b.Tmpl,b.Tmpl,b.Tmpl,b.Tmpl,b.Both,b.Both,b.Both,Et.Property,Rt.Property,Et.TwoWay,Rt.TwoWayProperty,Et.Attribute,Rt.Attribute,Et.Class,Rt.ClassName,Et.Style,Rt.StyleProperty,Et.LegacyAnimation,Rt.LegacyAnimation,Et.Animation,Rt.Animation;var Qt=`%COMP%`;`${Qt}`,`${Qt}`,class e{static SINGLETON=new e;static veWillInferAnyFor(t){let n=e.SINGLETON;return t instanceof Tt?t.visit(n):t.receiver.visit(n)}visitUnary(e){return e.expr.visit(this)}visitBinary(e){return e.left.visit(this)||e.right.visit(this)}visitChain(){return!1}visitConditional(e){return e.condition.visit(this)||e.trueExp.visit(this)||e.falseExp.visit(this)}visitCall(){return!0}visitSafeCall(){return!1}visitImplicitReceiver(){return!1}visitThisReceiver(){return!1}visitInterpolation(e){return e.expressions.some(e=>e.visit(this))}visitKeyedRead(){return!1}visitLiteralArray(){return!0}visitLiteralMap(){return!0}visitLiteralPrimitive(){return!1}visitPipe(){return!0}visitPrefixNot(e){return e.expression.visit(this)}visitTypeofExpression(e){return e.expression.visit(this)}visitVoidExpression(e){return e.expression.visit(this)}visitNonNullAssert(e){return e.expression.visit(this)}visitPropertyRead(){return!1}visitSafePropertyRead(){return!1}visitSafeKeyedRead(){return!1}visitTemplateLiteral(){return!1}visitTemplateLiteralElement(){return!1}visitTaggedTemplateLiteral(){return!1}visitParenthesizedExpression(e){return e.expression.visit(this)}visitRegularExpressionLiteral(){return!1}visitSpreadElement(e){return e.expression.visit(this)}visitArrowFunction(e,t){return!1}};var $t=null,en=!1,tn=1,nn=null,rn=Symbol(`SIGNAL`);function an(e){let t=$t;return $t=e,t}function on(){return $t}var sn={version:0,lastCleanEpoch:0,dirty:!1,producers:void 0,producersTail:void 0,consumers:void 0,consumersTail:void 0,recomputing:!1,consumerAllowSignalWrites:!1,consumerIsAlwaysLive:!1,kind:`unknown`,producerMustRecompute:()=>!1,producerRecomputeValue:()=>{},consumerMarkedDirty:()=>{},consumerOnSignalRead:()=>{}};function cn(e){if(en)throw Error(``);if($t===null)return;$t.consumerOnSignalRead(e);let t=$t.producersTail;if(t!==void 0&&t.producer===e)return;let n,r=$t.recomputing;if(r&&(n=t===void 0?$t.producers:t.nextProducer,n!==void 0&&n.producer===e)){$t.producersTail=n,n.lastReadVersion=e.version,n.knownValidAtEpoch=tn;return}let i=e.consumersTail;if(i!==void 0&&i.consumer===$t&&(!r||i.knownValidAtEpoch===tn))return;let a=Cn($t),o={producer:e,consumer:$t,nextProducer:n,prevConsumer:void 0,knownValidAtEpoch:tn,lastReadVersion:e.version,nextConsumer:void 0};$t.producersTail=o,t===void 0?$t.producers=o:t.nextProducer=o,a&&xn(e,o)}function ln(){tn++}function un(e){if((!Cn(e)||e.dirty)&&(e.dirty||e.lastCleanEpoch!==tn)){if(!e.producerMustRecompute(e)&&!yn(e)){mn(e);return}e.producerRecomputeValue(e),mn(e)}}function dn(e){if(e.consumers===void 0)return;let t=en;en=!0;try{for(let t=e.consumers;t!==void 0;t=t.nextConsumer){let e=t.consumer;e.dirty||pn(e)}}finally{en=t}}function fn(){return $t?.consumerAllowSignalWrites!==!1}function pn(e){e.dirty=!0,dn(e),e.consumerMarkedDirty?.(e)}function mn(e){e.dirty=!1,e.lastCleanEpoch=tn}function hn(e){return e&&gn(e),an(e)}function gn(e){if(e.producersTail?.knownValidAtEpoch===tn){let t=e.producers;for(;t!==void 0;)t.knownValidAtEpoch=null,t=t.nextProducer}e.producersTail=void 0,e.recomputing=!0}function _n(e,t){an(t),e&&vn(e)}function vn(e){e.recomputing=!1;let t=e.producersTail,n=t===void 0?e.producers:t.nextProducer;if(n!==void 0){if(Cn(e))do n=Sn(n);while(n!==void 0);t===void 0?e.producers=void 0:t.nextProducer=void 0}}function yn(e){for(let t=e.producers;t!==void 0;t=t.nextProducer){let e=t.producer,n=t.lastReadVersion;if(n!==e.version||(un(e),n!==e.version))return!0}return!1}function bn(e){if(Cn(e)){let t=e.producers;for(;t!==void 0;)t=Sn(t)}e.producers=void 0,e.producersTail=void 0,e.consumers=void 0,e.consumersTail=void 0}function xn(e,t){let n=e.consumersTail,r=Cn(e);if(n===void 0?(t.nextConsumer=void 0,e.consumers=t):(t.nextConsumer=n.nextConsumer,n.nextConsumer=t),t.prevConsumer=n,e.consumersTail=t,!r)for(let t=e.producers;t!==void 0;t=t.nextProducer)xn(t.producer,t)}function Sn(e){let t=e.producer,n=e.nextProducer,r=e.nextConsumer,i=e.prevConsumer;if(e.nextConsumer=void 0,e.prevConsumer=void 0,r===void 0?t.consumersTail=i:r.prevConsumer=i,i!==void 0)i.nextConsumer=r;else if(t.consumers=r,!Cn(t)){let e=t.producers;for(;e!==void 0;)e=Sn(e)}return n}function Cn(e){return e.consumerIsAlwaysLive||e.consumers!==void 0}function wn(e){nn?.(e)}function Tn(e,t){return Object.is(e,t)}function En(e,t){let n=Object.create(uee);n.computation=e,t!==void 0&&(n.equal=t);let r=()=>{if(un(n),cn(n),n.value===kn)throw n.error;return n.value};return r[rn]=n,wn(n),r}var Dn=Symbol(`UNSET`),On=Symbol(`COMPUTING`),kn=Symbol(`ERRORED`),uee={...sn,value:Dn,dirty:!0,error:null,equal:Tn,kind:`computed`,producerMustRecompute(e){return e.value===Dn||e.value===On},producerRecomputeValue(e){if(e.value===On)throw Error(``);let t=e.value;e.value=On;let n=hn(e),r,i=!1;try{r=e.computation(),an(null),i=t!==Dn&&t!==kn&&r!==kn&&e.equal(t,r)}catch(t){r=kn,e.error=t}finally{_n(e,n)}if(i){e.value=t;return}e.value=r,e.version++}};function dee(){throw Error()}var An=dee;function jn(e){An(e)}function fee(e){An=e}var pee=null;function mee(e,t){let n=Object.create(Pn);n.value=e,t!==void 0&&(n.equal=t);let r=()=>hee(n);return r[rn]=n,wn(n),[r,e=>Mn(n,e),e=>Nn(n,e)]}function hee(e){return cn(e),e.value}function Mn(e,t){fn()||jn(e),e.equal(e.value,t)||(e.value=t,Fn(e))}function Nn(e,t){fn()||jn(e),Mn(e,t(e.value))}var Pn={...sn,equal:Tn,value:void 0,kind:`signal`};function Fn(e){e.version++,ln(),dn(e),pee?.(e)}var In={...sn,consumerIsAlwaysLive:!0,consumerAllowSignalWrites:!0,dirty:!0,kind:`effect`};function Ln(e){if(e.dirty=!1,e.version>0&&!yn(e))return;e.version++;let t=hn(e);try{e.cleanup(),e.fn()}finally{_n(e,t)}}var Rn=void 0;function zn(){return Rn}function Bn(e){let t=Rn;return Rn=e,t}var Vn=Symbol(`NotFound`);function Hn(e){return e===Vn||e?.name===`ɵNotFound`}function Un(e,t,n){let r=Object.create(Kn);r.source=e,r.computation=t,n!=null&&(r.equal=n);let i=()=>{if(un(r),cn(r),r.value===kn)throw r.error;return r.value};return i[rn]=r,wn(r),i}function Wn(e,t){un(e),Mn(e,t),mn(e)}function Gn(e,t){if(un(e),e.value===kn)throw e.error;Nn(e,t),mn(e)}var Kn={...sn,value:Dn,dirty:!0,error:null,equal:Tn,kind:`linkedSignal`,producerMustRecompute(e){return e.value===Dn||e.value===On},producerRecomputeValue(e){if(e.value===On)throw Error(``);let t=e.value;e.value=On;let n=hn(e),r,i=!1;try{let n=e.source(),a=t!==Dn&&t!==kn,o=a?{source:e.sourceValue,value:t}:void 0;r=e.computation(n,o),e.sourceValue=n,an(null),i=a&&r!==kn&&e.equal(t,r)}catch(t){r=kn,e.error=t}finally{_n(e,n)}if(i){e.value=t;return}e.value=r,e.version++}};function qn(e){let t=an(null);try{return e()}finally{an(t)}}var Jn=function(e,t){return Jn=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},Jn(e,t)};function Yn(e,t){if(typeof t!=`function`&&t!==null)throw TypeError(`Class extends value `+String(t)+` is not a constructor or null`);Jn(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}function Xn(e,t,n,r){function i(e){return e instanceof n?e:new n(function(t){t(e)})}return new(n||=Promise)(function(n,a){function o(e){try{c(r.next(e))}catch(e){a(e)}}function s(e){try{c(r.throw(e))}catch(e){a(e)}}function c(e){e.done?n(e.value):i(e.value).then(o,s)}c((r=r.apply(e,t||[])).next())})}function Zn(e,t){var n={label:0,sent:function(){if(a[0]&1)throw a[1];return a[1]},trys:[],ops:[]},r,i,a,o=Object.create((typeof Iterator==`function`?Iterator:Object).prototype);return o.next=s(0),o.throw=s(1),o.return=s(2),typeof Symbol==`function`&&(o[Symbol.iterator]=function(){return this}),o;function s(e){return function(t){return c([e,t])}}function c(s){if(r)throw TypeError(`Generator is already executing.`);for(;o&&(o=0,s[0]&&(n=0)),n;)try{if(r=1,i&&(a=s[0]&2?i.return:s[0]?i.throw||((a=i.return)&&a.call(i),0):i.next)&&!(a=a.call(i,s[1])).done)return a;switch(i=0,a&&(s=[s[0]&2,a.value]),s[0]){case 0:case 1:a=s;break;case 4:return n.label++,{value:s[1],done:!1};case 5:n.label++,i=s[1],s=[0];continue;case 7:s=n.ops.pop(),n.trys.pop();continue;default:if(a=n.trys,!(a=a.length>0&&a[a.length-1])&&(s[0]===6||s[0]===2)){n=0;continue}if(s[0]===3&&(!a||s[1]>a[0]&&s[1]=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw TypeError(t?`Object is not iterable.`:`Symbol.iterator is not defined.`)}function $n(e,t){var n=typeof Symbol==`function`&&e[Symbol.iterator];if(!n)return e;var r=n.call(e),i,a=[],o;try{for(;(t===void 0||t-->0)&&!(i=r.next()).done;)a.push(i.value)}catch(e){o={error:e}}finally{try{i&&!i.done&&(n=r.return)&&n.call(r)}finally{if(o)throw o.error}}return a}function er(e,t,n){if(n||arguments.length===2)for(var r=0,i=t.length,a;r1||c(e,t)})},t&&(i[e]=t(i[e])))}function c(e,t){try{l(r[e](t))}catch(e){f(a[0][3],e)}}function l(e){e.value instanceof tr?Promise.resolve(e.value.v).then(u,d):f(a[0][2],e)}function u(e){c(`next`,e)}function d(e){c(`throw`,e)}function f(e,t){e(t),a.shift(),a.length&&c(a[0][0],a[0][1])}}function rr(e){if(!Symbol.asyncIterator)throw TypeError(`Symbol.asyncIterator is not defined.`);var t=e[Symbol.asyncIterator],n;return t?t.call(e):(e=typeof Qn==`function`?Qn(e):e[Symbol.iterator](),n={},r(`next`),r(`throw`),r(`return`),n[Symbol.asyncIterator]=function(){return this},n);function r(t){n[t]=e[t]&&function(n){return new Promise(function(r,a){n=e[t](n),i(r,a,n.done,n.value)})}}function i(e,t,n,r){Promise.resolve(r).then(function(t){e({value:t,done:n})},t)}}function ir(e){return typeof e==`function`}function ar(e){var t=e(function(e){Error.call(e),e.stack=Error().stack});return t.prototype=Object.create(Error.prototype),t.prototype.constructor=t,t}var or=ar(function(e){return function(t){e(this),this.message=t?t.length+` errors occurred during unsubscription: `+t.map(function(e,t){return t+1+`) `+e.toString()}).join(` `):``,this.name=`UnsubscriptionError`,this.errors=t}});function sr(e,t){if(e){var n=e.indexOf(t);0<=n&&e.splice(n,1)}}var cr=function(){function e(e){this.initialTeardown=e,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var e,t,n,r,i;if(!this.closed){this.closed=!0;var a=this._parentage;if(a){if(this._parentage=null,Array.isArray(a))try{for(var o=Qn(a),s=o.next();!s.done;s=o.next())s.value.remove(this)}catch(t){e={error:t}}finally{try{s&&!s.done&&(t=o.return)&&t.call(o)}finally{if(e)throw e.error}}else a.remove(this)}var c=this.initialTeardown;if(ir(c))try{c()}catch(e){i=e instanceof or?e.errors:[e]}var l=this._finalizers;if(l){this._finalizers=null;try{for(var u=Qn(l),d=u.next();!d.done;d=u.next()){var f=d.value;try{dr(f)}catch(e){i??=[],e instanceof or?i=er(er([],$n(i)),$n(e.errors)):i.push(e)}}}catch(e){n={error:e}}finally{try{d&&!d.done&&(r=u.return)&&r.call(u)}finally{if(n)throw n.error}}}if(i)throw new or(i)}},e.prototype.add=function(t){if(t&&t!==this){if(this.closed)dr(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=this._finalizers??[]).push(t)}}},e.prototype._hasParent=function(e){var t=this._parentage;return t===e||Array.isArray(t)&&t.includes(e)},e.prototype._addParent=function(e){var t=this._parentage;this._parentage=Array.isArray(t)?(t.push(e),t):t?[t,e]:e},e.prototype._removeParent=function(e){var t=this._parentage;t===e?this._parentage=null:Array.isArray(t)&&sr(t,e)},e.prototype.remove=function(t){var n=this._finalizers;n&&sr(n,t),t instanceof e&&t._removeParent(this)},e.EMPTY=(function(){var t=new e;return t.closed=!0,t})(),e}(),lr=cr.EMPTY;function ur(e){return e instanceof cr||e&&`closed`in e&&ir(e.remove)&&ir(e.add)&&ir(e.unsubscribe)}function dr(e){ir(e)?e():e.unsubscribe()}var fr={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1},pr={setTimeout:function(e,t){var n=[...arguments].slice(2),r=pr.delegate;return r?.setTimeout?r.setTimeout.apply(r,er([e,t],$n(n))):setTimeout.apply(void 0,er([e,t],$n(n)))},clearTimeout:function(e){return(pr.delegate?.clearTimeout||clearTimeout)(e)},delegate:void 0};function mr(e){pr.setTimeout(function(){var t=fr.onUnhandledError;if(t)t(e);else throw e})}function hr(){}var gr=(function(){return yr(`C`,void 0,void 0)})();function _r(e){return yr(`E`,void 0,e)}function vr(e){return yr(`N`,e,void 0)}function yr(e,t,n){return{kind:e,value:t,error:n}}var br=null;function xr(e){if(fr.useDeprecatedSynchronousErrorHandling){var t=!br;if(t&&(br={errorThrown:!1,error:null}),e(),t){var n=br,r=n.errorThrown,i=n.error;if(br=null,r)throw i}}else e()}function Sr(e){fr.useDeprecatedSynchronousErrorHandling&&br&&(br.errorThrown=!0,br.error=e)}var Cr=function(e){Yn(t,e);function t(t){var n=e.call(this)||this;return n.isStopped=!1,t?(n.destination=t,ur(t)&&t.add(n)):n.destination=jr,n}return t.create=function(e,t,n){return new Dr(e,t,n)},t.prototype.next=function(e){this.isStopped?Ar(vr(e),this):this._next(e)},t.prototype.error=function(e){this.isStopped?Ar(_r(e),this):(this.isStopped=!0,this._error(e))},t.prototype.complete=function(){this.isStopped?Ar(gr,this):(this.isStopped=!0,this._complete())},t.prototype.unsubscribe=function(){this.closed||(this.isStopped=!0,e.prototype.unsubscribe.call(this),this.destination=null)},t.prototype._next=function(e){this.destination.next(e)},t.prototype._error=function(e){try{this.destination.error(e)}finally{this.unsubscribe()}},t.prototype._complete=function(){try{this.destination.complete()}finally{this.unsubscribe()}},t}(cr),wr=Function.prototype.bind;function Tr(e,t){return wr.call(e,t)}var Er=function(){function e(e){this.partialObserver=e}return e.prototype.next=function(e){var t=this.partialObserver;if(t.next)try{t.next(e)}catch(e){Or(e)}},e.prototype.error=function(e){var t=this.partialObserver;if(t.error)try{t.error(e)}catch(e){Or(e)}else Or(e)},e.prototype.complete=function(){var e=this.partialObserver;if(e.complete)try{e.complete()}catch(e){Or(e)}},e}(),Dr=function(e){Yn(t,e);function t(t,n,r){var i=e.call(this)||this,a;if(ir(t)||!t)a={next:t??void 0,error:n??void 0,complete:r??void 0};else{var o;i&&fr.useDeprecatedNextContext?(o=Object.create(t),o.unsubscribe=function(){return i.unsubscribe()},a={next:t.next&&Tr(t.next,o),error:t.error&&Tr(t.error,o),complete:t.complete&&Tr(t.complete,o)}):a=t}return i.destination=new Er(a),i}return t}(Cr);function Or(e){fr.useDeprecatedSynchronousErrorHandling?Sr(e):mr(e)}function kr(e){throw e}function Ar(e,t){var n=fr.onStoppedNotification;n&&pr.setTimeout(function(){return n(e,t)})}var jr={closed:!0,next:hr,error:kr,complete:hr},Mr=(function(){return typeof Symbol==`function`&&Symbol.observable||`@@observable`})();function Nr(e){return e}function Pr(e){return e.length===0?Nr:e.length===1?e[0]:function(t){return e.reduce(function(e,t){return t(e)},t)}}var Fr=function(){function e(e){e&&(this._subscribe=e)}return e.prototype.lift=function(t){var n=new e;return n.source=this,n.operator=t,n},e.prototype.subscribe=function(e,t,n){var r=this,i=Rr(e)?e:new Dr(e,t,n);return xr(function(){var e=r,t=e.operator,n=e.source;i.add(t?t.call(i,n):n?r._subscribe(i):r._trySubscribe(i))}),i},e.prototype._trySubscribe=function(e){try{return this._subscribe(e)}catch(t){e.error(t)}},e.prototype.forEach=function(e,t){var n=this;return t=Ir(t),new t(function(t,r){var i=new Dr({next:function(t){try{e(t)}catch(e){r(e),i.unsubscribe()}},error:r,complete:t});n.subscribe(i)})},e.prototype._subscribe=function(e){return this.source?.subscribe(e)},e.prototype[Mr]=function(){return this},e.prototype.pipe=function(){return Pr([...arguments])(this)},e.prototype.toPromise=function(e){var t=this;return e=Ir(e),new e(function(e,n){var r;t.subscribe(function(e){return r=e},function(e){return n(e)},function(){return e(r)})})},e.create=function(t){return new e(t)},e}();function Ir(e){return e??fr.Promise??Promise}function Lr(e){return e&&ir(e.next)&&ir(e.error)&&ir(e.complete)}function Rr(e){return e&&e instanceof Cr||Lr(e)&&ur(e)}function zr(e){return ir(e?.lift)}function Br(e){return function(t){if(zr(t))return t.lift(function(t){try{return e(t,this)}catch(e){this.error(e)}});throw TypeError(`Unable to lift unknown Observable type`)}}function Vr(e,t,n,r,i){return new Hr(e,t,n,r,i)}var Hr=function(e){Yn(t,e);function t(t,n,r,i,a,o){var s=e.call(this,t)||this;return s.onFinalize=a,s.shouldUnsubscribe=o,s._next=n?function(e){try{n(e)}catch(e){t.error(e)}}:e.prototype._next,s._error=i?function(e){try{i(e)}catch(e){t.error(e)}finally{this.unsubscribe()}}:e.prototype._error,s._complete=r?function(){try{r()}catch(e){t.error(e)}finally{this.unsubscribe()}}:e.prototype._complete,s}return t.prototype.unsubscribe=function(){var t;if(!this.shouldUnsubscribe||this.shouldUnsubscribe()){var n=this.closed;e.prototype.unsubscribe.call(this),!n&&((t=this.onFinalize)==null||t.call(this))}},t}(Cr),Ur=ar(function(e){return function(){e(this),this.name=`ObjectUnsubscribedError`,this.message=`object unsubscribed`}}),Wr=function(e){Yn(t,e);function t(){var t=e.call(this)||this;return t.closed=!1,t.currentObservers=null,t.observers=[],t.isStopped=!1,t.hasError=!1,t.thrownError=null,t}return t.prototype.lift=function(e){var t=new Gr(this,this);return t.operator=e,t},t.prototype._throwIfClosed=function(){if(this.closed)throw new Ur},t.prototype.next=function(e){var t=this;xr(function(){var n,r;if(t._throwIfClosed(),!t.isStopped){t.currentObservers||=Array.from(t.observers);try{for(var i=Qn(t.currentObservers),a=i.next();!a.done;a=i.next())a.value.next(e)}catch(e){n={error:e}}finally{try{a&&!a.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}}})},t.prototype.error=function(e){var t=this;xr(function(){if(t._throwIfClosed(),!t.isStopped){t.hasError=t.isStopped=!0,t.thrownError=e;for(var n=t.observers;n.length;)n.shift().error(e)}})},t.prototype.complete=function(){var e=this;xr(function(){if(e._throwIfClosed(),!e.isStopped){e.isStopped=!0;for(var t=e.observers;t.length;)t.shift().complete()}})},t.prototype.unsubscribe=function(){this.isStopped=this.closed=!0,this.observers=this.currentObservers=null},Object.defineProperty(t.prototype,"observed",{get:function(){return this.observers?.length>0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(t){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,t)},t.prototype._subscribe=function(e){return this._throwIfClosed(),this._checkFinalizedStatuses(e),this._innerSubscribe(e)},t.prototype._innerSubscribe=function(e){var t=this,n=this,r=n.hasError,i=n.isStopped,a=n.observers;return r||i?lr:(this.currentObservers=null,a.push(e),new cr(function(){t.currentObservers=null,sr(a,e)}))},t.prototype._checkFinalizedStatuses=function(e){var t=this,n=t.hasError,r=t.thrownError,i=t.isStopped;n?e.error(r):i&&e.complete()},t.prototype.asObservable=function(){var e=new Fr;return e.source=this,e},t.create=function(e,t){return new Gr(e,t)},t}(Fr),Gr=function(e){Yn(t,e);function t(t,n){var r=e.call(this)||this;return r.destination=t,r.source=n,r}return t.prototype.next=function(e){var t,n;(n=(t=this.destination)?.next)==null||n.call(t,e)},t.prototype.error=function(e){var t,n;(n=(t=this.destination)?.error)==null||n.call(t,e)},t.prototype.complete=function(){var e,t;(t=(e=this.destination)?.complete)==null||t.call(e)},t.prototype._subscribe=function(e){return this.source?.subscribe(e)??lr},t}(Wr),Kr=function(e){Yn(t,e);function t(t){var n=e.call(this)||this;return n._value=t,n}return Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(t){var n=e.prototype._subscribe.call(this,t);return!n.closed&&t.next(this._value),n},t.prototype.getValue=function(){var e=this,t=e.hasError,n=e.thrownError,r=e._value;if(t)throw n;return this._throwIfClosed(),r},t.prototype.next=function(t){e.prototype.next.call(this,this._value=t)},t}(Wr);function qr(e){return e[e.length-1]}function Jr(e){return ir(qr(e))?e.pop():void 0}var Yr=(function(e){return e&&typeof e.length==`number`&&typeof e!=`function`});function Xr(e){return ir(e?.then)}function Zr(e){return ir(e[Mr])}function Qr(e){return Symbol.asyncIterator&&ir(e?.[Symbol.asyncIterator])}function $r(e){return TypeError(`You provided `+(typeof e==`object`&&e?`an invalid object`:`'`+e+`'`)+` where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`)}function ei(){return typeof Symbol!=`function`||!Symbol.iterator?`@@iterator`:Symbol.iterator}var ti=ei();function ni(e){return ir(e?.[ti])}function ri(e){return nr(this,arguments,function(){var t,n,r,i;return Zn(this,function(a){switch(a.label){case 0:t=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,tr(t.read())];case 3:return n=a.sent(),r=n.value,i=n.done,i?[4,tr(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,tr(r)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return t.releaseLock(),[7];case 10:return[2]}})})}function ii(e){return ir(e?.getReader)}function ai(e){if(e instanceof Fr)return e;if(e!=null){if(Zr(e))return gee(e);if(Yr(e))return _ee(e);if(Xr(e))return vee(e);if(Qr(e))return oi(e);if(ni(e))return yee(e);if(ii(e))return bee(e)}throw $r(e)}function gee(e){return new Fr(function(t){var n=e[Mr]();if(ir(n.subscribe))return n.subscribe(t);throw TypeError(`Provided object does not correctly implement Symbol.observable`)})}function _ee(e){return new Fr(function(t){for(var n=0;n=0?n.slice(0,r):n}function _i(e,t){return e?t?`${e} ${t}`:e:t||``}var Hee=hi({__forward_ref__:hi});function vi(e){return e.__forward_ref__=vi,e}function yi(e){return bi(e)?e():e}function bi(e){return typeof e==`function`&&Object.hasOwn(e,Hee)&&e.__forward_ref__===vi}function xi(e){return{token:e.token,providedIn:e.providedIn||null,factory:e.factory,value:void 0}}function Si(e){return Ci(e,Ei)}function Ci(e,t){return Object.hasOwn(e,t)&&e[t]||null}function wi(e){return(e?.[Ei]??null)||null}function Ti(e){return e&&Object.hasOwn(e,Di)?e[Di]:null}var Ei=hi({ɵprov:hi}),Di=hi({ɵinj:hi}),Oi=class{_desc;ngMetadataName=`InjectionToken`;ɵprov;constructor(e,t){this._desc=e,this.ɵprov=void 0,typeof t==`number`?this.__NG_ELEMENT_ID__=t:t!==void 0&&(this.ɵprov=xi({token:this,providedIn:t.providedIn||`root`,factory:t.factory}))}get multi(){return this}toString(){return`InjectionToken ${this._desc}`}};function ki(e){return e&&!!e.ɵproviders}var Ai=hi({ɵcmp:hi}),ji=hi({ɵdir:hi}),Mi=hi({ɵpipe:hi}),Ni=hi({ɵfac:hi}),Pi=hi({__NG_ELEMENT_ID__:hi}),Fi=hi({__NG_ENV_ID__:hi});function Ii(e){return zi(e,`@Component`),e[Ai]||null}function Li(e){return zi(e,`@Directive`),e[ji]||null}function Ri(e){return zi(e,`@Pipe`),e[Mi]||null}function zi(e,t){if(e==null)throw new pi(-919,!1)}function Bi(e){return typeof e==`string`?e:e==null?``:String(e)}var Vi=hi({ngErrorCode:hi}),Hi=hi({ngErrorMessage:hi}),Ui=hi({ngTokenPath:hi});function Wi(e,t){return Ki(``,-200,t)}function Gi(e,t){throw new pi(-201,!1)}function Ki(e,t,n){let r=new pi(t,e);return r[Vi]=t,r[Hi]=e,n&&(r[Ui]=n),r}function qi(e){return e[Vi]}var Ji;function Yi(){return Ji}function Xi(e){let t=Ji;return Ji=e,t}function Zi(e,t,n){let r=Si(e);if(r&&r.providedIn==`root`)return r.value===void 0?r.value=r.factory():r.value;if(n&8)return null;if(t!==void 0)return t;Gi(e,``)}var Qi=globalThis,$i={},ea=`__NG_DI_FLAG__`,ta=class{injector;constructor(e){this.injector=e}retrieve(e,t){let n=ia(t)||0;try{return this.injector.get(e,n&8?null:$i,n)}catch(e){if(Hn(e))return e;throw e}}};function na(e,t=0){let n=zn();if(n===void 0)throw new pi(-203,!1);if(n===null)return Zi(e,void 0,t);{let r=aa(t),i=n.retrieve(e,r);if(Hn(i)){if(r.optional)return null;throw i}return i}}function ra(e,t=0){return(Yi()||na)(yi(e),t)}function x(e,t){return ra(e,ia(t))}function ia(e){return e===void 0||typeof e==`number`?e:0|(e.optional&&8)|(e.host&&1)|(e.self&&2)|(e.skipSelf&&4)}function aa(e){return{optional:!!(e&8),host:!!(e&1),self:!!(e&2),skipSelf:!!(e&4)}}function oa(e){let t=[];for(let n=0;nArray.isArray(e)?da(e,t):t(e))}function fa(e,t,n){t>=e.length?e.push(n):e.splice(t,0,n)}function pa(e,t){return t>=e.length-1?e.pop():e.splice(t,1)[0]}function ma(e,t){let n=[];for(let r=0;rt;){let t=i-2;e[i]=e[t],i--}e[t]=n,e[t+1]=r}}function ga(e,t,n){let r=va(e,t);return r>=0?e[r|1]=n:(r=~r,ha(e,r,t,n)),r}function _a(e,t){let n=va(e,t);if(n>=0)return e[n|1]}function va(e,t){return ya(e,t,1)}function ya(e,t,n){let r=0,i=e.length>>n;for(;i!==r;){let a=r+(i-r>>1),o=e[a<t?i=a:r=a+1}return~(i<{n.push(e)};return da(t,e=>{let t=e;ka(t,a,[],r)&&(i||=[],i.push(t))}),i!==void 0&&Oa(i,a),n}function Oa(e,t){for(let n=0;n{t(e,r)})}}function ka(e,t,n,r){if(e=yi(e),!e)return!1;let i=null,a=Ti(e),o=!a&&Ii(e);if(!a&&!o){let t=e.ngModule;if(a=Ti(t),a)i=t;else return!1}else if(o&&!o.standalone)return!1;else i=e;let s=r.has(i);if(o){if(s)return!1;if(r.add(i),o.dependencies){let e=typeof o.dependencies==`function`?o.dependencies():o.dependencies;for(let i of e)ka(i,t,n,r)}}else if(a){if(a.imports!=null&&!s){r.add(i);let e;try{da(a.imports,i=>{ka(i,t,n,r)&&(e||=[],e.push(i))})}finally{}e!==void 0&&Oa(e,t)}if(!s){let e=ca(i)||(()=>new i);t({provide:i,useFactory:e,deps:xa},i),t({provide:wa,useValue:i,multi:!0},i),t({provide:Sa,useValue:()=>ra(i),multi:!0},i)}let o=a.providers;if(o!=null&&!s){let n=e;Aa(o,e=>{t(e,n)})}}else return!1;return i!==e&&e.providers!==void 0}function Aa(e,t){for(let n of e)ki(n)&&(n=n.ɵproviders),Array.isArray(n)?Aa(n,t):t(n)}var ja=hi({provide:String,useValue:hi});function Ma(e){return typeof e==`object`&&!!e&&ja in e}function Na(e){return!!(e&&e.useExisting)}function Pa(e){return!!(e&&e.useFactory)}function Fa(e){return typeof e==`function`}function Ia(e){return!!e.useClass}var La=new Oi(``),Ra={},za={},Ba=void 0;function Va(){return Ba===void 0&&(Ba=new Ta),Ba}var Ha=class{},Ua=class extends Ha{parent;source;scopes;records=new Map;_ngOnDestroyHooks=new Set;_onDestroyHooks=[];get destroyed(){return this._destroyed}_destroyed=!1;injectorDefTypes;constructor(e,t,n,r){super(),this.parent=t,this.source=n,this.scopes=r,$a(e,e=>this.processProvider(e)),this.records.set(Ca,Ya(void 0,this)),r.has(`environment`)&&this.records.set(Ha,Ya(void 0,this));let i=this.records.get(La);i!=null&&typeof i.value==`string`&&this.scopes.add(i.value),this.injectorDefTypes=new Set(this.get(wa,xa,{self:!0}))}retrieve(e,t){let n=ia(t)||0;try{return this.get(e,$i,n)}catch(e){if(Hn(e))return e;throw e}}destroy(){Ja(this),this._destroyed=!0;let e=an(null);try{for(let e of this._ngOnDestroyHooks)e.ngOnDestroy();let e=this._onDestroyHooks;this._onDestroyHooks=[];for(let t of e)t()}finally{this.records.clear(),this._ngOnDestroyHooks.clear(),this.injectorDefTypes.clear(),an(e)}}onDestroy(e){return Ja(this),this._onDestroyHooks.push(e),()=>this.removeOnDestroy(e)}runInContext(e){Ja(this);let t=Bn(this),n=Xi(void 0);try{return e()}finally{Bn(t),Xi(n)}}get(e,t=$i,n){if(Ja(this),Object.hasOwn(e,Fi))return e[Fi](this);let r=ia(n),i=Bn(this),a=Xi(void 0);try{if(!(r&4)){let t=this.records.get(e);if(t===void 0){let n=Qa(e)&&Si(e);t=n&&this.injectableDefInScope(n)?Ya(Wa(e),Ra):null,this.records.set(e,t)}if(t!=null)return this.hydrate(e,t,r)}let n=r&2?Va():this.parent;return t=r&8&&t===$i?null:t,n.get(e,t)}catch(e){let t=qi(e);throw t===-200||t===-201?new pi(t,null):e}finally{Xi(a),Bn(i)}}resolveInjectorInitializers(){let e=an(null),t=Bn(this),n=Xi(void 0);try{let e=this.get(Sa,xa,{self:!0});for(let t of e)t()}finally{Bn(t),Xi(n),an(e)}}toString(){return`R3Injector[...]`}processProvider(e){e=yi(e);let t=Fa(e)?e:yi(e&&e.provide),n=Ka(e);if(!Fa(e)&&e.multi===!0){let n=this.records.get(t);n||(n=Ya(void 0,Ra,!0),n.factory=()=>oa(n.multi),this.records.set(t,n)),t=e,n.multi.push(e)}this.records.set(t,n)}hydrate(e,t,n){let r=an(null);try{if(t.value===za)throw Wi(``);return t.value===Ra&&(t.value=za,t.value=t.factory(void 0,n)),typeof t.value==`object`&&t.value&&Za(t.value)&&this._ngOnDestroyHooks.add(t.value),t.value}finally{an(r)}}injectableDefInScope(e){if(!e.providedIn)return!1;let t=yi(e.providedIn);return typeof t==`string`?t===`any`||this.scopes.has(t):this.injectorDefTypes.has(t)}removeOnDestroy(e){let t=this._onDestroyHooks.indexOf(e);t!==-1&&this._onDestroyHooks.splice(t,1)}};function Wa(e){let t=Si(e),n=t===null?ca(e):t.factory;if(n!==null)return n;if(e instanceof Oi)throw new pi(-204,!1);if(e instanceof Function)return Ga(e);throw new pi(-204,!1)}function Ga(e){if(e.length>0)throw new pi(-204,!1);let t=wi(e);return t===null?()=>new e:()=>t.factory(e)}function Ka(e){return Ma(e)?Ya(void 0,e.useValue):Ya(qa(e),Ra)}function qa(e,t,n){let r;if(Fa(e)){let t=yi(e);return ca(t)||Wa(t)}if(Ma(e))r=()=>yi(e.useValue);else if(Pa(e))r=()=>e.useFactory(...oa(e.deps||[]));else if(Na(e))r=(t,n)=>ra(yi(e.useExisting),n!==void 0&&n&8?8:void 0);else{let t=yi(e&&(e.useClass||e.provide));if(Xa(e))r=()=>new t(...oa(e.deps));else return ca(t)||Wa(t)}return r}function Ja(e){if(e.destroyed)throw new pi(-205,!1)}function Ya(e,t,n=!1){return{factory:e,value:t,multi:n?[]:void 0}}function Xa(e){return!!e.deps}function Za(e){return typeof e==`object`&&!!e&&typeof e.ngOnDestroy==`function`}function Qa(e){return typeof e==`function`||typeof e==`object`&&e.ngMetadataName===`InjectionToken`}function $a(e,t){for(let n of e)Array.isArray(n)?$a(n,t):n&&ki(n)?$a(n.ɵproviders,t):t(n)}function eo(e,t){let n;e instanceof Ua?(Ja(e),n=e):n=new ta(e);let r=Bn(n),i=Xi(void 0);try{return t()}finally{Bn(r),Xi(i)}}function to(){return Yi()!==void 0||zn()!=null}var no=1;function ro(e){return Array.isArray(e)&&typeof e[no]==`object`}function io(e){return Array.isArray(e)&&e[no]===!0}function ao(e){return!!(e.flags&4)}function oo(e){return e.componentOffset>-1}function so(e){return(e.flags&1)==1}function co(e){return!!e.template}function lo(e){return!!(e[2]&512)}function uo(e){return(e[2]&256)==256}var fo=(function(e){return e[e.NONE=0]=`NONE`,e[e.HTML=1]=`HTML`,e[e.STYLE=2]=`STYLE`,e[e.SCRIPT=3]=`SCRIPT`,e[e.URL=4]=`URL`,e[e.RESOURCE_URL=5]=`RESOURCE_URL`,e[e.ATTRIBUTE_NO_BINDING=6]=`ATTRIBUTE_NO_BINDING`,e})(fo||{}),po=`math`;function mo(e){for(;Array.isArray(e);)e=e[0];return e}function ho(e,t){return mo(t[e])}function go(e,t){return mo(t[e.index])}function _o(e,t){return e.data[t]}function vo(e,t){return e[t]}function yo(e,t,n,r){n>=e.data.length&&(e.data[n]=null,e.blueprint[n]=null),t[n]=r}function bo(e,t){let n=t[e];return ro(n)?n:n[0]}function xo(e){return(e[2]&128)==128}function So(e){return io(e[3])}function Co(e,t){return t==null?null:e[t]}function wo(e){e[17]=0}function To(e){e[2]&1024||(e[2]|=1024,xo(e)&&Oo(e))}function Uee(e,t){for(;e>0;)t=t[14],e--;return t}function Eo(e){return!!(e[2]&9216||e[24]?.dirty)}function Do(e){e[10].changeDetectionScheduler?.notify(8),e[2]&64&&(e[2]|=1024),Eo(e)&&Oo(e)}function Oo(e){e[10].changeDetectionScheduler?.notify(0);let t=Ao(e);for(;t!==null&&!(t[2]&8192||(t[2]|=8192,!xo(t)));)t=Ao(t)}function ko(e,t){if(uo(e))throw new pi(911,!1);e[21]===null&&(e[21]=[]),e[21].push(t)}function Wee(e,t){if(e[21]===null)return;let n=e[21].indexOf(t);n!==-1&&e[21].splice(n,1)}function Ao(e){let t=e[3];return io(t)?t[3]:t}function jo(e){return e[7]??=[]}function Mo(e){return e.cleanup??=[]}function Gee(e,t,n,r){let i=jo(t);i.push(n),e.firstCreatePass&&Mo(e).push(r,i.length-1)}var No={lFrame:as(null),bindingsEnabled:!0,skipHydrationRootTNode:null},Po=!1;function Kee(){return No.lFrame.elementDepthCount}function qee(){No.lFrame.elementDepthCount++}function Fo(){No.lFrame.elementDepthCount--}function Io(){return No.bindingsEnabled}function Lo(){return No.skipHydrationRootTNode!==null}function Ro(e){return No.skipHydrationRootTNode===e}function zo(){No.skipHydrationRootTNode=null}function Bo(){return No.lFrame.lView}function Vo(){return No.lFrame.tView}function S(e){return No.lFrame.contextLView=e,e[8]}function C(e){return No.lFrame.contextLView=null,e}function Ho(){let e=Uo();for(;e!==null&&e.type===64;)e=e.parent;return e}function Uo(){return No.lFrame.currentTNode}function Jee(){let e=No.lFrame,t=e.currentTNode;return e.isParent?t:t.parent}function Wo(e,t){let n=No.lFrame;n.currentTNode=e,n.isParent=t}function Go(){return No.lFrame.isParent}function Ko(){No.lFrame.isParent=!1}function qo(){return No.lFrame.contextLView}function Jo(){return Po}function Yo(e){let t=Po;return Po=e,t}function Xo(){let e=No.lFrame,t=e.bindingRootIndex;return t===-1&&(t=e.bindingRootIndex=e.tView.bindingStartIndex),t}function Zo(){return No.lFrame.bindingIndex}function Yee(e){return No.lFrame.bindingIndex=e}function Qo(){return No.lFrame.bindingIndex++}function $o(e){let t=No.lFrame,n=t.bindingIndex;return t.bindingIndex+=e,n}function Xee(){return No.lFrame.inI18n}function Zee(e,t){let n=No.lFrame;n.bindingIndex=n.bindingRootIndex=e,es(t)}function Qee(){return No.lFrame.currentDirectiveIndex}function es(e){No.lFrame.currentDirectiveIndex=e}function $ee(e){let t=No.lFrame.currentDirectiveIndex;return t===-1?null:e[t]}function ete(){return No.lFrame.currentQueryIndex}function ts(e){No.lFrame.currentQueryIndex=e}function tte(e){let t=e[1];return t.type===2?t.declTNode:t.type===1?e[5]:null}function ns(e,t,n){if(n&4){let r=t,i=e;for(;r=r.parent,r===null&&!(n&1)&&(r=tte(i),!(r===null||(i=i[14],r.type&10))););if(r===null)return!1;t=r,e=i}let r=No.lFrame=is();return r.currentTNode=t,r.lView=e,!0}function rs(e){let t=is(),n=e[1];No.lFrame=t,t.currentTNode=n.firstChild,t.lView=e,t.tView=n,t.contextLView=e,t.bindingIndex=n.bindingStartIndex,t.inI18n=!1}function is(){let e=No.lFrame,t=e===null?null:e.child;return t===null?as(e):t}function as(e){let t={currentTNode:null,isParent:!0,lView:null,tView:null,selectedIndex:-1,contextLView:null,elementDepthCount:0,currentNamespace:null,currentDirectiveIndex:-1,bindingRootIndex:-1,bindingIndex:-1,currentQueryIndex:0,parent:e,child:null,inI18n:!1};return e!==null&&(e.child=t),t}function os(){let e=No.lFrame;return No.lFrame=e.parent,e.currentTNode=null,e.lView=null,e}var ss=os;function cs(){let e=os();e.isParent=!0,e.tView=null,e.selectedIndex=-1,e.contextLView=null,e.elementDepthCount=0,e.currentDirectiveIndex=-1,e.currentNamespace=null,e.bindingRootIndex=-1,e.bindingIndex=-1,e.currentQueryIndex=0}function nte(e){return(No.lFrame.contextLView=Uee(e,No.lFrame.contextLView))[8]}function ls(){return No.lFrame.selectedIndex}function us(e){No.lFrame.selectedIndex=e}function ds(){let e=No.lFrame;return _o(e.tView,e.selectedIndex)}function w(){No.lFrame.currentNamespace=`svg`}function fs(){ps()}function ps(){No.lFrame.currentNamespace=null}function ms(){return No.lFrame.currentNamespace}var hs=!0;function gs(){return hs}function _s(e){hs=e}function vs(e,t=null,n=null,r){let i=ys(e,t,n,r);return i.resolveInjectorInitializers(),i}function ys(e,t=null,n=null,r,i=new Set){return new Ua([n||xa,Ea(e)],t||Va(),null,i)}var bs=class e{static THROW_IF_NOT_FOUND=$i;static NULL=new Ta;static create(e,t){if(Array.isArray(e))return vs({name:``},t,e,``);{let t=e.name??``;return vs({name:t},e.parent,e.providers,t)}}static ɵprov=xi({token:e,providedIn:`any`,factory:()=>ra(Ca)});static __NG_ELEMENT_ID__=-1},xs=new Oi(``),Ss=class{static __NG_ELEMENT_ID__=ws;static __NG_ENV_ID__=e=>e},Cs=class extends Ss{_lView;constructor(e){super(),this._lView=e}get destroyed(){return uo(this._lView)}onDestroy(e){let t=this._lView;return ko(t,e),()=>Wee(t,e)}};function ws(){return new Cs(Bo())}var Ts=new Oi(``),Es=(()=>{class e{taskId=0;pendingTasks=new Set;destroyed=!1;pendingTask=new Kr(!1);debugTaskTracker=x(Ts,{optional:!0});get hasPendingTasks(){return!this.destroyed&&this.pendingTask.value}get hasPendingTasksObservable(){return this.destroyed?new Fr(e=>{e.next(!1),e.complete()}):this.pendingTask}add(){!this.hasPendingTasks&&!this.destroyed&&this.pendingTask.next(!0);let e=this.taskId++;return this.pendingTasks.add(e),this.debugTaskTracker?.add(e),e}has(e){return this.pendingTasks.has(e)}remove(e){this.pendingTasks.delete(e),this.debugTaskTracker?.remove(e),this.pendingTasks.size===0&&this.hasPendingTasks&&this.pendingTask.next(!1)}ngOnDestroy(){this.pendingTasks.clear(),this.hasPendingTasks&&this.pendingTask.next(!1),this.destroyed=!0,this.pendingTask.unsubscribe()}static ɵprov=xi({token:e,providedIn:`root`,factory:()=>new e})}return e})(),Ds=class extends Wr{__isAsync;destroyRef=void 0;pendingTasks=void 0;constructor(e=!1){super(),this.__isAsync=e,to()&&(this.destroyRef=x(Ss,{optional:!0})??void 0,this.pendingTasks=x(Es,{optional:!0})??void 0)}emit(e){let t=an(null);try{super.next(e)}finally{an(t)}}subscribe(e,t,n){let r=e,i=t||(()=>null),a=n;if(e&&typeof e==`object`){let t=e;r=t.next?.bind(t),i=t.error?.bind(t),a=t.complete?.bind(t)}this.__isAsync&&(i=this.wrapInTimeout(i),r&&=this.wrapInTimeout(r),a&&=this.wrapInTimeout(a));let o=super.subscribe({next:r,error:i,complete:a});return e instanceof cr&&e.add(o),o}wrapInTimeout(e){return t=>{let n=this.pendingTasks?.add();setTimeout(()=>{try{e(t)}finally{n!==void 0&&this.pendingTasks?.remove(n)}})}}};function Os(...e){}function ks(e){let t,n;function r(){e=Os;try{n!==void 0&&typeof cancelAnimationFrame==`function`&&cancelAnimationFrame(n),t!==void 0&&clearTimeout(t)}catch{}}return t=setTimeout(()=>{e(),r()}),typeof requestAnimationFrame==`function`&&(n=requestAnimationFrame(()=>{e(),r()})),()=>r()}function As(e){return queueMicrotask(()=>e()),()=>{e=Os}}var js=`isAngularZone`,Ms=`isAngularZone_ID`,Ns=0,Ps=class e{hasPendingMacrotasks=!1;hasPendingMicrotasks=!1;isStable=!0;onUnstable=new Ds(!1);onMicrotaskEmpty=new Ds(!1);onStable=new Ds(!1);onError=new Ds(!1);constructor(e){let{enableLongStackTrace:t=!1,shouldCoalesceEventChangeDetection:n=!1,shouldCoalesceRunChangeDetection:r=!1,scheduleInRootZone:i=!1}=e;if(typeof Zone>`u`)throw new pi(908,!1);Zone.assertZonePatched();let a=this;a._nesting=0,a._outer=a._inner=Zone.current,Zone.TaskTrackingZoneSpec&&(a._inner=a._inner.fork(new Zone.TaskTrackingZoneSpec)),t&&Zone.longStackTraceZoneSpec&&(a._inner=a._inner.fork(Zone.longStackTraceZoneSpec)),a.shouldCoalesceEventChangeDetection=!r&&n,a.shouldCoalesceRunChangeDetection=r,a.callbackScheduled=!1,a.scheduleInRootZone=i,Rs(a)}static isInAngularZone(){return typeof Zone<`u`&&Zone.current.get(js)===!0}static assertInAngularZone(){if(!e.isInAngularZone())throw new pi(909,!1)}static assertNotInAngularZone(){if(e.isInAngularZone())throw new pi(909,!1)}run(e,t,n){return this._inner.run(e,t,n)}runTask(e,t,n,r){let i=this._inner,a=i.scheduleEventTask(`NgZoneEvent: `+r,e,Fs,Os,Os);try{return i.runTask(a,t,n)}finally{i.cancelTask(a)}}runGuarded(e,t,n){return this._inner.runGuarded(e,t,n)}runOutsideAngular(e){return this._outer.run(e)}},Fs={};function Is(e){if(e._nesting==0&&!e.hasPendingMicrotasks&&!e.isStable)try{e._nesting++,e.onMicrotaskEmpty.emit(null)}finally{if(e._nesting--,!e.hasPendingMicrotasks)try{e.runOutsideAngular(()=>e.onStable.emit(null))}finally{e.isStable=!0}}}function Ls(e){if(e.isCheckStableRunning||e.callbackScheduled)return;e.callbackScheduled=!0;function t(){ks(()=>{e.callbackScheduled=!1,zs(e),e.isCheckStableRunning=!0,Is(e),e.isCheckStableRunning=!1})}e.scheduleInRootZone?Zone.root.run(()=>{t()}):e._outer.run(()=>{t()}),zs(e)}function Rs(e){let t=()=>{Ls(e)},n=Ns++;e._inner=e._inner.fork({name:`angular`,properties:{[js]:!0,[Ms]:n,[Ms+n]:!0},onInvokeTask:(n,r,i,a,o,s)=>{if(Us(s))return n.invokeTask(i,a,o,s);try{return Bs(e),n.invokeTask(i,a,o,s)}finally{(e.shouldCoalesceEventChangeDetection&&a.type===`eventTask`||e.shouldCoalesceRunChangeDetection)&&t(),Vs(e)}},onInvoke:(n,r,i,a,o,s,c)=>{try{return Bs(e),n.invoke(i,a,o,s,c)}finally{e.shouldCoalesceRunChangeDetection&&!e.callbackScheduled&&!Ws(s)&&t(),Vs(e)}},onHasTask:(t,n,r,i)=>{t.hasTask(r,i),n===r&&(i.change==`microTask`?(e._hasPendingMicrotasks=i.microTask,zs(e),Is(e)):i.change==`macroTask`&&(e.hasPendingMacrotasks=i.macroTask))},onHandleError:(t,n,r,i)=>(t.handleError(r,i),e.runOutsideAngular(()=>e.onError.emit(i)),!1)})}function zs(e){e.hasPendingMicrotasks=!!(e._hasPendingMicrotasks||(e.shouldCoalesceEventChangeDetection||e.shouldCoalesceRunChangeDetection)&&e.callbackScheduled===!0)}function Bs(e){e._nesting++,e.isStable&&(e.isStable=!1,e.onUnstable.emit(null))}function Vs(e){e._nesting--,Is(e)}var Hs=class{hasPendingMicrotasks=!1;hasPendingMacrotasks=!1;isStable=!0;onUnstable=new Ds;onMicrotaskEmpty=new Ds;onStable=new Ds;onError=new Ds;run(e,t,n){return e.apply(t,n)}runGuarded(e,t,n){return e.apply(t,n)}runOutsideAngular(e){return e()}runTask(e,t,n,r){return e.apply(t,n)}};function Us(e){return Gs(e,`__ignore_ng_zone__`)}function Ws(e){return Gs(e,`__scheduler_tick__`)}function Gs(e,t){return!Array.isArray(e)||e.length!==1?!1:e[0]?.data?.[t]===!0}var Ks=class{_console=console;handleError(e){this._console.error(`ERROR`,e)}},qs=new Oi(``,{factory:()=>{let e=x(Ps),t=x(Ha),n;return r=>{e.runOutsideAngular(()=>{t.destroyed&&!n?setTimeout(()=>{throw r}):(n??=t.get(Ks),n.handleError(r))})}}}),Js={provide:Sa,useValue:()=>{x(Ks,{optional:!0})},multi:!0};function T(e,t){let[n,r,i]=mee(e,t?.equal),a=n;return a[rn],a.set=r,a.update=i,a.asReadonly=Ys.bind(a),a}function Ys(){let e=this[rn];if(e.readonlyFn===void 0){let t=()=>this();t[rn]=e,e.readonlyFn=t}return e.readonlyFn}var Xs=new Oi(``,{factory:()=>Zs}),Zs=`ng`,Qs=new Oi(``),$s=new Oi(``,{providedIn:`platform`,factory:()=>`unknown`}),ec=new Oi(``,{factory:()=>x(xs).body?.querySelector(`[ngCspNonce]`)?.getAttribute(`ngCspNonce`)||null}),tc=(()=>{class e{view;node;constructor(e,t){this.view=e,this.node=t}static __NG_ELEMENT_ID__=nc}return e})();function nc(){return new tc(Bo(),Ho())}var rc=class{},ic=new Oi(``,{factory:()=>!0}),ac=new Oi(``),oc=(()=>{class e{static ɵprov=xi({token:e,providedIn:`root`,factory:()=>new sc})}return e})(),sc=class{dirtyEffectCount=0;queues=new Map;add(e){this.enqueue(e),this.schedule(e)}schedule(e){e.dirty&&this.dirtyEffectCount++}remove(e){let t=e.zone,n=this.queues.get(t);n.has(e)&&(n.delete(e),e.dirty&&this.dirtyEffectCount--)}enqueue(e){let t=e.zone;this.queues.has(t)||this.queues.set(t,new Set);let n=this.queues.get(t);n.has(e)||n.add(e)}flush(){for(;this.dirtyEffectCount>0;){let e=!1;for(let[t,n]of this.queues)e||=t===null?this.flushQueue(n):t.run(()=>this.flushQueue(n));e||(this.dirtyEffectCount=0)}}flushQueue(e){let t=!1;for(let n of e)n.dirty&&(this.dirtyEffectCount--,t=!0,n.run());return t}},cc=class{[rn];constructor(e){this[rn]=e}destroy(){this[rn].destroy()}};function E(e,t){let n=t?.injector??x(bs),r=t?.manualCleanup===!0?null:n.get(Ss),i,a=n.get(tc,null,{optional:!0}),o=n.get(rc);return a===null?i=pc(e,n.get(oc),o):(i=fc(a.view,o,e),r instanceof Cs&&r._lView===a.view&&(r=null)),i.injector=n,r!==null&&(i.onDestroyFns=[r.onDestroy(()=>i.destroy())]),new cc(i)}var lc={...In,cleanupFns:void 0,zone:null,onDestroyFns:null,run(){let e=Yo(!1);try{Ln(this)}finally{Yo(e)}},cleanup(){if(!this.cleanupFns?.length)return;let e=an(null);try{for(;this.cleanupFns.length;)this.cleanupFns.pop()()}finally{this.cleanupFns=[],an(e)}}},uc={...lc,consumerMarkedDirty(){this.scheduler.schedule(this),this.notifier.notify(12)},destroy(){if(bn(this),this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();this.cleanup(),this.scheduler.remove(this)}},dc={...lc,consumerMarkedDirty(){this.view[2]|=8192,Oo(this.view),this.notifier.notify(13)},destroy(){if(bn(this),this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();this.cleanup(),this.view[23]?.delete(this)}};function fc(e,t,n){let r=Object.create(dc);return r.view=e,r.zone=typeof Zone<`u`?Zone.current:null,r.notifier=t,r.fn=mc(r,n),e[23]??=new Set,e[23].add(r),r.consumerMarkedDirty(r),r}function pc(e,t,n){let r=Object.create(uc);return r.fn=mc(r,e),r.scheduler=t,r.notifier=n,r.zone=typeof Zone<`u`?Zone.current:null,r.scheduler.add(r),r.notifier.notify(12),r}function mc(e,t){return()=>{t(t=>(e.cleanupFns??=[]).push(t))}}function hc(e){return typeof e==`function`&&e[rn]!==void 0}function gc(e){return hc(e)&&typeof e.set==`function`}var _c=Symbol(`InputSignalNode#UNSET`),vc={...Pn,transformFn:void 0,applyValueToInputSignal(e,t){Mn(e,t)}};function yc(e){return{toString:e}.toString()}var bc=(function(e){return e[e.TemplateCreateStart=0]=`TemplateCreateStart`,e[e.TemplateCreateEnd=1]=`TemplateCreateEnd`,e[e.TemplateUpdateStart=2]=`TemplateUpdateStart`,e[e.TemplateUpdateEnd=3]=`TemplateUpdateEnd`,e[e.LifecycleHookStart=4]=`LifecycleHookStart`,e[e.LifecycleHookEnd=5]=`LifecycleHookEnd`,e[e.OutputStart=6]=`OutputStart`,e[e.OutputEnd=7]=`OutputEnd`,e[e.BootstrapApplicationStart=8]=`BootstrapApplicationStart`,e[e.BootstrapApplicationEnd=9]=`BootstrapApplicationEnd`,e[e.BootstrapComponentStart=10]=`BootstrapComponentStart`,e[e.BootstrapComponentEnd=11]=`BootstrapComponentEnd`,e[e.ChangeDetectionStart=12]=`ChangeDetectionStart`,e[e.ChangeDetectionEnd=13]=`ChangeDetectionEnd`,e[e.ChangeDetectionSyncStart=14]=`ChangeDetectionSyncStart`,e[e.ChangeDetectionSyncEnd=15]=`ChangeDetectionSyncEnd`,e[e.AfterRenderHooksStart=16]=`AfterRenderHooksStart`,e[e.AfterRenderHooksEnd=17]=`AfterRenderHooksEnd`,e[e.ComponentStart=18]=`ComponentStart`,e[e.ComponentEnd=19]=`ComponentEnd`,e[e.DeferBlockStateStart=20]=`DeferBlockStateStart`,e[e.DeferBlockStateEnd=21]=`DeferBlockStateEnd`,e[e.DynamicComponentStart=22]=`DynamicComponentStart`,e[e.DynamicComponentEnd=23]=`DynamicComponentEnd`,e[e.HostBindingsUpdateStart=24]=`HostBindingsUpdateStart`,e[e.HostBindingsUpdateEnd=25]=`HostBindingsUpdateEnd`,e})(bc||{}),xc=class{previousValue;currentValue;firstChange;constructor(e,t,n){this.previousValue=e,this.currentValue=t,this.firstChange=n}isFirstChange(){return this.firstChange}};function Sc(e,t,n,r){t===null?e[n]=r:t.applyValueToInputSignal(t,r)}var Cc=null,wc=(()=>{Cc=Ec;let e=()=>Ec;return e.ngInherit=!0,e})();function Tc(){return Cc}function Ec(e){return e.type.prototype.ngOnChanges&&(e.setInput=Oc),Dc}function Dc(){let e=Ac(this),t=e?.current;if(t){let n=e.previous;if(n===ba)e.previous=t;else for(let e in t)n[e]=t[e];e.current=null,this.ngOnChanges(t)}}function Oc(e,t,n,r,i){let a=this.declaredInputs[r],o=Ac(e)||jc(e,{previous:ba,current:null}),s=o.current||={},c=o.previous,l=c[a];s[a]=new xc(l&&l.currentValue,n,c===ba),Sc(e,t,i,n)}var kc=`__ngSimpleChanges__`;function Ac(e){return Object.hasOwn(e,kc)&&e[kc]||null}function jc(e,t){return e[kc]=t}var Mc=[],Nc=function(e,t=null,n){for(let r=0;r=r)break}else t[c]<0&&(e[17]+=65536),(s>14>16&&(e[2]&3)===t&&(e[2]+=16384,Bc(o,a)):Bc(o,a)}var Hc=-1,Uc=class{factory;name;injectImpl;resolving=!1;canSeeViewProviders;multi;componentProviders;index;providerFactory;constructor(e,t,n,r){this.factory=e,this.name=r,this.canSeeViewProviders=t,this.injectImpl=n}};function Wc(e){return!!(e.flags&8)}function Gc(e){return!!(e.flags&16)}function Kc(e,t,n){let r=0;for(;rt){o=a-1;break}}}for(;a>16}function el(e,t){let n=$c(e),r=t;for(;n>0;)r=r[14],n--;return r}var tl=!0;function nl(e){let t=tl;return tl=e,t}var rl=255,il=5,al=0,ol={};function sl(e,t,n){let r;typeof n==`string`?r=n.charCodeAt(0)||0:Object.hasOwn(n,Pi)&&(r=n[Pi]),r??=n[Pi]=al++;let i=r&rl,a=1<>il)]|=a}function cl(e,t){let n=ul(e,t);if(n!==-1)return n;let r=t[1];r.firstCreatePass&&(e.injectorIndex=t.length,ll(r.data,e),ll(t,null),ll(r.blueprint,null));let i=dl(e,t),a=e.injectorIndex;if(Zc(i)){let e=Qc(i),n=el(i,t),r=n[1].data;for(let i=0;i<8;i++)t[a+i]=n[e+i]|r[e+i]}return t[a+8]=i,a}function ll(e,t){e.push(0,0,0,0,0,0,0,0,t)}function ul(e,t){return e.injectorIndex===-1||e.parent&&e.parent.injectorIndex===e.injectorIndex||t[e.injectorIndex+8]===null?-1:e.injectorIndex}function dl(e,t){if(e.parent&&e.parent.injectorIndex!==-1)return e.parent.injectorIndex;let n=0,r=null,i=t;for(;i!==null;){if(r=Ol(i),r===null)return Hc;if(n++,i=i[14],r.injectorIndex!==-1)return r.injectorIndex|n<<16}return Hc}function fl(e,t,n){sl(e,t,n)}function pl(e,t,n){if(n&8||e!==void 0)return e;Gi(t,`NodeInjector`)}function ml(e,t,n,r){if(n&8&&r===void 0&&(r=null),!(n&3)){let i=e[9],a=Xi(void 0);try{return i?i.get(t,r,n&8):Zi(t,r,n&8)}finally{Xi(a)}}return pl(r,t,n)}function hl(e,t,n,r=0,i){if(e!==null){if(t[2]&2048&&!(r&2)){let i=Dl(e,t,n,r,ol);if(i!==ol)return i}let i=gl(e,t,n,r,ol);if(i!==ol)return i}return ml(t,n,r,i)}function gl(e,t,n,r,i){let a=bl(n);if(typeof a==`function`){if(!ns(t,e,r))return r&1?pl(i,n,r):ml(t,n,r,i);try{let e;if(e=a(r),e==null&&!(r&8))Gi(n);else return e}finally{ss()}}else if(typeof a==`number`){let i=null,o=ul(e,t),s=Hc,c=r&1?t[15][5]:null;for((o===-1||r&4)&&(s=o===-1?dl(e,t):t[o+8],s===Hc||!Sl(r,!1)?o=-1:(i=t[1],o=Qc(s),t=el(s,t)));o!==-1;){let e=t[1];if(xl(a,o,e.data)){let e=_l(o,t,n,i,r,c);if(e!==ol)return e}s=t[o+8],s!==Hc&&Sl(r,t[1].data[o+8]===c)&&xl(a,o,t)?(i=e,o=Qc(s),t=el(s,t)):o=-1}}return i}function _l(e,t,n,r,i,a){let o=t[1],s=o.data[e+8],c=vl(s,o,n,r==null?oo(s)&&tl:r!=o&&!!(s.type&3),i&1&&a===s);return c===null?ol:yl(t,o,c,s,i)}function vl(e,t,n,r,i){let a=e.providerIndexes,o=t.data,s=a&1048575,c=e.directiveStart,l=e.directiveEnd,u=a>>20,d=r?s:s+u,f=i?s+u:l;for(let e=d;e=c&&t.type===n)return e}if(i){let e=o[c];if(e&&co(e)&&e.type===n)return c}return null}function yl(e,t,n,r,i){let a=e[n],o=t.data;if(a instanceof Uc){let s=a;if(s.resolving)throw Wi(``);let c=nl(s.canSeeViewProviders);s.resolving=!0,o[n].type||o[n];let l=s.injectImpl?Xi(s.injectImpl):null;ns(e,r,0);try{a=e[n]=s.factory(void 0,i,o,e,r),t.firstCreatePass&&n>=r.directiveStart&&Pc(n,o[n],t)}finally{l!==null&&Xi(l),nl(c),s.resolving=!1,ss()}}return a}function bl(e){if(typeof e==`string`)return e.charCodeAt(0)||0;let t=Object.hasOwn(e,Pi)?e[Pi]:void 0;return typeof t==`number`?t>=0?t&rl:wl:t}function xl(e,t,n){let r=1<>il)]&r)}function Sl(e,t){return!(e&2)&&!(e&1&&t)}var Cl=class{_tNode;_lView;constructor(e,t){this._tNode=e,this._lView=t}get(e,t,n){return hl(this._tNode,this._lView,e,ia(n),t)}};function wl(){return new Cl(Ho(),Bo())}function Tl(e){return yc(()=>{let t=e.prototype.constructor,n=t[Ni]||El(t),r=Object.prototype,i=Object.getPrototypeOf(e.prototype).constructor;for(;i&&i!==r;){let e=i[Ni]||El(i);if(e&&e!==n)return e;i=Object.getPrototypeOf(i)}return e=>new e})}function El(e){return bi(e)?()=>{let t=El(yi(e));return t&&t()}:ca(e)}function Dl(e,t,n,r,i){let a=e,o=t;for(;a!==null&&o!==null&&o[2]&2048&&!lo(o);){let e=gl(a,o,n,r|2,ol);if(e!==ol)return e;r&=-5;let t=a.parent;if(!t){let e=o[20];if(e){let t=e.get(n,ol,r);if(t!==ol)return t}t=Ol(o),o=o[14]}a=t}return i}function Ol(e){let t=e[1],n=t.type;return n===2?t.declTNode:n===1?e[5]:null}function kl(e){return{token:e.token,providedIn:e.autoProvided===!1?null:`root`,factory:e.factory,value:void 0}}function Al(){return jl(Ho(),Bo())}function jl(e,t){return new Ml(go(e,t))}var Ml=(()=>{class e{nativeElement;constructor(e){this.nativeElement=e}static __NG_ELEMENT_ID__=Al}return e})();function Nl(e){return e instanceof Ml?e.nativeElement:e}function Pl(){return this._results[Symbol.iterator]()}var Fl=class{_emitDistinctChangesOnly;dirty=!0;_onDirty=void 0;_results=[];_changesDetected=!1;_changes=void 0;length=0;first=void 0;last=void 0;get changes(){return this._changes??=new Wr}constructor(e=!1){this._emitDistinctChangesOnly=e}get(e){return this._results[e]}map(e){return this._results.map(e)}filter(e){return this._results.filter(e)}find(e){return this._results.find(e)}reduce(e,t){return this._results.reduce(e,t)}forEach(e){this._results.forEach(e)}some(e){return this._results.some(e)}toArray(){return this._results.slice()}toString(){return this._results.toString()}reset(e,t){this.dirty=!1;let n=ua(e);(this._changesDetected=!la(this._results,n,t))&&(this._results=n,this.length=n.length,this.last=n[this.length-1],this.first=n[0])}notifyOnChanges(){this._changes!==void 0&&(this._changesDetected||!this._emitDistinctChangesOnly)&&this._changes.next(this)}onDirty(e){this._onDirty=e}setDirty(){this.dirty=!0,this._onDirty?.()}destroy(){this._changes!==void 0&&(this._changes.complete(),this._changes.unsubscribe())}[Symbol.iterator]=Pl};function Il(e){return(e.flags&128)==128}var Ll=(function(e){return e[e.OnPush=0]=`OnPush`,e[e.Eager=1]=`Eager`,e[e.Default=1]=`Default`,e})(Ll||{}),Rl=new Map,zl=0;function Bl(){return zl++}function Vl(e){Rl.set(e[19],e)}function Hl(e){Rl.delete(e[19])}var Ul=`__ngContext__`;function Wl(e,t){ro(t)?(e[Ul]=t[19],Vl(t)):e[Ul]=t}function Gl(e){return ql(e[12])}function Kl(e){return ql(e[4])}function ql(e){for(;e!==null&&!io(e);)e=e[4];return e}var Jl=void 0;function Yl(e){Jl=e}function Xl(){if(Jl!==void 0)return Jl;if(typeof document<`u`)return document;throw new pi(210,!1)}var Zl=!1,Ql=new Oi(``,{factory:()=>Zl}),$l=new WeakMap;function eu(e,t){if(typeof e!=`object`||!e)return;let n=$l.get(e);n||(n=new WeakSet,$l.set(e,n)),n.add(t)}function tu(e){return(e.flags&32)==32}var nu=()=>null;function ru(e,t,n=!1){return nu(e,t,n)}function iu(e,t){let n=e.contentQueries;if(n!==null){let r=an(null);try{for(let r=0;r|^->||--!>|)/g,gu=`​$1​`;function _u(e){return e.replace(mu,e=>e.replace(hu,gu))}function vu(e,t){return e.createText(t)}function yu(e,t,n){e.setValue(t,n)}function bu(e,t){return e.createComment(_u(t))}function xu(e,t,n){return e.createElement(t,n)}function Su(e,t,n,r,i){e.insertBefore(t,n,r,i)}function Cu(e,t,n){e.appendChild(t,n)}function wu(e,t,n,r,i){r===null?Cu(e,t,n):Su(e,t,n,r,i)}function Tu(e,t,n,r){e.removeChild(null,t,n,r)}function rte(e,t,n){e.setAttribute(t,`style`,n)}function ite(e,t,n){n===``?e.removeAttribute(t,`class`):e.setAttribute(t,`class`,n)}function Eu(e,t,n){let{mergedAttrs:r,classes:i,styles:a}=n;r!==null&&Kc(e,t,r),i!==null&&ite(e,t,i),a!==null&&rte(e,t,a)}function Du(e){let t=ate();return t?t.sanitize(fo.URL,e)||``:uu(e,`URL`)?lu(e):pu(Bi(e))}function ate(){let e=Bo();return e&&e[10].sanitizer}function Ou(e){return e.ownerDocument.defaultView}function ku(e){return e.ownerDocument}function ote(e,t,n){let r=e.length;for(;;){let i=e.indexOf(t,n);if(i===-1)return i;if(i===0||e.charCodeAt(i-1)<=32){let n=t.length;if(i+n===r||e.charCodeAt(i+n)<=32)return i}n=i+1}}var Au=`ng-template`;function ste(e,t,n,r){let i=0;if(r){for(;i-1){let e;for(;++ia?``:i[u+1].toLowerCase(),r&2&&l!==e){if(Mu(r))return!1;o=!0}}}}}return Mu(r)||o}function Mu(e){return!(e&1)}function ute(e,t,n,r){if(t===null)return-1;let i=0;if(r||!n){let n=!1;for(;i-1)for(n++;n0?`="`+t+`"`:``)+`]`}else r&8?i+=`.`+o:r&4&&(i+=` `+o)}else i!==``&&!Mu(o)&&(t+=Pu(a,i),i=``),r=o,a||=!Mu(r);n++}return i!==``&&(t+=Pu(a,i)),t}function gte(e){return e.map(hte).join(`,`)}function _te(e){let t=[],n=[],r=1,i=2;for(;r!1});function Ru(e){if(!e)return 0;let t=e.toLowerCase().indexOf(`ms`)>-1?1:1e3;return parseFloat(e)*t}function zu(e,t){return e.getPropertyValue(t).split(`,`).map(e=>e.trim())}function bte(e){let t=zu(e,`transition-property`),n=zu(e,`transition-duration`),r=zu(e,`transition-delay`),i={propertyName:``,duration:0,animationName:void 0};for(let e=0;ei.duration&&(i.propertyName=t[e],i.duration=a)}return i}function xte(e){let t=zu(e,`animation-name`),n=zu(e,`animation-delay`),r=zu(e,`animation-duration`),i=zu(e,`animation-iteration-count`),a={animationName:``,propertyName:void 0,duration:0};for(let e=0;ea.duration&&s!==`infinite`&&(a.animationName=t[e],a.duration=o)}return a}function Bu(e,t){return e!==void 0&&e.duration>t.duration}function Vu(e){return(e.animationName!=null||e.propertyName!=null)&&e.duration>0}function Hu(e){let t=e.effect?.getTiming();if(t===void 0)return;let n=typeof t.duration==`number`?t.duration:0,r=(t.delay??0)+n,i=e.playbackRate;return i!==void 0&&i!==0&&i!==1&&(r/=Math.abs(i)),r}function Ste(e,t){let n=getComputedStyle(e),r=xte(n),i=bte(n),a=r.duration>i.duration?r:i;Bu(t.get(e),a)||Vu(a)&&t.set(e,a)}function Cte(e,t,n){if(!n)return;let r=e.getAnimations();return r.length===0?Ste(e,t):wte(e,t,r)}function wte(e,t,n){let r={animationName:void 0,propertyName:void 0,duration:0};for(let e of n){if(e.effect?.getTiming()?.iterations===1/0)continue;let t=Hu(e)??0,n,i;e.animationName?i=e.animationName:n=e.transitionProperty,t>=r.duration&&(r={animationName:i,propertyName:n,duration:t})}Bu(t.get(e),r)||Vu(r)&&t.set(e,r)}var Uu=new Set,Tte=!1,Ete=1,Wu=typeof document<`u`&&typeof document?.documentElement?.getAnimations==`function`;function Dte(e){return e[9].get(yte,Tte)}function Ote(e,t,n){let r=Ku.get(e);if(r){for(let e of t)r.classList.push(e);for(let e of n)r.cleanupFns.push(e)}else Ku.set(e,{classList:t,cleanupFns:n})}function Gu(e){let t=Ku.get(e);if(t){for(let e of t.cleanupFns)e();Ku.delete(e)}qu.delete(e)}var Ku=new WeakMap,qu=new WeakMap,Ju=new WeakMap;function Yu(e){return e?e[14]??e:null}var Xu=new WeakSet;function kte(e,t,n){let r=Ju.get(e);if(!r||r.length===0)return;let i=t.parentNode,a=t.previousSibling,o=Yu(n);for(let e=r.length-1;e>=0;e--){let{el:n,declarationView:s}=r[e],c=n.parentNode;n===t?(r.splice(e,1),Xu.add(n),n.dispatchEvent(new CustomEvent(`animationend`,{detail:{cancel:!0}}))):(a&&n===a||c&&i&&c!==i&&(o===null||s===null||o===s))&&(r.splice(e,1),n.dispatchEvent(new CustomEvent(`animationend`,{detail:{cancel:!0}})),n.parentNode?.removeChild(n))}}function Ate(e,t,n){let r=Yu(n),i=Ju.get(e);i?i.some(e=>e.el===t)||i.push({el:t,declarationView:r}):Ju.set(e,[{el:t,declarationView:r}])}function Zu(e){let t=e[26]??={};return t.enter??=new Map}function jte(e){let t=typeof e==`function`?e():e,n=Array.isArray(t)?t:null;return typeof t==`string`&&(n=t.trim().split(/\s+/).filter(e=>e)),n}function Qu(e){return e.composedPath?e.composedPath()[0]:e.target}function $u(e,t){let n=qu.get(t);if(n===void 0)return!0;if(t!==Qu(e))return!1;let r=e.animation;if(r){let e=Hu(r);if(e!==void 0&&e+Ete{class e{impl=null;execute(){this.impl?.execute()}static ɵprov=xi({token:e,providedIn:`root`,factory:()=>new e})}return e})(),ad=[0,1,2,3],od=(()=>{class e{ngZone=x(Ps);scheduler=x(rc);errorHandler=x(Ks,{optional:!0});sequences=new Set;deferredRegistrations=new Set;executing=!1;constructor(){x(td,{optional:!0})}execute(){let e=this.sequences.size>0;e&&Nc(bc.AfterRenderHooksStart),this.executing=!0;for(let e of ad)for(let t of this.sequences)if(!t.erroredOrDestroyed&&t.hooks[e])try{t.pipelinedValue=this.ngZone.runOutsideAngular(()=>this.maybeTrace(()=>{let n=t.hooks[e];return n(t.pipelinedValue)},t.snapshot))}catch(e){t.erroredOrDestroyed=!0,this.errorHandler?.handleError(e)}this.executing=!1;for(let e of this.sequences)e.afterRun(),e.once&&(this.sequences.delete(e),e.destroy());for(let e of this.deferredRegistrations)this.sequences.add(e);this.deferredRegistrations.size>0&&this.scheduler.notify(7),this.deferredRegistrations.clear(),e&&Nc(bc.AfterRenderHooksEnd)}register(e){let{view:t}=e;t===void 0?this.executing?this.deferredRegistrations.add(e):this.addSequence(e):((t[25]??=[]).push(e),Oo(t),t[2]|=8192)}addSequence(e){this.sequences.add(e),this.scheduler.notify(7)}unregister(e){this.executing&&this.sequences.has(e)?(e.erroredOrDestroyed=!0,e.pipelinedValue=void 0,e.once=!0):(this.sequences.delete(e),this.deferredRegistrations.delete(e))}maybeTrace(e,t){return t?t.run(ed.AFTER_NEXT_RENDER,e):e()}static ɵprov=xi({token:e,providedIn:`root`,factory:()=>new e})}return e})(),sd=class{impl;hooks;view;once;snapshot;erroredOrDestroyed=!1;pipelinedValue=void 0;unregisterOnDestroy;constructor(e,t,n,r,i,a=null){this.impl=e,this.hooks=t,this.view=n,this.once=r,this.snapshot=a,this.unregisterOnDestroy=i?.onDestroy(()=>this.destroy())}afterRun(){this.erroredOrDestroyed=!1,this.pipelinedValue=void 0,this.snapshot?.dispose(),this.snapshot=null}destroy(){this.impl.unregister(this),this.unregisterOnDestroy?.();let e=this.view?.[25];e&&(this.view[25]=e.filter(e=>e!==this))}};function cd(e,t){let n=t?.injector??x(bs);return rd(`NgAfterNextRender`),Pte(e,n,t,!0)}function Nte(e){return e instanceof Function?[void 0,void 0,e,void 0]:[e.earlyRead,e.write,e.mixedReadWrite,e.read]}function Pte(e,t,n,r){let i=t.get(id);i.impl??=t.get(od);let a=t.get(td,null,{optional:!0}),o=n?.manualCleanup===!0?null:t.get(Ss),s=t.get(tc,null,{optional:!0}),c=new sd(i.impl,Nte(e),s?.view,r,o,a?.snapshot(null));return i.impl.register(c),c}var ld=new Oi(``,{factory:()=>{let e=x(Ha),t=new Set;return e.onDestroy(()=>t.clear()),{queue:t,isScheduled:!1,scheduler:null,injector:e}}});function ud(e,t,n){let r=e.get(ld);if(Array.isArray(t))for(let e of t)r.queue.add(e),n?.detachedLeaveAnimationFns?.push(e);else r.queue.add(t),n?.detachedLeaveAnimationFns?.push(t);r.scheduler&&r.scheduler(e)}function Fte(e,t){let n=e.get(ld);if(Array.isArray(t))for(let e of t)n.queue.delete(e);else n.queue.delete(t)}function Ite(e,t){let n=e.get(ld);if(t.detachedLeaveAnimationFns){for(let e of t.detachedLeaveAnimationFns)n.queue.delete(e);t.detachedLeaveAnimationFns=void 0}}function Lte(e){let t=e.get(ld);t.isScheduled||=(cd(()=>{t.isScheduled=!1;for(let e of t.queue)e();t.queue.clear()},{injector:t.injector}),!0)}function Rte(e){let t=e.get(ld);t.scheduler=Lte,t.scheduler(e)}function dd(e,t){for(let[n,r]of t)ud(e,r.animateFns)}function fd(e,t,n,r){let i=e?.[26]?.enter;t!==null&&i&&i.has(n.index)&&dd(r,i)}function pd(e,t,n,r){try{n.get(Ca)}catch{return r(!1)}let i=e?.[26];i?.enter?.has(t.index)&&Fte(n,i.enter.get(t.index).animateFns);let a=zte(e,t,i);if(a.size===0){let n=!1;if(e){let r=[];md(e,t,r),n=r.length>0}if(!n)return r(!1)}e&&Uu.add(e[19]),ud(n,()=>Bte(e,t,i||void 0,a,r),i||void 0)}function zte(e,t,n){let r=new Map,i=n?.leave;if(i&&i.has(t.index)&&r.set(t.index,i.get(t.index)),e&&i)for(let[n,a]of i){if(r.has(n))continue;let i=e[1].data[n].parent;for(;i;){if(i===t){r.set(n,a);break}i=i.parent}}return r}function Bte(e,t,n,r,i){let a=[];if(n&&n.leave)for(let[e]of r){if(!n.leave.has(e))continue;let t=n.leave.get(e);for(let e of t.animateFns){let{promise:t}=e();a.push(t)}n.detachedLeaveAnimationFns=void 0}if(e&&md(e,t,a),a.length>0){let t=n||e?.[26];if(t){let n=t.running;n&&a.push(n),t.running=Promise.allSettled(a),Hte(e,t.running,i)}else Promise.allSettled(a).then(()=>{e&&Uu.delete(e[19]),i(!0)})}else e&&Uu.delete(e[19]),i(!1)}function md(e,t,n){if(t.type&12){let r=e[t.index];if(io(r))for(let e=10;e{e[26]?.running===t&&(e[26].running=void 0,Uu.delete(e[19])),n(!0)})}function hd(e,t,n,r,i,a,o,s){if(i!=null){let c,l=!1;io(i)?c=i:ro(i)&&(l=!0,i=i[0]);let u=mo(i);e===0&&r!==null?(fd(s,r,a,n),o==null?Cu(t,r,u):Su(t,r,u,o||null,!0)):e===1&&r!==null?(fd(s,r,a,n),Su(t,r,u,o||null,!0),kte(a,u,s)):e===2?(s?.[26]?.leave?.has(a.index)&&Ate(a,u,s),Xu.delete(u),pd(s,a,n,e=>{if(Xu.has(u)){Xu.delete(u);return}Tu(t,u,l,e)})):e===3&&(Xu.delete(u),pd(s,a,n,()=>{t.destroyNode(u)})),c!=null&&kd(t,e,n,c,a,r,o)}}function Ute(e,t){gd(e,t),t[0]=null,t[5]=null}function Wte(e,t,n,r,i,a){r[0]=i,r[5]=t,Dd(e,r,n,1,i,a)}function gd(e,t){t[10].changeDetectionScheduler?.notify(9),Dd(e,t,t[11],2,null,null)}function Gte(e){let t=e[12];if(!t)return yd(e[1],e);for(;t;){let n=null;if(ro(t))n=t[12];else{let e=t[10];e&&(n=e)}if(!n){for(;t&&!t[4]&&t!==e;)ro(t)&&yd(t[1],t),t=t[3];t===null&&(t=e),ro(t)&&yd(t[1],t),n=t&&t[4]}t=n}}function _d(e,t){let n=e[9],r=n.indexOf(t);n.splice(r,1)}function vd(e,t){if(uo(t))return;let n=t[11];n.destroyNode&&Dd(e,t,n,3,null,null),Gte(t)}function yd(e,t){if(uo(t))return;let n=an(null);try{t[2]&=-129,t[2]|=256,t[24]&&bn(t[24]),qte(e,t),Kte(e,t),t[1].type===1&&t[11].destroy();let n=t[16];if(n!==null&&io(t[3])){n!==t[3]&&_d(n,t);let r=t[18];r!==null&&r.detachView(e)}Hl(t)}finally{an(n)}}function Kte(e,t){let n=e.cleanup,r=t[7];if(n!==null)for(let e=0;e=0?r[t]():r[-t].unsubscribe(),e+=2}else{let t=r[n[e+1]];n[e].call(t)}r!==null&&(t[7]=null);let i=t[21];if(i!==null){t[21]=null;for(let e=0;e27&&zd(e,t,27,!1),Nc(o?bc.TemplateUpdateStart:bc.TemplateCreateStart,i,n),n(r,i)}finally{us(a),Nc(o?bc.TemplateUpdateEnd:bc.TemplateCreateEnd,i,n)}}function Ud(e,t,n){Xd(e,t,n),(n.flags&64)==64&&Zd(e,t,n)}function Wd(e,t,n=go){let r=t.localNames;if(r!==null){let i=t.index+1;for(let a=0;a=s&&i<=c){let o=t.data[i],s=r[e+1];Vd(o,n[i],s,a),l=!0}else if(i>c)break}}return o!==null&&Object.hasOwn(r.inputs,i)&&(Vd(r,n[o],i,a),l=!0),l}function lf(e,t){let n=bo(t,e),r=n[1];uf(r,n);let i=n[0];i!==null&&n[6]===null&&(n[6]=ru(i,n[9])),Nc(bc.ComponentStart);try{df(r,n,n[8])}finally{Nc(bc.ComponentEnd,n[8])}}function uf(e,t){for(let n=t.length;n{Oo(e.lView)},consumerOnSignalRead(){this.lView[24]=this}};function Cf(e){let t=e[24]??Object.create(wf);return t.lView=e,t}var wf={...sn,consumerIsAlwaysLive:!0,kind:`template`,consumerMarkedDirty:e=>{let t=Ao(e.lView);for(;t&&!Tf(t[1]);)t=Ao(t);t&&To(t)},consumerOnSignalRead(){this.lView[24]=this}};function Tf(e){return e.type!==2}function Ef(e){if(e[23]===null)return;let t=!0;for(;t;){let n=!1;for(let t of e[23])if(t.dirty&&(n=!0,t.zone===null||Zone.current===t.zone?t.run():t.zone.run(()=>t.run()),e[23]===null))return;t=n&&!!(e[2]&8192)}}var Df=100;function Of(e,t=0){let n=e[10].rendererFactory;n.begin?.();try{kf(e,t)}finally{n.end?.()}}function kf(e,t){let n=Jo();try{Yo(!0),Ff(e,t);let n=0;for(;Eo(e);){if(n===Df)throw new pi(103,!1);n++,Ff(e,1)}}finally{Yo(n)}}function Af(e,t,n,r){if(uo(t))return;let i=t[2];rs(t);let a=!0,o=null,s=null;Tf(e)?(s=yf(t),o=hn(s)):on()===null?(a=!1,s=Cf(t),o=hn(s)):t[24]&&=(bn(t[24]),null);try{wo(t),Yee(e.bindingStartIndex),n!==null&&Hd(e,t,n,2,r);let a=(i&3)==3;if(a){let n=e.preOrderCheckHooks;n!==null&&Ic(t,n,null)}else{let n=e.preOrderHooks;n!==null&&Lc(t,n,0,null),Rc(t,0)}if(Mf(t),Ef(t),jf(t,0),e.contentQueries!==null&&iu(e,t),a){let n=e.contentCheckHooks;n!==null&&Ic(t,n)}else{let n=e.contentHooks;n!==null&&Lc(t,n,1),Rc(t,1)}Lf(e,t);let o=e.components;o!==null&&If(t,o,0);let s=e.viewQuery;if(s!==null&&au(2,s,r),a){let n=e.viewCheckHooks;n!==null&&Ic(t,n)}else{let n=e.viewHooks;n!==null&&Lc(t,n,2),Rc(t,2)}if(e.firstUpdatePass===!0&&(e.firstUpdatePass=!1),t[22]){for(let e of t[22])e();t[22]=null}_f(t),t[2]&=-73}catch(e){throw Oo(t),e}finally{s!==null&&(_n(s,o),a&&xf(s)),cs()}}function jf(e,t){for(let n=Gl(e);n!==null;n=Kl(n))for(let e=10;e0&&(e[n-1][4]=r[4]);let a=pa(e,10+t);Ute(r[1],r);let o=a[18];o!==null&&o.detachView(a[1]),r[3]=null,r[4]=null,r[2]&=-129}return r}function Wf(e,t,n,r){let i=10+r,a=n.length;r>0&&(n[i-1][4]=t),r-1&&(Uf(e,n),pa(t,n))}this._attachedToViewContainer=!1}vd(this._lView[1],this._lView)}onDestroy(e){ko(this._lView,e)}markForCheck(){Rf(this._cdRefInjectingView||this._lView,4)}detach(){this._lView[2]&=-129}reattach(){Do(this._lView),this._lView[2]|=128}detectChanges(){this._lView[2]|=1024,Of(this._lView)}checkNoChanges(){}attachToViewContainerRef(){if(this._appRef)throw new pi(902,!1);this._attachedToViewContainer=!0}detachFromAppRef(){this._appRef=null;let e=lo(this._lView),t=this._lView[16];t!==null&&!e&&_d(t,this._lView),gd(this._lView[1],this._lView)}attachToAppRef(e){if(this._attachedToViewContainer)throw new pi(902,!1);this._appRef=e;let t=lo(this._lView),n=this._lView[16];n!==null&&!t&&Gf(n,this._lView),Do(this._lView)}},qf=(()=>{class e{_declarationLView;_declarationTContainer;elementRef;static __NG_ELEMENT_ID__=Jf;constructor(e,t,n){this._declarationLView=e,this._declarationTContainer=t,this.elementRef=n}get ssrId(){return this._declarationTContainer.tView?.ssrId||null}createEmbeddedView(e,t){return this.createEmbeddedViewImpl(e,t)}createEmbeddedViewImpl(e,t,n){return new Kf(pf(this._declarationLView,this._declarationTContainer,e,{embeddedViewInjector:t,dehydratedView:n}))}}return e})();function Jf(){return Yf(Ho(),Bo())}function Yf(e,t){return e.type&4?new qf(t,e,jl(e,t)):null}function Xf(e,t,n,r,i){let a=e.data[t];if(a===null)a=Zf(e,t,n,r,i),Xee()&&(a.flags|=32);else if(a.type&64){a.type=n,a.value=r,a.attrs=i;let e=Jee();a.injectorIndex=e===null?-1:e.injectorIndex}return Wo(a,!0),a}function Zf(e,t,n,r,i){let a=Uo(),o=Go(),s=o?a:a&&a.parent,c=e.data[t]=$f(e,s,n,t,r,i);return Qf(e,c,a,o),c}function Qf(e,t,n,r){e.firstChild===null&&(e.firstChild=t),n!==null&&(r?n.child==null&&t.parent!==null&&(n.child=t):n.next===null&&(n.next=t,t.prev=n))}function $f(e,t,n,r,i,a){let o=t?t.injectorIndex:-1,s=0;return Lo()&&(s|=128),{type:n,index:r,insertBeforeIndex:null,injectorIndex:o,directiveStart:-1,directiveEnd:-1,directiveStylingLast:-1,componentOffset:-1,controlDirectiveIndex:-1,customControlIndex:-1,propertyBindings:null,flags:s,providerIndexes:0,value:i,namespace:ms(),attrs:a,mergedAttrs:null,localNames:null,initialInputs:null,inputs:null,hostDirectiveInputs:null,outputs:null,hostDirectiveOutputs:null,directiveToIndex:null,tView:null,next:null,prev:null,projectionNext:null,child:null,parent:t,projection:null,styles:null,stylesWithoutHost:null,residualStyles:void 0,classes:null,classesWithoutHost:null,residualClasses:void 0,classBindings:0,styleBindings:0}}function ep(e){let t=e[6]??[],n=e[3][11],r=[];for(let e of t)e.data.di===void 0?tp(e,n):r.push(e);e[6]=r}function tp(e,t){let n=0,r=e.firstChild;if(r){let i=e.data.r;for(;nnull,rp=()=>null;function ip(e,t){return np(e,t)}function ap(e,t,n){return rp(e,t,n)}var op=class{},sp=class{},cp=class{destroyNode=null;static __NG_ELEMENT_ID__=()=>lp()};function lp(){let e=Bo(),t=bo(Ho().index,e);return(ro(t)?t:e)[11]}var up=(()=>{class e{static ɵprov=xi({token:e,providedIn:`root`,factory:()=>null})}return e})();function dp(e){return e.debugInfo?.className||e.type.name||null}var fp={},pp=class{injector;parentInjector;constructor(e,t){this.injector=e,this.parentInjector=t}get(e,t,n){let r=this.injector.get(e,fp,n);return r!==fp||t===fp?r:this.parentInjector.get(e,t,n)}};function mp(e,t,n){return e[t]=n}function hp(e,t){return e[t]}function gp(e,t,n){if(n===Fu)return!1;let r=e[t];return!Object.is(r,n)&&(e[t]=n,!0)}function _p(e,t,n,r){let i=gp(e,t,n);return gp(e,t+1,r)||i}function vp(e,t,n,r,i){let a=_p(e,t,n,r);return gp(e,t+2,i)||a}function yp(e,t,n,r,i,a){let o=_p(e,t,n,r);return _p(e,t+2,i,a)||o}function bp(e,t,n){return function r(i){let a=r.__ngNativeEl__;a!==void 0&&eu(i,a),Rf(oo(e)?bo(e.index,t):t,5);let o=t[8],s=xp(t,o,n,i),c=r.__ngNextListenerFn__;for(;c;)s=xp(t,o,c,i)&&s,c=c.__ngNextListenerFn__;return s}}function xp(e,t,n,r){let i=an(null);try{return Nc(bc.OutputStart,t,n),n(r)!==!1}catch(t){return of(e,t),!1}finally{Nc(bc.OutputEnd,t,n),an(i)}}function Sp(e,t,n,r,i,a,o,s){let c=so(e),l=!1,u=null;if(!r&&c&&(u=wp(t,n,a,e.index)),u!==null){let e=u.__ngLastListenerFn__||u;e.__ngNextListenerFn__=o,u.__ngLastListenerFn__=o,l=!0}else{let o=go(e,n),c=r?r(o):o;r||(s.__ngNativeEl__=o);let l=i.listen(c,a,s);Cp(a)||Tp(r?t=>r(mo(t[e.index])):e.index,t,n,a,s,l,!1)}return l}function Cp(e){return e.startsWith(`animation`)||e.startsWith(`transition`)}function wp(e,t,n,r){let i=e.cleanup;if(i!=null)for(let e=0;er?n[r]:null}typeof a==`string`&&(e+=2)}return null}function Tp(e,t,n,r,i,a,o){let s=t.firstCreatePass?Mo(t):null,c=jo(n),l=c.length;c.push(i,a),s&&s.push(r,e,l,(l+1)*(o?-1:1))}function Ep(e,t,n,r,i){let a=null,o=null,s=null,c=!1,l=e.directiveToIndex.get(n.type);if(typeof l==`number`?a=l:[a,o,s]=l,o!==null&&s!==null&&e.hostDirectiveOutputs&&Object.hasOwn(e.hostDirectiveOutputs,r)){let n=e.hostDirectiveOutputs[r];for(let a=0;a=o&&l<=s)c=!0,Dp(e,t,l,n[a+1],r,i);else if(l>s)break}}return Object.hasOwn(n.outputs,r)&&(c=!0,Dp(e,t,a,r,r,i)),c}function Dp(e,t,n,r,i,a){let o=t[n],s=t[1],c=o[s.data[n].outputs[r]].subscribe(a);Tp(e.index,s,t,i,a,c,!0)}function Op(){kp()}function kp(){let e=Bo(),t=Vo(),n=Ho();if(t.firstCreatePass&&Fp(t,n),n.controlDirectiveIndex===-1)return;rd(`NgSignalForms`);let r=e[n.controlDirectiveIndex];t.data[n.controlDirectiveIndex].controlDef.create(r,new Mp(e,t,n))}function Ap(){jp()}function jp(){let e=Bo(),t=Vo(),n=ds();if(n.controlDirectiveIndex===-1)return;let r=t.data[n.controlDirectiveIndex].controlDef,i=e[n.controlDirectiveIndex];r.update(i,new Mp(e,t,n))}var Mp=class{lView;tView;tNode;hasPassThrough;constructor(e,t,n){this.lView=e,this.tView=t,this.tNode=n,this.hasPassThrough=!!(n.flags&4096)}get customControl(){return this.tNode.customControlIndex===-1?void 0:this.lView[this.tNode.customControlIndex]}get nativeElement(){return go(this.tNode,this.lView)}get descriptor(){return`<${this.tNode.value}>`}listenToCustomControlOutput(e,t){let n=this.tView.data[this.tNode.customControlIndex];Ep(this.tNode,this.lView,n,e,bp(this.tNode,this.lView,t))}listenToCustomControlModel(e){let t=this.tNode.flags&1024?`valueChange`:`checkedChange`,n=this.tView.data[this.tNode.customControlIndex];Ep(this.tNode,this.lView,n,t,bp(this.tNode,this.lView,e))}listenToDom(e,t){Sp(this.tNode,this.tView,this.lView,void 0,this.lView[11],e,t,bp(this.tNode,this.lView,t))}setInputOnDirectives(e,t,n){let r=this.tNode.inputs?.[e],i=this.tNode.hostDirectiveInputs?.[e];if(!r&&!i)return!1;let a=!1;if(r)for(let i of r){if(i===this.tNode.controlDirectiveIndex)continue;let r=this.lView[i],o=this.tView.data[i];(!n||n(Pp(r,o,e)))&&(Vd(o,r,e,t),a=!0)}if(i)for(let r=0;r0;){let e=n.shift();if(typeof e!=`function`){for(let n in e.inputs)t[e.inputs[n]]=!0;let r=Np(e.directive);r!==null&&n.push(...r);continue}for(let r of e()){if(typeof r==`function`)continue;if(r.inputs)for(let e=0;e1){t.flags|=4096;return}Ip(e,t)}function Ip(e,t){for(let n=t.directiveStart;n{let r=t.hostDirectiveInputs[e],i=t.hostDirectiveOutputs[e+`Change`];if(!r||!i)return!1;for(let e=0;e=i&&a<=o)return t.flags|=n,t.customControlIndex=r,!0}}return!1};if(e(`value`,1024)||e(`checked`,2048))return}}function Lp(e,t){return Rp(e,t)&&zp(e,t+`Change`)}function Rp(e,t){return t in e.inputs}function zp(e,t){return t in e.outputs}var Bp=Symbol(`BINDING`),Vp=new Oi(``);function Hp(e,t,n){let r=n?e.styles:null,i=n?e.classes:null,a=0;if(t!==null)for(let e=0;e0&&(n.directiveToIndex=new Map);for(let c=0;c0;){let n=e[--t];if(typeof n==`number`&&n<0)return n}return 0}function nm(e,t,n){if(n){if(t.exportAs)for(let r=0;r{let[n,r,i]=e[t],a={propName:n,templateName:t,isSignal:(r&Bd.SignalBased)!==0};return i&&(a.transform=i),a})}function um(e){return Object.keys(e).map(t=>({propName:e[t],templateName:t}))}function dm(e,t,n){let r=t instanceof Ha?t:t?.injector;return r&&e.getStandaloneInjector!==null&&(r=e.getStandaloneInjector(r)||r),r?new pp(n,r):n}function fm(e){let t=e.get(sp,null);if(t===null)throw new pi(407,!1);return{rendererFactory:t,sanitizer:e.get(up,null),changeDetectionScheduler:e.get(rc,null),ngReflect:!1,tracingService:e.get(td,null,{optional:!0})}}function pm(e,t,n){let r=hm(e);return xu(t,r,r===`svg`?`svg`:r===`math`?po:n)}function mm(e){if((e&&`localName`in e&&typeof e.localName==`string`?e.localName:e?.tagName)?.toLowerCase()===`script`)throw new pi(905,!1)}function hm(e){return(e.selectors[0][0]||`div`).toLowerCase()}var gm=class{componentDef;ngModule;selector;componentType;ngContentSelectors;isBoundToModule;cachedInputs=null;cachedOutputs=null;get inputs(){return this.cachedInputs??=lm(this.componentDef.inputs),this.cachedInputs}get outputs(){return this.cachedOutputs??=um(this.componentDef.outputs),this.cachedOutputs}constructor(e,t){this.componentDef=e,this.ngModule=t,this.componentType=e.type,this.selector=gte(e.selectors),this.ngContentSelectors=e.ngContentSelectors??[],this.isBoundToModule=!!t}create(e,t,n,r,i,a,o){Nc(bc.DynamicComponentStart);let s=an(null);try{let s=this.componentDef,c=dm(s,r||this.ngModule,e),l=fm(c),u=l.tracingService;return u&&u.componentCreate?u.componentCreate(dp(s),()=>this.createComponentRef(l,c,t,n,i,a,o)):this.createComponentRef(l,c,t,n,i,a,o)}finally{an(s)}}createComponentRef(e,t,n,r,i,a,o){let s=this.componentDef,c=_m(r,s,a,i),l=e.rendererFactory.createRenderer(null,s),u=r?Gd(l,r,s.encapsulation,t):pm(s,l,o??null);mm(u);let d=t.get(Vp,null),f=vm(u,()=>t.get(xs,null)??Xl());d&&d.addHost(f);let p=a?.some(bm)||i?.some(e=>typeof e!=`function`&&e.bindings.some(bm)),m=Pd(null,c,null,512|Id(s),null,null,e,l,t,null,ru(u,t,!0));d&&sm&&f instanceof ShadowRoot&&ko(m,()=>{d.removeHost(f)}),m[27]=u,rs(m);let ee=null;try{let e=im(27,m,2,`#host`,()=>c.directiveRegistry,!0,0);Eu(l,u,e),Wl(u,m),Ud(c,m,e),ou(c,e,m),am(c,e),n!==void 0&&Sm(e,this.ngContentSelectors,n),ee=bo(e.index,m),m[8]=ee[8],df(c,m,null)}catch(e){throw ee!==null&&Hl(ee),Hl(m),e}finally{Nc(bc.DynamicComponentEnd),cs()}return new xm(this.componentType,m,!!p)}};function _m(e,t,n,r){let i=e?[`ng-version`,`22.1.7`]:_te(t.selectors[0]),a=null,o=null,s=0;if(n)for(let e of n)s+=e[Bp].requiredVars,e.create&&(e.targetIdx=0,(a??=[]).push(e)),e.update&&(e.targetIdx=0,(o??=[]).push(e));if(r)for(let e=0;e{if(n&1&&e)for(let t of e)t.create();if(n&2&&t)for(let e of t)e.update()}}function bm(e){let t=e[Bp].kind;return t===`input`||t===`twoWay`}var xm=class extends op{_rootLView;_hasInputBindings;instance;hostView;changeDetectorRef;componentType;location;previousInputValues=null;_tNode;constructor(e,t,n){super(),this._rootLView=t,this._hasInputBindings=n,this._tNode=_o(t[1],27),this.location=jl(this._tNode,t),this.instance=bo(this._tNode.index,t)[8],this.hostView=this.changeDetectorRef=new Kf(t,void 0),this.componentType=e}setInput(e,t){this._hasInputBindings;let n=this._tNode;if(this.previousInputValues??=new Map,this.previousInputValues.has(e)&&Object.is(this.previousInputValues.get(e),t))return;let r=this._rootLView;sf(n,r[1],r,e,t),this.previousInputValues.set(e,t),Rf(bo(n.index,r),1)}get injector(){return new Cl(this._tNode,this._rootLView)}destroy(){this.hostView.destroy()}onDestroy(e){this.hostView.onDestroy(e)}};function Sm(e,t,n){let r=e.projection=[];for(let e=0;e{class e{static __NG_ELEMENT_ID__=wm}return e})();function wm(){return Om(Ho(),Bo())}var Tm=class e extends Cm{_lContainer;_hostTNode;_hostLView;constructor(e,t,n){super(),this._lContainer=e,this._hostTNode=t,this._hostLView=n}get element(){return jl(this._hostTNode,this._hostLView)}get injector(){return new Cl(this._hostTNode,this._hostLView)}get parentInjector(){let e=dl(this._hostTNode,this._hostLView);if(Zc(e)){let t=el(e,this._hostLView),n=Qc(e),r=t[1].data[n+8];return new Cl(r,t)}return new Cl(null,this._hostLView)}clear(){for(;this.length>0;)this.remove(this.length-1)}get(e){let t=Em(this._lContainer);return t!==null&&t[e]||null}get length(){return this._lContainer.length-10}createEmbeddedView(e,t,n){let r,i;typeof n==`number`?r=n:n!=null&&(r=n.index,i=n.injector);let a=ip(this._lContainer,e.ssrId),o=e.createEmbeddedViewImpl(t||{},i,a);return this.insertImpl(o,r,mf(this._hostTNode,a)),o}createComponent(e,t,n,r,i,a,o){let s,c=t||{};s=c.index,n=c.injector,r=c.projectableNodes,i=c.environmentInjector||c.ngModuleRef,a=c.directives,o=c.bindings;let l=new gm(Ii(e)),u=n||this.parentInjector;if(!i&&l.ngModule==null){let e=this.parentInjector.get(Ha,null);e&&(i=e)}let d=Ii(l.componentType??{}),f=ip(this._lContainer,d?.id??null),p=f?.firstChild??null,m=l.create(u,r,p,i,a,o,this._getHostElementNamespace());return this.insertImpl(m.hostView,s,mf(this._hostTNode,f)),m}_getHostElementNamespace(){if(this._hostTNode.type&2){let e=this._hostTNode.parent??this._hostLView[5];return e!==null&&e.type&2&&typeof e.value==`string`&&e.value.toLowerCase()===`foreignobject`?null:e?.namespace??null}return this._hostTNode.namespace}insert(e,t){return this.insertImpl(e,t,!0)}insertImpl(t,n,r){let i=t._lView;if(So(i)){let n=this.indexOf(t);if(n!==-1)this.detach(n);else{let n=i[3],r=new e(n,n[5],n[3]);r.detach(r.indexOf(t))}}let a=this._adjustIndex(n),o=this._lContainer;return Vf(o,i,a,r),t.attachToViewContainerRef(),fa(Dm(o),a,t),t}move(e,t){return this.insert(e,t)}indexOf(e){let t=Em(this._lContainer);return t===null?-1:t.indexOf(e)}remove(e){let t=this._adjustIndex(e,-1),n=Uf(this._lContainer,t);n&&(pa(Dm(this._lContainer),t),vd(n[1],n))}detach(e){let t=this._adjustIndex(e,-1),n=Uf(this._lContainer,t);return n&&pa(Dm(this._lContainer),t)!=null?new Kf(n):null}_adjustIndex(e,t=0){return e??this.length+t}};function Em(e){return e[8]}function Dm(e){return e[8]||=[]}function Om(e,t){let n,r=t[e.index];return io(r)?n=r:(n=zf(r,t,null,e),t[e.index]=n,Rd(t,n)),Am(n,t,e,r),new Tm(n,e,t)}function km(e,t){let n=e[11],r=n.createComment(``),i=go(t,e);return Su(n,n.parentNode(i),r,n.nextSibling(i),!1),r}var Am=Nm,jm=()=>!1;function Mm(e,t,n){return jm(e,t,n)}function Nm(e,t,n,r){if(e[7])return;let i;i=n.type&8?mo(r):km(t,n),e[7]=i}var Pm=class e{queryList;matches=null;constructor(e){this.queryList=e}clone(){return new e(this.queryList)}setDirty(){this.queryList.setDirty()}},Fm=class e{queries;constructor(e=[]){this.queries=e}createEmbeddedView(t){let n=t.queries;if(n!==null){let r=t.contentQueries===null?n.length:t.contentQueries[0],i=[];for(let e=0;e0)r.push(o[e/2]);else{let i=a[e+1],o=t[-n];for(let e=10;ee.trim())}function Ym(e,t,n){e.queries===null&&(e.queries=new Lm),e.queries.track(new Rm(t,n))}function Xm(e,t){return e.queries.getByIndex(t)}function Zm(e,t){let n=e[1],r=Xm(n,t);return r.crossesNgTemplate?Wm(n,e,t,[]):Um(n,e,r,t)}function Qm(e,t,n){let r,i=En(()=>{r._dirtyCounter();let n=nh(r,e);if(t&&n===void 0)throw new pi(-951,!1);return n});return r=i[rn],r._dirtyCounter=T(0),r._flatValue=void 0,i}function $m(e){return Qm(!0,!1,e)}function eh(e){return Qm(!0,!0,e)}function th(e,t){let n=e[rn];n._lView=Bo(),n._queryIndex=t,n._queryList=Gm(n._lView,t),n._queryList.onDirty(()=>n._dirtyCounter.update(e=>e+1))}function nh(e,t){let n=e._lView,r=e._queryIndex;if(n===void 0||r===void 0||n[2]&4)return t?void 0:xa;let i=Gm(n,r),a=Zm(n,r);return i.reset(a,Nl),t?i.first:i._changesDetected||e._flatValue===void 0?e._flatValue=i.toArray():e._flatValue}function rh(e){return!!e&&typeof e.then==`function`}function ih(e){return!!e&&typeof e.subscribe==`function`}var ah=class{},oh=class extends ah{injector;instance=null;constructor(e){super();let t=new Ua([...e.providers,{provide:ah,useValue:this}],e.parent||Va(),e.debugName,new Set([`environment`]));this.injector=t,e.runEnvironmentInitializers&&t.resolveInjectorInitializers()}destroy(){this.injector.destroy()}onDestroy(e){this.injector.onDestroy(e)}};function sh(e,t,n=null){return new oh({providers:e,parent:t,debugName:n,runEnvironmentInitializers:!0}).injector}var ch=(()=>{class e{_injector;cachedInjectors=new Map;constructor(e){this._injector=e}getOrCreateStandaloneInjector(e){if(!e.standalone)return null;if(!this.cachedInjectors.has(e)){let t=Da(!1,e.type),n=t.length>0?sh([t],this._injector,``):null;this.cachedInjectors.set(e,n)}return this.cachedInjectors.get(e)}ngOnDestroy(){try{for(let e of this.cachedInjectors.values())e!==null&&e.destroy()}finally{this.cachedInjectors.clear()}}static ɵprov=xi({token:e,providedIn:`environment`,factory:()=>new e(ra(Ha))})}return e})();function O(e){return yc(()=>{let t=mh(e),n={...t,decls:e.decls,vars:e.vars,template:e.template,consts:e.consts||null,ngContentSelectors:e.ngContentSelectors,onPush:e.changeDetection!==Ll.Eager,directiveDefs:null,pipeDefs:null,dependencies:t.standalone&&e.dependencies||null,getStandaloneInjector:t.standalone?e=>e.get(ch).getOrCreateStandaloneInjector(n):null,getExternalStyles:null,signals:e.signals??!1,data:e.data||{},encapsulation:e.encapsulation||su.Emulated,styles:e.styles||xa,_:null,schemas:e.schemas||null,tView:null,id:``};t.standalone&&rd(`NgStandalone`),hh(n);let r=e.dependencies;return n.directiveDefs=gh(r,lh),n.pipeDefs=gh(r,Ri),n.id=_h(n),n})}function lh(e){return Ii(e)||Li(e)}function uh(e,t){if(e==null)return ba;let n={};for(let r in e)if(Object.hasOwn(e,r)){let i=e[r],a,o,s,c;Array.isArray(i)?(s=i[0],a=i[1],o=i[2]??a,c=i[3]||null):(a=i,o=i,s=Bd.None,c=null),n[a]=[r,s,c],t[a]=o}return n}function dh(e){if(e==null)return ba;let t={};for(let n in e)Object.hasOwn(e,n)&&(t[e[n]]=n);return t}function fh(e){return yc(()=>{let t=mh(e);return hh(t),t})}function ph(e){return{type:e.type,name:e.name,factory:null,pure:e.pure!==!1,standalone:e.standalone??!0,onDestroy:e.type.prototype.ngOnDestroy||null}}function mh(e){let t={};return{type:e.type,providersResolver:null,viewProvidersResolver:null,factory:null,hostBindings:e.hostBindings||null,hostVars:e.hostVars||0,hostAttrs:e.hostAttrs||null,contentQueries:e.contentQueries||null,declaredInputs:t,inputConfig:e.inputs||ba,exportAs:e.exportAs||null,standalone:e.standalone??!0,signals:e.signals===!0,selectors:e.selectors||xa,viewQuery:e.viewQuery||null,features:e.features||null,setInput:null,resolveHostDirectives:null,hostDirectives:null,controlDef:null,signalFormsInputPresence:null,inputs:uh(e.inputs,t),outputs:dh(e.outputs),debugInfo:null}}function hh(e){e.features?.forEach(t=>t(e))}function gh(e,t){return e?()=>{let n=typeof e==`function`?e():e,r=[];for(let e of n){let n=t(e);n!==null&&r.push(n)}return r}:null}function _h(e){let t=0,n=typeof e.consts==`function`?``:e.consts,r=[e.selectors,e.ngContentSelectors,e.hostVars,e.hostAttrs,n,e.vars,e.decls,e.encapsulation,e.standalone,e.signals,e.exportAs,JSON.stringify(e.inputs),JSON.stringify(e.outputs),Object.getOwnPropertyNames(e.type.prototype),!!e.contentQueries,!!e.viewQuery];for(let e of r.join(`|`))t=Math.imul(31,t)+e.charCodeAt(0)<<0;return t+=2147483648,`c`+t}var vh=new Oi(``),yh=(()=>{class e{resolve;reject;initialized=!1;done=!1;donePromise=new Promise((e,t)=>{this.resolve=e,this.reject=t});appInits=x(vh,{optional:!0})??[];injector=x(bs);constructor(){}runInitializers(){if(this.initialized)return;let e=[];for(let t of this.appInits){let n=eo(this.injector,t);if(rh(n))e.push(n);else if(ih(n)){let t=new Promise((e,t)=>{n.subscribe({complete:e,error:t})});e.push(t)}}let t=()=>{this.done=!0,this.resolve()};Promise.all(e).then(()=>{t()}).catch(e=>{this.reject(e)}),e.length===0&&t(),this.initialized=!0}static ɵfac=function(t){return new(t||e)};static ɵprov=kl({token:e,factory:e.ɵfac})}return e})();function bh(e){return t=>{t.controlDef={create:(e,t)=>{e?.ɵngControlCreate(t)},update:(e,t)=>{e?.ɵngControlUpdate?.(t)},passThroughInput:e}}}function xh(e){return Object.getPrototypeOf(e.prototype).constructor}function Sh(e){let t=xh(e.type),n=!0,r=[e];for(;t&&t!==Function.prototype&&t!==Object.prototype;){let i,a=Object.hasOwn(t,Ai)?t[Ai]:void 0,o=Object.hasOwn(t,ji)?t[ji]:void 0;if(co(e))i=a??o;else{if(a)throw new pi(903,!1);i=o}if(i){if(n){r.push(i);let t=e;t.inputs=Th(e.inputs),t.declaredInputs=Th(e.declaredInputs),t.outputs=Th(e.outputs);let n=i.hostBindings;n&&Oh(e,n);let a=i.viewQuery,o=i.contentQueries;if(a&&Eh(e,a),o&&Dh(e,o),Ch(e,i),Vee(e.outputs,i.outputs),co(i)&&i.data.animation){let t=e.data;t.animation=(t.animation||[]).concat(i.data.animation)}}let t=i.features;if(t)for(let r=0;r=0;r--){let i=e[r];i.hostVars=t+=i.hostVars,i.hostAttrs=Yc(i.hostAttrs,n=Yc(n,i.hostAttrs))}}function Th(e){return e===ba?{}:e===xa?[]:e}function Eh(e,t){let n=e.viewQuery;e.viewQuery=n?(e,r)=>{t(e,r),n(e,r)}:t}function Dh(e,t){let n=e.contentQueries;e.contentQueries=n?(e,r,i)=>{t(e,r,i),n(e,r,i)}:t}function Oh(e,t){let n=e.hostBindings;e.hostBindings=n?(e,r)=>{t(e,r),n(e,r)}:t}function kh(e,t,n,r,i,a,o,s){if(n.firstCreatePass){e.mergedAttrs=Yc(e.mergedAttrs,e.attrs);let t=e.tView=jd(2,e,i,a,o,n.directiveRegistry,n.pipeRegistry,null,n.schemas,n.consts,null);n.queries!==null&&(n.queries.template(n,e),t.queries=n.queries.embeddedTView(e))}s&&(e.flags|=s),Wo(e,!1);let c=Nh(n,t,e,r);gs()&&Sd(n,t,c,e),Wl(c,t);let l=zf(c,t,c,e);t[r+27]=l,Rd(t,l),Mm(l,e,t)}function Ah(e,t,n,r,i,a,o,s,c,l,u){let d=n+27,f;return t.firstCreatePass?(f=Xf(t,d,4,o||null,s||null),Io()&&Wp(t,e,f,Co(t.consts,l),$d),Fc(t,f)):f=t.data[d],kh(f,e,t,n,r,i,a,c),so(f)&&Ud(t,e,f),l!=null&&Wd(e,f,u),f}function jh(e,t,n,r,i,a,o,s,c,l,u){let d=n+27,f;if(t.firstCreatePass){if(f=Xf(t,d,4,o||null,s||null),l!=null){let e=Co(t.consts,l);f.localNames=[];for(let t=0;t{throw new pi(600,``)})}var Rh=10,zh=(()=>{class e{_runningTick=!1;_destroyed=!1;_destroyListeners=[];_views=[];internalErrorHandler=x(qs);afterRenderManager=x(id);zonelessEnabled=x(ic);rootEffectScheduler=x(oc);dirtyFlags=0;tracingSnapshot=null;allTestViews=new Set;autoDetectTestViews=new Set;includeAllTestViews=!1;afterTick=new Wr;get allViews(){return[...(this.includeAllTestViews?this.allTestViews:this.autoDetectTestViews).keys(),...this._views]}get destroyed(){return this._destroyed}componentTypes=[];components=[];internalPendingTask=x(Es);get isStable(){return this.internalPendingTask.hasPendingTasksObservable.pipe(di(e=>!e))}constructor(){x(td,{optional:!0})}whenStable(){let e;return new Promise(t=>{e=this.isStable.subscribe({next:e=>{e&&t()}})}).finally(()=>{e.unsubscribe()})}_injector=x(Ha);_rendererFactory=null;get injector(){return this._injector}bootstrap(e,t){return this.bootstrapImpl(e,t)}bootstrapImpl(e,t,n=bs.NULL){return this._injector.get(Ps).run(()=>{if(Nc(bc.BootstrapComponentStart),!this._injector.get(yh).done)throw new pi(405,``);let r=Ii(e),i=this._injector.get(ah),a=new gm(r,i);this.componentTypes.push(e);let{hostElement:o,directives:s,bindings:c}=Bh(t),l=o||a.selector,u=a.create(n,[],l,i.injector,s,c),d=u.location.nativeElement,f=u.injector.get(Fh,null);return f?.registerApplication(d),u.onDestroy(()=>{this.detachView(u.hostView),Vh(this.components,u),f?.unregisterApplication(d)}),this._loadComponent(u),Nc(bc.BootstrapComponentEnd,u),u})}tick(){this.zonelessEnabled||(this.dirtyFlags|=1),this._tick()}_tick(){Nc(bc.ChangeDetectionStart),this.tracingSnapshot===null?this.tickImpl():this.tracingSnapshot.run(ed.CHANGE_DETECTION,this.tickImpl)}tickImpl=()=>{if(this._runningTick)throw Nc(bc.ChangeDetectionEnd),new pi(101,!1);let e=an(null);try{this._runningTick=!0,this.synchronize()}finally{this._runningTick=!1,this.tracingSnapshot?.dispose(),this.tracingSnapshot=null,an(e),this.afterTick.next(),Nc(bc.ChangeDetectionEnd)}};synchronize(){this._rendererFactory===null&&!this._injector.destroyed&&(this._rendererFactory=this._injector.get(sp,null,{optional:!0}));let e=0;for(;this.dirtyFlags!==0&&e++Eo(e))){this.dirtyFlags|=2;return}this.dirtyFlags&=-8}attachView(e){let t=e;this._views.push(t),t.attachToAppRef(this)}detachView(e){let t=e;Vh(this._views,t),t.detachFromAppRef()}_loadComponent(e){this.attachView(e.hostView);try{this.tick()}catch(e){this.internalErrorHandler(e)}this.components.push(e),this._injector.get(Ih,[]).forEach(t=>t(e))}ngOnDestroy(){if(!this._destroyed)try{this._destroyListeners.forEach(e=>e()),this._views.slice().forEach(e=>e.destroy())}finally{this._destroyed=!0,this._views=[],this._destroyListeners=[]}}onDestroy(e){return this._destroyListeners.push(e),()=>Vh(this._destroyListeners,e)}destroy(){if(this._destroyed)throw new pi(406,!1);let e=this._injector;e.destroy&&!e.destroyed&&e.destroy()}get viewCount(){return this._views.length}static ɵfac=function(t){return new(t||e)};static ɵprov=kl({token:e,factory:e.ɵfac})}return e})();function Bh(e){return e===void 0||typeof e==`string`||e instanceof Element?{hostElement:e}:e}function Vh(e,t){let n=e.indexOf(t);n>-1&&e.splice(n,1)}function k(e,t,n,r){let i=Bo();return gp(i,Qo(),t)&&(Vo(),ef(ds(),i,e,t,n,r)),k}function Hh(e){if(rd(`NgAnimateEnter`),!Wu)return Hh;let t=Bo();if(Dte(t))return Hh;let n=Ho(),r=t[9].get(Ps);return Mte(Zu(t),n,()=>Uh(t,n,e,r)),Rte(t[9]),dd(t[9],Zu(t)),Hh}function Uh(e,t,n,r){let i=go(t,e),a=e[11],o=jte(n),s=[],c=!1,l=e=>{if(Qu(e)!==i)return;let t=e instanceof AnimationEvent?`animationend`:`transitionend`;r.runOutsideAngular(()=>{a.listen(i,t,u)})},u=e=>{Qu(e)===i&&($u(e,i)&&(c=!0),Wh(e,i,a))};if(o&&o.length>0){r.runOutsideAngular(()=>{s.push(a.listen(i,`animationstart`,l)),s.push(a.listen(i,`transitionstart`,l))}),Ote(i,o,s);for(let e of o)a.addClass(i,e);r.runOutsideAngular(()=>{requestAnimationFrame(()=>{if(!c&&(Cte(i,qu,Wu),!qu.has(i))){for(let e of o)a.removeClass(i,e);Gu(i)}})})}}function Wh(e,t,n){let r=Ku.get(t);if(Qu(e)===t&&r&&$u(e,t)){e.stopPropagation();for(let e of r.classList)n.removeClass(t,e);Gu(t)}}var Gh=class{destroy(e){}updateValue(e,t){}swap(e,t){let n=Math.min(e,t),r=Math.max(e,t),i=this.detach(r);if(r-n>1){let e=this.detach(n);this.attach(n,i),this.attach(r,e)}else this.attach(n,i)}move(e,t){this.attach(t,this.detach(e))}};function Kh(e,t,n,r,i){return e===n&&Object.is(t,r)?1:Object.is(i(e,t),i(n,r))?-1:0}function qh(e,t,n,r){let i,a,o=0,s=e.length-1;if(Array.isArray(t)){an(r);let c=t.length-1;for(an(null);o<=s&&o<=c;){let r=e.at(o),l=t[o],u=Kh(o,r,o,l,n);if(u!==0){u<0&&e.updateValue(o,l),o++;continue}let d=e.at(s),f=t[c],p=Kh(s,d,c,f,n);if(p!==0){p<0&&e.updateValue(s,f),s--,c--;continue}let m=n(o,r),ee=n(s,d),h=n(o,l);if(Object.is(h,ee)){let t=n(c,f);Object.is(t,m)?(e.swap(o,s),e.updateValue(s,f),c--,s--):e.move(s,o),e.updateValue(o,l),o++;continue}if(i??=new Zh,a??=Xh(e,o,s,n),Jh(e,i,o,h))e.updateValue(o,l),o++,s++;else if(a.has(h))i.set(m,e.detach(o)),s--;else{let n=e.create(o,t[o]);e.attach(o,n),o++,s++}}for(;o<=c;)Yh(e,i,n,o,t[o]),o++}else if(t!=null){an(r);let c=t[Symbol.iterator]();an(null);let l=c.next();for(;!l.done&&o<=s;){let t=e.at(o),r=l.value,u=Kh(o,t,o,r,n);if(u!==0)u<0&&e.updateValue(o,r),o++,l=c.next();else{i??=new Zh,a??=Xh(e,o,s,n);let u=n(o,r);if(Jh(e,i,o,u))e.updateValue(o,r),o++,s++,l=c.next();else if(!a.has(u))e.attach(o,e.create(o,r)),o++,s++,l=c.next();else{let r=n(o,t);i.set(r,e.detach(o)),s--}}}for(;!l.done;)Yh(e,i,n,e.length,l.value),l=c.next()}for(;o<=s;)e.destroy(e.detach(s--));i?.forEach(t=>{e.destroy(t)})}function Jh(e,t,n,r){return t!==void 0&&t.has(r)?(e.attach(n,t.get(r)),t.delete(r),!0):!1}function Yh(e,t,n,r,i){if(Jh(e,t,r,n(r,i)))e.updateValue(r,i);else{let t=e.create(r,i);e.attach(r,t)}}function Xh(e,t,n,r){let i=new Set;for(let a=t;a<=n;a++)i.add(r(a,e.at(a)));return i}var Zh=class{kvMap=new Map;_vMap=void 0;has(e){return this.kvMap.has(e)}delete(e){if(!this.has(e))return!1;let t=this.kvMap.get(e);return this._vMap!==void 0&&this._vMap.has(t)?(this.kvMap.set(e,this._vMap.get(t)),this._vMap.delete(t)):this.kvMap.delete(e),!0}get(e){return this.kvMap.get(e)}set(e,t){if(this.kvMap.has(e)){let n=this.kvMap.get(e);this._vMap===void 0&&(this._vMap=new Map);let r=this._vMap;for(;r.has(n);)n=r.get(n);r.set(n,t)}else this.kvMap.set(e,t)}forEach(e){for(let[t,n]of this.kvMap)if(e(n,t),this._vMap!==void 0){let r=this._vMap;for(;r.has(n);)n=r.get(n),e(n,t)}}};function A(e,t,n,r,i,a,o,s){rd(`NgControlFlow`);let c=Bo(),l=Vo();return jh(c,l,e,t,n,r,i,Co(l.consts,a),256,o,s),Qh}function Qh(e,t,n,r,i,a,o,s){rd(`NgControlFlow`);let c=Bo(),l=Vo();return jh(c,l,e,t,n,r,i,Co(l.consts,a),512,o,s),Qh}function j(e,t){rd(`NgControlFlow`);let n=Bo(),r=Qo(),i=n[r]===Fu?-1:n[r],a=i===-1?void 0:ig(n,27+i);if(gp(n,r,e)){let r=an(null);try{if(a!==void 0&&Hf(a,0),e!==-1){let r=27+e,i=ig(n,r),a=lg(n[1],r),o=ap(i,a,n);Vf(i,pf(n,a,t,{dehydratedView:o}),0,mf(a,o))}}finally{an(r)}}else if(a!==void 0){let e=Bf(a,0);e!==void 0&&(e[8]=t)}}var $h=class{lContainer;$implicit;$index;constructor(e,t,n){this.lContainer=e,this.$implicit=t,this.$index=n}get $count(){return this.lContainer.length-10}};function eg(e){return e}function tg(e,t){return t}var ng=class{hasEmptyBlock;trackByFn;liveCollection;constructor(e,t,n){this.hasEmptyBlock=e,this.trackByFn=t,this.liveCollection=n}};function M(e,t,n,r,i,a,o,s,c,l,u,d,f){rd(`NgControlFlow`);let p=Bo(),m=Vo(),ee=c!==void 0,h=Bo(),g=new ng(ee,s?o.bind(h[15][8]):o);h[27+e]=g,jh(p,m,e+1,t,n,r,i,Co(m.consts,a),256),ee&&jh(p,m,e+2,c,l,u,d,Co(m.consts,f),512)}var rg=class extends Gh{lContainer;hostLView;templateTNode;operationsCounter=void 0;needsIndexUpdate=!1;constructor(e,t,n){super(),this.lContainer=e,this.hostLView=t,this.templateTNode=n}get length(){return this.lContainer.length-10}at(e){return this.getLView(e)[8].$implicit}attach(e,t){let n=t[6];this.needsIndexUpdate||=e!==this.length,Vf(this.lContainer,t,e,mf(this.templateTNode,n)),ag(this.lContainer,e)}detach(e){return this.needsIndexUpdate||=e!==this.length-1,og(this.lContainer,e),sg(this.lContainer,e)}create(e,t){let n=ip(this.lContainer,this.templateTNode.tView.ssrId);return pf(this.hostLView,this.templateTNode,new $h(this.lContainer,t,e),{dehydratedView:n})}destroy(e){vd(e[1],e)}updateValue(e,t){this.getLView(e)[8].$implicit=t}reset(){this.needsIndexUpdate=!1}updateIndexes(){if(this.needsIndexUpdate)for(let e=0;e0){let e=n[9];Ite(e,r),Uu.delete(n[19]),r.detachedLeaveAnimationFns=void 0}}function og(e,t){if(e.length<=10)return;let n=e[10+t],r=n?n[26]:void 0;r&&r.leave&&r.leave.size>0&&(r.detachedLeaveAnimationFns=[])}function sg(e,t){return Uf(e,t)}function cg(e,t){return Bf(e,t)}function lg(e,t){return _o(e,t)}function P(e,t,n){let r=Bo();return gp(r,Qo(),t)&&(Vo(),qd(ds(),r,e,t,r[11],n)),P}function ug(e,t,n,r,i){sf(t,e,n,i?`class`:`style`,r)}function F(e,t,n,r){let i=Bo(),a=i[1],o=e+27,s=a.firstCreatePass?im(o,i,2,t,$d,Io(),n,r):a.data[o];if(oo(s)){let n=i[10].tracingService;if(n&&n.componentCreate){let o=a.data[s.directiveStart+s.componentOffset];return n.componentCreate(dp(o),()=>(dg(e,t,i,s,r),F))}}return dg(e,t,i,s,r),F}function dg(e,t,n,r,i){if(rf(r,n,e,t,pg),so(r)){let e=n[1];Ud(e,n,r),ou(e,r,n)}i!=null&&Wd(n,r)}function I(){let e=Vo(),t=af(Ho());return e.firstCreatePass&&am(e,t),Ro(t)&&zo(),Fo(),t.classesWithoutHost!=null&&Wc(t)&&ug(e,t,Bo(),t.classesWithoutHost,!0),t.stylesWithoutHost!=null&&Gc(t)&&ug(e,t,Bo(),t.stylesWithoutHost,!1),I}function L(e,t,n,r){return F(e,t,n,r),I(),L}function R(e,t,n,r){let i=Bo(),a=i[1],o=e+27,s=a.firstCreatePass?om(o,a,2,t,n,r):a.data[o];return rf(s,i,e,t,pg),r!=null&&Wd(i,s),R}function z(){return Ro(af(Ho()))&&zo(),Fo(),z}function fg(e,t,n,r){return R(e,t,n,r),z(),fg}var pg=(e,t,n,r,i)=>(_s(!0),xu(t[11],r,ms()));function mg(e,t,n){let r=Bo(),i=r[1],a=e+27,o=i.firstCreatePass?im(a,r,8,`ng-container`,$d,Io(),t,n):i.data[a];if(rf(o,r,e,`ng-container`,_g),so(o)){let e=r[1];Ud(e,r,o),ou(e,o,r)}return n!=null&&Wd(r,o),mg}function hg(){let e=Vo(),t=af(Ho());return e.firstCreatePass&&am(e,t),hg}function gg(e,t,n){return mg(e,t,n),hg(),gg}var _g=(e,t,n,r,i)=>(_s(!0),bu(t[11],``));function B(){return Bo()}function V(e,t,n){let r=Bo();return gp(r,Qo(),t)&&(Vo(),Jd(ds(),r,e,t,r[11],n)),V}var vg=void 0;function yg(e){let t=Math.floor(Math.abs(e)),n=e.toString().replace(/^[^.]*\.?/,``).length;return t===1&&n===0?1:5}var bg=[`en`,[[`a`,`p`],[`AM`,`PM`]],[[`AM`,`PM`]],[[`S`,`M`,`T`,`W`,`T`,`F`,`S`],[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`],[`Su`,`Mo`,`Tu`,`We`,`Th`,`Fr`,`Sa`]],vg,[[`J`,`F`,`M`,`A`,`M`,`J`,`J`,`A`,`S`,`O`,`N`,`D`],[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`]],vg,[[`B`,`A`],[`BC`,`AD`],[`Before Christ`,`Anno Domini`]],0,[6,0],[`M/d/yy`,`MMM d, y`,`MMMM d, y`,`EEEE, MMMM d, y`],[`h:mm a`,`h:mm:ss a`,`h:mm:ss a z`,`h:mm:ss a zzzz`],[`{1}, {0}`,vg,vg,vg],[`.`,`,`,`;`,`%`,`+`,`-`,`E`,`×`,`‰`,`∞`,`NaN`,`:`],[`#,##0.###`,`#,##0%`,`¤#,##0.00`,`#E0`],`USD`,`$`,`US Dollar`,{},`ltr`,yg],xg=Object.create(null);function Sg(e){let t=Tg(e),n=Cg(t);if(n)return n;let r=t.split(`-`)[0];if(n=Cg(r),n)return n;if(r===`en`)return bg;throw new pi(701,!1)}function Cg(e){if(!(e in xg)){let t=Qi.ng&&Qi.ng.common&&Qi.ng.common.locales&&Qi.ng.common.locales[e];return t!==void 0&&(xg[e]=t),t}return xg[e]}var wg={LocaleId:0,DayPeriodsFormat:1,DayPeriodsStandalone:2,DaysFormat:3,DaysStandalone:4,MonthsFormat:5,MonthsStandalone:6,Eras:7,FirstDayOfWeek:8,WeekendRange:9,DateFormat:10,TimeFormat:11,DateTimeFormat:12,NumberSymbols:13,NumberFormats:14,CurrencyCode:15,CurrencySymbol:16,CurrencyName:17,Currencies:18,Directionality:19,PluralCase:20,ExtraData:21};function Tg(e){return e.toLowerCase().replace(/_/g,`-`)}var Eg=`en-US`;function Dg(e){typeof e==`string`&&e.toLowerCase().replace(/_/g,`-`)}function H(e,t,n){let r=Bo(),i=Vo(),a=Ho();return Og(i,r,r[11],a,e,t,n),H}function U(e,t,n){let r=Bo(),i=Vo(),a=Ho();return(a.type&3||n)&&Sp(a,i,r,n,r[11],e,t,bp(a,r,t)),U}function Og(e,t,n,r,i,a,o){let s=!0,c=null;if((r.type&3||o)&&(c??=bp(r,t,a),Sp(r,e,t,o,n,i,a,c)&&(s=!1)),s){let e=r.outputs?.[i],n=r.hostDirectiveOutputs?.[i];if(n&&n.length)for(let e=0;e>17&32767}function Rg(e){return(e&2)==2}function zg(e,t){return e&131071|t<<17}function Bg(e){return e|2}function Vg(e){return(e&131068)>>2}function Hg(e,t){return e&-131069|t<<2}function Ug(e){return(e&1)==1}function Wg(e){return e|1}function Gg(e,t,n,r,i,a){let o=a?t.classBindings:t.styleBindings,s=Lg(o),c=Vg(o);e[r]=n;let l=!1,u;if(Array.isArray(n)){let e=n;u=e[1],(u===null||va(e,u)>0)&&(l=!0)}else u=n;if(i){if(c!==0){let t=Lg(e[s+1]);e[r+1]=Ig(t,s),t!==0&&(e[t+1]=Hg(e[t+1],r)),e[s+1]=zg(e[s+1],r)}else e[r+1]=Ig(s,0),s!==0&&(e[s+1]=Hg(e[s+1],r)),s=r}else e[r+1]=Ig(c,0),s===0?s=r:e[c+1]=Hg(e[c+1],r),c=r;l&&(e[r+1]=Bg(e[r+1])),qg(e,u,r,!0),qg(e,u,r,!1),Kg(t,u,e,r,a),o=Ig(s,c),a?t.classBindings=o:t.styleBindings=o}function Kg(e,t,n,r,i){let a=i?e.residualClasses:e.residualStyles;a!=null&&typeof t==`string`&&va(a,t)>=0&&(n[r+1]=Wg(n[r+1]))}function qg(e,t,n,r){let i=e[n+1],a=t===null,o=r?Lg(i):Vg(i),s=!1;for(;o!==0&&(s===!1||a);){let n=e[o],i=e[o+1];Jg(n,t)&&(s=!0,e[o+1]=r?Wg(i):Bg(i)),o=r?Lg(i):Vg(i)}s&&(e[n+1]=r?Bg(i):Wg(i))}function Jg(e,t){return e===null||t==null||(Array.isArray(e)?e[1]:e)===t?!0:Array.isArray(e)&&typeof t==`string`?va(e,t)>=0:!1}var Yg={textEnd:0,key:0,keyEnd:0,value:0,valueEnd:0};function Xg(e){return e.substring(Yg.key,Yg.keyEnd)}function Zg(e){return $g(e),Qg(e,e_(e,0,Yg.textEnd))}function Qg(e,t){let n=Yg.textEnd;return n===t?-1:(t=Yg.keyEnd=t_(e,Yg.key=t,n),e_(e,t,n))}function $g(e){Yg.key=0,Yg.keyEnd=0,Yg.value=0,Yg.valueEnd=0,Yg.textEnd=e.length}function e_(e,t,n){for(;t32;)t++;return t}function n_(e,t,n){return a_(e,t,n,!1),n_}function G(e,t){return a_(e,t,null,!0),G}function r_(e){o_(g_,i_,e,!0)}function i_(e,t){for(let n=Zg(t);n>=0;n=Qg(t,n))ga(e,Xg(t),!0)}function a_(e,t,n,r){let i=Bo(),a=Vo(),o=$o(2);if(a.firstUpdatePass&&c_(a,e,o,r),t!==Fu&&gp(i,o,t)){let s=a.data[ls()];v_(a,s,i,i[11],e,i[o+1]=x_(t,n),r,o)}}function o_(e,t,n,r){let i=Vo(),a=$o(2);i.firstUpdatePass&&c_(i,null,a,r);let o=Bo();if(n!==Fu&&gp(o,a,n)){let s=i.data[ls()];if(S_(s,r)&&!s_(i,a)){let e=r?s.classesWithoutHost:s.stylesWithoutHost;e!==null&&(n=_i(e,n||``)),ug(i,s,o,n,r)}else __(i,s,o,o[11],o[a+1],o[a+1]=h_(e,t,n),r,a)}}function s_(e,t){return t>=e.expandoStartIndex}function c_(e,t,n,r){let i=e.data;if(i[n+1]===null){let a=i[ls()],o=s_(e,n);S_(a,r)&&t===null&&!o&&(t=!1),t=l_(i,a,t,r),Gg(i,a,t,n,o,r)}}function l_(e,t,n,r){let i=$ee(e),a=r?t.residualClasses:t.residualStyles;if(i===null)(r?t.classBindings:t.styleBindings)===0&&(n=p_(null,e,t,n,r),n=m_(n,t.attrs,r),a=null);else{let o=t.directiveStylingLast;if(o===-1||e[o]!==i){if(n=p_(i,e,t,n,r),a===null){let n=u_(e,t,r);n!==void 0&&Array.isArray(n)&&(n=p_(null,e,t,n[1],r),n=m_(n,t.attrs,r),d_(e,t,r,n))}else a=f_(e,t,r)}}return a!==void 0&&(r?t.residualClasses=a:t.residualStyles=a),n}function u_(e,t,n){let r=n?t.classBindings:t.styleBindings;if(Vg(r)!==0)return e[Lg(r)]}function d_(e,t,n,r){let i=n?t.classBindings:t.styleBindings;e[Lg(i)]=r}function f_(e,t,n){let r,i=t.directiveEnd;for(let a=1+t.directiveStylingLast;a0;){let t=e[i],a=Array.isArray(t),c=a?t[1]:t,l=c===null,u=n[i+1];u===Fu&&(u=l?xa:void 0);let d=l?_a(u,r):c===r?u:void 0;if(a&&!b_(d)&&(d=_a(t,r)),b_(d)&&(s=d,o))return s;let f=e[i+1];i=o?Lg(f):Vg(f)}if(t!==null){let e=a?t.residualClasses:t.residualStyles;e!=null&&(s=_a(e,r))}return s}function b_(e){return e!==void 0}function x_(e,t){return e==null||e===``||(typeof t==`string`?e=lu(e)+t:typeof e==`object`&&(e=gi(lu(e)))),e}function S_(e,t){return!!(e.flags&(t?8:16))}function K(e,t=``){let n=Bo(),r=Vo(),i=e+27,a=r.firstCreatePass?Xf(r,i,1,t,null):r.data[i],o=C_(r,n,a,t);n[i]=o,gs()&&Sd(r,n,o,a),Wo(a,!1)}var C_=(e,t,n,r)=>(_s(!0),vu(t[11],r));function w_(e,t,n,r=``){return gp(e,Qo(),n)?t+Bi(n)+r:Fu}function T_(e,t,n,r,i,a=``){let o=_p(e,Zo(),n,i);return $o(2),o?t+Bi(n)+r+Bi(i)+a:Fu}function E_(e,t,n,r,i,a,o,s=``){let c=vp(e,Zo(),n,i,o);return $o(3),c?t+Bi(n)+r+Bi(i)+a+Bi(o)+s:Fu}function D_(e,t,n,r,i,a,o,s,c,l=``){let u=yp(e,Zo(),n,i,o,c);return $o(4),u?t+Bi(n)+r+Bi(i)+a+Bi(o)+s+Bi(c)+l:Fu}function q(e){return J(``,e),q}function J(e,t,n){let r=Bo(),i=w_(r,e,t,n);return i!==Fu&&A_(r,ls(),i),J}function Y(e,t,n,r,i){let a=Bo(),o=T_(a,e,t,n,r,i);return o!==Fu&&A_(a,ls(),o),Y}function O_(e,t,n,r,i,a,o){let s=Bo(),c=E_(s,e,t,n,r,i,a,o);return c!==Fu&&A_(s,ls(),c),O_}function k_(e,t,n,r,i,a,o,s,c){let l=Bo(),u=D_(l,e,t,n,r,i,a,o,s,c);return u!==Fu&&A_(l,ls(),u),k_}function A_(e,t,n){let r=ho(t,e);yu(e[11],r,n)}function j_(e,t,n){gc(t)&&(t=t());let r=Bo();return gp(r,Qo(),t)&&(Vo(),qd(ds(),r,e,t,r[11],n)),j_}function M_(e,t){let n=gc(e);return n&&e.set(t),n}function N_(e,t){let n=Bo(),r=Vo(),i=Ho();return Og(r,n,n[11],i,e,t),N_}var P_={};function F_(e){rd(`NgLet`);let t=Vo(),n=Bo(),r=e+27;return Wo(Xf(t,r,128,null,null),!1),yo(t,n,r,P_),F_}function I_(e){return yo(Vo(),Bo(),ls(),e),e}function L_(e){let t=vo(qo(),27+e);if(t===P_)throw new pi(314,!1);return t}function R_(e,t,n=``){return w_(Bo(),e,t,n)}function z_(e,t,n){let r=Vo();r.firstCreatePass&&B_(t,r.data,r.blueprint,co(e),n)}function B_(e,t,n,r,i){if(e=yi(e),Array.isArray(e))for(let a=0;a>20;if(Fa(e)||!e.multi){let r=new Uc(l,i,Up,null),p=U_(c,t,i?u:u+f,d);p===-1?(fl(cl(s,o),a,c),V_(a,e,t.length),t.push(c),s.directiveStart++,s.directiveEnd++,i&&(s.providerIndexes+=1048576),n.push(r),o.push(r)):(n[p]=r,o[p]=r)}else{let p=U_(c,t,u+f,d),m=U_(c,t,u,u+f),ee=p>=0&&n[p],h=m>=0&&n[m];if(i&&!h||!i&&!ee){fl(cl(s,o),a,c);let u=tne(i?ene:$te,n.length,i,r,l,e);!i&&h&&(n[m].providerFactory=u),V_(a,e,t.length,0),t.push(c),s.directiveStart++,s.directiveEnd++,i&&(s.providerIndexes+=1048576),n.push(u),o.push(u)}else{let t=H_(n[i?m:p],l,!i&&r);V_(a,e,p>-1?p:m,t)}!i&&r&&h&&n[m].componentProviders++}}}function V_(e,t,n,r){let i=Fa(t),a=Ia(t);if(i||a){let o=(a?yi(t.useClass):t).prototype.ngOnDestroy;if(o){let a=e.destroyHooks||=[];if(!i&&t.multi){let e=a.indexOf(n);e===-1?a.push(n,[r,o]):a[e+1].push(r,o)}else a.push(n,o)}}}function H_(e,t,n){return n&&e.componentProviders++,e.multi.push(t)-1}function U_(e,t,n,r){for(let i=n;i{n.providersResolver=(t,n)=>z_(t,n?n(e):e,!1),t&&(n.viewProvidersResolver=(e,n)=>z_(e,n?n(t):t,!0))}}function K_(e,t){let n=Xo()+e,r=Bo();return r[n]===Fu?mp(r,n,t()):hp(r,n)}function q_(e,t,n){return X_(Bo(),Xo(),e,t,n)}function J_(e,t,n,r){return Z_(Bo(),Xo(),e,t,n,r)}function nne(e,t,n,r,i,a,o){return rne(Bo(),Xo(),e,t,n,r,i,a)}function Y_(e,t){let n=e[t];return n===Fu?void 0:n}function X_(e,t,n,r,i,a){let o=t+n;return gp(e,o,i)?mp(e,o+1,a?r.call(a,i):r(i)):Y_(e,o+1)}function Z_(e,t,n,r,i,a,o){let s=t+n;return _p(e,s,i,a)?mp(e,s+2,o?r.call(o,i,a):r(i,a)):Y_(e,s+2)}function rne(e,t,n,r,i,a,o,s,c){let l=t+n;return yp(e,l,i,a,o,s)?mp(e,l+4,c?r.call(c,i,a,o,s):r(i,a,o,s)):Y_(e,l+4)}function Q_(e,t){let n=Vo(),r,i=e+27;n.firstCreatePass?(r=ine(t,n.pipeRegistry),n.data[i]=r,r.onDestroy&&(n.destroyHooks??=[]).push(i,r.onDestroy)):r=n.data[i];let a=r.factory||(r.factory=ca(r.type,!0)),o=Xi(Up);try{let e=nl(!1),t=a();return nl(e),yo(n,Bo(),i,t),t}finally{Xi(o)}}function ine(e,t){if(t)for(let n=t.length-1;n>=0;n--){let r=t[n];if(e===r.name)return r}}function $_(e,t,n){let r=e+27,i=Bo(),a=vo(i,r);return tv(i,r)?X_(i,Xo(),t,a.transform,n,a):a.transform(n)}function ev(e,t,n,r){let i=e+27,a=Bo(),o=vo(a,i);return tv(a,i)?Z_(a,Xo(),t,o.transform,n,r,o):o.transform(n,r)}function tv(e,t){return e[1].data[t].pure}function nv(e,t){return Yf(e,t)}var ane=(()=>{class e{applicationErrorHandler=x(qs);appRef=x(zh);taskService=x(Es);ngZone=x(Ps);zonelessEnabled=x(ic);tracing=x(td,{optional:!0});zoneIsDefined=typeof Zone<`u`&&!!Zone.root.run;schedulerTickApplyArgs=[{data:{__scheduler_tick__:!0}}];subscriptions=new cr;angularZoneId=this.zoneIsDefined?this.ngZone._inner?.get(Ms):null;scheduleInRootZone=!this.zonelessEnabled&&this.zoneIsDefined&&(x(ac,{optional:!0})??!1);cancelScheduledCallback=null;useMicrotaskScheduler=!1;runningTick=!1;pendingRenderTaskId=null;constructor(){this.subscriptions.add(this.appRef.afterTick.subscribe(()=>{let e=this.taskService.add();if(!this.runningTick&&(this.cleanup(),!this.zonelessEnabled||this.appRef.includeAllTestViews)){this.taskService.remove(e);return}this.switchToMicrotaskScheduler(),this.taskService.remove(e)})),this.subscriptions.add(this.ngZone.onUnstable.subscribe(()=>{this.runningTick||this.cleanup()}))}switchToMicrotaskScheduler(){this.ngZone.runOutsideAngular(()=>{let e=this.taskService.add();this.useMicrotaskScheduler=!0,queueMicrotask(()=>{this.useMicrotaskScheduler=!1,this.taskService.remove(e)})})}notify(e){if(!this.zonelessEnabled&&e===5)return;switch(e){case 0:case 2:this.appRef.dirtyFlags|=2;break;case 3:case 4:case 5:case 1:this.appRef.dirtyFlags|=4;break;case 6:this.appRef.dirtyFlags|=2;break;case 12:this.appRef.dirtyFlags|=16;break;case 13:this.appRef.dirtyFlags|=2;break;case 11:break;default:this.appRef.dirtyFlags|=8}if(this.appRef.tracingSnapshot=this.tracing?.snapshot(this.appRef.tracingSnapshot)??null,!this.shouldScheduleTick())return;let t=this.useMicrotaskScheduler?As:ks;this.pendingRenderTaskId=this.taskService.add(),this.cancelScheduledCallback=this.scheduleInRootZone?Zone.root.run(()=>t(()=>this.tick())):this.ngZone.runOutsideAngular(()=>t(()=>this.tick()))}shouldScheduleTick(){return!(this.appRef.destroyed||this.pendingRenderTaskId!==null||this.runningTick||this.appRef._runningTick||!this.zonelessEnabled&&this.zoneIsDefined&&Zone.current.get(`isAngularZone_ID`+this.angularZoneId))}tick(){if(this.runningTick||this.appRef.destroyed)return;if(this.appRef.dirtyFlags===0){this.cleanup();return}!this.zonelessEnabled&&this.appRef.dirtyFlags&7&&(this.appRef.dirtyFlags|=1);let e=this.taskService.add();try{this.ngZone.run(()=>{this.runningTick=!0,this.appRef._tick()},void 0,this.schedulerTickApplyArgs)}catch(e){this.applicationErrorHandler(e)}finally{this.taskService.remove(e),this.cleanup()}}ngOnDestroy(){this.subscriptions.unsubscribe(),this.cleanup()}cleanup(){if(this.runningTick=!1,this.cancelScheduledCallback?.(),this.cancelScheduledCallback=null,this.pendingRenderTaskId!==null){let e=this.pendingRenderTaskId;this.pendingRenderTaskId=null,this.taskService.remove(e)}}static ɵfac=function(t){return new(t||e)};static ɵprov=kl({token:e,factory:e.ɵfac})}return e})();function one(){return[{provide:rc,useExisting:ane},{provide:Ps,useClass:Hs},{provide:ic,useValue:!0}]}function sne(){return typeof $localize<`u`&&$localize.locale||`en-US`}var rv=new Oi(``,{factory:()=>x(rv,{optional:!0,skipSelf:!0})||sne()}),iv=class{destroyed=!1;listeners=null;errorHandler=x(Ks,{optional:!0});isEmitting=!1;hasNullListeners=!1;destroyRef=x(Ss);constructor(){this.destroyRef.onDestroy(()=>{this.destroyed=!0,this.listeners=null})}subscribe(e){if(this.destroyed)throw new pi(953,!1);return(this.listeners??=[]).push(e),{unsubscribe:()=>{let t=this.listeners?this.listeners.indexOf(e):-1;t>-1&&(this.isEmitting?(this.hasNullListeners=!0,this.listeners[t]=null):this.listeners.splice(t,1))}}}emit(e){if(this.destroyed){console.warn(mi(953,!1));return}if(this.listeners===null)return;this.isEmitting=!0;let t=an(null);try{for(let t of this.listeners)try{t!==null&&t(e)}catch(e){this.errorHandler?.handleError(e)}}finally{this.hasNullListeners&&(this.hasNullListeners=!1,this.listeners&&cne(this.listeners)),an(t),this.isEmitting=!1}}};function cne(e){let t=e.length-1;for(;t>-1;)e[t]===null&&e.splice(t,1),t--}function X(e,t){return En(e,t?.equal)}function Z(e){return qn(e)}(class e extends Error{_brand;constructor(e){super(e)}static IDLE=new e(`IDLE`);static LOADING=new e(`LOADING`)});var lne=e=>e;function Q(e,t){return typeof e==`function`?av(Un(e,lne,t?.equal),t?.debugName,t?.set):av(Un(e.source,e.computation,e.equal),e.debugName,e.set)}function av(e,t,n){let r=e[rn],i=e;if(n!==void 0){let t=e=>Wn(r,e);i.set=e=>n(e,t),i.update=r=>n(r(Z(e)),t)}else i.set=e=>Wn(r,e),i.update=e=>Gn(r,e);return i.asReadonly=Ys.bind(e),i}var ov=!1;function une(){return ov}function sv(e){ov=e}function cv(e,t){let n=Object.create(vc);n.value=e,n.transformFn=t?.transform;function r(){if(cn(n),n.value===_c)throw new pi(-950,null);return n.value}return r[rn]=n,r}function lv(e){return new iv}function uv(e,t){return cv(e,t)}function dne(e){return cv(_c,e)}var $=(uv.required=dne,uv);function dv(e,t){let n=Object.create(vc),r=new iv;n.value=e;function i(){return cn(n),fv(n.value),n.value}return i[rn]=n,i.asReadonly=Ys.bind(i),i.set=e=>{n.equal(n.value,e)||(Mn(n,e),r.emit(e))},i.update=e=>{fv(n.value),i.set(e(n.value))},i.subscribe=r.subscribe.bind(r),i.destroyRef=r.destroyRef,i}function fv(e){if(e===_c)throw new pi(952,!1)}function pv(e,t){return dv(e,t)}function fne(e){return dv(_c,e)}var mv=(pv.required=fne,pv);function hv(e,t){return $m(t)}function pne(e,t){return eh(t)}var gv=(hv.required=pne,hv),mne=(()=>{class e{static __NG_ELEMENT_ID__=hne}return e})();function hne(e){return gne(Ho(),Bo(),(e&16)==16)}function gne(e,t,n){if(oo(e)&&!n){let n=bo(e.index,t);return new Kf(n,n)}if(e.type&175){let e=t[15];return new Kf(e,t)}return null}var _v=new Oi(``),_ne=new Oi(``);function vv(e){return!e.moduleRef}function vne(e){let t=vv(e)?e.r3Injector:e.moduleRef.injector,n=t.get(Ps);return n.run(()=>{vv(e)?e.r3Injector.resolveInjectorInitializers():e.moduleRef.resolveInjectorInitializers();let r=t.get(qs),i;if(n.runOutsideAngular(()=>{i=n.onError.subscribe({next:r})}),vv(e)){let n=()=>t.destroy(),r=e.platformInjector.get(_v);r.add(n),t.onDestroy(()=>{i.unsubscribe(),r.delete(n)})}else{let t=()=>e.moduleRef.destroy(),n=e.platformInjector.get(_v);n.add(t),e.moduleRef.onDestroy(()=>{Vh(e.allPlatformModules,e.moduleRef),i.unsubscribe(),n.delete(t)})}return bne(r,n,()=>{let n=t.get(Es),r=n.add(),i=t.get(yh);return i.runInitializers(),i.donePromise.then(()=>{if(Dg(t.get(rv,Eg)||`en-US`),!t.get(_ne,!0))return vv(e)?t.get(zh):(e.allPlatformModules.push(e.moduleRef),e.moduleRef);if(vv(e)){let n=t.get(zh);return e.rootComponent!==void 0&&n.bootstrap(e.rootComponent),n}return yne?.(e.moduleRef,e.allPlatformModules),e.moduleRef}).finally(()=>void n.remove(r))})})}var yne;function bne(e,t,n){try{let r=n();return rh(r)?r.catch(n=>{throw t.runOutsideAngular(()=>e(n)),n}):r}catch(n){throw t.runOutsideAngular(()=>e(n)),n}}var yv=null;function xne(e=[],t){return bs.create({name:t,providers:[{provide:La,useValue:`platform`},{provide:_v,useValue:new Set([()=>yv=null])},...e]})}function Sne(e=[]){if(yv)return yv;let t=xne(e);return yv=t,Lh(),Cne(t),t}function Cne(e){let t=e.get(Qs,null);eo(e,()=>{t?.forEach(e=>e())})}function wne(e){let{rootComponent:t,appProviders:n,platformProviders:r,platformRef:i}=e;Nc(bc.BootstrapApplicationStart);try{let e=i?.injector??Sne(r);return vne({r3Injector:new oh({providers:[one(),Js,...n||[]],parent:e,debugName:``,runEnvironmentInitializers:!1}).injector,platformInjector:e,rootComponent:t})}catch(e){return Promise.reject(e)}finally{Nc(bc.BootstrapApplicationEnd)}}function bv(e){return typeof e==`boolean`?e:e!=null&&e!==`false`}var xv=Symbol(`NOT_SET`),Sv=new Set,Tne={...Pn,kind:`afterRenderEffectPhase`,consumerIsAlwaysLive:!0,consumerAllowSignalWrites:!0,value:xv,cleanup:null,consumerMarkedDirty(){if(this.sequence.impl.executing){if(this.sequence.lastPhase===null||this.sequence.lastPhase(cn(r),r.value),r.signal[rn]=r,r.registerCleanupFn=e=>(r.cleanup??=new Set).add(e),this.nodes[e]=r,this.hooks[e]=e=>r.phaseFn(e)}}afterRun(){super.afterRun(),this.lastPhase=null}destroy(){if(this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();super.destroy();for(let e of this.nodes)if(e)try{for(let t of e.cleanup??Sv)t()}finally{bn(e)}}};function Cv(e,t){let n=t?.injector??x(bs),r=n.get(rc),i=n.get(id),a=n.get(td,null,{optional:!0});i.impl??=n.get(od);let o=e;typeof o==`function`&&(o={mixedReadWrite:e});let s=n.get(tc,null,{optional:!0}),c=new Ene(i.impl,[o.earlyRead,o.write,o.mixedReadWrite,o.read],s?.view,r,n,a?.snapshot(null));return i.impl.register(c),c}var wv=null;function Tv(){return wv}function Dne(e){wv??=e}var One=class{},Ev=(function(e){return e[e.Format=0]=`Format`,e[e.Standalone=1]=`Standalone`,e})(Ev||{}),Dv=(function(e){return e[e.Narrow=0]=`Narrow`,e[e.Abbreviated=1]=`Abbreviated`,e[e.Wide=2]=`Wide`,e[e.Short=3]=`Short`,e})(Dv||{}),Ov=(function(e){return e[e.Short=0]=`Short`,e[e.Medium=1]=`Medium`,e[e.Long=2]=`Long`,e[e.Full=3]=`Full`,e})(Ov||{}),kv={Decimal:0,Group:1,List:2,PercentSign:3,PlusSign:4,MinusSign:5,Exponential:6,SuperscriptingExponent:7,PerMille:8,Infinity:9,NaN:10,TimeSeparator:11,CurrencyDecimal:12,CurrencyGroup:13};function kne(e){return Sg(e)[wg.LocaleId]}function Ane(e,t,n){let r=Sg(e);return Fv(Fv([r[wg.DayPeriodsFormat],r[wg.DayPeriodsStandalone]],t),n)}function jne(e,t,n){let r=Sg(e);return Fv(Fv([r[wg.DaysFormat],r[wg.DaysStandalone]],t),n)}function Mne(e,t,n){let r=Sg(e);return Fv(Fv([r[wg.MonthsFormat],r[wg.MonthsStandalone]],t),n)}function Nne(e,t){let n=Sg(e)[wg.Eras];return Fv(n,t)}function Av(e,t){return Fv(Sg(e)[wg.DateFormat],t)}function jv(e,t){return Fv(Sg(e)[wg.TimeFormat],t)}function Mv(e,t){let n=Sg(e)[wg.DateTimeFormat];return Fv(n,t)}function Nv(e,t){let n=Sg(e),r=n[wg.NumberSymbols][t];if(r===void 0){if(t===kv.CurrencyDecimal)return n[wg.NumberSymbols][kv.Decimal];if(t===kv.CurrencyGroup)return n[wg.NumberSymbols][kv.Group]}return r}function Pv(e){if(!e[wg.ExtraData])throw new pi(2303,!1)}function Pne(e){let t=Sg(e);return Pv(t),(t[wg.ExtraData][2]||[]).map(e=>typeof e==`string`?Iv(e):[Iv(e[0]),Iv(e[1])])}function Fne(e,t,n){let r=Sg(e);return Pv(r),Fv(Fv([r[wg.ExtraData][0],r[wg.ExtraData][1]],t)||[],n)||[]}function Fv(e,t){for(let n=t;n>-1;n--)if(e[n]!==void 0)return e[n];throw new pi(2304,!1)}function Iv(e){let[t,n]=e.split(`:`);return{hours:+t,minutes:+n}}var Ine=/^(\d{4,})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/,Lv=Object.create(null),Lne=/((?:[^BEGHLMOSWYZabcdhmswyz']+)|(?:'(?:[^']|'')*')|(?:G{1,5}|y{1,4}|Y{1,4}|M{1,5}|L{1,5}|w{1,2}|W{1}|d{1,2}|E{1,6}|c{1,6}|a{1,5}|b{1,5}|B{1,5}|h{1,2}|H{1,2}|m{1,2}|s{1,2}|S{1,3}|z{1,4}|Z{1,5}|O{1,4}))([\s\S]*)/,Rne=256;function zne(e,t,n,r){let i=Yne(e);Bne(t),t=zv(n,t)||t;let a=[],o;for(;t;)if(o=Lne.exec(t),o){a=a.concat(o.slice(1));let e=a.pop();if(!e)break;t=e}else{a.push(t);break}let s=i.getTimezoneOffset();r&&(s=Xv(r,s),i=Jne(i,r));let c=``;return a.forEach(e=>{let t=Kne(e);c+=t?t(i,n,s):e===`''`?`'`:e.replace(/(^'|'$)/g,``).replace(/''/g,`'`)}),c}function Bne(e){if(e.length>Rne)throw new pi(2300,!1)}function Rv(e,t,n){let r=new Date(0);return r.setFullYear(e,t,n),r.setHours(0,0,0),r}function zv(e,t){let n=kne(e);if(Lv[n]??=Object.create(null),Lv[n][t])return Lv[n][t];let r=``;switch(t){case`shortDate`:r=Av(e,Ov.Short);break;case`mediumDate`:r=Av(e,Ov.Medium);break;case`longDate`:r=Av(e,Ov.Long);break;case`fullDate`:r=Av(e,Ov.Full);break;case`shortTime`:r=jv(e,Ov.Short);break;case`mediumTime`:r=jv(e,Ov.Medium);break;case`longTime`:r=jv(e,Ov.Long);break;case`fullTime`:r=jv(e,Ov.Full);break;case`short`:let t=zv(e,`shortTime`),n=zv(e,`shortDate`);r=Bv(Mv(e,Ov.Short),[t,n]);break;case`medium`:let i=zv(e,`mediumTime`),a=zv(e,`mediumDate`);r=Bv(Mv(e,Ov.Medium),[i,a]);break;case`long`:let o=zv(e,`longTime`),s=zv(e,`longDate`);r=Bv(Mv(e,Ov.Long),[o,s]);break;case`full`:let c=zv(e,`fullTime`),l=zv(e,`fullDate`);r=Bv(Mv(e,Ov.Full),[c,l])}return r&&(Lv[n][t]=r),r}function Bv(e,t){return t&&(e=e.replace(/\{([^}]+)}/g,function(e,n){return Object.hasOwn(t,n)?t[n]:e})),e}function Vv(e,t,n=`-`,r,i){let a=``;(e<0||i&&e<=0)&&(i?e=-e+1:(e=-e,a=n));let o=String(e);for(;o.length0||s>-n)&&(s+=n),e===3)s===0&&n===-12&&(s=12);else if(e===6)return Vne(s,t);let c=Nv(o,kv.MinusSign);return Vv(s,t,c,r,i)}}function Hne(e,t){switch(e){case 0:return t.getFullYear();case 1:return t.getMonth();case 2:return t.getDate();case 3:return t.getHours();case 4:return t.getMinutes();case 5:return t.getSeconds();case 6:return t.getMilliseconds();case 7:return t.getDay();default:throw new pi(2301,!1)}}function Uv(e,t,n=Ev.Format,r=!1){return function(i,a){return Une(i,a,e,t,n,r)}}function Une(e,t,n,r,i,a){switch(n){case 2:return Mne(t,i,r)[e.getMonth()];case 1:return jne(t,i,r)[e.getDay()];case 0:let n=e.getHours(),o=e.getMinutes();if(a){let e=Pne(t),a=Fne(t,i,r),s=e.findIndex(e=>{if(Array.isArray(e)){let[t,r]=e,i=n>=t.hours&&o>=t.minutes,a=n0?Math.floor(i/60):Math.ceil(i/60);switch(e){case 0:return(i>=0?`+`:``)+Vv(o,2,a)+Vv(Math.abs(i%60),2,a);case 1:return`GMT`+(i>=0?`+`:``)+Vv(o,1,a);case 2:return`GMT`+(i>=0?`+`:``)+Vv(o,2,a)+`:`+Vv(Math.abs(i%60),2,a);case 3:return r===0?`Z`:(i>=0?`+`:``)+Vv(o,2,a)+`:`+Vv(Math.abs(i%60),2,a);default:throw new pi(2310,!1)}}}var Wne=0,Gv=4;function Gne(e){let t=Rv(e,Wne,1).getDay();return Rv(e,0,1+(t<=Gv?Gv:11)-t)}function Kv(e){let t=e.getDay(),n=t===0?-3:Gv-t;return Rv(e.getFullYear(),e.getMonth(),e.getDate()+n)}function qv(e,t=!1){return function(n,r){let i;if(t){let e=new Date(n.getFullYear(),n.getMonth(),1).getDay()-1,t=n.getDate();i=1+Math.floor((t+e)/7)}else{let e=Kv(n),t=Gne(e.getFullYear()),r=e.getTime()-t.getTime();i=1+Math.round(r/6048e5)}return Vv(i,e,Nv(r,kv.MinusSign))}}function Jv(e,t=!1){return function(n,r){return Vv(Kv(n).getFullYear(),e,Nv(r,kv.MinusSign),t)}}var Yv=Object.create(null);function Kne(e){if(Yv[e])return Yv[e];let t;switch(e){case`G`:case`GG`:case`GGG`:t=Uv(3,Dv.Abbreviated);break;case`GGGG`:t=Uv(3,Dv.Wide);break;case`GGGGG`:t=Uv(3,Dv.Narrow);break;case`y`:t=Hv(0,1,0,!1,!0);break;case`yy`:t=Hv(0,2,0,!0,!0);break;case`yyy`:t=Hv(0,3,0,!1,!0);break;case`yyyy`:t=Hv(0,4,0,!1,!0);break;case`Y`:t=Jv(1);break;case`YY`:t=Jv(2,!0);break;case`YYY`:t=Jv(3);break;case`YYYY`:t=Jv(4);break;case`M`:case`L`:t=Hv(1,1,1);break;case`MM`:case`LL`:t=Hv(1,2,1);break;case`MMM`:t=Uv(2,Dv.Abbreviated);break;case`MMMM`:t=Uv(2,Dv.Wide);break;case`MMMMM`:t=Uv(2,Dv.Narrow);break;case`LLL`:t=Uv(2,Dv.Abbreviated,Ev.Standalone);break;case`LLLL`:t=Uv(2,Dv.Wide,Ev.Standalone);break;case`LLLLL`:t=Uv(2,Dv.Narrow,Ev.Standalone);break;case`w`:t=qv(1);break;case`ww`:t=qv(2);break;case`W`:t=qv(1,!0);break;case`d`:t=Hv(2,1);break;case`dd`:t=Hv(2,2);break;case`c`:case`cc`:t=Hv(7,1);break;case`ccc`:t=Uv(1,Dv.Abbreviated,Ev.Standalone);break;case`cccc`:t=Uv(1,Dv.Wide,Ev.Standalone);break;case`ccccc`:t=Uv(1,Dv.Narrow,Ev.Standalone);break;case`cccccc`:t=Uv(1,Dv.Short,Ev.Standalone);break;case`E`:case`EE`:case`EEE`:t=Uv(1,Dv.Abbreviated);break;case`EEEE`:t=Uv(1,Dv.Wide);break;case`EEEEE`:t=Uv(1,Dv.Narrow);break;case`EEEEEE`:t=Uv(1,Dv.Short);break;case`a`:case`aa`:case`aaa`:t=Uv(0,Dv.Abbreviated);break;case`aaaa`:t=Uv(0,Dv.Wide);break;case`aaaaa`:t=Uv(0,Dv.Narrow);break;case`b`:case`bb`:case`bbb`:t=Uv(0,Dv.Abbreviated,Ev.Standalone,!0);break;case`bbbb`:t=Uv(0,Dv.Wide,Ev.Standalone,!0);break;case`bbbbb`:t=Uv(0,Dv.Narrow,Ev.Standalone,!0);break;case`B`:case`BB`:case`BBB`:t=Uv(0,Dv.Abbreviated,Ev.Format,!0);break;case`BBBB`:t=Uv(0,Dv.Wide,Ev.Format,!0);break;case`BBBBB`:t=Uv(0,Dv.Narrow,Ev.Format,!0);break;case`h`:t=Hv(3,1,-12);break;case`hh`:t=Hv(3,2,-12);break;case`H`:t=Hv(3,1);break;case`HH`:t=Hv(3,2);break;case`m`:t=Hv(4,1);break;case`mm`:t=Hv(4,2);break;case`s`:t=Hv(5,1);break;case`ss`:t=Hv(5,2);break;case`S`:t=Hv(6,1);break;case`SS`:t=Hv(6,2);break;case`SSS`:t=Hv(6,3);break;case`Z`:case`ZZ`:case`ZZZ`:t=Wv(0);break;case`ZZZZZ`:t=Wv(3);break;case`O`:case`OO`:case`OOO`:case`z`:case`zz`:case`zzz`:t=Wv(1);break;case`OOOO`:case`ZZZZ`:case`zzzz`:t=Wv(2);break;default:return null}return Yv[e]=t,t}function Xv(e,t){e=e.replace(/:/g,``);let n=Date.parse(`Jan 01, 1970 00:00:00 `+e)/6e4;return isNaN(n)?t:n}function qne(e,t){return e=new Date(e.getTime()),e.setMinutes(e.getMinutes()+t),e}function Jne(e,t,n){let r=e.getTimezoneOffset();return qne(e,-1*(Xv(t,r)-r))}function Yne(e){if(Zv(e))return e;if(typeof e==`number`&&!isNaN(e))return new Date(e);if(typeof e==`string`){if(e=e.trim(),/^(\d{4}(-\d{1,2}(-\d{1,2})?)?)$/.test(e)){let[t,n=1,r=1]=e.split(`-`).map(e=>+e);return Rv(t,n-1,r)}let t=parseFloat(e);if(!isNaN(e-t))return new Date(t);let n;if(n=e.match(Ine))return Xne(n)}let t=new Date(e);if(!Zv(t))throw new pi(2311,!1);return t}function Xne(e){let t=new Date(0),n=0,r=0,i=e[8]?t.setUTCFullYear:t.setFullYear,a=e[8]?t.setUTCHours:t.setHours;e[9]&&(n=Number(e[9]+e[10]),r=Number(e[9]+e[11])),i.call(t,Number(e[1]),Number(e[2])-1,Number(e[3]));let o=Number(e[4]||0)-n,s=Number(e[5]||0)-r,c=Number(e[6]||0),l=Math.floor(parseFloat(`0.`+(e[7]||0))*1e3);return a.call(t,o,s,c,l),t}function Zv(e){return e instanceof Date&&!isNaN(e.valueOf())}var Qv=(()=>{class e{_viewContainerRef;_viewRef=null;ngTemplateOutletContext=null;ngTemplateOutlet=null;ngTemplateOutletInjector=null;injector=x(bs);constructor(e){this._viewContainerRef=e}ngOnChanges(e){if(this._shouldRecreateView(e)){let e=this._viewContainerRef;if(this._viewRef&&e.remove(e.indexOf(this._viewRef)),!this.ngTemplateOutlet){this._viewRef=null;return}let t=this._createContextForwardProxy();this._viewRef=e.createEmbeddedView(this.ngTemplateOutlet,t,{injector:this._getInjector()})}}_getInjector(){return this.ngTemplateOutletInjector===`outlet`?this.injector:this.ngTemplateOutletInjector??void 0}_shouldRecreateView(e){return!!e.ngTemplateOutlet||!!e.ngTemplateOutletInjector}_createContextForwardProxy(){return new Proxy({},{set:(e,t,n)=>this.ngTemplateOutletContext?Reflect.set(this.ngTemplateOutletContext,t,n):!1,get:(e,t,n)=>{if(this.ngTemplateOutletContext)return Reflect.get(this.ngTemplateOutletContext,t,n)}})}static ɵfac=function(t){return new(t||e)(Up(Cm))};static ɵdir=fh({type:e,selectors:[[``,`ngTemplateOutlet`,``]],inputs:{ngTemplateOutletContext:`ngTemplateOutletContext`,ngTemplateOutlet:`ngTemplateOutlet`,ngTemplateOutletInjector:`ngTemplateOutletInjector`},features:[wc]})}return e})();function Zne(e,t){return new pi(2100,!1)}var Qne=`mediumDate`,$ne=new Oi(``),ere=new Oi(``),$v=(()=>{class e{locale;defaultTimezone;defaultOptions;constructor(e,t,n){this.locale=e,this.defaultTimezone=t,this.defaultOptions=n}transform(t,n,r,i){if(t==null||t===``||t!==t)return null;try{let e=n??this.defaultOptions?.dateFormat??Qne,a=r??this.defaultOptions?.timezone??this.defaultTimezone??void 0;return zne(t,e,i||this.locale,a)}catch(t){throw Zne(e,t.message)}}static ɵfac=function(t){return new(t||e)(Up(rv,16),Up($ne,24),Up(ere,24))};static ɵpipe=ph({name:`date`,type:e,pure:!0})}return e})(),ey=(()=>{class e{transform(e){return JSON.stringify(e,null,2)}static ɵfac=function(t){return new(t||e)};static ɵpipe=ph({name:`json`,type:e,pure:!1})}return e})();function tre(e,t){t=encodeURIComponent(t);for(let n of e.split(`;`)){let e=n.indexOf(`=`),[r,i]=e==-1?[n,``]:[n.slice(0,e),n.slice(e+1)];if(r.trim()!==t)continue;let a=i;try{a=decodeURIComponent(i)}catch{}return a.length>1&&a[0]===`"`&&a[a.length-1]===`"`&&(a=a.slice(1,-1)),a}return null}var nre=`browser`,ty=class{_doc;constructor(e){this._doc=e}manager},ny=(()=>{class e extends ty{constructor(e){super(e)}supports(e){return!0}addEventListener(e,t,n,r){return e.addEventListener(t,n,r),()=>this.removeEventListener(e,t,n,r)}removeEventListener(e,t,n,r){return e.removeEventListener(t,n,r)}static ɵfac=function(t){return new(t||e)(ra(xs))};static ɵprov=xi({token:e,factory:e.ɵfac})}return e})(),ry=new Oi(``),iy=(()=>{class e{_zone;_plugins;_eventNameToPlugin=new Map;constructor(e,t){this._zone=t,e.forEach(e=>{e.manager=this});let n=e.filter(e=>!(e instanceof ny));this._plugins=n.slice().reverse();let r=e.find(e=>e instanceof ny);r&&this._plugins.push(r)}addEventListener(e,t,n,r){return this._findPluginFor(t).addEventListener(e,t,n,r)}getZone(){return this._zone}_findPluginFor(e){let t=this._eventNameToPlugin.get(e);if(t)return t;if(t=this._plugins.find(t=>t.supports(e)),!t)throw new pi(-5101,!1);return this._eventNameToPlugin.set(e,t),t}static ɵfac=function(t){return new(t||e)(ra(ry),ra(Ps))};static ɵprov=xi({token:e,factory:e.ɵfac})}return e})(),ay=`ng-app-id`;function oy(e){for(let t of e)t.remove()}function sy(e,t){let n=t.createElement(`style`);return n.textContent=e,n}function rre(e,t,n,r){let i=e.head?.querySelectorAll(`style[${ay}="${t}"],link[${ay}="${t}"]`);if(!i||i.length===0)return!1;for(let e of i)e.removeAttribute(ay),e instanceof HTMLLinkElement?r.set(e.href.slice(e.href.lastIndexOf(`/`)+1),{usage:0,elements:[e]}):e.textContent&&n.set(e.textContent,{usage:0,elements:[e]});return!0}function cy(e,t){let n=t.createElement(`link`);return n.setAttribute(`rel`,`stylesheet`),n.setAttribute(`href`,e),n}var ly=(()=>{class e{doc;appId;nonce;inline=new Map;external=new Map;hosts=new Set;constructor(e,t,n,r={}){this.doc=e,this.appId=t,this.nonce=n,rre(e,t,this.inline,this.external)&&this.hosts.add(e.head)}addStyles(e,t){for(let t of e)this.addUsage(t,this.inline,sy);t?.forEach(e=>this.addUsage(e,this.external,cy))}removeStyles(e,t){for(let t of e)this.removeUsage(t,this.inline);t?.forEach(e=>this.removeUsage(e,this.external))}addUsage(e,t,n){let r=t.get(e);r?r.usage++:t.set(e,{usage:1,elements:[...this.hosts].map(t=>this.addElement(t,n(e,this.doc)))})}removeUsage(e,t){let n=t.get(e);n&&(n.usage--,n.usage<=0&&(oy(n.elements),t.delete(e)))}ngOnDestroy(){for(let[,{elements:e}]of[...this.inline,...this.external])oy(e);this.hosts.clear()}addHost(e){if(!this.hosts.has(e)){this.hosts.add(e);for(let[t,{elements:n}]of this.inline)n.push(this.addElement(e,sy(t,this.doc)));for(let[t,{elements:n}]of this.external)n.push(this.addElement(e,cy(t,this.doc)))}}removeHost(e){this.hosts.delete(e);for(let t of[...this.inline.values(),...this.external.values()]){let n=[];for(let r of t.elements)r.parentNode===e?r.remove():n.push(r);t.elements=n}}addElement(e,t){return this.nonce&&t.setAttribute(`nonce`,this.nonce),e.appendChild(t)}static ɵfac=function(t){return new(t||e)(ra(xs),ra(Xs),ra(ec,8),ra($s))};static ɵprov=xi({token:e,factory:e.ɵfac})}return e})(),uy={svg:`http://www.w3.org/2000/svg`,xhtml:`http://www.w3.org/1999/xhtml`,xlink:`http://www.w3.org/1999/xlink`,xml:`http://www.w3.org/XML/1998/namespace`,xmlns:`http://www.w3.org/2000/xmlns/`,math:`http://www.w3.org/1998/Math/MathML`},dy=/%COMP%/g,fy=`%COMP%`,ire=`_nghost-${fy}`,are=`_ngcontent-${fy}`,ore=!0,sre=new Oi(``,{factory:()=>ore}),cre=new Oi(``);function lre(e){return are.replace(dy,e)}function ure(e){return ire.replace(dy,e)}function py(e,t){return t.map(t=>t.replace(dy,e))}var my=(()=>{class e{eventManager;sharedStylesHost;appId;removeStylesOnCompDestroy;doc;ngZone;nonce;tracingService;rendererByCompId=new Map;defaultRenderer;cssVarNamespace;constructor(e,t,n,r,i,a,o=null,s=null,c=null){this.eventManager=e,this.sharedStylesHost=t,this.appId=n,this.removeStylesOnCompDestroy=r,this.doc=i,this.ngZone=a,this.nonce=o,this.tracingService=s,this.cssVarNamespace=c??``,this.defaultRenderer=new hy(e,i,a,this.tracingService,this.cssVarNamespace)}createRenderer(e,t){if(!e||!t)return this.defaultRenderer;let n=this.getOrCreateRenderer(e,t);return n instanceof yy?n.applyToHost(e):n instanceof vy&&n.applyStyles(),n}getOrCreateRenderer(e,t){let n=this.rendererByCompId,r=n.get(t.id);if(!r){let i=this.doc,a=this.ngZone,o=this.eventManager,s=this.sharedStylesHost,c=this.removeStylesOnCompDestroy,l=this.tracingService;switch(t.encapsulation){case su.Emulated:r=new yy(o,s,t,this.appId,c,i,a,l,this.cssVarNamespace);break;case su.ShadowDom:return new _y(o,e,t,i,a,this.nonce,l,this.cssVarNamespace,s);case su.ExperimentalIsolatedShadowDom:return new _y(o,e,t,i,a,this.nonce,l,this.cssVarNamespace);default:r=new vy(o,s,t,c,i,a,l,this.cssVarNamespace)}n.set(t.id,r)}return r}ngOnDestroy(){this.rendererByCompId.clear()}componentReplaced(e){this.rendererByCompId.delete(e)}static ɵfac=function(t){return new(t||e)(ra(iy),ra(Vp),ra(Xs),ra(sre),ra(xs),ra(Ps),ra(ec),ra(td,8),ra(cre,8))};static ɵprov=xi({token:e,factory:e.ɵfac})}return e})(),hy=class{eventManager;doc;ngZone;tracingService;cssVarNamespace;data=Object.create(null);throwOnSyntheticProps=!0;constructor(e,t,n,r,i=``){this.eventManager=e,this.doc=t,this.ngZone=n,this.tracingService=r,this.cssVarNamespace=i}destroy(){}destroyNode=null;createElement(e,t){return t?this.doc.createElementNS(uy[t]||t,e):this.doc.createElement(e)}createComment(e){return this.doc.createComment(e)}createText(e){return this.doc.createTextNode(e)}appendChild(e,t){(gy(e)?e.content:e).appendChild(t)}insertBefore(e,t,n){if(e){let r=gy(e)?e.content:e;if(n!=null&&n.parentNode!==r)throw new pi(-5106,!1);r.insertBefore(t,n)}}removeChild(e,t){t.remove()}selectRootElement(e,t){let n=typeof e==`string`?this.doc.querySelector(e):e;if(!n)throw new pi(-5104,!1);return t||(n.textContent=``),n}parentNode(e){return e.parentNode}nextSibling(e){return e.nextSibling}setAttribute(e,t,n,r){if(r){t=r+`:`+t;let i=uy[r];i?e.setAttributeNS(i,t,n):e.setAttribute(t,n)}else e.setAttribute(t,n)}removeAttribute(e,t,n){if(n){let r=uy[n];r?e.removeAttributeNS(r,t):e.removeAttribute(`${n}:${t}`)}else e.removeAttribute(t)}addClass(e,t){e.classList.add(t)}removeClass(e,t){e.classList.remove(t)}setStyle(e,t,n,r){let i=t.startsWith(`--`);i&&(t=t.replace(`%NS%`,this.cssVarNamespace)),i||r&(Iu.DashCase|Iu.Important)?e.style.setProperty(t,n,r&Iu.Important?`important`:``):e.style[t]=n}removeStyle(e,t,n){let r=t.startsWith(`--`);r&&(t=t.replace(`%NS%`,this.cssVarNamespace)),r||n&Iu.DashCase?e.style.removeProperty(t):e.style[t]=``}setProperty(e,t,n){e!=null&&(e[t]=n)}setValue(e,t){e.nodeValue=t}listen(e,t,n,r){if(typeof e==`string`&&(e=Tv().getGlobalEventTarget(this.doc,e),!e))throw new pi(-5102,!1);let i=this.decoratePreventDefault(n);return this.tracingService?.wrapEventListener&&(i=this.tracingService.wrapEventListener(e,t,i)),this.eventManager.addEventListener(e,t,i,r)}decoratePreventDefault(e){return t=>{if(t===`__ngUnwrap__`)return e;e(t)===!1&&t.preventDefault()}}};function gy(e){return e.tagName===`TEMPLATE`&&e.content!==void 0}var _y=class extends hy{hostEl;sharedStylesHost;shadowRoot;constructor(e,t,n,r,i,a,o,s,c){super(e,r,i,o,s),this.hostEl=t,this.sharedStylesHost=c,this.shadowRoot=t.attachShadow({mode:`open`}),this.sharedStylesHost&&this.sharedStylesHost.addHost(this.shadowRoot);let l=n.styles;l=py(n.id,l).map(e=>e.replace(/%NS%/g,s));for(let e of l){let t=document.createElement(`style`);a&&t.setAttribute(`nonce`,a),t.textContent=e,this.shadowRoot.appendChild(t)}let u=n.getExternalStyles?.();if(u)for(let e of u){let t=cy(e,r);a&&t.setAttribute(`nonce`,a),this.shadowRoot.appendChild(t)}}nodeOrShadowRoot(e){return e===this.hostEl?this.shadowRoot:e}appendChild(e,t){return super.appendChild(this.nodeOrShadowRoot(e),t)}insertBefore(e,t,n){return super.insertBefore(this.nodeOrShadowRoot(e),t,n)}removeChild(e,t){return super.removeChild(null,t)}parentNode(e){return this.nodeOrShadowRoot(super.parentNode(this.nodeOrShadowRoot(e)))}destroy(){this.sharedStylesHost&&this.sharedStylesHost.removeHost(this.shadowRoot)}},vy=class extends hy{sharedStylesHost;removeStylesOnCompDestroy;styles;styleUrls;constructor(e,t,n,r,i,a,o,s,c){super(e,i,a,o,s),this.sharedStylesHost=t,this.removeStylesOnCompDestroy=r;let l=n.styles,u=c?py(c,l):l;this.styles=u.map(e=>e.replace(/%NS%/g,s)),this.styleUrls=n.getExternalStyles?.(c)}applyStyles(){this.sharedStylesHost.addStyles(this.styles,this.styleUrls)}destroy(){this.removeStylesOnCompDestroy&&Uu.size===0&&this.sharedStylesHost.removeStyles(this.styles,this.styleUrls)}},yy=class extends vy{contentAttr;hostAttr;constructor(e,t,n,r,i,a,o,s,c){let l=r+`-`+n.id;super(e,t,n,i,a,o,s,c,l),this.contentAttr=lre(l),this.hostAttr=ure(l)}applyToHost(e){this.applyStyles(),this.setAttribute(e,this.hostAttr,``)}createElement(e,t){let n=super.createElement(e,t);return super.setAttribute(n,this.contentAttr,``),n}},dre=class e extends One{supportsDOMEvents=!0;static makeCurrent(){Dne(new e)}onAndCancel(e,t,n,r){return e.addEventListener(t,n,r),()=>{e.removeEventListener(t,n,r)}}dispatchEvent(e,t){e.dispatchEvent(t)}remove(e){e.remove()}createElement(e,t){return t||=this.getDefaultDocument(),t.createElement(e)}createHtmlDocument(){return document.implementation.createHTMLDocument(`fakeTitle`)}getDefaultDocument(){return document}isElementNode(e){return e.nodeType===Node.ELEMENT_NODE}isShadowRoot(e){return e instanceof DocumentFragment}getGlobalEventTarget(e,t){return t===`window`?window:t===`document`?e:t===`body`?e.body:null}getBaseHref(e){let t=fre();return t==null?null:pre(t)}resetBaseElement(){by=null}getUserAgent(){return window.navigator.userAgent}getCookie(e){return tre(document.cookie,e)}},by=null;function fre(){return by||=document.head.querySelector(`base`),by?by.getAttribute(`href`):null}function pre(e){return new URL(e,document.baseURI).pathname}var xy=[`alt`,`control`,`meta`,`shift`],mre={"\b":`Backspace`," ":`Tab`,"":`Delete`,"\x1B":`Escape`,Del:`Delete`,Esc:`Escape`,Left:`ArrowLeft`,Right:`ArrowRight`,Up:`ArrowUp`,Down:`ArrowDown`,Menu:`ContextMenu`,Scroll:`ScrollLock`,Win:`OS`},hre={alt:e=>e.altKey,control:e=>e.ctrlKey,meta:e=>e.metaKey,shift:e=>e.shiftKey},gre=(()=>{class e extends ty{constructor(e){super(e)}supports(t){return e.parseEventName(t)!=null}addEventListener(t,n,r,i){let a=e.parseEventName(n),o=e.eventCallback(a.fullKey,r,this.manager.getZone());return this.manager.getZone().runOutsideAngular(()=>Tv().onAndCancel(t,a.domEventName,o,i))}static parseEventName(t){let n=t.toLowerCase().split(`.`),r=n.shift();if(n.length===0||r!==`keydown`&&r!==`keyup`)return null;let i=e._normalizeKey(n.pop()),a=``,o=n.indexOf(`code`);if(o>-1&&(n.splice(o,1),a=`code.`),xy.forEach(e=>{let t=n.indexOf(e);t>-1&&(n.splice(t,1),a+=e+`.`)}),a+=i,n.length!=0||i.length===0)return null;let s={};return s.domEventName=r,s.fullKey=a,s}static matchEventFullKeyCode(e,t){let n=mre[e.key]||e.key,r=``;return t.indexOf(`code.`)>-1&&(n=e.code,r=`code.`),n==null||!n?!1:(n=n.toLowerCase(),n===` `?n=`space`:n===`.`&&(n=`dot`),xy.forEach(t=>{if(t!==n){let n=hre[t];n(e)&&(r+=t+`.`)}}),r+=n,r===t)}static eventCallback(t,n,r){return i=>{e.matchEventFullKeyCode(i,t)&&r.runGuarded(()=>n(i))}}static _normalizeKey(e){return e===`esc`?`escape`:e}static ɵfac=function(t){return new(t||e)(ra(xs))};static ɵprov=xi({token:e,factory:e.ɵfac})}return e})();async function _re(e,t,n){return wne({rootComponent:e,...vre(t,n)})}function vre(e,t){return{platformRef:t?.platformRef,appProviders:[...Cre,...e?.providers??[]],platformProviders:Sre}}function yre(){dre.makeCurrent()}function bre(){return new Ks}function xre(){return Yl(document),document}var Sre=[{provide:$s,useValue:nre},{provide:Qs,useValue:yre,multi:!0},{provide:xs,useFactory:xre}],Cre=[{provide:La,useValue:`root`},{provide:Ks,useFactory:bre},{provide:ry,useClass:ny,multi:!0},{provide:ry,useClass:gre,multi:!0},my,{provide:Vp,useClass:ly},{provide:ly,useExisting:Vp},iy,{provide:sp,useExisting:my},[]];function Sy(e,t){let n=`\x1B[${e}m`,r=`\x1B[${t}m`;return((e,...t)=>{if(Array.isArray(e)&&`raw`in e){let i=e,a=``;for(let e=0;e{let r=new Ere({code:i,why:Cy(a.why,e),fix:Cy(a.fix,e),docs:o,cause:e.cause,sources:e.sources,data:Cy(a.data,e)},s);for(let e of t)e(r,n);return r};n[i]=s}return n}function kre(e){return t=>{let n=`${e.bold(e.red(`[${t.name}]`))} ${t.message}`,r=[];return t.fix&&r.push(`${e.dim(`fix:`)} ${t.fix}`),t.sources?.length&&r.push(`${e.dim(`sources:`)} ${t.sources.join(`, `)}`),t.docs&&r.push(`${e.dim(`see:`)} ${e.cyan(t.docs)}`),r.length===0?n:[n,...r.map((t,n)=>`${e.dim(n{e=n,t=r}),resolve:e,reject:t}}var Ey=Math.random.bind(Math),Dy=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function Oy(e=21){let t=``,n=e;for(;n--;)t+=Dy[Ey()*64|0];return t}var ky=6e4,Ay=e=>e,jy=Ay,{clearTimeout:My,setTimeout:Ny}=globalThis;function Py(e,t){let{post:n,on:r,off:i=()=>{},eventNames:a=[],serialize:o=Ay,deserialize:s=jy,resolver:c,bind:l=`rpc`,timeout:u=ky,proxify:d=!0}=t,f=!1,p=new Map,m,ee;async function h(e,r,i,a){if(f)throw Error(`[birpc] rpc is closed, cannot call "${e}"`);let s={m:e,a:r,t:`q`};a&&(s.o=!0);let c=async e=>n(o(e));if(i){await c(s);return}if(m)try{await m}finally{m=void 0}let{promise:l,resolve:d,reject:h}=Ty(),g=Oy();s.i=g;let te;async function ne(n=s){return u>=0&&(te=Ny(()=>{try{if(t.onTimeoutError?.call(ee,e,r)!==!0)throw Error(`[birpc] timeout on calling "${e}"`)}catch(e){h(e)}p.delete(g)},u),typeof te==`object`&&(te=te.unref?.())),p.set(g,{resolve:d,reject:h,timeoutId:te,method:e}),await c(n),l}try{t.onRequest?await t.onRequest.call(ee,s,ne,d):await ne()}catch(e){if(t.onGeneralError?.call(ee,e)!==!0)throw e;return}finally{My(te),p.delete(g)}return l}let g={$call:(e,...t)=>h(e,t,!1),$callOptional:(e,...t)=>h(e,t,!1,!0),$callEvent:(e,...t)=>h(e,t,!0),$callRaw:e=>h(e.method,e.args,e.event,e.optional),$rejectPendingCalls:ne,get $closed(){return f},get $meta(){return t.meta},$close:te,$functions:e};ee=d?new Proxy({},{get(t,n){if(Object.hasOwn(g,n))return g[n];if(n===`then`&&!a.includes(`then`)&&!(`then`in e))return;let r=(...e)=>h(n,e,!0);if(a.includes(n))return r.asEvent=r,r;let i=(...e)=>h(n,e,!1);return i.asEvent=r,i}}):g;function te(e){f=!0,p.forEach(({reject:t,method:n})=>{let r=Error(`[birpc] rpc is closed, cannot call "${n}"`);if(e)return e.cause??=r,t(e);t(r)}),p.clear(),i(re)}function ne(e){let t=Array.from(p.values()).map(({method:t,reject:n})=>e?e({method:t,reject:n}):n(Error(`[birpc]: rejected pending call "${t}".`)));return p.clear(),t}async function re(r,...i){let a;try{a=s(r)}catch(e){if(t.onGeneralError?.call(ee,e)!==!0)throw e;return}if(a.t===`q`){let{m:r,a:s,o:u}=a,d,f,p=await(c?c.call(ee,r,e[r]):e[r]);if(u&&(p||=()=>void 0),!p)f=Error(`[birpc] function "${r}" not found`);else try{d=await p.apply(l===`rpc`?ee:e,s)}catch(e){f=e}if(a.i){if(f&&t.onFunctionError&&t.onFunctionError.call(ee,f,r,s)===!0)return;if(!f)try{await n(o({t:`s`,i:a.i,r:d}),...i);return}catch(e){if(f=e,t.onGeneralError?.call(ee,e,r,s)!==!0)throw e}try{await n(o({t:`s`,i:a.i,e:f}),...i)}catch(e){if(t.onGeneralError?.call(ee,e,r,s)!==!0)throw e}}}else{let{i:e,r:t,e:n}=a,r=p.get(e);r&&(My(r.timeoutId),n?r.reject(n):r.resolve(t)),p.delete(e)}}return m=r(re),ee}function Fy(e,t){return t.safety?t.safety:e===`static`||e===`query`||e==null?`read`:`action`}var Iy=Object.freeze({type:`object`,additionalProperties:!0});function Ly(e){let t=e[`~standard`];if(t.jsonSchema)try{return t.jsonSchema.input({target:`draft-2020-12`})}catch{return Iy}return Iy}function Ry(e){if(!e||e.length===0)return{type:`object`,properties:{}};let t={},n=[];for(let r=0;rn[`arg${t}`]);if(`arg0`in n){let e=[];for(;`arg${e.length}`in n;)e.push(n[`arg${e.length}`]);return e}return Object.keys(n).length===0?[]:void 0}function By(e,t){return zy(e,t)??[e]}function Vy(e){return typeof e==`string`?`'${e}'`:new Gy().serialize(e)}var Hy=` _-,;:!?.'"()[]{}@*/\\&#%\`^+<=>|~$0123456789abcdefghijklmnopqrstuvwxyz`,Uy=(function(){let e=new Uint8Array(128);for(let t=0;t<69;t++)e[Hy.charCodeAt(t)]=t+1;for(let t=65;t<=90;t++)e[t]=e[t+32];return e})();function Wy(e,t){if(e===t)return 0;let n=Math.min(e.length,t.length),r=0;for(let i=0;ia?-1:1)}return e.length===t.length?r:e.lengththis.compare(e[0],t[0])),r=`${e}{`;for(let e=0;ethis.compare(e,t)))}`}$Map(e){return this.serializeObjectEntries(`Map`,e.entries())}}for(let t of[`Error`,`RegExp`,`URL`])e.prototype[`$`+t]=function(e){return`${t}(${e})`};for(let t of[`Int8Array`,`Uint8Array`,`Uint8ClampedArray`,`Int16Array`,`Uint16Array`,`Int32Array`,`Uint32Array`,`Float32Array`,`Float64Array`])e.prototype[`$`+t]=function(e){return`${t}[${e.join(`,`)}]`};for(let t of[`BigInt64Array`,`BigUint64Array`])e.prototype[`$`+t]=function(e){return`${t}[${e.join(`n,`)}${e.length>0?`n`:``}]`};return e})(),Ky=[1779033703,-1150833019,1013904242,-1521486534,1359893119,-1694144372,528734635,1541459225],qy=[1116352408,1899447441,-1245643825,-373957723,961987163,1508970993,-1841331548,-1424204075,-670586216,310598401,607225278,1426881987,1925078388,-2132889090,-1680079193,-1046744716,-459576895,-272742522,264347078,604807628,770255983,1249150122,1555081692,1996064986,-1740746414,-1473132947,-1341970488,-1084653625,-958395405,-710438585,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,-2117940946,-1838011259,-1564481375,-1474664885,-1035236496,-949202525,-778901479,-694614492,-200395387,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,-2067236844,-1933114872,-1866530822,-1538233109,-1090935817,-965641998],Jy=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_`,Yy=[],Xy=class{_data=new Zy;_hash=new Zy([...Ky]);_nDataBytes=0;_minBufferSize=0;finalize(e){e&&this._append(e);let t=this._nDataBytes*8,n=this._data.sigBytes*8;return this._data.words[n>>>5]|=128<<24-n%32,this._data.words[(n+64>>>9<<4)+14]=Math.floor(t/4294967296),this._data.words[(n+64>>>9<<4)+15]=t,this._data.sigBytes=this._data.words.length*4,this._process(),this._hash}_doProcessBlock(e,t){let n=this._hash.words,r=n[0],i=n[1],a=n[2],o=n[3],s=n[4],c=n[5],l=n[6],u=n[7];for(let n=0;n<64;n++){if(n<16)Yy[n]=e[t+n]|0;else{let e=Yy[n-15],t=(e<<25|e>>>7)^(e<<14|e>>>18)^e>>>3,r=Yy[n-2],i=(r<<15|r>>>17)^(r<<13|r>>>19)^r>>>10;Yy[n]=t+Yy[n-7]+i+Yy[n-16]}let d=s&c^~s&l,f=r&i^r&a^i&a,p=(r<<30|r>>>2)^(r<<19|r>>>13)^(r<<10|r>>>22),m=(s<<26|s>>>6)^(s<<21|s>>>11)^(s<<7|s>>>25),ee=u+m+d+qy[n]+Yy[n],h=p+f;u=l,l=c,c=s,s=o+ee|0,o=a,a=i,i=r,r=ee+h|0}n[0]=n[0]+r|0,n[1]=n[1]+i|0,n[2]=n[2]+a|0,n[3]=n[3]+o|0,n[4]=n[4]+s|0,n[5]=n[5]+c|0,n[6]=n[6]+l|0,n[7]=n[7]+u|0}_append(e){typeof e==`string`&&(e=Zy.fromUtf8(e)),this._data.concat(e),this._nDataBytes+=e.sigBytes}_process(e){let t,n=this._data.sigBytes/64;n=e?Math.ceil(n):Math.max((n|0)-this._minBufferSize,0);let r=n*16,i=Math.min(r*4,this._data.sigBytes);if(r){for(let e=0;e>>2]|=(n.charCodeAt(e)&255)<<24-e%4*8;return new e(i,r)}toBase64(){let e=[];for(let t=0;t>>2]>>>24-t%4*8&255,r=this.words[t+1>>>2]>>>24-(t+1)%4*8&255,i=this.words[t+2>>>2]>>>24-(t+2)%4*8&255,a=n<<16|r<<8|i;for(let n=0;n<4&&t*8+n*6>>6*(3-n)&63))}return e.join(``)}concat(e){if(this.words[this.sigBytes>>>2]&=4294967295<<32-this.sigBytes%4*8,this.words.length=Math.ceil(this.sigBytes/4),this.sigBytes%4)for(let t=0;t>>2]>>>24-t%4*8&255;this.words[this.sigBytes+t>>>2]|=n<<24-(this.sigBytes+t)%4*8}else for(let t=0;t>>2]=e.words[t>>>2];this.sigBytes+=e.sigBytes}};function Qy(e){return new Xy().finalize(e).toBase64()}function $y(e){return Qy(Vy(e))}function eb(e){return $y(e)}function tb(){let e={};function t(t,...n){let r=e[t]||[];for(let e=0,t=r.length;e{e[t]=e[t]?.filter(e=>n!==e)}}function i(e,t){let n=r(e,((...e)=>(n(),t(...e))));return n}return{_listeners:e,emit:t,emitOnce:n,on:r,once:i}}var nb=/^[\w+.-]{2,}:\/\//;function rb(e){return e.endsWith(`/`)?e:`${e}/`}function ib(e){return(e.endsWith(`/`)?e.slice(0,-1):e)||`/`}function ab(e,...t){let n=e;for(let e of t)e&&e!==`/`&&(n=n?rb(n)+e.replace(/^\.?\//,``):e);return n}function ob(e,t){if(!t||t===`/`||nb.test(e))return e;let n=ib(t);return e.startsWith(n)?e:ab(n,e)}function sb(e,t){let n=e.match(nb);return t+(n?e.slice(n[0].length):e)}var cb=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function lb(e=21){let t=``,n=e;for(;n--;)t+=cb[Math.random()*64|0];return t}var ub=Symbol.for(`immer-nothing`),db=Symbol.for(`immer-draftable`),fb=Symbol.for(`immer-state`),pb=[function(e){return`The plugin for '${e}' has not been loaded into Immer. To enable the plugin, import and call \`enable${e}()\` when initializing your application.`},function(e){return`produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${e}'`},`This object has been frozen and should not be mutated`,function(e){return`Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? `+e},`An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.`,`Immer forbids circular references`,"The first or second argument to `produce` must be a function","The third argument to `produce` must be a function or undefined","First argument to `createDraft` must be a plain object, an array, or an immerable object","First argument to `finishDraft` must be a draft returned by `createDraft`",function(e){return`'current' expects a draft, got: ${e}`},`Object.defineProperty() cannot be used on an Immer draft`,`Object.setPrototypeOf() cannot be used on an Immer draft`,`Immer only supports deleting array indices`,`Immer only supports setting array indices and the 'length' property`,function(e){return`'original' expects a draft, got: ${e}`}];function mb(e,...t){{let n=pb[e],r=Rb(n)?n.apply(null,t):n;throw Error(`[Immer] ${r}`)}}var hb=Object,gb=hb.getPrototypeOf,_b=`constructor`,vb=`prototype`,yb=`configurable`,bb=`enumerable`,xb=`writable`,Sb=`value`,Cb=e=>!!e&&!!e[fb];function wb(e){return e?Db(e)||Pb(e)||!!e[db]||!!e[_b]?.[db]||Fb(e)||Ib(e):!1}var Tb=hb[vb][_b].toString(),Eb=new WeakMap;function Db(e){if(!e||!Lb(e))return!1;let t=gb(e);if(t===null||t===hb[vb])return!0;let n=hb.hasOwnProperty.call(t,_b)&&t[_b];if(n===Object)return!0;if(!Rb(n))return!1;let r=Eb.get(n);return r===void 0&&(r=Function.toString.call(n),Eb.set(n,r)),r===Tb}function Ob(e,t,n=!0){kb(e)===0?(n?Reflect.ownKeys(e):hb.keys(e)).forEach(n=>{t(n,e[n],e)}):e.forEach((n,r)=>t(r,n,e))}function kb(e){let t=e[fb];return t?t.type_:Pb(e)?1:Fb(e)?2:Ib(e)?3:0}var Ab=(e,t,n=kb(e))=>n===2?e.has(t):hb[vb].hasOwnProperty.call(e,t),jb=(e,t,n=kb(e))=>n===2?e.get(t):e[t],Mb=(e,t,n,r=kb(e))=>{r===2?e.set(t,n):r===3?e.add(n):e[t]=n};function Nb(e,t){return e===t?e!==0||1/e==1/t:e!==e&&t!==t}var Pb=Array.isArray,Fb=e=>e instanceof Map,Ib=e=>e instanceof Set,Lb=e=>typeof e==`object`,Rb=e=>typeof e==`function`,zb=e=>typeof e==`boolean`;function Bb(e){let t=+e;return Number.isInteger(t)&&String(t)===e}var Vb=e=>Lb(e)?e?.[fb]:null,Hb=e=>e.copy_||e.base_,Ub=e=>e.modified_?e.copy_:e.base_;function Wb(e,t){if(Fb(e))return new Map(e);if(Ib(e))return new Set(e);if(Pb(e))return Array[vb].slice.call(e);let n=Db(e);if(t===!0||t===`class_only`&&!n){let t=hb.getOwnPropertyDescriptors(e);delete t[fb];let n=Reflect.ownKeys(t);for(let r=0;r1&&hb.defineProperties(e,{set:qb,add:qb,clear:qb,delete:qb}),hb.freeze(e),t&&Ob(e,(e,t)=>{Gb(t,!0)},!1),e)}function Kb(){mb(2)}var qb={[Sb]:Kb};function Jb(e){return e===null||!Lb(e)||hb.isFrozen(e)}var Yb=`MapSet`,Xb=`Patches`,Zb=`ArrayMethods`,Qb={};function $b(e){let t=Qb[e];return t||mb(0,e),t}var ex=e=>!!Qb[e];function tx(e,t){Qb[e]||(Qb[e]=t)}var nx,rx=()=>nx,ix=(e,t)=>({drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:ex(Yb)?$b(Yb):void 0,arrayMethodsPlugin_:ex(Zb)?$b(Zb):void 0});function ax(e,t){t&&(e.patchPlugin_=$b(Xb),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function ox(e){sx(e),e.drafts_.forEach(lx),e.drafts_=null}function sx(e){e===nx&&(nx=e.parent_)}var cx=e=>nx=ix(nx,e);function lx(e){let t=e[fb];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function ux(e,t){t.unfinalizedDrafts_=t.drafts_.length;let n=t.drafts_[0];if(e!==void 0&&e!==n){n[fb].modified_&&(ox(t),mb(4)),wb(e)&&(e=dx(t,e));let{patchPlugin_:r}=t;r&&r.generateReplacementPatches_(n[fb].base_,e,t)}else e=dx(t,n);return fx(t,e,!0),ox(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e===ub?void 0:e}function dx(e,t){if(Jb(t))return t;let n=t[fb];if(!n)return bx(t,e.handledSet_,e);if(!mx(n,e))return t;if(!n.modified_)return n.base_;if(!n.finalized_){let{callbacks_:t}=n;if(t)for(;t.length>0;)t.pop()(e);vx(n,e)}return n.copy_}function fx(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&Gb(t,n)}function px(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var mx=(e,t)=>e.scope_===t,hx=[];function gx(e,t,n,r){let i=Hb(e),a=e.type_;if(r!==void 0&&jb(i,r,a)===t){Mb(i,r,n,a);return}if(!e.draftLocations_){let t=e.draftLocations_=new Map;Ob(i,(e,n)=>{if(Cb(n)){let r=t.get(n)||[];r.push(e),t.set(n,r)}})}let o=e.draftLocations_.get(t)??hx;for(let e of o)Mb(i,e,n,a)}function _x(e,t,n){e.callbacks_.push(function(r){let i=t;if(!i||!mx(i,r))return;r.mapSetPlugin_?.fixSetContents(i);let a=Ub(i);gx(e,i.draft_??i,a,n),vx(i,r)})}function vx(e,t){if(e.modified_&&!e.finalized_&&(e.type_===3||e.type_===1&&e.allIndicesReassigned_||(e.assigned_?.size??0)>0)){let{patchPlugin_:n}=t;if(n){let r=n.getPath(e);r&&n.generatePatches_(e,r,t)}px(e)}}function yx(e,t,n){let{scope_:r}=e;if(Cb(n)){let i=n[fb];mx(i,r)&&i.callbacks_.push(function(){kx(e),gx(e,n,Ub(i),t)})}else wb(n)&&e.callbacks_.push(function(){let i=Hb(e);e.type_===3?i.has(n)&&bx(n,r.handledSet_,r):jb(i,t,e.type_)===n&&r.drafts_.length>1&&(e.assigned_.get(t)??!1)===!0&&e.copy_&&bx(jb(e.copy_,t,e.type_),r.handledSet_,r)})}function bx(e,t,n){return!n.immer_.autoFreeze_&&n.unfinalizedDrafts_<1||Cb(e)||t.has(e)||!wb(e)||Jb(e)?e:(t.add(e),Ob(e,(r,i)=>{if(Cb(i)){let t=i[fb];mx(t,n)&&(Mb(e,r,Ub(t),e.type_),px(t))}else wb(i)&&bx(i,t,n)}),e)}function xx(e,t){let n=Pb(e),r={type_:+!!n,scope_:t?t.scope_:rx(),modified_:!1,finalized_:!1,assigned_:void 0,parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1,callbacks_:void 0},i=r,a=Sx;n&&(i=[r],a=Cx);let{revoke:o,proxy:s}=Proxy.revocable(i,a);return r.draft_=s,r.revoke_=o,[s,r]}var Sx={get(e,t){if(t===fb)return e;let n=e.scope_.arrayMethodsPlugin_,r=e.type_===1&&typeof t==`string`;if(r&&n?.isArrayOperationMethod(t))return n.createMethodInterceptor(e,t);let i=Hb(e);if(!Ab(i,t,e.type_))return Ex(e,i,t);let a=i[t];if(e.finalized_||!wb(a)||r&&e.operationMethod&&n?.isMutatingArrayMethod(e.operationMethod)&&Bb(t))return a;if(a===wx(e.base_,t)||Tx(e,t,a)){kx(e);let n=e.type_===1?+t:t,r=jx(e.scope_,a,e,n);return e.copy_[n]=r}return a},has(e,t){return t in Hb(e)},ownKeys(e){return Reflect.ownKeys(Hb(e))},set(e,t,n){let r=Dx(Hb(e),t);if(r?.set)return r.set.call(e.draft_,n),!0;if(!e.modified_){let r=wx(Hb(e),t),i=r?.[fb];if(i&&i.base_===n)return e.copy_[t]=n,e.assigned_.delete(t),!0;if(Nb(n,r)&&(n!==void 0||Ab(e.base_,t,e.type_)))return!0;kx(e),Ox(e)}return e.copy_[t]===n&&(n!==void 0||Ab(e.copy_,t,e.type_))||Number.isNaN(n)&&Number.isNaN(e.copy_[t])?!0:(e.copy_[t]=n,e.assigned_.set(t,!0),yx(e,t,n),!0)},deleteProperty(e,t){return kx(e),wx(e.base_,t)!==void 0||t in e.base_?(e.assigned_.set(t,!1),Ox(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){let n=Hb(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r&&{[xb]:!0,[yb]:e.type_!==1||t!==`length`,[bb]:r[bb],[Sb]:n[t]}},defineProperty(){mb(11)},getPrototypeOf(e){return gb(e.base_)},setPrototypeOf(){mb(12)}},Cx={};for(let e in Sx){let t=Sx[e];Cx[e]=function(){let e=arguments;return e[0]=e[0][0],t.apply(this,e)}}Cx.deleteProperty=function(e,t){return isNaN(parseInt(t))&&mb(13),Cx.set.call(this,e,t,void 0)},Cx.set=function(e,t,n){return t!==`length`&&isNaN(parseInt(t))&&mb(14),Sx.set.call(this,e[0],t,n,e[0])};function wx(e,t){let n=e[fb];return(n?Hb(n):e)[t]}function Tx(e,t,n){return e.type_!==1||!e.allIndicesReassigned_||e.assigned_?.get(t)||!wb(n)||n[fb]?!1:e.baseRefs_.has(n)}function Ex(e,t,n){let r=Dx(t,n);return r?Sb in r?r[Sb]:r.get?.call(e.draft_):void 0}function Dx(e,t){if(!(t in e))return;let n=gb(e);for(;n;){let e=Object.getOwnPropertyDescriptor(n,t);if(e)return e;n=gb(n)}}function Ox(e){e.modified_||(e.modified_=!0,e.parent_&&Ox(e.parent_))}function kx(e){e.copy_||=(e.assigned_=new Map,Wb(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var Ax=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(e,t,n)=>{if(Rb(e)&&!Rb(t)){let n=t;t=e;let r=this;return function(e=n,...i){return r.produce(e,e=>t.call(this,e,...i))}}Rb(t)||mb(6),n!==void 0&&!Rb(n)&&mb(7);let r;if(wb(e)){let i=cx(this),a=jx(i,e,void 0),o=!0;try{r=t(a),o=!1}finally{o?ox(i):sx(i)}return ax(i,n),ux(r,i)}if(!e||!Lb(e)){if(r=t(e),r===void 0&&(r=e),r===ub&&(r=void 0),this.autoFreeze_&&Gb(r,!0),n){let t=[],i=[];$b(Xb).generateReplacementPatches_(e,r,{patches_:t,inversePatches_:i}),n(t,i)}return r}mb(1,e)},this.produceWithPatches=(e,t)=>{if(Rb(e))return(t,...n)=>this.produceWithPatches(t,t=>e(t,...n));let n,r;return[this.produce(e,t,(e,t)=>{n=e,r=t}),n,r]},zb(e?.autoFreeze)&&this.setAutoFreeze(e.autoFreeze),zb(e?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),zb(e?.useStrictIteration)&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){wb(e)||mb(8),Cb(e)&&(e=Mx(e));let t=cx(this),n=jx(t,e,void 0);return n[fb].isManual_=!0,sx(t),n}finishDraft(e,t){let n=e&&e[fb];(!n||!n.isManual_)&&mb(9);let{scope_:r}=n;return ax(r,t),ux(void 0,r)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(e,t){let n;for(n=t.length-1;n>=0;n--){let r=t[n];if(r.path.length===0&&r.op===`replace`){e=r.value;break}}n>-1&&(t=t.slice(n+1));let r=$b(Xb).applyPatches_;return Cb(e)?r(e,t):this.produce(e,e=>r(e,t))}};function jx(e,t,n,r){let[i,a]=Fb(t)?$b(Yb).proxyMap_(t,n):Ib(t)?$b(Yb).proxySet_(t,n):xx(t,n);return(n?.scope_??rx()).drafts_.push(i),a.callbacks_=n?.callbacks_??[],a.key_=r,n&&r!==void 0?_x(n,a,r):a.callbacks_.push(function(e){e.mapSetPlugin_?.fixSetContents(a);let{patchPlugin_:t}=e;a.modified_&&t&&t.generatePatches_(a,[],e)}),i}function Mx(e){return Cb(e)||mb(10,e),Nx(e)}function Nx(e){if(!wb(e)||Jb(e))return e;let t=e[fb],n,r=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=Wb(e,t.scope_.immer_.useStrictShallowCopy_),r=t.scope_.immer_.shouldUseStrictIteration()}else n=Wb(e,!0);let i=n;return Ib(n)&&(n=new Set),Ob(i,(e,t)=>{Mb(n,e,Nx(t))},r),t&&(t.finalized_=!1),n}function Px(){pb.push(`Sets cannot have "replace" patches.`,function(e){return`Unsupported patch operation: `+e},function(e){return`Cannot apply patch, path doesn't resolve: `+e},`Patching reserved attributes like __proto__, prototype and constructor is not allowed`);function e(n,r=[]){if(n.key_!==void 0){let e=n.parent_.copy_??n.parent_.base_,t=Vb(jb(e,n.key_)),i=jb(e,n.key_);if(i===void 0||i!==n.draft_&&i!==n.base_&&i!==n.copy_||t!=null&&t.base_!==n.base_)return null;let a=n.parent_.type_===3,o;if(a){let e=n.parent_;o=Array.from(e.drafts_.keys()).indexOf(n.key_)}else o=n.key_;if(!(a&&e.size>o||Ab(e,o))||n.parent_.type_===1&&n.parent_.allIndicesReassigned_)return null;r.push(o)}if(n.parent_)return e(n.parent_,r);r.reverse();try{t(n.copy_,r)}catch{return null}return r}function t(e,t){let n=e;for(let e=0;e{let u=jb(o,e,c),f=jb(s,e,c),p=l?Ab(o,e)?n:`add`:r;if(u===f&&p===n)return;let m=t.concat(e);i.push(p===r?{op:p,path:m}:{op:p,path:m,value:d(f)}),a.push(p===`add`?{op:r,path:m}:p===r?{op:`add`,path:m,value:d(u)}:{op:n,path:m,value:d(u)})})}function s(e,t,n,i){let{base_:a,copy_:o}=e,s=0;a.forEach(e=>{if(!o.has(e)){let a=t.concat([s]);n.push({op:r,path:a,value:e}),i.unshift({op:`add`,path:a,value:e})}s++}),s=0,o.forEach(e=>{if(!a.has(e)){let a=t.concat([s]);n.push({op:`add`,path:a,value:e}),i.unshift({op:r,path:a,value:e})}s++})}function c(e,t,r){let{patches_:i,inversePatches_:a}=r;i.push({op:n,path:[],value:t===ub?void 0:t}),a.push({op:n,path:[],value:e})}function l(e,t){return t.forEach(t=>{let{path:i,op:a}=t,o=e;for(let e=0;e[e,u(t)]));if(Ib(e))return new Set(Array.from(e).map(u));let t=Object.create(gb(e));for(let n in e)t[n]=u(e[n]);return Ab(e,db)&&(t[db]=e[db]),t}function d(e){return Cb(e)?u(e):e}tx(Xb,{applyPatches_:l,generatePatches_:i,generateReplacementPatches_:c,getPath:e})}globalThis.Iterator?.from;var Fx=new Ax,Ix=Fx.produce,Lx=Fx.produceWithPatches.bind(Fx),Rx=Fx.applyPatches.bind(Fx),zx=1e3;function Bx(e,t){if(e.add(t),e.size>zx){let t=e.values().next().value;t!==void 0&&e.delete(t)}}function Vx(e){let{enablePatches:t=!1}=e;t&&Px();let n=tb(),r=e.initialValue,i=new Set;return{on:n.on,value:()=>r,patch:(e,t=lb())=>{i.has(t)||(Px(),r=Rx(r,e),Bx(i,t),n.emit(`updated`,r,void 0,t))},mutate:(e,a=lb())=>{if(!i.has(a)){if(Bx(i,a),t){let[t,i]=Lx(r,e);if(t===r)return;r=t,n.emit(`updated`,r,i,a)}else{let t=Ix(r,e);if(t===r)return;r=t,n.emit(`updated`,r,void 0,a)}}},syncIds:i}}var Hx=typeof self==`object`?self:globalThis,Ux=new Set([`Error`,`EvalError`,`RangeError`,`ReferenceError`,`SyntaxError`,`TypeError`,`URIError`,`AggregateError`]),Wx=new Set([`Boolean`,`Number`,`String`,`Int8Array`,`Uint8Array`,`Uint8ClampedArray`,`Int16Array`,`Uint16Array`,`Int32Array`,`Uint32Array`,`Float16Array`,`Float32Array`,`Float64Array`,`BigInt64Array`,`BigUint64Array`]);function Gx(e,t){let n=(t,n)=>(e.set(n,t),t),r=i=>{if(e.has(i))return e.get(i);let[a,o]=t[i];switch(a){case 0:case-1:return n(o,i);case 1:{let e=n([],i);for(let t of o)e.push(r(t));return e}case 2:{let e=n({},i);for(let[t,n]of o)e[r(t)]=r(n);return e}case 3:return n(new Date(o),i);case 4:{let{source:e,flags:t}=o;return n(new RegExp(e,t),i)}case 5:{let e=n(new Map,i);for(let[t,n]of o)e.set(r(t),r(n));return e}case 6:{let e=n(new Set,i);for(let t of o)e.add(r(t));return e}case 7:{let{name:e,message:t}=o,r=Ux.has(e)?Hx[e]:void 0;return n(new(r??Hx.Error)(t),i)}case 8:return n(BigInt(o),i);case`BigInt`:return n(Object(BigInt(o)),i);case`ArrayBuffer`:return n(new Uint8Array(o).buffer,o);case`DataView`:{let{buffer:e}=new Uint8Array(o);return n(new DataView(e),o)}}if(typeof a==`string`&&Wx.has(a))return n(new Hx[a](o),i);throw TypeError(`unable to deserialize unsafe or unknown type: ${String(a)}`)};return r}function Kx(e){return Gx(new Map,e)(0)}var qx=``,{toString:Jx}={},{keys:Yx}=Object;function Xx(e){let t=typeof e;if(t!==`object`||!e)return[0,t];let n=Jx.call(e).slice(8,-1);switch(n){case`Array`:return[1,qx];case`Object`:return[2,qx];case`Date`:return[3,qx];case`RegExp`:return[4,qx];case`Map`:return[5,qx];case`Set`:return[6,qx];case`DataView`:return[1,n]}return n.includes(`Array`)?[1,n]:n.includes(`Error`)?[7,n]:[2,n]}function Zx([e,t]){return e===0&&(t===`function`||t===`symbol`)}function Qx(e,t,n,r){let i=(e,t)=>{let i=r.push(e)-1;return n.set(t,i),i},a=r=>{if(n.has(r))return n.get(r);let[o,s]=Xx(r);switch(o){case 0:{let t=r;switch(s){case`bigint`:o=8,t=r.toString();break;case`function`:case`symbol`:if(e)throw TypeError(`unable to serialize ${s}`);t=null;break;case`undefined`:return i([-1],r)}return i([o,t],r)}case 1:{if(s){let e=r;return s===`DataView`?e=new Uint8Array(r.buffer):s===`ArrayBuffer`&&(e=new Uint8Array(r)),i([s,[...e]],r)}let e=[],t=i([o,e],r);for(let t of r)e.push(a(t));return t}case 2:{if(s)switch(s){case`BigInt`:return i([s,r.toString()],r);case`Boolean`:case`Number`:case`String`:return i([s,r.valueOf()],r)}if(t&&`toJSON`in r)return a(r.toJSON());let n=[],c=i([o,n],r);for(let t of Yx(r))(e||!Zx(Xx(r[t])))&&n.push([a(t),a(r[t])]);return c}case 3:return i([o,r.toISOString()],r);case 4:{let{source:e,flags:t}=r;return i([o,{source:e,flags:t}],r)}case 5:{let t=[],n=i([o,t],r);for(let[n,i]of r)(e||!(Zx(Xx(n))||Zx(Xx(i))))&&t.push([a(n),a(i)]);return n}case 6:{let t=[],n=i([o,t],r);for(let n of r)(e||!Zx(Xx(n)))&&t.push(a(n));return n}}let{message:c}=r;return i([o,{name:s,message:c}],r)};return a}function $x(e,t={}){let n=[];return Qx(!(t.json||t.lossy),!!t.json,new Map,n)(e),n}var{parse:eS,stringify:tS}=JSON,nS={json:!0,lossy:!0};function rS(e){return Kx(eS(e))}function iS(e){return tS($x(e,nS))}function aS(e){return Kx(e)}function oS(e){return iS(e)}function sS(e){return rS(e)}var cS=256,lS=class extends Error{name=`StreamClosedError`};function uS(e={}){let t=e.id??lb(),n=Math.max(0,e.replayWindow??0),r=tb(),i=new AbortController,a=[],o=!1,s=0;function c(e){if(o)throw new lS(`Cannot write to a closed stream "${t}"`);s+=1,n>0&&(a.push({seq:s,chunk:e}),a.length>n&&(a.length-n===1?a.shift():a.splice(0,a.length-n))),r.emit(`chunk`,s,e)}function l(e){if(o)return;o=!0;let t=fS(e);i.abort(e),r.emit(`end`,t)}function u(){o||(o=!0,i.signal.aborted||i.abort(`stream closed`),r.emit(`end`,void 0))}function d(e){o||i.signal.aborted||i.abort(e??`aborted`)}let f=new WritableStream({write(e){c(e)},close(){u()},abort(e){l(e)}});return{id:t,signal:i.signal,get closed(){return o},get lastSeq(){return s},write:c,error:l,close:u,abort:d,writable:f,events:r,buffer:a}}function dS(e={}){let t=e.id??lb(),n=Math.max(1,e.highWaterMark??cS),r=[],i=0,a=!1,o=!1,s,c,l,u;function d(){if(c){if(r.length>0){let e=r.shift(),t=c;c=void 0,t.resolve({value:e,done:!1});return}if(a){let e=c;if(c=void 0,s){let t=Error(s.message);t.name=s.name,e.reject(t)}else e.resolve({value:void 0,done:!0})}}}function f(){if(l){for(;r.length>0;){let e=r.shift();try{l.enqueue(e)}catch{break}}if(a&&l){try{if(s){let e=Error(s.message);e.name=s.name,l.error(e)}else l.close()}catch{}l=void 0}}}function p(t,s){if(!(a||o)&&!(t<=i)){if(i=t,r.push(s),r.length>n){let t=r.length-n;r.splice(0,t),e.onOverflow?.(t)}d(),u&&f()}}function m(e){a||(a=!0,s=e,d(),u&&f())}function ee(){o||a||(o=!0,e.onCancel?.(),m(void 0))}function h(){return u||(u=new ReadableStream({start(e){l=e,f()},cancel(){ee()}}),u)}return{id:t,get cancelled(){return o},get done(){return a},get lastSeenSeq(){return i},get readable(){return h()},cancel:ee,_push:p,_end:m,[Symbol.asyncIterator](){return{next(){if(r.length>0)return Promise.resolve({value:r.shift(),done:!1});if(a){if(s){let e=Error(s.message);return e.name=s.name,Promise.reject(e)}return Promise.resolve({value:void 0,done:!0})}return new Promise((e,t)=>{c={resolve:e,reject:t}})},return(){return ee(),Promise.resolve({value:void 0,done:!0})}}}}}function fS(e){if(e instanceof Error)return{name:e.name||`Error`,message:e.message};if(typeof e==`string`)return{name:`Error`,message:e};try{return{name:`Error`,message:JSON.stringify(e)}}catch{return{name:`Error`,message:String(e)}}}var pS=128;function mS(e){return e.replace(/[^\w-]+/g,`_`).slice(0,pS)}var hS=`modulepreload`,gS=function(e,t){return new URL(e,t).href},_S={},vS=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=gS(t,n),t=s(t),t in _S)return;_S[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:hS,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},yS=`__connection.json`,bS=`__DEVFRAME_CONNECTION__`,xS=`x-birpc-session`,SS=`__rpc-dump/index.json`,CS=`devframe:services`,wS=`devframe_otp`,TS=`devframe_auth_token`;wy.postMessage.remoteAssetsError;var ES=class{cacheMap=new Map;options;keySerializer;constructor(e){this.options=e,this.keySerializer=e.keySerializer||(e=>eb(e))}updateOptions(e){this.options={...this.options,...e}}cached(e,t){let n=this.cacheMap.get(e);if(n)return n.get(this.keySerializer(t))}has(e,t){return this.cacheMap.get(e)?.has(this.keySerializer(t))??!1}apply(e,t){let n=this.cacheMap.get(e.m)||new Map;n.set(this.keySerializer(e.a),t),this.cacheMap.set(e.m,n)}validate(e){return this.options.functions.includes(e)}clear(e){e?this.cacheMap.delete(e):this.cacheMap.clear()}},DS=Mre({docsBase:`https://devfra.me/errors`,codes:{DF0019:{why:e=>`RPC function "${e.name}" has \`agent\` set but \`jsonSerializable\` is \`false\`; MCP requires JSON-serializable data.`,fix:"Remove `jsonSerializable: false`, or remove `agent` to keep it RPC-only."},DF0020:{why:e=>`RPC function "${e.name}" declares \`jsonSerializable: true\` but the value at "${e.path}" is a ${e.type}.`,fix:"Either drop `jsonSerializable: true` (falls back to structured-clone) or change the value to a JSON-safe shape."},DF0021:{why:e=>`RPC function "${e.name}" is already registered`,fix:"Use the `force` parameter to overwrite an existing registration."},DF0022:{why:e=>`RPC function "${e.name}" is not registered. Use register() to add new functions.`},DF0023:{why:e=>`RPC function "${e.name}" is not registered`},DF0024:{why:e=>`Either handler or setup function must be provided for RPC function "${e.name}"`},DF0025:{why:e=>`Function "${e.name}" not found in dump store`},DF0026:{why:e=>`No dump match for "${e.name}" with args: ${e.args}`},DF0027:{why:e=>`Function "${e.name}" with type "${e.type}" cannot have dump configuration. Only "static" and "query" types support dumps.`},DF0028:{why:e=>`Function "${e.name}" with type "${e.type}" cannot use \`snapshot: true\`. Only "query" functions support this sugar; "static" functions have equivalent default behavior already.`,fix:"Remove `snapshot: true`, or change the function type to `query`."},DF0043:{why:e=>`RPC function "${e.name}" received an invalid argument at position ${e.index}: ${e.issues}`,fix:"Pass a value that satisfies the `args` schema declared for this function."},DF0044:{why:e=>`RPC function "${e.name}" returned a value that failed its \`returns\` schema: ${e.issues}`,fix:"Make the handler return a value that satisfies the `returns` schema, or relax the schema."}}});function OS(e){if(e.agent&&e.jsonSerializable===!1)throw DS.DF0019({name:e.name});e.agent&&!e.jsonSerializable&&(e.jsonSerializable=!0)}async function kS(e,t){let n=e[`~standard`].validate(t);return n instanceof Promise?await n:n}function AS(e){return e.map(e=>{let t=e.path?.map(e=>typeof e==`object`?e.key:e).join(`.`);return t?`${t}: ${e.message}`:e.message}).join(`; `)}async function jS(e,t,n){let r=n.slice();if(!t||t.length===0)return r;for(let r=0;r{n.get(t)===r&&n.delete(t)}),n.set(t,r)),await r}if(!e.__promise){let n=Promise.resolve(e.setup(t));n.catch(()=>{e.__promise===n&&(e.__promise=void 0)}),e.__promise=n}return await e.__promise}async function PS(e,t){let n=e.handler;if(!n){let r=await NS(e,t);if(!r.handler)throw DS.DF0024({name:e.name});n=r.handler}let r=e.args,i=e.returns;if(!r&&!i)return n;let a=n;return async(...t)=>{let n=await jS(e.name,r,t),o=await a(...n);return await MS(e.name,i,o)}}var FS=class{context;definitions=new Map;functions;_onChanged=[];constructor(e){this.context=e;let t=this.definitions,n=this;this.functions=new Proxy({},{get(e,r){let i=t.get(r);if(i)return PS(i,n.context)},has(e,n){return t.has(n)},getOwnPropertyDescriptor(e,n){return{value:t.get(n)?.handler,configurable:!0,enumerable:!0}},ownKeys(){return Array.from(t.keys())}})}register(e,t=!1){if(this.definitions.has(e.name)&&!t)throw DS.DF0021({name:e.name});OS(e),this.definitions.set(e.name,e),this._onChanged.forEach(t=>t(e.name))}update(e,t=!1){if(!this.definitions.has(e.name)&&!t)throw DS.DF0022({name:e.name});OS(e),this.definitions.set(e.name,e),this._onChanged.forEach(t=>t(e.name))}onChanged(e){return this._onChanged.push(e),()=>{let t=this._onChanged.indexOf(e);t!==-1&&this._onChanged.splice(t,1)}}async getHandler(e){return await PS(this.definitions.get(e),this.context)}getSchema(e){let t=this.definitions.get(e);if(!t)throw DS.DF0023({name:String(e)});return{args:t.args,returns:t.returns}}has(e){return this.definitions.has(e)}get(e){return this.definitions.get(e)}list(){return Array.from(this.definitions.keys())}};function IS(e,t=``){return JSON.stringify(e,function(e,n){let r=this,i=r==null?n:r[e];if(i===void 0){if(Array.isArray(r))throw RS(t,`undefined`,r,e);return n}return i!==null&&LS(i,r,e,t),n})}function LS(e,t,n,r){if(typeof e==`bigint`)throw RS(r,`BigInt`,t,n);if(typeof e!=`object`)return;if(e instanceof Map)throw RS(r,`Map`,t,n);if(e instanceof Set)throw RS(r,`Set`,t,n);if(e instanceof Date)throw RS(r,`Date`,t,n);if(Array.isArray(e))return;let i=Object.getPrototypeOf(e);if(i!==null&&i!==Object.prototype)throw RS(r,e.constructor?.name??`class instance`,t,n)}function RS(e,t,n,r){let i=zS(n,r);return DS.DF0020({name:e||``,type:t,path:i})}function zS(e,t){return Array.isArray(e)?`[${t}]`:t===``?``:t}var BS=`__DEVFRAME_CONNECTION_META__`,VS=`__DEVFRAME_CONNECTION_AUTH_TOKEN__`;function HS(e){let t=[()=>window?.[e],()=>globalThis?.[e],()=>parent.window?.[e]];for(let e of t)try{let t=e();if(t)return t}catch{}}function US(){return HS(bS)}function WS(){return HS(BS)}function GS(e){if(e)return e;try{let e=localStorage.getItem(VS);if(e)return e}catch{}return HS(VS)}function KS(e){globalThis[bS]=e,globalThis[BS]={...e.connectionMeta,baseUrl:e.metaBaseUrl},e.authToken&&qS(e.authToken)}function qS(e){try{localStorage.setItem(VS,e)}catch{}globalThis[VS]=e;let t=US();t&&(globalThis[bS]={...t,authToken:e})}function JS(e){let t=ob(yS,e);try{return new URL(t,globalThis.location?.href).href}catch{return t}}function YS(e,t){return t&&t!==e.authToken?{...e,authToken:t}:e}function XS(){let e=US();if(e)return YS(e,GS()??e.authToken??e.connectionMeta.authToken);let t=WS();if(t)return{connectionMeta:t,metaBaseUrl:t.baseUrl??JS(`./`),authToken:GS(t.authToken)}}async function ZS(e={}){if(e.connection){let t=YS(e.connection,GS(e.authToken??e.connection.authToken??e.connection.connectionMeta.authToken));return KS(t),t}let t=Array.isArray(e.baseURL)?e.baseURL:[e.baseURL??`./`];if(e.connectionMeta){let n={connectionMeta:e.connectionMeta,metaBaseUrl:JS(t[0]??`./`),authToken:GS(e.authToken??e.connectionMeta.authToken)};return KS(n),n}let n=XS();if(n){let t=YS(n,GS(e.authToken??n.authToken??n.connectionMeta.authToken));return KS(t),t}let r=[];for(let n of t){let t=ob(yS,n),i=JS(n);try{let n=await fetch(t);if(!n.ok)throw Error(`Failed to fetch connection meta from ${i}: ${n.status}`);let r=await n.json(),a=n.url||i,o={connectionMeta:r,metaBaseUrl:r.baseUrl?new URL(r.baseUrl,a).href:a,authToken:GS(e.authToken??r.authToken)};return KS(o),o}catch(e){r.push(e)}}throw Error(`Failed to get connection meta from ${t.join(`, `)}`,{cause:r})}var QS=class extends Error{name=`DevframeConnectionError`;kind;constructor(e,t,n){super(t,n),this.kind=e}};function $S(e=wS){try{let t=globalThis.location?.hash?.replace(/^#/,``)??``;return new URLSearchParams(t).get(e)||void 0}catch{return}}function eC(e){try{let t=new URL(globalThis.location.href),n=new URLSearchParams(t.hash.replace(/^#/,``));if(!n.has(e))return;n.delete(e),t.hash=n.toString(),globalThis.history?.replaceState(globalThis.history.state,``,t.href)}catch{}}function tC(e=wS){let t=$S(e);return t&&eC(e),t}async function nC(e,t={}){let n=tC(t.param??`devframe_otp`);return n?e.isTrusted?!0:e.requestTrustWithCode(n):!1}function rC(e){let t={},n=new WeakMap,r,i=()=>(r??=e.sharedState.get(CS,{initialValue:{}}).then(e=>(t=e.value(),e.on(`updated`,e=>{t=e}),e)),r);return i(),{state:i,has:e=>e in t,keys:()=>Object.keys(t),get:r=>{let i=t[r];if(!i)return;let a=n.get(i);return a||(a={...i,rpc:e.scope(i.scope).rpc},n.set(i,a)),a}}}function iC(e){let t=new Map,n=new Map,r=new Map,i=new Set,a=e.connectionMeta.backend===`static`;function o(e,t){let n=r.get(e);return n&&typeof n==`object`&&!Array.isArray(n)&&typeof t==`object`&&!Array.isArray(t)?{...n,...t}:t}e.client.register({name:wy.broadcast.clientStateUpdated,type:`event`,handler:(e,n,r)=>{let i=t.get(e);i&&!i.syncIds.has(r)&&i.mutate(()=>o(e,n),r)}}),e.client.register({name:wy.broadcast.clientStatePatch,type:`event`,handler:(e,n,r)=>{let i=t.get(e);i&&!i.syncIds.has(r)&&i.patch(n,r)}});function s(t,n){let r=[];return r.push(n.on(`updated`,(n,r,i)=>{a||(r?e.callEvent(`devframe:rpc:server-state:patch`,t,r,i):e.callEvent(`devframe:rpc:server-state:set`,t,n,i))})),()=>{for(let e of r)e()}}return{keys:()=>Array.from(t.keys()),onKeyAdded(e){return i.add(e),()=>{i.delete(e)}},delete(e){let i=n.get(e);n.delete(e);let a=t.delete(e);return r.delete(e),i?.(),a},get:async(c,l)=>{if(l?.initialValue!==void 0&&r.set(c,l.initialValue),t.has(c))return t.get(c);let u=Vx({initialValue:l?.initialValue,enablePatches:!1});async function d(){if(a||e.callEvent(`devframe:rpc:server-state:subscribe`,c),l?.initialValue!==void 0){t.set(c,u);for(let e of i)e(c);return e.call(`devframe:rpc:server-state:get`,c).then(e=>{e!==void 0&&u.mutate(()=>o(c,e))}).catch(e=>{console.error(`Error getting server state`,e)}),n.set(c,s(c,u)),u}{let r=await e.call(`devframe:rpc:server-state:get`,c);u.mutate(()=>o(c,r)),t.set(c,u);for(let e of i)e(c);return n.set(c,s(c,u)),u}}return new Promise((t,n)=>{if(e.isTrusted)d().then(t,n);else{t(u);let n=!1;e.events.on(wy.client.isTrustedUpdated,e=>{e&&!n&&(n=!0,d())})}})}}}var aC=new Map;function oC(e=aC){let t=new Map;return{serialize:n=>{let r;return n.t===`q`?r=n.m:(r=t.get(n.i),t.delete(n.i)),!(n.t===`s`&&`e`in n)&&r&&e.get(r)?.jsonSerializable===!0?IS(n,r??``):`s:${oS(n)}`},deserialize:e=>{let n=e.startsWith(`s:`)?sS(e.slice(2)):JSON.parse(e);return n.t===`q`&&n.i&&n.m&&t.set(n.i,n.m),n}}}function sC(){}function cC(e){let t=e.search(/\n\n|\r\n\r\n/);if(!(t<0))return{frame:e.slice(0,t),rest:e.slice(t+(e[t]===`\r`?4:2))}}function lC(e){let t=`message`,n=[];for(let r of e.split(/\r?\n/))r.startsWith(`:`)||(r.startsWith(`event:`)?t=r.slice(6).trimStart():r.startsWith(`data:`)&&n.push(r.slice(5).replace(/^ /,``)));return{event:t,data:n}}function uC(e){let{onConnected:t=sC,onError:n=sC,onDisconnected:r=sC,definitions:i,fetch:a=globalThis.fetch.bind(globalThis)}=e,o=e.url;e.authToken&&(o=`${o}${o.includes(`?`)?`&`:`?`}${TS}=${encodeURIComponent(e.authToken)}`);let s=oC(i),c=new AbortController,l=!1,u,d,f,p,m=new Promise((e,t)=>{f=e,p=t});m.catch(()=>{});function ee(e){l||(l=!0,p(e),n(e),r())}function h(){l||(l=!0,p(Error(`Devframe SSE stream closed`)),r())}function g(e,n){if(e===`session`){f(n),t();return}u?.(n)}async function te(e){let t=e.getReader();d=t;let n=new TextDecoder,r=``;for(;;){let{done:e,value:i}=await t.read();if(e)break;for(r+=n.decode(i,{stream:!0});;){let e=cC(r);if(!e)break;r=e.rest;let{event:t,data:n}=lC(e.frame);n.length>0&&g(t,n.join(` -`))}}h()}return(async()=>{try{let e=await a(o,{headers:{accept:`text/event-stream`},signal:c.signal});if(!e.ok||!e.body)throw Error(`Devframe SSE stream request failed: ${e.status}`);await te(e.body)}catch(e){if(c.signal.aborted){h();return}ee(e instanceof Error?e:Error(String(e)))}})(),{close:()=>{l=!0,c.abort(),d?.cancel().catch(()=>{})},on:e=>{u=e},post:async e=>{let t;try{t=await m}catch{return}if(l){n(Error(`Devframe SSE channel is closed; message dropped`));return}try{let n=await a(o,{method:`POST`,headers:{"content-type":`text/plain; charset=utf-8`,[xS]:t},body:e});if(n.status===200){let e=await n.text();e&&u?.(e);return}if(!n.ok)throw Error(`Devframe SSE POST failed: ${n.status}`)}catch(e){n(e instanceof Error?e:Error(String(e)))}},serialize:s.serialize,deserialize:s.deserialize}}function dC(e,t){let{channel:n,rpcOptions:r={}}=t;return Py(e,{...n,timeout:-1,...r,proxify:!1})}function fC(e){let{transport:t,authToken:n,connectionMeta:r,events:i,clientRpc:a,rpcOptions:o={},callTimeout:s=0}=e,c=!1,l=`connecting`,u=null,d=Promise.withResolvers();function f(e,t=null){if(t?u=t:e===`connected`&&(u=null),e===l)return;let n=l;l=e,i.emit(wy.client.connectionStatus,e,n)}let p=new Set;function m(e){for(let t of[...p])t.reject(e)}function ee(){return l===`disconnected`||l===`error`?new QS(`connection`,`[devframe] Not connected to the devframe server`,{cause:u??void 0}):l===`unauthorized`?new QS(`auth`,`[devframe] Not authorized by the devframe server`,{cause:u??void 0}):null}function h(e,t){return new Promise((n,r)=>{let a=!1,o,c={reject(e){a||(l(),i.emit(wy.client.error,e,t),r(e))}};function l(){a=!0,p.delete(c),o&&clearTimeout(o)}p.add(c),s>0&&(o=setTimeout(()=>{c.reject(new QS(`timeout`,`[devframe] RPC call "${t}" timed out after ${s}ms`))},s)),e.then(e=>{a||(l(),n(e))},e=>{if(a)return;l();let n=e instanceof Error?e:Error(String(e));i.emit(wy.client.error,n,t),r(n)})})}let g=new Map;for(let e of r.jsonSerializableMethods??[])g.set(e,{jsonSerializable:!0});let te=e.createChannel({definitions:g,onError(e){f(`error`,e),i.emit(wy.client.connectionError,e),m(new QS(`connection`,`[devframe] Connection to the devframe server failed`,{cause:e}))},onDisconnected(){l!==`error`&&f(`disconnected`),m(new QS(`connection`,`[devframe] Disconnected from the devframe server`,{cause:u??void 0}))}}),ne=dC(a.functions,{channel:te,rpcOptions:o});a.register({name:wy.broadcast.authRevoked,type:`event`,handler:()=>{c=!1;let e=new QS(`auth`,`[devframe] The devframe server revoked this client's trust`);f(`unauthorized`,e),i.emit(wy.client.connectionError,e),m(e),i.emit(wy.client.isTrustedUpdated,!1)}});let re=n;async function ie(e){re=e;let t=await ne.$call(`anonymous:devframe:auth`,{authToken:e,ua:navigator.userAgent,origin:location.origin});if(c=t.isTrusted,c)d.resolve(!0),f(`connected`);else{let e=new QS(`auth`,`[devframe] The devframe server refused this client's credentials`);f(`unauthorized`,e),i.emit(wy.client.connectionError,e)}return i.emit(wy.client.isTrustedUpdated,c),t.isTrusted}async function ae(e){let t=(await ne.$call(`anonymous:devframe:auth:exchange`,{code:e,ua:navigator.userAgent,origin:location.origin}))?.authToken??null;return t&&(re=t,c=!0,d.resolve(!0),f(`connected`),i.emit(wy.client.isTrustedUpdated,!0)),t}async function oe(e={}){await ne.$call(`anonymous:devframe:auth:request-code`,{ua:navigator.userAgent,origin:location.origin,...e.reissue?{reissue:!0}:{}})}async function se(){return c?!0:ie(re??``)}async function ce(e=6e4){if(c&&d.resolve(!0),e<=0)return d.promise;let t;try{return await Promise.race([d.promise,new Promise((n,r)=>{t=setTimeout(()=>{r(Error(`[devframe] Timeout waiting for rpc to be trusted`))},e)})]),c}finally{clearTimeout(t)}}return{transport:t,get isTrusted(){return c},get status(){return l},get connectionError(){return u},requestTrust:se,requestTrustWithToken:ie,requestTrustWithCode:ae,requestAuthCode:oe,ensureTrusted:ce,call:(...e)=>{let t=String(e[0]),n=ee();return n?(i.emit(wy.client.error,n,t),Promise.reject(n)):h(ne.$call(...e),t)},callEvent:(...e)=>{let t=ee();if(t){i.emit(wy.client.error,t,String(e[0]));return}return ne.$callEvent(...e)},callOptional:(...e)=>{let t=String(e[0]),n=ee();return n?(i.emit(wy.client.error,n,t),Promise.reject(n)):h(ne.$callOptional(...e),t)},close:()=>{te.close()}}}function pC(e,t,n){let r=(()=>{try{return new URL(t,n.href)}catch{return new URL(n.href)}})();if(e&&typeof e==`object`){if(e.host!=null||e.port!=null){let t=e.host??`${r.hostname}:${e.port}`;return new URL(e.path??`/`,`${r.protocol}//${t}`).href}return new URL(e.path??``,r).href}let i=e??``;return/^https?:\/\//i.test(i)?i:new URL(i,r).href}function mC(e){let{authToken:t,connectionMeta:n,metaBaseUrl:r,events:i,clientRpc:a,rpcOptions:o={},sseOptions:s={},callTimeout:c=0}=e,l=pC(n.sse,r??`./`,location);return fC({transport:`sse`,authToken:t,connectionMeta:n,events:i,clientRpc:a,rpcOptions:o,callTimeout:c,createChannel:e=>uC({url:l,authToken:t,definitions:e.definitions,...s,onConnected(){s.onConnected?.()},onError(t){e.onError(t),s.onError?.(t)},onDisconnected(){e.onDisconnected(),s.onDisconnected?.()}})})}function hC(e){let{name:t,message:n,cause:r,...i}=e,a=r instanceof Error?r:gC(r)?hC(r):r,o=a===void 0?Error(n):Error(n,{cause:a});return o.name=t,Object.assign(o,i),o}function gC(e){return typeof e==`object`&&!!e&&typeof e.message==`string`&&typeof e.name==`string`}function _C(e){return typeof e==`object`&&!!e&&e.type===`static`&&typeof e.path==`string`}function vC(e){return typeof e==`object`&&!!e&&e.type===`query`&&typeof e.records==`object`&&e.records!==null}function yC(e){return typeof e==`object`&&!!e&&(`output`in e||`error`in e)}function bC(e){if(e.error)throw hC(e.error);return e.output}function xC(e){return e.some(e=>e!=null)}function SC(e){return typeof e==`object`&&e&&`serialization`in e&&`data`in e?e.data:e}function CC(e,t){let n=new Map,r=new Map;function i(e,t){return t===`structured-clone`&&Array.isArray(e)?aS(e):e}function a(e,t){return i(SC(e),t)}async function o(e){n.has(e.path)||n.set(e.path,t(e.path).then(t=>a(t,e.serialization)));let r=await n.get(e.path);return yC(r)?bC(r):r}async function s(e,n){return r.has(e)||r.set(e,t(e).then(e=>a(e,n))),await r.get(e)}async function c(t,n){if(!(t in e))throw Error(`[devframe-rpc] Function "${t}" not found in dump store`);let r=e[t];if(_C(r)){if(xC(n))throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`);return await o(r)}if(vC(r)){let e=eb(n),i=r.records[e];if(i)return bC(await s(i,r.serialization));if(r.fallback)return bC(await s(r.fallback,r.serialization));throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`)}if(!xC(n))return r;throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`)}return{call:async(e,t)=>await c(e,t),callOptional:async(t,n)=>{if(t in e)return await c(t,n)},callEvent:async(e,t)=>{}}}async function wC(e){let t=CC(await e.fetchJsonFromBases(SS),e.fetchJsonFromBases);return{transport:`static`,isTrusted:!0,status:`connected`,connectionError:null,requestTrust:async()=>!0,requestTrustWithToken:async()=>!0,requestTrustWithCode:async()=>null,requestAuthCode:async()=>{},ensureTrusted:async()=>!0,call:(...e)=>t.call(e[0],e.slice(1)),callEvent:(...e)=>t.callEvent(e[0],e.slice(1)),callOptional:(...e)=>t.callOptional(e[0],e.slice(1)),close:()=>{}}}var TC=``;function EC(e,t){return`${e}${TC}${t}`}function DC(e){let t=new Map,n=new Map;e.client.register({name:wy.broadcast.streamingChunk,type:`event`,handler(e,n,r,i){t.get(EC(e,n))?._push(r,i)}}),e.client.register({name:wy.broadcast.streamingEnd,type:`event`,handler(e,n,r){let i=EC(e,n),a=t.get(i);a&&(a._end(r),t.delete(i))}}),e.client.register({name:wy.broadcast.streamingUploadCancel,type:`event`,handler(e,t){let r=EC(e,t),i=n.get(r);i&&(i.abort(`server cancelled upload`),n.delete(r))}}),e.events.on(wy.client.isTrustedUpdated,n=>{if(n)for(let[n,r]of t){if(r.cancelled||r.done)continue;let t=n.indexOf(TC);if(t<0)continue;let i=n.slice(0,t),a=n.slice(t+1);e.callEvent(`devframe:streaming:subscribe`,i,a,{afterSeq:r.lastSeenSeq})}});function r(n,r,i={}){let a=EC(n,r),o=t.get(a);if(o)return o;let s=dS({id:r,highWaterMark:i.highWaterMark,onOverflow(e){console.warn(`[devframe] DF0029: Stream "${n}#${r}" dropped ${e} chunk(s) after exceeding the client high-water mark.`)},onCancel(){e.callEvent(`devframe:streaming:cancel`,n,r),t.delete(a)}});if(t.set(a,s),e.isTrusted)e.callEvent(`devframe:streaming:subscribe`,n,r,{afterSeq:0});else{let i=e.events.on(wy.client.isTrustedUpdated,o=>{o&&(i(),t.has(a)&&!s.cancelled&&!s.done&&e.callEvent(`devframe:streaming:subscribe`,n,r,{afterSeq:s.lastSeenSeq}))})}return s}function i(t,r){let i=EC(t,r),a=n.get(i);if(a)return a;let o=uS({id:r});return o.events.on(`chunk`,(n,i)=>{e.callEvent(`devframe:streaming:upload-chunk`,t,r,n,i)}),o.events.on(`end`,a=>{e.callEvent(`devframe:streaming:upload-end`,t,r,a),n.delete(i)}),n.set(i,o),o}return{subscribe:r,upload:i}}function OC(){}var kC=new Map;function AC(e){let t=e.url;e.authToken&&(t=`${t}?${TS}=${encodeURIComponent(e.authToken)}`);let n=new WebSocket(t),{onConnected:r=OC,onError:i=OC,onDisconnected:a=OC,definitions:o=kC}=e;n.addEventListener(`open`,e=>{r(e)}),n.addEventListener(`error`,e=>{let t=e instanceof Error?e:Error(e.type);i(t)}),n.addEventListener(`close`,e=>{a(e)});let s=oC(o);return{close:()=>{n.close()},on:e=>{n.addEventListener(`message`,t=>{e(t.data)})},post:e=>{if(n.readyState===WebSocket.OPEN){n.send(e);return}if(n.readyState===WebSocket.CONNECTING){let t=()=>{i(),n.readyState===WebSocket.OPEN&&n.send(e)},r=()=>i();function i(){n.removeEventListener(`open`,t),n.removeEventListener(`close`,r)}n.addEventListener(`open`,t),n.addEventListener(`close`,r);return}i(Error(`Devframe WebSocket is not open; message dropped`))},serialize:s.serialize,deserialize:s.deserialize}}function jC(e,t,n){let r=(()=>{try{return new URL(t,n.href)}catch{return new URL(n.href)}})(),i=r.protocol===`https:`?`wss:`:`ws:`;if(e&&typeof e==`object`){if(e.host!=null||e.port!=null){let t=e.host??`${r.hostname}:${e.port}`,n=new URL(e.path??`/`,`${i}//${t}`);return n.protocol=i,n.href}let t=new URL(e.path??``,r);return t.protocol=i,t.href}if(typeof e==`number`)return`${i}//${r.hostname}:${e}`;let a=e??``;if(/^wss?:\/\//i.test(a))return a;if(/^https?:\/\//i.test(a))return sb(a,/^https/i.test(a)?`wss://`:`ws://`);let o=new URL(a,r);return o.protocol=i,o.href}function MC(e){let{authToken:t,connectionMeta:n,metaBaseUrl:r,events:i,clientRpc:a,rpcOptions:o={},wsOptions:s={},callTimeout:c=0}=e,l=jC(n.websocket,r??`./`,location);return fC({transport:`websocket`,authToken:t,connectionMeta:n,events:i,clientRpc:a,rpcOptions:o,callTimeout:c,createChannel:e=>AC({url:l,authToken:t,definitions:e.definitions,...s,onConnected(e){s.onConnected?.(e)},onError(t){e.onError(t),s.onError?.(t)},onDisconnected(t){e.onDisconnected(),s.onDisconnected?.(t)}})})}function NC(e){return e.includes(`:`)}function PC(e,t){return NC(t)?t:`${e}:${t}`}function FC(e){return{async get(t){return(await e()).value()?.[t]},async set(t,n){(await e()).mutate(e=>{if(e===void 0)return{[t]:n};e[t]=n})},async delete(t){(await e()).mutate(e=>{e!==void 0&&delete e[t]})},async all(){return(await e()).value()??{}},async onChange(t){return(await e()).on(`updated`,e=>t(e??{}))}}}function IC(e,t,n){let r=`devframe:settings:${n}:${t}`,i;function a(){return i||=(async()=>(await e.ensureTrusted(),e.sharedState.get(r)))().catch(e=>{throw i=void 0,e}),i}return FC(a)}function LC(e,t){return{global:IC(e,t,`global`),project:IC(e,t,`project`)}}function RC(e,t){return{namespace:t,base:e,rpc:{namespace:t,register(n){if(NC(n.name))throw Error(`[devframe] Scoped client RPC registration for namespace "${t}" received an already-namespaced function name "${n.name}". Pass a bare name without a ":" separator.`);e.client.register({...n,name:`${t}:${n.name}`})},call:((n,...r)=>e.call(PC(t,n),...r)),callEvent:((n,...r)=>e.callEvent(PC(t,n),...r)),callOptional:((n,...r)=>e.callOptional(PC(t,n),...r)),sharedState:((n,r)=>e.sharedState.get(PC(t,n),r)),streaming:{subscribe:(n,r,i)=>e.streaming.subscribe(PC(t,n),r,i),upload:(n,r)=>e.streaming.upload(PC(t,n),r)}},settings:LC(e,t),scope:e.scope}}function zC(){if(typeof document<`u`){let e=document.modelContext;if(e)return e}if(typeof navigator<`u`){let e=navigator.modelContext;if(e)return e}}function BC(e,t={}){let n=t.modelContext??zC();if(!n)return()=>{};let r=n,i=new Map,a=new Map;function o(t,n){let o=mS(t.name),s=a.get(o);if(s&&s!==t.name){console.warn(`[devframe] WebMCP tool name "${o}" (from "${t.name}") collides with "${s}"; keeping the first registration.`);return}let c=new AbortController,l=Fy(t.type,n),u=r.registerTool({name:o,description:n.description,inputSchema:Ry(t.args),annotations:{title:n.title??t.name,readOnlyHint:l===`read`,destructiveHint:l===`destructive`},execute:n=>VC(t,e.context,n)},{signal:c.signal});u&&`then`in u&&u.then(()=>{},()=>{}),a.set(o,t.name),i.set(t.name,()=>{c.abort(),u&&`unregister`in u&&typeof u.unregister==`function`&&u.unregister(),a.delete(o)})}function s(t){let n=t?[t]:[...e.definitions.keys()];for(let t of n){i.get(t)?.(),i.delete(t);let n=e.definitions.get(t),r=n?.agent;n&&r&&o(n,r)}}s();let c=e.onChanged(e=>s(e));return()=>{c();for(let e of i.values())e();i.clear()}}async function VC(e,t,n){try{let r=By(n,e.args?.length);return{content:[{type:`text`,text:HC(await(await PS(e,t))(...r))}]}}catch(e){return{isError:!0,content:[{type:`text`,text:UC(e)}]}}}function HC(e){return e===void 0?`undefined`:typeof e==`string`?e:JSON.stringify(e,null,2)}function UC(e){if(!(e instanceof Error))return String(e);let t=e.cause instanceof Error?` (cause: ${e.cause.message})`:``;return`${e.name}: ${e.message}${t}`}function WC(e,t){if(t.backend===`static`)return`static`;let n=t.websocket!==void 0,r=t.sse!==void 0;if(e===`websocket`){if(!n)throw Error(`[devframe] transport: 'websocket' was requested, but this server does not advertise a WebSocket endpoint`);return`websocket`}if(e===`sse`){if(!r)throw Error(`[devframe] transport: 'sse' was requested, but this server does not advertise an SSE endpoint`);return`sse`}if(t.backend===`sse`&&r)return`sse`;if(n)return`websocket`;if(r)return`sse`;throw Error(`[devframe] This server advertises no RPC transport (backend "none"), so there is nothing to connect to. Enable the WebSocket or SSE endpoint on the server, or use its static/MCP surfaces instead.`)}async function GC(e={}){let{baseURL:t=`./`,rpcOptions:n={},cacheOptions:r=!1}=e,i=tb(),a=Array.isArray(t)?t:[t],o=await ZS(e),{connectionMeta:s,metaBaseUrl:c,authToken:l}=o,u=a[0]??`./`;try{u=new URL(`.`,c).href}catch{}let d=new ES({functions:[],...typeof e.cacheOptions==`object`?e.cacheOptions:{}}),f={rpc:void 0},p=new FS(f),m=e.webmcp===!1?void 0:BC(p),ee,h=!1,g=0,te;function ne(){g++,te=void 0,d.clear(),r===!0&&d.updateOptions({functions:[]})}r&&(p.register({name:wy.broadcast.cacheInvalidate,type:`event`,handler:ne}),i.on(wy.client.connectionStatus,ne),i.on(wy.client.isTrustedUpdated,ne));async function re(e){let t=[u,...a.filter(e=>e!==u)].filter(e=>e!=null),n=[];for(let r of t)try{return await fetch(ob(e,r)).then(t=>{if(!t.ok)throw Error(`Failed to fetch ${e} from ${r}: ${t.status}`);return t.json()})}catch(e){n.push(e)}throw Error(`Failed to load ${e} from ${t.join(`, `)}`,{cause:n})}let ie=e.callTimeout??0,ae=ie>0?ie:1/0,oe,se={authToken:l,connectionMeta:s,metaBaseUrl:c,events:i,clientRpc:p,callTimeout:e.callTimeout,rpcOptions:{...n,async onRequest(e,t,i){let a=performance.now()+ae;if(await n.onRequest?.call(this,e,t,i),r===!0&&e.i&&oe.isTrusted&&!e.m.startsWith(`anonymous:`)&&e.m!==`devframe:rpc:cacheable-functions`){function t(){if(performance.now()>=a)throw new QS(`timeout`,`[devframe] RPC call "${e.m}" timed out after ${ie}ms`)}for(;!te&&(t(),!(h||oe.status!==`connected`));){let e=g;te=oe.callOptional(`devframe:rpc:cacheable-functions`).then(t=>{e===g&&d.updateOptions({functions:t??[]})}).catch(t=>{throw e===g&&(te=void 0),t}),await te}await te,t()}let o=g;if(r&&e.i&&!h&&oe.isTrusted&&d.validate(e.m)){if(d.has(e.m,e.a))return i(d.cached(e.m,e.a));let n=await t(e);o===g&&!h&&d.apply(e,n)}else await t(e)}}},ce=WC(e.transport??`auto`,s);oe=ce===`static`?await wC({fetchJsonFromBases:re}):ce===`sse`?mC({...se,sseOptions:e.sseOptions}):MC({...se,wsOptions:e.wsOptions});let le;try{le=new BroadcastChannel(`devframe-auth`)}catch{}let ue,de=!1;function fe(e){return((...t)=>de||!ue?e(...t):ue.then(()=>e(...t)))}function pe(){h=!0,ne();try{ee?.(),m?.()}finally{try{le?.close()}finally{oe.close?.()}}}let me={events:i,get isTrusted(){return oe.isTrusted},get status(){return oe.status},get connectionError(){return oe.connectionError},get transport(){return oe.transport??ce},get connection(){return o},connectionMeta:s,ensureTrusted:oe.ensureTrusted,requestTrust:oe.requestTrust,requestTrustWithToken:async e=>(qS(e),o={...o,authToken:e},oe.requestTrustWithToken(e)),requestTrustWithCode:async e=>{let t=await oe.requestTrustWithCode(e);if(!t)return!1;qS(t),o={...o,authToken:t};try{le?.postMessage({type:`auth-update`,authToken:t})}catch{}return!0},requestAuthCode:e=>oe.requestAuthCode(e),call:fe(oe.call),callEvent:fe(oe.callEvent),callOptional:fe(oe.callOptional),client:p,sharedState:void 0,services:void 0,streaming:void 0,cacheManager:d,scope:void 0,close:pe};me.sharedState=iC(me),me.streaming=DC(me),me.services=rC(me);let he=new Map;me.scope=(e=>{if(!e)return me;let t=he.get(e);return t||(t=RC(me,e),he.set(e,t)),t}),f.rpc=me;function ge(){try{return typeof window<`u`&&window.self===window.top}catch{return!1}}async function _e(){if(e.simpleAuth!==!1&&ge()&&typeof globalThis.prompt==`function`)for(await me.requestAuthCode().catch(()=>{});!me.isTrusted;){let e=globalThis.prompt(`devframe: enter the authentication code shown in your terminal`);if(e==null)return;let t=e.trim();if(t&&await me.requestTrustWithCode(t))return}}async function ve(){let t=await oe.requestTrust(),n=e.otpParam??`devframe_otp`,r=n?await nC(me,{param:n}):!1;t||r||me.isTrusted||await _e()}return ue=ve().then(()=>{de=!0},()=>{de=!0}),s.mcp&&vS(async()=>{let{setupBrowserAgentRpcBridge:e}=await import(`./browser-agent-rpc-KH4HHvHf-DqNFcBHr.js`);return{setupBrowserAgentRpcBridge:e}},[],import.meta.url).then(({setupBrowserAgentRpcBridge:e})=>{h||(ee=e(me))}).catch(()=>{}),le&&(le.onmessage=e=>{e.data?.type===`auth-update`&&e.data.authToken&&me.requestTrustWithToken(e.data.authToken)}),me}var KC=GC,qC=[`components`,`injectors`,`signals`,`ngrx`,`tanstackQuery`,`forms`,`router`,`pipes`,`http`,`analog`,`capacitor`,`errors`,`plugins`,`performance`,`build`],JC=[`angular`,`ngrx`,`analog`,`angular-native`,`nativescript`,`capacitor`];function YC(e){return`pangular:${e}`}var XC=[`forms`,`router`,`ngrx`,`http`,`analog`,`components`,`tanstackQuery`,`plugins`],ZC={refreshMs:{default:3e3,min:500,max:8e3},navigations:{default:50,min:5,max:500},formTimeline:{default:200,min:10,max:2e3},httpCalls:{default:200,min:10,max:2e3},changeLog:{default:200,min:10,max:2e3},cdCycles:{default:200,min:10,max:2e3},cdSlowMs:{default:16,min:1,max:1e3},capacitorCalls:{default:200,min:10,max:2e3},idleAfterMs:{default:6e4,min:0,max:6e5}},QC={"opted-out":`the request sets transferCache: false`,post:`POST requests are left out unless includePostRequests is set`,method:`only GET, HEAD and POST requests are cached`,"auth-headers":`it sends an Authorization, Proxy-Authorization or Cookie header`,credentials:`it sends credentials (withCredentials or credentials: include/same-origin)`,"no-cache-request":`the request asks for no-store, no-cache or private`,"no-cache-response":`the response has Cache-Control no-store, no-cache or private`,"set-cookie":`the response sets a cookie`,error:`failed responses are not stored`,mocked:`a fault rule answered before the transfer cache ran`,filter:`the transferCache filter passed to withPangular() left it out`,"cache-off-or-filter":`the transfer cache is off, or its filter (or another withHttpTransferCacheOptions setting) left it out`},$C=[[0,`Network error (offline)`],[200,`OK`],[201,`Created`],[202,`Accepted`],[203,`Non-Authoritative Information`],[204,`No Content`],[205,`Reset Content`],[206,`Partial Content`],[207,`Multi-Status`],[208,`Already Reported`],[226,`IM Used`],[300,`Multiple Choices`],[301,`Moved Permanently`],[302,`Found`],[303,`See Other`],[304,`Not Modified`],[307,`Temporary Redirect`],[308,`Permanent Redirect`],[400,`Bad Request`],[401,`Unauthorized`],[402,`Payment Required`],[403,`Forbidden`],[404,`Not Found`],[405,`Method Not Allowed`],[406,`Not Acceptable`],[407,`Proxy Authentication Required`],[408,`Request Timeout`],[409,`Conflict`],[410,`Gone`],[411,`Length Required`],[412,`Precondition Failed`],[413,`Content Too Large`],[414,`URI Too Long`],[415,`Unsupported Media Type`],[416,`Range Not Satisfiable`],[417,`Expectation Failed`],[418,`I'm a Teapot`],[421,`Misdirected Request`],[422,`Unprocessable Content`],[423,`Locked`],[424,`Failed Dependency`],[425,`Too Early`],[426,`Upgrade Required`],[428,`Precondition Required`],[429,`Too Many Requests`],[431,`Request Header Fields Too Large`],[451,`Unavailable For Legal Reasons`],[499,`Client Closed Request`],[500,`Internal Server Error`],[501,`Not Implemented`],[502,`Bad Gateway`],[503,`Service Unavailable`],[504,`Gateway Timeout`],[505,`HTTP Version Not Supported`],[506,`Variant Also Negotiates`],[507,`Insufficient Storage`],[508,`Loop Detected`],[510,`Not Extended`],[511,`Network Authentication Required`],[520,`Web Server Returned an Unknown Error`],[521,`Web Server Is Down`],[522,`Connection Timed Out`],[523,`Origin Is Unreachable`],[524,`A Timeout Occurred`]];function ew(e){return $C.some(([t])=>t===e)}var tw=/^[a-z][a-z0-9-]{0,39}$/;function nw(e,t){let n=t.plugins?.[e],r=t.inspectors.plugins&&tw.test(e)&&(n?.enabled??!0);return{enabled:r,tools:r&&t.agent.tools.plugins&&(n?.tools??!0),actions:r&&t.actions.plugins&&(n?.actions??!0)}}var rw=`pangular`,iw={mod:`Mod`,ctrl:`Ctrl`,control:`Ctrl`,meta:`Meta`,cmd:`Meta`,command:`Meta`,alt:`Alt`,option:`Alt`,opt:`Alt`,shift:`Shift`},aw=[`Mod`,`Ctrl`,`Meta`,`Alt`,`Shift`];function ow(e){if(typeof e!=`string`||e.length>40)return;let t=e.split(`+`).map(e=>e.trim());if(t.some(e=>!e))return;let n=new Set,r;for(let e of t){let t=iw[e.toLowerCase()];if(t){if(n.has(t))return;n.add(t);continue}if(r!==void 0)return;if(/^[a-z0-9]$/i.test(e))r=e.toUpperCase();else if(/^f([1-9]|1[0-2])$/i.test(e))r=e.toUpperCase();else return}if(r&&[...n].some(e=>e!==`Shift`)&&!(n.has(`Mod`)&&(n.has(`Ctrl`)||n.has(`Meta`))))return[...aw.filter(e=>n.has(e)),r].join(`+`)}function sw(e,t,n){let r=t.split(`+`),i=r.pop(),a=new Set(r),o=a.has(`Ctrl`)||a.has(`Mod`)&&!n,s=a.has(`Meta`)||a.has(`Mod`)&&n;if(e.ctrlKey!==o||e.metaKey!==s||e.altKey!==a.has(`Alt`)||e.shiftKey!==a.has(`Shift`))return!1;if(/^F\d+$/.test(i))return e.key.toUpperCase()===i;let c=/^\d$/.test(i)?`Digit${i}`:`Key${i}`;return e.code?e.code===c:e.key.toUpperCase()===i}function cw(e,t){if(!t)return e.replace(/^Mod\b/,`Ctrl`);let n={Mod:`⌘`,Meta:`⌘`,Ctrl:`⌃`,Alt:`⌥`,Shift:`⇧`};return e.split(`+`).map(e=>n[e]??e).join(``)}var lw=[{id:`dashboard`,label:`Dashboard`},{id:`timeline`,label:`Timeline`},{id:`audit`,label:`Audit`},{id:`analog`,label:`Analog`,inspector:`analog`},{id:`components`,label:`Components`,inspector:`components`},{id:`routes`,label:`Routes`,inspector:`router`},{id:`signals`,label:`Signals`,inspector:`signals`},{id:`injectors`,label:`Injectors`,inspector:`injectors`},{id:`store`,label:`Store`,inspector:`ngrx`},{id:`queries`,label:`Queries`,inspector:`tanstackQuery`},{id:`forms`,label:`Forms`,inspector:`forms`},{id:`pipes`,label:`Pipes`,inspector:`pipes`},{id:`network`,label:`SSR & HTTP`,inspector:`http`},{id:`errors`,label:`Errors`,inspector:`errors`},{id:`performance`,label:`Performance`,inspector:`performance`},{id:`build`,label:`Build`,inspector:`build`},{id:`capacitor`,label:`Capacitor`,inspector:`capacitor`},{id:`plugins`,label:`Plugins`,inspector:`plugins`}],uw=1e4;function dw(e){return lw.filter(t=>!(`inspector`in t)||e.inspectors[t.inspector])}var fw={components:`a component instance, by its id in the component tree`,injectors:`a component's element injector, by the component's id`,signals:`a component's signal graph, by the component's id`,forms:`a form, by its id`},pw=200;function mw(e){let t=new URLSearchParams({tab:e.tab});return e.id&&t.set(`id`,e.id),e.page&&t.set(`page`,e.page),`#${t.toString()}`}function hw(e){let t=new URLSearchParams(e.replace(/^#/,``)),n=e=>{let n=t.get(e)?.trim();return n&&n.length<=pw?n:void 0},r=n(`tab`);if(!r)return null;let i=n(`id`),a=n(`page`);return{tab:r,...i?{id:i}:{},...a?{page:a}:{}}}var gw=[{id:`settings`,title:`Open settings`,group:`Go to`,keywords:`preferences tabs`},{id:`pick-component`,title:`Pick component on page`,group:`Actions`,keywords:`select inspect element`,inspector:`components`},{id:`cd-record-start`,title:`Start recording change detection`,group:`Actions`,keywords:`profiler cycles`,inspector:`components`},{id:`cd-record-stop`,title:`Stop recording change detection`,group:`Actions`,keywords:`profiler cycles`,inspector:`components`},{id:`cd-clear`,title:`Clear change detection recording`,group:`Actions`,keywords:`reset recordings cycles`,inspector:`components`},{id:`theme:system`,title:`Theme: follow the system`,group:`Theme`,keywords:`auto`},{id:`theme:light`,title:`Theme: light`,group:`Theme`},{id:`theme:dark`,title:`Theme: dark`,group:`Theme`},{id:`dock:float`,title:`Popup: float`,group:`Popup`,keywords:`dock`,popupOnly:!0},{id:`dock:bottom`,title:`Popup: dock to the bottom`,group:`Popup`,keywords:`dock`,popupOnly:!0},{id:`dock:right`,title:`Popup: dock to the right`,group:`Popup`,keywords:`dock`,popupOnly:!0},{id:`dock:reset-size`,title:`Popup: reset the docked size`,group:`Popup`,keywords:`splitter resize height width`,popupOnly:!0},{id:`popout`,title:`Popup: open in its own window`,group:`Popup`,keywords:`pop out detach new window`,popupOnly:!0},{id:`popout:return`,title:`Popup: back into the page`,group:`Popup`,keywords:`pop in attach dock window`,popupOnly:!0}];function _w(e){let t=dw(e).map(e=>({id:`tab:${e.id}`,title:`Go to ${e.label}`,group:`Go to`,keywords:`tab open`})),n=gw.filter(t=>!t.inspector||e.inspectors[t.inspector]).map(({inspector:e,...t})=>t);return[...t,...n]}function vw(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:{}}var yw=Object.freeze({minLength:24,threshold:4.5}),bw={min:16,max:512},xw={min:2,max:6};function Sw(e){return typeof e==`number`&&Number.isInteger(e)&&e>=bw.min&&e<=bw.max}function Cw(e){return typeof e==`number`&&Number.isFinite(e)&&e>=xw.min&&e<=xw.max}function ww(e){if(e===!0)return{...yw};if(!e||typeof e!=`object`||Array.isArray(e))return;let{minLength:t,threshold:n}=e;return{minLength:Sw(t)?t:yw.minLength,threshold:Cw(n)?n:yw.threshold}}function Tw(e){let t=ww(e);return t?{entropy:t}:{}}function Ew(e,t){return typeof e==`boolean`?e:t}var Dw=100,Ow=100;function kw(e){if(!Array.isArray(e))return[];let t=e.filter(e=>typeof e==`string`).map(e=>e.trim()).filter(e=>e&&e.length<=Ow);return[...new Set(t)].slice(0,Dw)}function Aw(e,t){let{default:n,min:r,max:i}=ZC[t];return typeof e!=`number`||!Number.isFinite(e)?n:Math.min(i,Math.max(r,Math.round(e)))}function jw(e,t){return Object.fromEntries(e.map(e=>[e,t(e)]))}function Mw(e){let t=vw(e),n=vw(t.agent),r=vw(t.inspectors),i=vw(n.tools),a=vw(t.actions),o=Ew(t.actions,!0),s=vw(t.redaction),c=vw(t.limits),l=jw(qC,e=>Ew(r[e],!0));return{inspectors:l,agent:{readOnly:Ew(n.readOnly,!1),tools:jw(qC,e=>l[e]&&Ew(i[e],!0)),browserTools:Ew(n.browserTools,!1)},actions:jw(XC,e=>l[e]&&Ew(a[e],o)),redaction:{secretNames:kw(s.secretNames),unmask:kw(s.unmask),...Tw(s.entropy)},limits:Object.fromEntries(Object.keys(ZC).map(e=>[e,Aw(c[e],e)])),popup:{hotkey:zw(vw(t.popup).hotkey)},plugins:Rw(t.plugins),lint:{rules:Iw(t.lint)},analog:Pw(t.analog),ngrx:{trace:Ew(vw(t.ngrx).trace,!1)}}}var Nw=500;function Pw(e){let t=vw(e).contentSchema;return typeof t==`string`&&t.trim()&&t.length<=Nw?{contentSchema:t.trim()}:{}}var Fw=200;function Iw(e){let t=vw(vw(e).rules),n={};for(let[e,r]of Object.entries(t).slice(0,Fw))typeof r==`boolean`&&(n[e]=r);return n}var Lw=100;function Rw(e){let t={};for(let[n,r]of Object.entries(vw(e)).slice(0,Lw)){if(!tw.test(n))continue;if(typeof r==`boolean`){t[n]={enabled:r,tools:!0,actions:!0};continue}let e=vw(r);r!==void 0&&Object.keys(e).length&&(t[n]={enabled:Ew(e.enabled,!0),tools:Ew(e.tools,!0),actions:Ew(e.actions,!0)})}return t}function zw(e){return e===!1?!1:ow(e)??`Alt+Shift+P`}function Bw(e){let t=e?.configs;return Mw(t?.[rw])}function Vw(e){return`${{forms:`Writing to forms`,router:`Navigating and clearing navigations`,ngrx:`Restoring NgRx state, dispatching actions and changing the Store DevTools history`,http:`Changing HTTP mock rules and SSR overrides, refetching the TransferState payload, and clearing HTTP calls`,analog:`Calling API routes, clearing server calls, running Nitro tasks and purging the Nitro cache`,components:`Editing component properties and signals`,tanstackQuery:`Invalidating and refetching TanStack queries`,plugins:`Running plugin actions`}[e]} is turned off in the devtools config (actions.${e}).`}var Hw=[`pangular:build-meta`],Uw={components:`Components`,injectors:`Injectors`,signals:`Signals`,ngrx:`NgRx`,tanstackQuery:`TanStack Query`,forms:`Forms`,router:`Router`,pipes:`Pipes`,http:`HTTP`,analog:`Analog`,capacitor:`Capacitor`,errors:`Errors`,plugins:`Plugins`,performance:`Performance`,build:`Build`},Ww={forms:`Form writes`,router:`Navigation`,ngrx:`NgRx restore, dispatch and Store DevTools`,http:`HTTP mocking`,analog:`Analog API calls`,components:`Component edits`,tanstackQuery:`TanStack Query invalidate and refetch`,plugins:`Plugin actions`},Gw={refreshMs:e=>`poll every ${e} ms`,navigations:e=>`${e} navigations`,formTimeline:e=>`${e} form events`,httpCalls:e=>`${e} HTTP calls`,changeLog:e=>`${e} NgRx changes`,cdCycles:e=>`${e} change detection cycles`,cdSlowMs:e=>`slow cycles over ${e} ms`,capacitorCalls:e=>`${e} Capacitor plugin calls`,idleAfterMs:e=>e?`idle ${e/1e3} s after the last agent call`:`never idle`};function Kw(e){if(!e)return[];let t=[`On`];return e.minLength!==yw.minLength&&t.push(`${e.minLength} characters or more`),e.threshold!==yw.threshold&&t.push(`up to ${e.threshold} bits per character`),t}function qw(e){let t=[],n=(e,n)=>{n.length&&t.push({label:e,value:n.join(`, `)})},r=qC.filter(t=>e.inspectors[t]);n(`Inspectors off`,qC.filter(t=>!e.inspectors[t]).map(e=>Uw[e])),n(`Agent`,e.agent.readOnly?[`Read-only`]:[]),n(`Hidden from the agent`,r.filter(t=>!e.agent.tools[t]).map(e=>Uw[e])),n(`Blocked actions`,XC.filter(t=>e.inspectors[t]&&!e.actions[t]).map(e=>Ww[e])),n(`Extra secret names`,e.redaction.secretNames),n(`Unmasked names`,e.redaction.unmask),n(`Entropy masking`,Kw(e.redaction.entropy)),n(`Limits`,Object.keys(ZC).filter(t=>e.limits[t]!==ZC[t].default).map(t=>Gw[t](e.limits[t]))),e.popup.hotkey!==`Alt+Shift+P`&&n(`Popup shortcut`,[e.popup.hotkey===!1?`Off`:e.popup.hotkey]);let i=Object.entries(e.plugins??{});return n(`Plugins off`,i.filter(([,e])=>!e.enabled).map(([e])=>e)),n(`Plugin tools or actions off`,i.filter(([,e])=>e.enabled&&(!e.tools||!e.actions)).map(([e,t])=>`${e} (${[!t.tools&&`tools`,!t.actions&&`actions`].filter(Boolean).join(`, `)})`)),n(`Lint rules off`,Object.entries(e.lint?.rules??{}).filter(([,e])=>!e).map(([e])=>e)),t}function Jw(e){let t={tags:[],directives:[],text:``},n=e.toLowerCase();return n=n.replace(/<\s*([^<>\s]+)\s*>/g,(e,n)=>(t.tags.push({value:n,exact:!0}),` `)),n=n.replace(/\[\s*([^[\]\s]+)\s*\]/g,(e,n)=>(t.directives.push({value:n,exact:!0}),` `)),n=n.replace(/(^|\s)([<[])([^<>[\]\s]*)$/,(e,n,r,i)=>(i&&(r===`<`?t.tags:t.directives).push({value:i,exact:!1}),n)),t.text=n.replace(/\s+/g,` `).trim(),t}function Yw(e){return!e.tags.length&&!e.directives.length&&!e.text}function Xw(e,t){let n=e.tag.toLowerCase(),r=(e.directives??[]).map(e=>e.toLowerCase()),i=(e.attributes??[]).map(e=>e.toLowerCase()),a=[...r,...r.map(e=>e.replace(/directive$/,``)),...i];for(let{value:e,exact:r}of t.tags)if(r?n!==e:!n.startsWith(e))return!1;for(let{value:e,exact:n}of t.directives)if(!a.some(t=>n?t===e:t.includes(e)))return!1;if(t.text){let a=t.text;if(!(e.name.toLowerCase().includes(a)||n.includes(a)||r.some(e=>e.includes(a))||i.some(e=>e.includes(a))))return!1}return!0}var Zw={debugApi:{subject:`Live data`,since:`12.0`},injectorProviders:{subject:`Reading providers and environment injectors`,since:`16.2`},injectorMetadata:{subject:`The full injector tree`,since:`17.0`},isSignal:{subject:`Telling signals apart in component values`,since:`17.1`},signalGraph:{subject:`The live signal graph`,since:`20.1`},deferBlocks:{subject:`Listing @defer blocks`,since:`19.1`},forBlocks:{subject:`Listing @for blocks`,since:`22.0`},profiler:{subject:`Recording change detection`,since:`20.0`},angularProfiling:{subject:`Angular profiling`,since:`20.0`},routerInstance:{subject:`The router debug util`,since:`20.3`}};function Qw(e){let t=/^(\d+)\.(\d+)/.exec(e.trim());return t?`${t[1]}.${t[2]}`:e.trim()}function $w(e){let t=/^(\d+)(?:\.(\d+))?/.exec(e.trim());return t?[Number(t[1]),Number(t[2]??0)]:null}function eT(e,t){let n=$w(e),r=$w(t);return!n||!r?!1:n[0]===r[0]?n[1]>=r[1]:n[0]>r[0]}function tT(e,t){return e?.capabilities?.[t]===!1}function nT(e,t){let n=Zw[e],r=`${n.subject} needs Angular ${n.since} or later`;if(!t)return`${r}; this page's Angular version is unknown.`;let i=Qw(t);return eT(t,n.since)?`${r} in a development build; this page runs Angular ${i} without it, which usually means a production build.`:`${r}; this page runs Angular ${i}.`}function rT(e){return e.hydration===`hydrated`&&e.hydratedAt===void 0?`hydrated before inspection`:e.hydration}var iT=/^on (viewport|interaction|hover)\b/;function aT(e){let t=e.filter(e=>!/^(prefetch|hydrate) /.test(e));return t.length>0&&t.every(e=>iT.test(e))}function oT(e,t){let n=[],r=e.since>0?Math.max(0,Math.round((t-e.since)/1e3)):0;return e.state===`error`&&n.push({kind:`failed`,text:`failed to load`,label:`failed`}),(e.state===`placeholder`||e.state===`initial`)&&r*1e3>=1e4&&n.push(aT(e.triggers)?{kind:`waiting`,text:`waiting for its trigger for ${r}s`,label:`waiting ${r}s`,seconds:r}:{kind:`stuck`,text:`on its placeholder for ${r}s`,label:`stuck ${r}s`,seconds:r}),e.hydrateNever?n.push({kind:`hydrate-never`,text:`hydrate never: the server HTML stays static`,label:`hydrate never`}):e.hydration===`dehydrated`&&n.push({kind:`dehydrated`,text:`still dehydrated`,label:`dehydrated`}),n}var sT=`pangular-page-id`,cT=null;function lT(e){cT=e}function uT(){if(cT)return cT;try{return new URLSearchParams(location.search).get(`pageId`)||(window.top===window?null:sessionStorage.getItem(sT)||null)}catch{return null}}function dT(e,t){if(t.chosen&&e[t.chosen])return t.chosen;if(t.host)return t.host;if(t.previous&&e[t.previous])return t.previous;let n=null;for(let t of Object.values(e))(!n||t.reportedAt>n.reportedAt)&&(n=t);return n?.pageId??null}function fT(e,t){return e?t?e.pages?.[t]??null:e:null}function pT(e,t){return e?t?e.pages?.[t]??null:e.graph??null:null}function mT(){return{functions:[...Hw]}}function hT(e,t,n){return e?e.scope(`pangular`).rpc.call(t,...n===void 0?[]:[n]):Promise.resolve(null)}function gT(e,t,n){return hT(e,t,n).then(e=>e,()=>null)}function _T(e){return e?.connectionMeta.backend===`static`}function vT(e){let t=()=>{let t=e()?.scope(`pangular`).rpc;t&&(t.callEvent(`request-page-highlight`,null),t.callEvent(`request-form-highlight`,null))};return addEventListener(`pagehide`,t),()=>{removeEventListener(`pagehide`,t),t()}}function yT(e=globalThis){delete e.__DEVFRAME_CONNECTION__,delete e.__DEVFRAME_CONNECTION_META__}function bT(e){return e.split(`@`)[1]??``}var xT={signal:`Signal Forms`,reactive:`Reactive`,template:`Template-driven`},ST={own:`validator`,directive:`template attribute`,tree:`cross-field rule`,async:`async`,parse:`parse`,submission:`server`,schema:`schema`,manual:`setErrors`},CT=gT,wT={key:`name looks secret`,"input-type":`password input`,autocomplete:`autocomplete is a secret kind`,marker:`marked as mask`,parent:`inside a secret group`,config:`listed in mask`};function TT(e){return wT[e]??e}var ET=`https://pangular-inspector.dev/security/#opt-fields-in-or-out`;async function DT(e,t){return await CT(e,`request-form-action`,t)??{ok:!1,error:`The devtools server did not answer.`}}function OT(e){return`${e.ok?e.message??`Done.`:e.error??`Failed.`}${e.skipped?.length?` Skipped: ${e.skipped.map(e=>`${e.path} (${e.reason})`).join(`, `)}.`:``}${e.status?` Status: ${e.status}.`:``}`}var kT=/"(?:[^"\\\n]|\\.)*"|`([^`\n]*)`|\*\*/g;function AT(e){return(e??``).replace(/^_Labels, paths.*_\n\n/,``).replace(kT,(e,t)=>t??(e===`**`?``:e))}function jT(e,t){let n=Math.max(0,e-t),r=Math.ceil(n/6e4);if(r<60)return`in ${r} min`;let i=Math.round(r/60);return i<48?`in ${i} ${i===1?`hour`:`hours`}`:`in ${Math.round(i/24)} days`}function MT(e,t){return e.length?e.join(`, `):t}function NT(e,t){let n=[];if(n.push({label:`One-time code`,value:e.auth?e.oneTimeCode.state===`locked`?`Locked after too many wrong codes: run pangular token --rotate or restart the server for a new code`:e.oneTimeCode.expiresAt?`On, current code expires ${jT(e.oneTimeCode.expiresAt,t)}`:`On`:`Off: every client is trusted`}),e.auth){let{count:r,nextExpiresAt:i,lastExpiresAt:a}=e.tokens;n.push({label:`Trusted clients`,value:r?r===1||i===a?`${r} ${r===1?`token`:`tokens`}, expires ${jT(i??t,t)}`:`${r} tokens, the first expires ${jT(i??t,t)}, the last ${jT(a??t,t)}`:`None`}),e.pairingTokens&&n.push({label:`Pairing tokens`,value:`${e.pairingTokens} accepted instead of the code`})}return e.reported?(n.push({label:`Reach`,value:e.network?`This machine and other machines`:`This machine only`}),n.push({label:`Allowed origins`,value:e.originCheck?`${MT(e.allowedOrigins,`This machine and the Chrome extension`)}${e.customOrigins?`, plus a custom origin check`:``}`:`Any: the origin check is off`}),(e.allowedHosts===`any`||e.allowedHosts.length)&&n.push({label:`Allowed hosts`,value:e.allowedHosts===`any`?`Any`:e.allowedHosts.join(`, `)}),n):n}function PT(e){return Bw(e?.connectionMeta)}function FT(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)?[...e]:void 0}function IT(e,t){if(!t||typeof t!=`object`)return e;let n=FT(t.secretNames),r=FT(t.unmask);if(!n||!r)return e;let i=ww(t.entropy);return{...e,redaction:i?{secretNames:n,unmask:r,entropy:i}:{secretNames:n,unmask:r}}}function LT(e,t){return PT(e).actions[t]}var RT={components:`components`,routes:`router`,signals:`signals`,injectors:`injectors`,store:`ngrx`,queries:`tanstackQuery`,forms:`forms`,pipes:`pipes`,network:`http`,analog:`analog`,capacitor:`capacitor`,errors:`errors`,plugins:`plugins`,performance:`performance`,build:`build`};function zT(e){return RT[e]}var BT=`https://pangular-inspector.dev/getting-started/configuration/#inspectors-and-agent-tools`;function VT(e,t){let n=RT[e];return!n||t.inspectors[n]}function HT(e,t){e&1&&(w(),fg(0,`rect`,5)(1,`rect`,6)(2,`rect`,7)(3,`rect`,8))}function UT(e,t){e&1&&(w(),fg(0,`path`,9)(1,`circle`,10)(2,`circle`,11)(3,`path`,12))}function WT(e,t){e&1&&(w(),fg(0,`path`,13)(1,`path`,14))}function GT(e,t){e&1&&(w(),fg(0,`path`,15)(1,`path`,16)(2,`path`,17))}function KT(e,t){e&1&&(w(),fg(0,`circle`,18)(1,`path`,19)(2,`circle`,20))}function qT(e,t){e&1&&(w(),fg(0,`path`,1))}function JT(e,t){e&1&&(w(),fg(0,`path`,21)(1,`path`,22)(2,`path`,23)(3,`path`,24))}function YT(e,t){e&1&&(w(),fg(0,`ellipse`,25)(1,`path`,26)(2,`path`,27))}function XT(e,t){e&1&&(w(),fg(0,`rect`,28)(1,`path`,29)(2,`path`,30)(3,`path`,31))}function ZT(e,t){e&1&&(w(),fg(0,`circle`,32)(1,`path`,9)(2,`path`,33))}function QT(e,t){e&1&&(w(),fg(0,`path`,34)(1,`path`,35)(2,`path`,36)(3,`path`,37)(4,`circle`,38))}function $T(e,t){e&1&&(w(),fg(0,`circle`,39)(1,`path`,40))}function eE(e,t){e&1&&(w(),fg(0,`ellipse`,41)(1,`path`,42)(2,`path`,43)(3,`path`,44)(4,`path`,45))}function tE(e,t){e&1&&(w(),fg(0,`circle`,32)(1,`path`,46)(2,`path`,47))}function nE(e,t){e&1&&(w(),fg(0,`path`,48)(1,`path`,49))}function rE(e,t){e&1&&(w(),fg(0,`path`,50)(1,`path`,51)(2,`path`,52))}function iE(e,t){e&1&&(w(),fg(0,`path`,2))}function aE(e,t){e&1&&(w(),fg(0,`path`,3))}function oE(e,t){e&1&&(w(),fg(0,`path`,4))}var sE=class e{name=$.required();static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-tab-icon`]],inputs:{name:[1,`name`]},decls:20,vars:1,consts:[[`viewBox`,`0 0 24 24`,`width`,`16`,`height`,`16`,`fill`,`none`,`stroke`,`currentColor`,`stroke-width`,`1.8`,`stroke-linecap`,`round`,`stroke-linejoin`,`round`,`aria-hidden`,`true`],[`d`,`M22 12h-4l-3 9L9 3l-3 9H2`],[`d`,`M10 3h4v3a2 2 0 1 0 4 0V5h1a2 2 0 0 1 2 2v4h-2a2 2 0 1 0 0 4h2v4a2 2 0 0 1-2 2h-4v-2a2 2 0 1 0-4 0v2H7a2 2 0 0 1-2-2v-4H4a2 2 0 1 1 0-4h1V7a2 2 0 0 1 2-2h3Z`],[`d`,`m8 3 4 8 5-5 5 15H2L8 3z`],[`fill`,`currentColor`,`stroke`,`none`,`transform`,`translate(1.8 1.8) scale(0.85)`,`d`,`M24 3.7l-5.766 5.766 5.725 5.736-3.713 3.712L5.073 3.742 8.786.03l5.736 5.726L20.284 0 24 3.7zM.029 8.785l3.713-3.713 15.173 15.173-3.713 3.714-5.732-5.726L3.7 24 0 20.285l5.754-5.764L.029 8.785z`],[`x`,`3`,`y`,`3`,`width`,`7`,`height`,`9`,`rx`,`1.5`],[`x`,`14`,`y`,`3`,`width`,`7`,`height`,`5`,`rx`,`1.5`],[`x`,`14`,`y`,`12`,`width`,`7`,`height`,`9`,`rx`,`1.5`],[`x`,`3`,`y`,`16`,`width`,`7`,`height`,`5`,`rx`,`1.5`],[`d`,`M3 12h18`],[`cx`,`7`,`cy`,`12`,`r`,`2`],[`cx`,`14`,`cy`,`12`,`r`,`2`],[`d`,`M18 7v10`],[`d`,`M9 11l2 2 4-4`],[`d`,`M12 3 4 6v6c0 4.5 3.4 8.3 8 9 4.6-.7 8-4.5 8-9V6l-8-3Z`],[`d`,`M12 2 3 7l9 5 9-5-9-5Z`],[`d`,`m3 12 9 5 9-5`],[`d`,`m3 17 9 5 9-5`],[`cx`,`6`,`cy`,`19`,`r`,`3`],[`d`,`M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15`],[`cx`,`18`,`cy`,`5`,`r`,`3`],[`d`,`M12 22v-5`],[`d`,`M9 8V2`],[`d`,`M15 8V2`],[`d`,`M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8Z`],[`cx`,`12`,`cy`,`5`,`rx`,`9`,`ry`,`3`],[`d`,`M3 5v14a9 3 0 0 0 18 0V5`],[`d`,`M3 12a9 3 0 0 0 18 0`],[`x`,`3`,`y`,`4`,`width`,`18`,`height`,`16`,`rx`,`2`],[`d`,`M7 9h10`],[`d`,`M7 13h6`],[`d`,`M7 17h8`],[`cx`,`12`,`cy`,`12`,`r`,`9`],[`d`,`M12 3a14 14 0 0 1 0 18a14 14 0 0 1 0-18Z`],[`d`,`M4 7h10`],[`d`,`M4 17h6`],[`d`,`m14 13 4 4-4 4`],[`d`,`M10 17h8`],[`cx`,`18`,`cy`,`7`,`r`,`3`],[`cx`,`12`,`cy`,`12`,`r`,`3`],[`d`,`M19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1.1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1.1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3H9a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8V9a1.7 1.7 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1Z`],[`cx`,`11`,`cy`,`5`,`rx`,`8`,`ry`,`3`],[`d`,`M3 5v6c0 1.66 3.58 3 8 3`],[`d`,`M3 11v6c0 1.66 3.58 3 8 3`],[`d`,`M21 14a4 4 0 1 1-1.2-2.85L21 12.3`],[`d`,`M21 9v3.3h-3.3`],[`d`,`M12 7v6`],[`d`,`M12 16.5v.01`],[`d`,`M12 14l4-4`],[`d`,`M3.34 19a10 10 0 1 1 17.32 0`],[`d`,`M21 16V8l-9-5-9 5v8l9 5 9-5Z`],[`d`,`m3.3 7 8.7 5 8.7-5`],[`d`,`M12 22V12`]],template:function(e,t){if(e&1&&(w(),R(0,`svg`,0),A(1,HT,4,0)(2,UT,4,0)(3,WT,2,0)(4,GT,3,0)(5,KT,3,0)(6,qT,1,0,`:svg:path`,1)(7,JT,4,0)(8,YT,3,0)(9,XT,4,0)(10,ZT,3,0)(11,QT,5,0)(12,$T,2,0)(13,eE,5,0)(14,tE,3,0)(15,nE,2,0)(16,rE,3,0)(17,iE,1,0,`:svg:path`,2)(18,aE,1,0,`:svg:path`,3)(19,oE,1,0,`:svg:path`,4),z()),e&2){let e;D(),j((e=t.name())===`dashboard`?1:e===`timeline`?2:e===`audit`?3:e===`components`?4:e===`routes`?5:e===`signals`?6:e===`injectors`?7:e===`store`?8:e===`forms`?9:e===`network`?10:e===`pipes`?11:e===`settings`?12:e===`queries`?13:e===`errors`?14:e===`performance`?15:e===`build`?16:e===`plugins`?17:e===`analog`?18:e===`capacitor`?19:-1)}},styles:[`[_nghost-%COMP%] { +`);return r>=0?n.slice(0,r):n}function _i(e,t){return e?t?`${e} ${t}`:e:t||``}var Hee=hi({__forward_ref__:hi});function vi(e){return e.__forward_ref__=vi,e}function yi(e){return bi(e)?e():e}function bi(e){return typeof e==`function`&&Object.hasOwn(e,Hee)&&e.__forward_ref__===vi}function xi(e){return{token:e.token,providedIn:e.providedIn||null,factory:e.factory,value:void 0}}function Si(e){return Ci(e,Ei)}function Ci(e,t){return Object.hasOwn(e,t)&&e[t]||null}function wi(e){return(e?.[Ei]??null)||null}function Ti(e){return e&&Object.hasOwn(e,Di)?e[Di]:null}var Ei=hi({ɵprov:hi}),Di=hi({ɵinj:hi}),Oi=class{_desc;ngMetadataName=`InjectionToken`;ɵprov;constructor(e,t){this._desc=e,this.ɵprov=void 0,typeof t==`number`?this.__NG_ELEMENT_ID__=t:t!==void 0&&(this.ɵprov=xi({token:this,providedIn:t.providedIn||`root`,factory:t.factory}))}get multi(){return this}toString(){return`InjectionToken ${this._desc}`}};function ki(e){return e&&!!e.ɵproviders}var Ai=hi({ɵcmp:hi}),ji=hi({ɵdir:hi}),Mi=hi({ɵpipe:hi}),Ni=hi({ɵfac:hi}),Pi=hi({__NG_ELEMENT_ID__:hi}),Fi=hi({__NG_ENV_ID__:hi});function Ii(e){return zi(e,`@Component`),e[Ai]||null}function Li(e){return zi(e,`@Directive`),e[ji]||null}function Ri(e){return zi(e,`@Pipe`),e[Mi]||null}function zi(e,t){if(e==null)throw new pi(-919,!1)}function Bi(e){return typeof e==`string`?e:e==null?``:String(e)}var Vi=hi({ngErrorCode:hi}),Hi=hi({ngErrorMessage:hi}),Ui=hi({ngTokenPath:hi});function Wi(e,t){return Ki(``,-200,t)}function Gi(e,t){throw new pi(-201,!1)}function Ki(e,t,n){let r=new pi(t,e);return r[Vi]=t,r[Hi]=e,n&&(r[Ui]=n),r}function qi(e){return e[Vi]}var Ji;function Yi(){return Ji}function Xi(e){let t=Ji;return Ji=e,t}function Zi(e,t,n){let r=Si(e);if(r&&r.providedIn==`root`)return r.value===void 0?r.value=r.factory():r.value;if(n&8)return null;if(t!==void 0)return t;Gi(e,``)}var Qi=globalThis,$i={},ea=`__NG_DI_FLAG__`,ta=class{injector;constructor(e){this.injector=e}retrieve(e,t){let n=ia(t)||0;try{return this.injector.get(e,n&8?null:$i,n)}catch(e){if(Hn(e))return e;throw e}}};function na(e,t=0){let n=zn();if(n===void 0)throw new pi(-203,!1);if(n===null)return Zi(e,void 0,t);{let r=aa(t),i=n.retrieve(e,r);if(Hn(i)){if(r.optional)return null;throw i}return i}}function ra(e,t=0){return(Yi()||na)(yi(e),t)}function x(e,t){return ra(e,ia(t))}function ia(e){return e===void 0||typeof e==`number`?e:0|(e.optional&&8)|(e.host&&1)|(e.self&&2)|(e.skipSelf&&4)}function aa(e){return{optional:!!(e&8),host:!!(e&1),self:!!(e&2),skipSelf:!!(e&4)}}function oa(e){let t=[];for(let n=0;nArray.isArray(e)?da(e,t):t(e))}function fa(e,t,n){t>=e.length?e.push(n):e.splice(t,0,n)}function pa(e,t){return t>=e.length-1?e.pop():e.splice(t,1)[0]}function ma(e,t){let n=[];for(let r=0;rt;){let t=i-2;e[i]=e[t],i--}e[t]=n,e[t+1]=r}}function ga(e,t,n){let r=va(e,t);return r>=0?e[r|1]=n:(r=~r,ha(e,r,t,n)),r}function _a(e,t){let n=va(e,t);if(n>=0)return e[n|1]}function va(e,t){return ya(e,t,1)}function ya(e,t,n){let r=0,i=e.length>>n;for(;i!==r;){let a=r+(i-r>>1),o=e[a<t?i=a:r=a+1}return~(i<{n.push(e)};return da(t,e=>{let t=e;ka(t,a,[],r)&&(i||=[],i.push(t))}),i!==void 0&&Oa(i,a),n}function Oa(e,t){for(let n=0;n{t(e,r)})}}function ka(e,t,n,r){if(e=yi(e),!e)return!1;let i=null,a=Ti(e),o=!a&&Ii(e);if(!a&&!o){let t=e.ngModule;if(a=Ti(t),a)i=t;else return!1}else if(o&&!o.standalone)return!1;else i=e;let s=r.has(i);if(o){if(s)return!1;if(r.add(i),o.dependencies){let e=typeof o.dependencies==`function`?o.dependencies():o.dependencies;for(let i of e)ka(i,t,n,r)}}else if(a){if(a.imports!=null&&!s){r.add(i);let e;try{da(a.imports,i=>{ka(i,t,n,r)&&(e||=[],e.push(i))})}finally{}e!==void 0&&Oa(e,t)}if(!s){let e=ca(i)||(()=>new i);t({provide:i,useFactory:e,deps:xa},i),t({provide:wa,useValue:i,multi:!0},i),t({provide:Sa,useValue:()=>ra(i),multi:!0},i)}let o=a.providers;if(o!=null&&!s){let n=e;Aa(o,e=>{t(e,n)})}}else return!1;return i!==e&&e.providers!==void 0}function Aa(e,t){for(let n of e)ki(n)&&(n=n.ɵproviders),Array.isArray(n)?Aa(n,t):t(n)}var ja=hi({provide:String,useValue:hi});function Ma(e){return typeof e==`object`&&!!e&&ja in e}function Na(e){return!!(e&&e.useExisting)}function Pa(e){return!!(e&&e.useFactory)}function Fa(e){return typeof e==`function`}function Ia(e){return!!e.useClass}var La=new Oi(``),Ra={},za={},Ba=void 0;function Va(){return Ba===void 0&&(Ba=new Ta),Ba}var Ha=class{},Ua=class extends Ha{parent;source;scopes;records=new Map;_ngOnDestroyHooks=new Set;_onDestroyHooks=[];get destroyed(){return this._destroyed}_destroyed=!1;injectorDefTypes;constructor(e,t,n,r){super(),this.parent=t,this.source=n,this.scopes=r,$a(e,e=>this.processProvider(e)),this.records.set(Ca,Ya(void 0,this)),r.has(`environment`)&&this.records.set(Ha,Ya(void 0,this));let i=this.records.get(La);i!=null&&typeof i.value==`string`&&this.scopes.add(i.value),this.injectorDefTypes=new Set(this.get(wa,xa,{self:!0}))}retrieve(e,t){let n=ia(t)||0;try{return this.get(e,$i,n)}catch(e){if(Hn(e))return e;throw e}}destroy(){Ja(this),this._destroyed=!0;let e=an(null);try{for(let e of this._ngOnDestroyHooks)e.ngOnDestroy();let e=this._onDestroyHooks;this._onDestroyHooks=[];for(let t of e)t()}finally{this.records.clear(),this._ngOnDestroyHooks.clear(),this.injectorDefTypes.clear(),an(e)}}onDestroy(e){return Ja(this),this._onDestroyHooks.push(e),()=>this.removeOnDestroy(e)}runInContext(e){Ja(this);let t=Bn(this),n=Xi(void 0);try{return e()}finally{Bn(t),Xi(n)}}get(e,t=$i,n){if(Ja(this),Object.hasOwn(e,Fi))return e[Fi](this);let r=ia(n),i=Bn(this),a=Xi(void 0);try{if(!(r&4)){let t=this.records.get(e);if(t===void 0){let n=Qa(e)&&Si(e);t=n&&this.injectableDefInScope(n)?Ya(Wa(e),Ra):null,this.records.set(e,t)}if(t!=null)return this.hydrate(e,t,r)}let n=r&2?Va():this.parent;return t=r&8&&t===$i?null:t,n.get(e,t)}catch(e){let t=qi(e);throw t===-200||t===-201?new pi(t,null):e}finally{Xi(a),Bn(i)}}resolveInjectorInitializers(){let e=an(null),t=Bn(this),n=Xi(void 0);try{let e=this.get(Sa,xa,{self:!0});for(let t of e)t()}finally{Bn(t),Xi(n),an(e)}}toString(){return`R3Injector[...]`}processProvider(e){e=yi(e);let t=Fa(e)?e:yi(e&&e.provide),n=Ka(e);if(!Fa(e)&&e.multi===!0){let n=this.records.get(t);n||(n=Ya(void 0,Ra,!0),n.factory=()=>oa(n.multi),this.records.set(t,n)),t=e,n.multi.push(e)}this.records.set(t,n)}hydrate(e,t,n){let r=an(null);try{if(t.value===za)throw Wi(``);return t.value===Ra&&(t.value=za,t.value=t.factory(void 0,n)),typeof t.value==`object`&&t.value&&Za(t.value)&&this._ngOnDestroyHooks.add(t.value),t.value}finally{an(r)}}injectableDefInScope(e){if(!e.providedIn)return!1;let t=yi(e.providedIn);return typeof t==`string`?t===`any`||this.scopes.has(t):this.injectorDefTypes.has(t)}removeOnDestroy(e){let t=this._onDestroyHooks.indexOf(e);t!==-1&&this._onDestroyHooks.splice(t,1)}};function Wa(e){let t=Si(e),n=t===null?ca(e):t.factory;if(n!==null)return n;if(e instanceof Oi)throw new pi(-204,!1);if(e instanceof Function)return Ga(e);throw new pi(-204,!1)}function Ga(e){if(e.length>0)throw new pi(-204,!1);let t=wi(e);return t===null?()=>new e:()=>t.factory(e)}function Ka(e){return Ma(e)?Ya(void 0,e.useValue):Ya(qa(e),Ra)}function qa(e,t,n){let r;if(Fa(e)){let t=yi(e);return ca(t)||Wa(t)}if(Ma(e))r=()=>yi(e.useValue);else if(Pa(e))r=()=>e.useFactory(...oa(e.deps||[]));else if(Na(e))r=(t,n)=>ra(yi(e.useExisting),n!==void 0&&n&8?8:void 0);else{let t=yi(e&&(e.useClass||e.provide));if(Xa(e))r=()=>new t(...oa(e.deps));else return ca(t)||Wa(t)}return r}function Ja(e){if(e.destroyed)throw new pi(-205,!1)}function Ya(e,t,n=!1){return{factory:e,value:t,multi:n?[]:void 0}}function Xa(e){return!!e.deps}function Za(e){return typeof e==`object`&&!!e&&typeof e.ngOnDestroy==`function`}function Qa(e){return typeof e==`function`||typeof e==`object`&&e.ngMetadataName===`InjectionToken`}function $a(e,t){for(let n of e)Array.isArray(n)?$a(n,t):n&&ki(n)?$a(n.ɵproviders,t):t(n)}function eo(e,t){let n;e instanceof Ua?(Ja(e),n=e):n=new ta(e);let r=Bn(n),i=Xi(void 0);try{return t()}finally{Bn(r),Xi(i)}}function to(){return Yi()!==void 0||zn()!=null}var no=1;function ro(e){return Array.isArray(e)&&typeof e[no]==`object`}function io(e){return Array.isArray(e)&&e[no]===!0}function ao(e){return!!(e.flags&4)}function oo(e){return e.componentOffset>-1}function so(e){return(e.flags&1)==1}function co(e){return!!e.template}function lo(e){return!!(e[2]&512)}function uo(e){return(e[2]&256)==256}var fo=(function(e){return e[e.NONE=0]=`NONE`,e[e.HTML=1]=`HTML`,e[e.STYLE=2]=`STYLE`,e[e.SCRIPT=3]=`SCRIPT`,e[e.URL=4]=`URL`,e[e.RESOURCE_URL=5]=`RESOURCE_URL`,e[e.ATTRIBUTE_NO_BINDING=6]=`ATTRIBUTE_NO_BINDING`,e})(fo||{}),po=`math`;function mo(e){for(;Array.isArray(e);)e=e[0];return e}function ho(e,t){return mo(t[e])}function go(e,t){return mo(t[e.index])}function _o(e,t){return e.data[t]}function vo(e,t){return e[t]}function yo(e,t,n,r){n>=e.data.length&&(e.data[n]=null,e.blueprint[n]=null),t[n]=r}function bo(e,t){let n=t[e];return ro(n)?n:n[0]}function xo(e){return(e[2]&128)==128}function So(e){return io(e[3])}function Co(e,t){return t==null?null:e[t]}function wo(e){e[17]=0}function To(e){e[2]&1024||(e[2]|=1024,xo(e)&&ko(e))}function Eo(e,t){for(;e>0;)t=t[14],e--;return t}function Do(e){return!!(e[2]&9216||e[24]?.dirty)}function Oo(e){e[10].changeDetectionScheduler?.notify(8),e[2]&64&&(e[2]|=1024),Do(e)&&ko(e)}function ko(e){e[10].changeDetectionScheduler?.notify(0);let t=jo(e);for(;t!==null&&!(t[2]&8192||(t[2]|=8192,!xo(t)));)t=jo(t)}function Ao(e,t){if(uo(e))throw new pi(911,!1);e[21]===null&&(e[21]=[]),e[21].push(t)}function Uee(e,t){if(e[21]===null)return;let n=e[21].indexOf(t);n!==-1&&e[21].splice(n,1)}function jo(e){let t=e[3];return io(t)?t[3]:t}function Mo(e){return e[7]??=[]}function No(e){return e.cleanup??=[]}function Wee(e,t,n,r){let i=Mo(t);i.push(n),e.firstCreatePass&&No(e).push(r,i.length-1)}var Po={lFrame:os(null),bindingsEnabled:!0,skipHydrationRootTNode:null},Fo=!1;function Gee(){return Po.lFrame.elementDepthCount}function Kee(){Po.lFrame.elementDepthCount++}function Io(){Po.lFrame.elementDepthCount--}function Lo(){return Po.bindingsEnabled}function Ro(){return Po.skipHydrationRootTNode!==null}function zo(e){return Po.skipHydrationRootTNode===e}function Bo(){Po.skipHydrationRootTNode=null}function Vo(){return Po.lFrame.lView}function Ho(){return Po.lFrame.tView}function S(e){return Po.lFrame.contextLView=e,e[8]}function C(e){return Po.lFrame.contextLView=null,e}function Uo(){let e=Wo();for(;e!==null&&e.type===64;)e=e.parent;return e}function Wo(){return Po.lFrame.currentTNode}function qee(){let e=Po.lFrame,t=e.currentTNode;return e.isParent?t:t.parent}function Go(e,t){let n=Po.lFrame;n.currentTNode=e,n.isParent=t}function Ko(){return Po.lFrame.isParent}function qo(){Po.lFrame.isParent=!1}function Jo(){return Po.lFrame.contextLView}function Yo(){return Fo}function Xo(e){let t=Fo;return Fo=e,t}function Zo(){let e=Po.lFrame,t=e.bindingRootIndex;return t===-1&&(t=e.bindingRootIndex=e.tView.bindingStartIndex),t}function Qo(){return Po.lFrame.bindingIndex}function Jee(e){return Po.lFrame.bindingIndex=e}function $o(){return Po.lFrame.bindingIndex++}function es(e){let t=Po.lFrame,n=t.bindingIndex;return t.bindingIndex+=e,n}function Yee(){return Po.lFrame.inI18n}function Xee(e,t){let n=Po.lFrame;n.bindingIndex=n.bindingRootIndex=e,ts(t)}function Zee(){return Po.lFrame.currentDirectiveIndex}function ts(e){Po.lFrame.currentDirectiveIndex=e}function Qee(e){let t=Po.lFrame.currentDirectiveIndex;return t===-1?null:e[t]}function $ee(){return Po.lFrame.currentQueryIndex}function ns(e){Po.lFrame.currentQueryIndex=e}function ete(e){let t=e[1];return t.type===2?t.declTNode:t.type===1?e[5]:null}function rs(e,t,n){if(n&4){let r=t,i=e;for(;r=r.parent,r===null&&!(n&1)&&(r=ete(i),!(r===null||(i=i[14],r.type&10))););if(r===null)return!1;t=r,e=i}let r=Po.lFrame=as();return r.currentTNode=t,r.lView=e,!0}function is(e){let t=as(),n=e[1];Po.lFrame=t,t.currentTNode=n.firstChild,t.lView=e,t.tView=n,t.contextLView=e,t.bindingIndex=n.bindingStartIndex,t.inI18n=!1}function as(){let e=Po.lFrame,t=e===null?null:e.child;return t===null?os(e):t}function os(e){let t={currentTNode:null,isParent:!0,lView:null,tView:null,selectedIndex:-1,contextLView:null,elementDepthCount:0,currentNamespace:null,currentDirectiveIndex:-1,bindingRootIndex:-1,bindingIndex:-1,currentQueryIndex:0,parent:e,child:null,inI18n:!1};return e!==null&&(e.child=t),t}function ss(){let e=Po.lFrame;return Po.lFrame=e.parent,e.currentTNode=null,e.lView=null,e}var cs=ss;function ls(){let e=ss();e.isParent=!0,e.tView=null,e.selectedIndex=-1,e.contextLView=null,e.elementDepthCount=0,e.currentDirectiveIndex=-1,e.currentNamespace=null,e.bindingRootIndex=-1,e.bindingIndex=-1,e.currentQueryIndex=0}function tte(e){return(Po.lFrame.contextLView=Eo(e,Po.lFrame.contextLView))[8]}function us(){return Po.lFrame.selectedIndex}function ds(e){Po.lFrame.selectedIndex=e}function fs(){let e=Po.lFrame;return _o(e.tView,e.selectedIndex)}function w(){Po.lFrame.currentNamespace=`svg`}function ps(){ms()}function ms(){Po.lFrame.currentNamespace=null}function hs(){return Po.lFrame.currentNamespace}var gs=!0;function _s(){return gs}function vs(e){gs=e}function ys(e,t=null,n=null,r){let i=bs(e,t,n,r);return i.resolveInjectorInitializers(),i}function bs(e,t=null,n=null,r,i=new Set){return new Ua([n||xa,Ea(e)],t||Va(),null,i)}var xs=class e{static THROW_IF_NOT_FOUND=$i;static NULL=new Ta;static create(e,t){if(Array.isArray(e))return ys({name:``},t,e,``);{let t=e.name??``;return ys({name:t},e.parent,e.providers,t)}}static ɵprov=xi({token:e,providedIn:`any`,factory:()=>ra(Ca)});static __NG_ELEMENT_ID__=-1},Ss=new Oi(``),Cs=class{static __NG_ELEMENT_ID__=Ts;static __NG_ENV_ID__=e=>e},ws=class extends Cs{_lView;constructor(e){super(),this._lView=e}get destroyed(){return uo(this._lView)}onDestroy(e){let t=this._lView;return Ao(t,e),()=>Uee(t,e)}};function Ts(){return new ws(Vo())}var Es=new Oi(``),Ds=(()=>{class e{taskId=0;pendingTasks=new Set;destroyed=!1;pendingTask=new Kr(!1);debugTaskTracker=x(Es,{optional:!0});get hasPendingTasks(){return!this.destroyed&&this.pendingTask.value}get hasPendingTasksObservable(){return this.destroyed?new Fr(e=>{e.next(!1),e.complete()}):this.pendingTask}add(){!this.hasPendingTasks&&!this.destroyed&&this.pendingTask.next(!0);let e=this.taskId++;return this.pendingTasks.add(e),this.debugTaskTracker?.add(e),e}has(e){return this.pendingTasks.has(e)}remove(e){this.pendingTasks.delete(e),this.debugTaskTracker?.remove(e),this.pendingTasks.size===0&&this.hasPendingTasks&&this.pendingTask.next(!1)}ngOnDestroy(){this.pendingTasks.clear(),this.hasPendingTasks&&this.pendingTask.next(!1),this.destroyed=!0,this.pendingTask.unsubscribe()}static ɵprov=xi({token:e,providedIn:`root`,factory:()=>new e})}return e})(),Os=class extends Wr{__isAsync;destroyRef=void 0;pendingTasks=void 0;constructor(e=!1){super(),this.__isAsync=e,to()&&(this.destroyRef=x(Cs,{optional:!0})??void 0,this.pendingTasks=x(Ds,{optional:!0})??void 0)}emit(e){let t=an(null);try{super.next(e)}finally{an(t)}}subscribe(e,t,n){let r=e,i=t||(()=>null),a=n;if(e&&typeof e==`object`){let t=e;r=t.next?.bind(t),i=t.error?.bind(t),a=t.complete?.bind(t)}this.__isAsync&&(i=this.wrapInTimeout(i),r&&=this.wrapInTimeout(r),a&&=this.wrapInTimeout(a));let o=super.subscribe({next:r,error:i,complete:a});return e instanceof cr&&e.add(o),o}wrapInTimeout(e){return t=>{let n=this.pendingTasks?.add();setTimeout(()=>{try{e(t)}finally{n!==void 0&&this.pendingTasks?.remove(n)}})}}};function ks(...e){}function As(e){let t,n;function r(){e=ks;try{n!==void 0&&typeof cancelAnimationFrame==`function`&&cancelAnimationFrame(n),t!==void 0&&clearTimeout(t)}catch{}}return t=setTimeout(()=>{e(),r()}),typeof requestAnimationFrame==`function`&&(n=requestAnimationFrame(()=>{e(),r()})),()=>r()}function js(e){return queueMicrotask(()=>e()),()=>{e=ks}}var Ms=`isAngularZone`,Ns=`isAngularZone_ID`,Ps=0,Fs=class e{hasPendingMacrotasks=!1;hasPendingMicrotasks=!1;isStable=!0;onUnstable=new Os(!1);onMicrotaskEmpty=new Os(!1);onStable=new Os(!1);onError=new Os(!1);constructor(e){let{enableLongStackTrace:t=!1,shouldCoalesceEventChangeDetection:n=!1,shouldCoalesceRunChangeDetection:r=!1,scheduleInRootZone:i=!1}=e;if(typeof Zone>`u`)throw new pi(908,!1);Zone.assertZonePatched();let a=this;a._nesting=0,a._outer=a._inner=Zone.current,Zone.TaskTrackingZoneSpec&&(a._inner=a._inner.fork(new Zone.TaskTrackingZoneSpec)),t&&Zone.longStackTraceZoneSpec&&(a._inner=a._inner.fork(Zone.longStackTraceZoneSpec)),a.shouldCoalesceEventChangeDetection=!r&&n,a.shouldCoalesceRunChangeDetection=r,a.callbackScheduled=!1,a.scheduleInRootZone=i,zs(a)}static isInAngularZone(){return typeof Zone<`u`&&Zone.current.get(Ms)===!0}static assertInAngularZone(){if(!e.isInAngularZone())throw new pi(909,!1)}static assertNotInAngularZone(){if(e.isInAngularZone())throw new pi(909,!1)}run(e,t,n){return this._inner.run(e,t,n)}runTask(e,t,n,r){let i=this._inner,a=i.scheduleEventTask(`NgZoneEvent: `+r,e,Is,ks,ks);try{return i.runTask(a,t,n)}finally{i.cancelTask(a)}}runGuarded(e,t,n){return this._inner.runGuarded(e,t,n)}runOutsideAngular(e){return this._outer.run(e)}},Is={};function Ls(e){if(e._nesting==0&&!e.hasPendingMicrotasks&&!e.isStable)try{e._nesting++,e.onMicrotaskEmpty.emit(null)}finally{if(e._nesting--,!e.hasPendingMicrotasks)try{e.runOutsideAngular(()=>e.onStable.emit(null))}finally{e.isStable=!0}}}function Rs(e){if(e.isCheckStableRunning||e.callbackScheduled)return;e.callbackScheduled=!0;function t(){As(()=>{e.callbackScheduled=!1,Bs(e),e.isCheckStableRunning=!0,Ls(e),e.isCheckStableRunning=!1})}e.scheduleInRootZone?Zone.root.run(()=>{t()}):e._outer.run(()=>{t()}),Bs(e)}function zs(e){let t=()=>{Rs(e)},n=Ps++;e._inner=e._inner.fork({name:`angular`,properties:{[Ms]:!0,[Ns]:n,[Ns+n]:!0},onInvokeTask:(n,r,i,a,o,s)=>{if(Ws(s))return n.invokeTask(i,a,o,s);try{return Vs(e),n.invokeTask(i,a,o,s)}finally{(e.shouldCoalesceEventChangeDetection&&a.type===`eventTask`||e.shouldCoalesceRunChangeDetection)&&t(),Hs(e)}},onInvoke:(n,r,i,a,o,s,c)=>{try{return Vs(e),n.invoke(i,a,o,s,c)}finally{e.shouldCoalesceRunChangeDetection&&!e.callbackScheduled&&!Gs(s)&&t(),Hs(e)}},onHasTask:(t,n,r,i)=>{t.hasTask(r,i),n===r&&(i.change==`microTask`?(e._hasPendingMicrotasks=i.microTask,Bs(e),Ls(e)):i.change==`macroTask`&&(e.hasPendingMacrotasks=i.macroTask))},onHandleError:(t,n,r,i)=>(t.handleError(r,i),e.runOutsideAngular(()=>e.onError.emit(i)),!1)})}function Bs(e){e.hasPendingMicrotasks=!!(e._hasPendingMicrotasks||(e.shouldCoalesceEventChangeDetection||e.shouldCoalesceRunChangeDetection)&&e.callbackScheduled===!0)}function Vs(e){e._nesting++,e.isStable&&(e.isStable=!1,e.onUnstable.emit(null))}function Hs(e){e._nesting--,Ls(e)}var Us=class{hasPendingMicrotasks=!1;hasPendingMacrotasks=!1;isStable=!0;onUnstable=new Os;onMicrotaskEmpty=new Os;onStable=new Os;onError=new Os;run(e,t,n){return e.apply(t,n)}runGuarded(e,t,n){return e.apply(t,n)}runOutsideAngular(e){return e()}runTask(e,t,n,r){return e.apply(t,n)}};function Ws(e){return Ks(e,`__ignore_ng_zone__`)}function Gs(e){return Ks(e,`__scheduler_tick__`)}function Ks(e,t){return!Array.isArray(e)||e.length!==1?!1:e[0]?.data?.[t]===!0}var qs=class{_console=console;handleError(e){this._console.error(`ERROR`,e)}},Js=new Oi(``,{factory:()=>{let e=x(Fs),t=x(Ha),n;return r=>{e.runOutsideAngular(()=>{t.destroyed&&!n?setTimeout(()=>{throw r}):(n??=t.get(qs),n.handleError(r))})}}}),Ys={provide:Sa,useValue:()=>{x(qs,{optional:!0})},multi:!0};function T(e,t){let[n,r,i]=mee(e,t?.equal),a=n;return a[rn],a.set=r,a.update=i,a.asReadonly=Xs.bind(a),a}function Xs(){let e=this[rn];if(e.readonlyFn===void 0){let t=()=>this();t[rn]=e,e.readonlyFn=t}return e.readonlyFn}var Zs=new Oi(``,{factory:()=>Qs}),Qs=`ng`,$s=new Oi(``),ec=new Oi(``,{providedIn:`platform`,factory:()=>`unknown`}),tc=new Oi(``,{factory:()=>x(Ss).body?.querySelector(`[ngCspNonce]`)?.getAttribute(`ngCspNonce`)||null}),nc=(()=>{class e{view;node;constructor(e,t){this.view=e,this.node=t}static __NG_ELEMENT_ID__=rc}return e})();function rc(){return new nc(Vo(),Uo())}var ic=class{},ac=new Oi(``,{factory:()=>!0}),oc=new Oi(``),sc=(()=>{class e{static ɵprov=xi({token:e,providedIn:`root`,factory:()=>new cc})}return e})(),cc=class{dirtyEffectCount=0;queues=new Map;add(e){this.enqueue(e),this.schedule(e)}schedule(e){e.dirty&&this.dirtyEffectCount++}remove(e){let t=e.zone,n=this.queues.get(t);n.has(e)&&(n.delete(e),e.dirty&&this.dirtyEffectCount--)}enqueue(e){let t=e.zone;this.queues.has(t)||this.queues.set(t,new Set);let n=this.queues.get(t);n.has(e)||n.add(e)}flush(){for(;this.dirtyEffectCount>0;){let e=!1;for(let[t,n]of this.queues)e||=t===null?this.flushQueue(n):t.run(()=>this.flushQueue(n));e||(this.dirtyEffectCount=0)}}flushQueue(e){let t=!1;for(let n of e)n.dirty&&(this.dirtyEffectCount--,t=!0,n.run());return t}},lc=class{[rn];constructor(e){this[rn]=e}destroy(){this[rn].destroy()}};function E(e,t){let n=t?.injector??x(xs),r=t?.manualCleanup===!0?null:n.get(Cs),i,a=n.get(nc,null,{optional:!0}),o=n.get(ic);return a===null?i=mc(e,n.get(sc),o):(i=pc(a.view,o,e),r instanceof ws&&r._lView===a.view&&(r=null)),i.injector=n,r!==null&&(i.onDestroyFns=[r.onDestroy(()=>i.destroy())]),new lc(i)}var uc={...In,cleanupFns:void 0,zone:null,onDestroyFns:null,run(){let e=Xo(!1);try{Ln(this)}finally{Xo(e)}},cleanup(){if(!this.cleanupFns?.length)return;let e=an(null);try{for(;this.cleanupFns.length;)this.cleanupFns.pop()()}finally{this.cleanupFns=[],an(e)}}},dc={...uc,consumerMarkedDirty(){this.scheduler.schedule(this),this.notifier.notify(12)},destroy(){if(bn(this),this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();this.cleanup(),this.scheduler.remove(this)}},fc={...uc,consumerMarkedDirty(){this.view[2]|=8192,ko(this.view),this.notifier.notify(13)},destroy(){if(bn(this),this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();this.cleanup(),this.view[23]?.delete(this)}};function pc(e,t,n){let r=Object.create(fc);return r.view=e,r.zone=typeof Zone<`u`?Zone.current:null,r.notifier=t,r.fn=hc(r,n),e[23]??=new Set,e[23].add(r),r.consumerMarkedDirty(r),r}function mc(e,t,n){let r=Object.create(dc);return r.fn=hc(r,e),r.scheduler=t,r.notifier=n,r.zone=typeof Zone<`u`?Zone.current:null,r.scheduler.add(r),r.notifier.notify(12),r}function hc(e,t){return()=>{t(t=>(e.cleanupFns??=[]).push(t))}}function gc(e){return typeof e==`function`&&e[rn]!==void 0}function _c(e){return gc(e)&&typeof e.set==`function`}var vc=Symbol(`InputSignalNode#UNSET`),yc={...Pn,transformFn:void 0,applyValueToInputSignal(e,t){Mn(e,t)}};function bc(e){return{toString:e}.toString()}var xc=(function(e){return e[e.TemplateCreateStart=0]=`TemplateCreateStart`,e[e.TemplateCreateEnd=1]=`TemplateCreateEnd`,e[e.TemplateUpdateStart=2]=`TemplateUpdateStart`,e[e.TemplateUpdateEnd=3]=`TemplateUpdateEnd`,e[e.LifecycleHookStart=4]=`LifecycleHookStart`,e[e.LifecycleHookEnd=5]=`LifecycleHookEnd`,e[e.OutputStart=6]=`OutputStart`,e[e.OutputEnd=7]=`OutputEnd`,e[e.BootstrapApplicationStart=8]=`BootstrapApplicationStart`,e[e.BootstrapApplicationEnd=9]=`BootstrapApplicationEnd`,e[e.BootstrapComponentStart=10]=`BootstrapComponentStart`,e[e.BootstrapComponentEnd=11]=`BootstrapComponentEnd`,e[e.ChangeDetectionStart=12]=`ChangeDetectionStart`,e[e.ChangeDetectionEnd=13]=`ChangeDetectionEnd`,e[e.ChangeDetectionSyncStart=14]=`ChangeDetectionSyncStart`,e[e.ChangeDetectionSyncEnd=15]=`ChangeDetectionSyncEnd`,e[e.AfterRenderHooksStart=16]=`AfterRenderHooksStart`,e[e.AfterRenderHooksEnd=17]=`AfterRenderHooksEnd`,e[e.ComponentStart=18]=`ComponentStart`,e[e.ComponentEnd=19]=`ComponentEnd`,e[e.DeferBlockStateStart=20]=`DeferBlockStateStart`,e[e.DeferBlockStateEnd=21]=`DeferBlockStateEnd`,e[e.DynamicComponentStart=22]=`DynamicComponentStart`,e[e.DynamicComponentEnd=23]=`DynamicComponentEnd`,e[e.HostBindingsUpdateStart=24]=`HostBindingsUpdateStart`,e[e.HostBindingsUpdateEnd=25]=`HostBindingsUpdateEnd`,e})(xc||{}),Sc=class{previousValue;currentValue;firstChange;constructor(e,t,n){this.previousValue=e,this.currentValue=t,this.firstChange=n}isFirstChange(){return this.firstChange}};function Cc(e,t,n,r){t===null?e[n]=r:t.applyValueToInputSignal(t,r)}var wc=null,Tc=(()=>{wc=Dc;let e=()=>Dc;return e.ngInherit=!0,e})();function Ec(){return wc}function Dc(e){return e.type.prototype.ngOnChanges&&(e.setInput=kc),Oc}function Oc(){let e=jc(this),t=e?.current;if(t){let n=e.previous;if(n===ba)e.previous=t;else for(let e in t)n[e]=t[e];e.current=null,this.ngOnChanges(t)}}function kc(e,t,n,r,i){let a=this.declaredInputs[r],o=jc(e)||Mc(e,{previous:ba,current:null}),s=o.current||={},c=o.previous,l=c[a];s[a]=new Sc(l&&l.currentValue,n,c===ba),Cc(e,t,i,n)}var Ac=`__ngSimpleChanges__`;function jc(e){return Object.hasOwn(e,Ac)&&e[Ac]||null}function Mc(e,t){return e[Ac]=t}var Nc=[],Pc=function(e,t=null,n){for(let r=0;r=r)break}else t[c]<0&&(e[17]+=65536),(s>14>16&&(e[2]&3)===t&&(e[2]+=16384,Vc(o,a)):Vc(o,a)}var Uc=-1,Wc=class{factory;name;injectImpl;resolving=!1;canSeeViewProviders;multi;componentProviders;index;providerFactory;constructor(e,t,n,r){this.factory=e,this.name=r,this.canSeeViewProviders=t,this.injectImpl=n}};function Gc(e){return!!(e.flags&8)}function Kc(e){return!!(e.flags&16)}function qc(e,t,n){let r=0;for(;rt){o=a-1;break}}}for(;a>16}function tl(e,t){let n=el(e),r=t;for(;n>0;)r=r[14],n--;return r}var nl=!0;function rl(e){let t=nl;return nl=e,t}var il=255,al=5,ol=0,sl={};function cl(e,t,n){let r;typeof n==`string`?r=n.charCodeAt(0)||0:Object.hasOwn(n,Pi)&&(r=n[Pi]),r??=n[Pi]=ol++;let i=r&il,a=1<>al)]|=a}function ll(e,t){let n=dl(e,t);if(n!==-1)return n;let r=t[1];r.firstCreatePass&&(e.injectorIndex=t.length,ul(r.data,e),ul(t,null),ul(r.blueprint,null));let i=fl(e,t),a=e.injectorIndex;if(Qc(i)){let e=$c(i),n=tl(i,t),r=n[1].data;for(let i=0;i<8;i++)t[a+i]=n[e+i]|r[e+i]}return t[a+8]=i,a}function ul(e,t){e.push(0,0,0,0,0,0,0,0,t)}function dl(e,t){return e.injectorIndex===-1||e.parent&&e.parent.injectorIndex===e.injectorIndex||t[e.injectorIndex+8]===null?-1:e.injectorIndex}function fl(e,t){if(e.parent&&e.parent.injectorIndex!==-1)return e.parent.injectorIndex;let n=0,r=null,i=t;for(;i!==null;){if(r=kl(i),r===null)return Uc;if(n++,i=i[14],r.injectorIndex!==-1)return r.injectorIndex|n<<16}return Uc}function pl(e,t,n){cl(e,t,n)}function ml(e,t,n){if(n&8||e!==void 0)return e;Gi(t,`NodeInjector`)}function hl(e,t,n,r){if(n&8&&r===void 0&&(r=null),!(n&3)){let i=e[9],a=Xi(void 0);try{return i?i.get(t,r,n&8):Zi(t,r,n&8)}finally{Xi(a)}}return ml(r,t,n)}function gl(e,t,n,r=0,i){if(e!==null){if(t[2]&2048&&!(r&2)){let i=Ol(e,t,n,r,sl);if(i!==sl)return i}let i=_l(e,t,n,r,sl);if(i!==sl)return i}return hl(t,n,r,i)}function _l(e,t,n,r,i){let a=xl(n);if(typeof a==`function`){if(!rs(t,e,r))return r&1?ml(i,n,r):hl(t,n,r,i);try{let e;if(e=a(r),e==null&&!(r&8))Gi(n);else return e}finally{cs()}}else if(typeof a==`number`){let i=null,o=dl(e,t),s=Uc,c=r&1?t[15][5]:null;for((o===-1||r&4)&&(s=o===-1?fl(e,t):t[o+8],s===Uc||!Cl(r,!1)?o=-1:(i=t[1],o=$c(s),t=tl(s,t)));o!==-1;){let e=t[1];if(Sl(a,o,e.data)){let e=vl(o,t,n,i,r,c);if(e!==sl)return e}s=t[o+8],s!==Uc&&Cl(r,t[1].data[o+8]===c)&&Sl(a,o,t)?(i=e,o=$c(s),t=tl(s,t)):o=-1}}return i}function vl(e,t,n,r,i,a){let o=t[1],s=o.data[e+8],c=yl(s,o,n,r==null?oo(s)&&nl:r!=o&&!!(s.type&3),i&1&&a===s);return c===null?sl:bl(t,o,c,s,i)}function yl(e,t,n,r,i){let a=e.providerIndexes,o=t.data,s=a&1048575,c=e.directiveStart,l=e.directiveEnd,u=a>>20,d=r?s:s+u,f=i?s+u:l;for(let e=d;e=c&&t.type===n)return e}if(i){let e=o[c];if(e&&co(e)&&e.type===n)return c}return null}function bl(e,t,n,r,i){let a=e[n],o=t.data;if(a instanceof Wc){let s=a;if(s.resolving)throw Wi(``);let c=rl(s.canSeeViewProviders);s.resolving=!0,o[n].type||o[n];let l=s.injectImpl?Xi(s.injectImpl):null;rs(e,r,0);try{a=e[n]=s.factory(void 0,i,o,e,r),t.firstCreatePass&&n>=r.directiveStart&&Fc(n,o[n],t)}finally{l!==null&&Xi(l),rl(c),s.resolving=!1,cs()}}return a}function xl(e){if(typeof e==`string`)return e.charCodeAt(0)||0;let t=Object.hasOwn(e,Pi)?e[Pi]:void 0;return typeof t==`number`?t>=0?t&il:Tl:t}function Sl(e,t,n){let r=1<>al)]&r)}function Cl(e,t){return!(e&2)&&!(e&1&&t)}var wl=class{_tNode;_lView;constructor(e,t){this._tNode=e,this._lView=t}get(e,t,n){return gl(this._tNode,this._lView,e,ia(n),t)}};function Tl(){return new wl(Uo(),Vo())}function El(e){return bc(()=>{let t=e.prototype.constructor,n=t[Ni]||Dl(t),r=Object.prototype,i=Object.getPrototypeOf(e.prototype).constructor;for(;i&&i!==r;){let e=i[Ni]||Dl(i);if(e&&e!==n)return e;i=Object.getPrototypeOf(i)}return e=>new e})}function Dl(e){return bi(e)?()=>{let t=Dl(yi(e));return t&&t()}:ca(e)}function Ol(e,t,n,r,i){let a=e,o=t;for(;a!==null&&o!==null&&o[2]&2048&&!lo(o);){let e=_l(a,o,n,r|2,sl);if(e!==sl)return e;r&=-5;let t=a.parent;if(!t){let e=o[20];if(e){let t=e.get(n,sl,r);if(t!==sl)return t}t=kl(o),o=o[14]}a=t}return i}function kl(e){let t=e[1],n=t.type;return n===2?t.declTNode:n===1?e[5]:null}function Al(e){return{token:e.token,providedIn:e.autoProvided===!1?null:`root`,factory:e.factory,value:void 0}}function jl(){return Ml(Uo(),Vo())}function Ml(e,t){return new Nl(go(e,t))}var Nl=(()=>{class e{nativeElement;constructor(e){this.nativeElement=e}static __NG_ELEMENT_ID__=jl}return e})();function Pl(e){return e instanceof Nl?e.nativeElement:e}function Fl(){return this._results[Symbol.iterator]()}var Il=class{_emitDistinctChangesOnly;dirty=!0;_onDirty=void 0;_results=[];_changesDetected=!1;_changes=void 0;length=0;first=void 0;last=void 0;get changes(){return this._changes??=new Wr}constructor(e=!1){this._emitDistinctChangesOnly=e}get(e){return this._results[e]}map(e){return this._results.map(e)}filter(e){return this._results.filter(e)}find(e){return this._results.find(e)}reduce(e,t){return this._results.reduce(e,t)}forEach(e){this._results.forEach(e)}some(e){return this._results.some(e)}toArray(){return this._results.slice()}toString(){return this._results.toString()}reset(e,t){this.dirty=!1;let n=ua(e);(this._changesDetected=!la(this._results,n,t))&&(this._results=n,this.length=n.length,this.last=n[this.length-1],this.first=n[0])}notifyOnChanges(){this._changes!==void 0&&(this._changesDetected||!this._emitDistinctChangesOnly)&&this._changes.next(this)}onDirty(e){this._onDirty=e}setDirty(){this.dirty=!0,this._onDirty?.()}destroy(){this._changes!==void 0&&(this._changes.complete(),this._changes.unsubscribe())}[Symbol.iterator]=Fl};function Ll(e){return(e.flags&128)==128}var Rl=(function(e){return e[e.OnPush=0]=`OnPush`,e[e.Eager=1]=`Eager`,e[e.Default=1]=`Default`,e})(Rl||{}),zl=new Map,Bl=0;function Vl(){return Bl++}function Hl(e){zl.set(e[19],e)}function Ul(e){zl.delete(e[19])}var Wl=`__ngContext__`;function Gl(e,t){ro(t)?(e[Wl]=t[19],Hl(t)):e[Wl]=t}function Kl(e){return Jl(e[12])}function ql(e){return Jl(e[4])}function Jl(e){for(;e!==null&&!io(e);)e=e[4];return e}var Yl=void 0;function Xl(e){Yl=e}function Zl(){if(Yl!==void 0)return Yl;if(typeof document<`u`)return document;throw new pi(210,!1)}var Ql=!1,$l=new Oi(``,{factory:()=>Ql}),eu=new WeakMap;function tu(e,t){if(typeof e!=`object`||!e)return;let n=eu.get(e);n||(n=new WeakSet,eu.set(e,n)),n.add(t)}function nu(e){return(e.flags&32)==32}var ru=()=>null;function iu(e,t,n=!1){return ru(e,t,n)}function au(e,t){let n=e.contentQueries;if(n!==null){let r=an(null);try{for(let r=0;r|^->||--!>|)/g,_u=`​$1​`;function vu(e){return e.replace(hu,e=>e.replace(gu,_u))}function yu(e,t){return e.createText(t)}function bu(e,t,n){e.setValue(t,n)}function xu(e,t){return e.createComment(vu(t))}function Su(e,t,n){return e.createElement(t,n)}function Cu(e,t,n,r,i){e.insertBefore(t,n,r,i)}function wu(e,t,n){e.appendChild(t,n)}function Tu(e,t,n,r,i){r===null?wu(e,t,n):Cu(e,t,n,r,i)}function Eu(e,t,n,r){e.removeChild(null,t,n,r)}function nte(e,t,n){e.setAttribute(t,`style`,n)}function rte(e,t,n){n===``?e.removeAttribute(t,`class`):e.setAttribute(t,`class`,n)}function Du(e,t,n){let{mergedAttrs:r,classes:i,styles:a}=n;r!==null&&qc(e,t,r),i!==null&&rte(e,t,i),a!==null&&nte(e,t,a)}function Ou(e){let t=ite();return t?t.sanitize(fo.URL,e)||``:du(e,`URL`)?uu(e):mu(Bi(e))}function ite(){let e=Vo();return e&&e[10].sanitizer}function ku(e){return e.ownerDocument.defaultView}function Au(e){return e.ownerDocument}function ate(e,t,n){let r=e.length;for(;;){let i=e.indexOf(t,n);if(i===-1)return i;if(i===0||e.charCodeAt(i-1)<=32){let n=t.length;if(i+n===r||e.charCodeAt(i+n)<=32)return i}n=i+1}}var ju=`ng-template`;function ote(e,t,n,r){let i=0;if(r){for(;i-1){let e;for(;++ia?``:i[u+1].toLowerCase(),r&2&&l!==e){if(Nu(r))return!1;o=!0}}}}}return Nu(r)||o}function Nu(e){return!(e&1)}function lte(e,t,n,r){if(t===null)return-1;let i=0;if(r||!n){let n=!1;for(;i-1)for(n++;n0?`="`+t+`"`:``)+`]`}else r&8?i+=`.`+o:r&4&&(i+=` `+o)}else i!==``&&!Nu(o)&&(t+=Fu(a,i),i=``),r=o,a||=!Nu(r);n++}return i!==``&&(t+=Fu(a,i)),t}function hte(e){return e.map(mte).join(`,`)}function gte(e){let t=[],n=[],r=1,i=2;for(;r!1});function zu(e){if(!e)return 0;let t=e.toLowerCase().indexOf(`ms`)>-1?1:1e3;return parseFloat(e)*t}function Bu(e,t){return e.getPropertyValue(t).split(`,`).map(e=>e.trim())}function yte(e){let t=Bu(e,`transition-property`),n=Bu(e,`transition-duration`),r=Bu(e,`transition-delay`),i={propertyName:``,duration:0,animationName:void 0};for(let e=0;ei.duration&&(i.propertyName=t[e],i.duration=a)}return i}function bte(e){let t=Bu(e,`animation-name`),n=Bu(e,`animation-delay`),r=Bu(e,`animation-duration`),i=Bu(e,`animation-iteration-count`),a={animationName:``,propertyName:void 0,duration:0};for(let e=0;ea.duration&&s!==`infinite`&&(a.animationName=t[e],a.duration=o)}return a}function Vu(e,t){return e!==void 0&&e.duration>t.duration}function Hu(e){return(e.animationName!=null||e.propertyName!=null)&&e.duration>0}function Uu(e){let t=e.effect?.getTiming();if(t===void 0)return;let n=typeof t.duration==`number`?t.duration:0,r=(t.delay??0)+n,i=e.playbackRate;return i!==void 0&&i!==0&&i!==1&&(r/=Math.abs(i)),r}function xte(e,t){let n=getComputedStyle(e),r=bte(n),i=yte(n),a=r.duration>i.duration?r:i;Vu(t.get(e),a)||Hu(a)&&t.set(e,a)}function Ste(e,t,n){if(!n)return;let r=e.getAnimations();return r.length===0?xte(e,t):Cte(e,t,r)}function Cte(e,t,n){let r={animationName:void 0,propertyName:void 0,duration:0};for(let e of n){if(e.effect?.getTiming()?.iterations===1/0)continue;let t=Uu(e)??0,n,i;e.animationName?i=e.animationName:n=e.transitionProperty,t>=r.duration&&(r={animationName:i,propertyName:n,duration:t})}Vu(t.get(e),r)||Hu(r)&&t.set(e,r)}var Wu=new Set,wte=!1,Tte=1,Gu=typeof document<`u`&&typeof document?.documentElement?.getAnimations==`function`;function Ete(e){return e[9].get(vte,wte)}function Dte(e,t,n){let r=qu.get(e);if(r){for(let e of t)r.classList.push(e);for(let e of n)r.cleanupFns.push(e)}else qu.set(e,{classList:t,cleanupFns:n})}function Ku(e){let t=qu.get(e);if(t){for(let e of t.cleanupFns)e();qu.delete(e)}Ju.delete(e)}var qu=new WeakMap,Ju=new WeakMap,Yu=new WeakMap;function Xu(e){return e?e[14]??e:null}var Zu=new WeakSet;function Ote(e,t,n){let r=Yu.get(e);if(!r||r.length===0)return;let i=t.parentNode,a=t.previousSibling,o=Xu(n);for(let e=r.length-1;e>=0;e--){let{el:n,declarationView:s}=r[e],c=n.parentNode;n===t?(r.splice(e,1),Zu.add(n),n.dispatchEvent(new CustomEvent(`animationend`,{detail:{cancel:!0}}))):(a&&n===a||c&&i&&c!==i&&(o===null||s===null||o===s))&&(r.splice(e,1),n.dispatchEvent(new CustomEvent(`animationend`,{detail:{cancel:!0}})),n.parentNode?.removeChild(n))}}function kte(e,t,n){let r=Xu(n),i=Yu.get(e);i?i.some(e=>e.el===t)||i.push({el:t,declarationView:r}):Yu.set(e,[{el:t,declarationView:r}])}function Qu(e){let t=e[26]??={};return t.enter??=new Map}function Ate(e){let t=typeof e==`function`?e():e,n=Array.isArray(t)?t:null;return typeof t==`string`&&(n=t.trim().split(/\s+/).filter(e=>e)),n}function $u(e){return e.composedPath?e.composedPath()[0]:e.target}function ed(e,t){let n=Ju.get(t);if(n===void 0)return!0;if(t!==$u(e))return!1;let r=e.animation;if(r){let e=Uu(r);if(e!==void 0&&e+Tte{class e{impl=null;execute(){this.impl?.execute()}static ɵprov=xi({token:e,providedIn:`root`,factory:()=>new e})}return e})(),od=[0,1,2,3],sd=(()=>{class e{ngZone=x(Fs);scheduler=x(ic);errorHandler=x(qs,{optional:!0});sequences=new Set;deferredRegistrations=new Set;executing=!1;constructor(){x(nd,{optional:!0})}execute(){let e=this.sequences.size>0;e&&Pc(xc.AfterRenderHooksStart),this.executing=!0;for(let e of od)for(let t of this.sequences)if(!t.erroredOrDestroyed&&t.hooks[e])try{t.pipelinedValue=this.ngZone.runOutsideAngular(()=>this.maybeTrace(()=>{let n=t.hooks[e];return n(t.pipelinedValue)},t.snapshot))}catch(e){t.erroredOrDestroyed=!0,this.errorHandler?.handleError(e)}this.executing=!1;for(let e of this.sequences)e.afterRun(),e.once&&(this.sequences.delete(e),e.destroy());for(let e of this.deferredRegistrations)this.sequences.add(e);this.deferredRegistrations.size>0&&this.scheduler.notify(7),this.deferredRegistrations.clear(),e&&Pc(xc.AfterRenderHooksEnd)}register(e){let{view:t}=e;t===void 0?this.executing?this.deferredRegistrations.add(e):this.addSequence(e):((t[25]??=[]).push(e),ko(t),t[2]|=8192)}addSequence(e){this.sequences.add(e),this.scheduler.notify(7)}unregister(e){this.executing&&this.sequences.has(e)?(e.erroredOrDestroyed=!0,e.pipelinedValue=void 0,e.once=!0):(this.sequences.delete(e),this.deferredRegistrations.delete(e))}maybeTrace(e,t){return t?t.run(td.AFTER_NEXT_RENDER,e):e()}static ɵprov=xi({token:e,providedIn:`root`,factory:()=>new e})}return e})(),cd=class{impl;hooks;view;once;snapshot;erroredOrDestroyed=!1;pipelinedValue=void 0;unregisterOnDestroy;constructor(e,t,n,r,i,a=null){this.impl=e,this.hooks=t,this.view=n,this.once=r,this.snapshot=a,this.unregisterOnDestroy=i?.onDestroy(()=>this.destroy())}afterRun(){this.erroredOrDestroyed=!1,this.pipelinedValue=void 0,this.snapshot?.dispose(),this.snapshot=null}destroy(){this.impl.unregister(this),this.unregisterOnDestroy?.();let e=this.view?.[25];e&&(this.view[25]=e.filter(e=>e!==this))}};function ld(e,t){let n=t?.injector??x(xs);return id(`NgAfterNextRender`),Nte(e,n,t,!0)}function Mte(e){return e instanceof Function?[void 0,void 0,e,void 0]:[e.earlyRead,e.write,e.mixedReadWrite,e.read]}function Nte(e,t,n,r){let i=t.get(ad);i.impl??=t.get(sd);let a=t.get(nd,null,{optional:!0}),o=n?.manualCleanup===!0?null:t.get(Cs),s=t.get(nc,null,{optional:!0}),c=new cd(i.impl,Mte(e),s?.view,r,o,a?.snapshot(null));return i.impl.register(c),c}var ud=new Oi(``,{factory:()=>{let e=x(Ha),t=new Set;return e.onDestroy(()=>t.clear()),{queue:t,isScheduled:!1,scheduler:null,injector:e}}});function dd(e,t,n){let r=e.get(ud);if(Array.isArray(t))for(let e of t)r.queue.add(e),n?.detachedLeaveAnimationFns?.push(e);else r.queue.add(t),n?.detachedLeaveAnimationFns?.push(t);r.scheduler&&r.scheduler(e)}function Pte(e,t){let n=e.get(ud);if(Array.isArray(t))for(let e of t)n.queue.delete(e);else n.queue.delete(t)}function Fte(e,t){let n=e.get(ud);if(t.detachedLeaveAnimationFns){for(let e of t.detachedLeaveAnimationFns)n.queue.delete(e);t.detachedLeaveAnimationFns=void 0}}function Ite(e){let t=e.get(ud);t.isScheduled||=(ld(()=>{t.isScheduled=!1;for(let e of t.queue)e();t.queue.clear()},{injector:t.injector}),!0)}function Lte(e){let t=e.get(ud);t.scheduler=Ite,t.scheduler(e)}function fd(e,t){for(let[n,r]of t)dd(e,r.animateFns)}function pd(e,t,n,r){let i=e?.[26]?.enter;t!==null&&i&&i.has(n.index)&&fd(r,i)}function md(e,t,n,r){try{n.get(Ca)}catch{return r(!1)}let i=e?.[26];i?.enter?.has(t.index)&&Pte(n,i.enter.get(t.index).animateFns);let a=Rte(e,t,i);if(a.size===0){let n=!1;if(e){let r=[];hd(e,t,r),n=r.length>0}if(!n)return r(!1)}e&&Wu.add(e[19]),dd(n,()=>zte(e,t,i||void 0,a,r),i||void 0)}function Rte(e,t,n){let r=new Map,i=n?.leave;if(i&&i.has(t.index)&&r.set(t.index,i.get(t.index)),e&&i)for(let[n,a]of i){if(r.has(n))continue;let i=e[1].data[n].parent;for(;i;){if(i===t){r.set(n,a);break}i=i.parent}}return r}function zte(e,t,n,r,i){let a=[];if(n&&n.leave)for(let[e]of r){if(!n.leave.has(e))continue;let t=n.leave.get(e);for(let e of t.animateFns){let{promise:t}=e();a.push(t)}n.detachedLeaveAnimationFns=void 0}if(e&&hd(e,t,a),a.length>0){let t=n||e?.[26];if(t){let n=t.running;n&&a.push(n),t.running=Promise.allSettled(a),Vte(e,t.running,i)}else Promise.allSettled(a).then(()=>{e&&Wu.delete(e[19]),i(!0)})}else e&&Wu.delete(e[19]),i(!1)}function hd(e,t,n){if(t.type&12){let r=e[t.index];if(io(r))for(let e=10;e{e[26]?.running===t&&(e[26].running=void 0,Wu.delete(e[19])),n(!0)})}function gd(e,t,n,r,i,a,o,s){if(i!=null){let c,l=!1;io(i)?c=i:ro(i)&&(l=!0,i=i[0]);let u=mo(i);e===0&&r!==null?(pd(s,r,a,n),o==null?wu(t,r,u):Cu(t,r,u,o||null,!0)):e===1&&r!==null?(pd(s,r,a,n),Cu(t,r,u,o||null,!0),Ote(a,u,s)):e===2?(s?.[26]?.leave?.has(a.index)&&kte(a,u,s),Zu.delete(u),md(s,a,n,e=>{if(Zu.has(u)){Zu.delete(u);return}Eu(t,u,l,e)})):e===3&&(Zu.delete(u),md(s,a,n,()=>{t.destroyNode(u)})),c!=null&&Ad(t,e,n,c,a,r,o)}}function Hte(e,t){_d(e,t),t[0]=null,t[5]=null}function Ute(e,t,n,r,i,a){r[0]=i,r[5]=t,Od(e,r,n,1,i,a)}function _d(e,t){t[10].changeDetectionScheduler?.notify(9),Od(e,t,t[11],2,null,null)}function Wte(e){let t=e[12];if(!t)return bd(e[1],e);for(;t;){let n=null;if(ro(t))n=t[12];else{let e=t[10];e&&(n=e)}if(!n){for(;t&&!t[4]&&t!==e;)ro(t)&&bd(t[1],t),t=t[3];t===null&&(t=e),ro(t)&&bd(t[1],t),n=t&&t[4]}t=n}}function vd(e,t){let n=e[9],r=n.indexOf(t);n.splice(r,1)}function yd(e,t){if(uo(t))return;let n=t[11];n.destroyNode&&Od(e,t,n,3,null,null),Wte(t)}function bd(e,t){if(uo(t))return;let n=an(null);try{t[2]&=-129,t[2]|=256,t[24]&&bn(t[24]),Kte(e,t),Gte(e,t),t[1].type===1&&t[11].destroy();let n=t[16];if(n!==null&&io(t[3])){n!==t[3]&&vd(n,t);let r=t[18];r!==null&&r.detachView(e)}Ul(t)}finally{an(n)}}function Gte(e,t){let n=e.cleanup,r=t[7];if(n!==null)for(let e=0;e=0?r[t]():r[-t].unsubscribe(),e+=2}else{let t=r[n[e+1]];n[e].call(t)}r!==null&&(t[7]=null);let i=t[21];if(i!==null){t[21]=null;for(let e=0;e27&&Bd(e,t,27,!1),Pc(o?xc.TemplateUpdateStart:xc.TemplateCreateStart,i,n),n(r,i)}finally{ds(a),Pc(o?xc.TemplateUpdateEnd:xc.TemplateCreateEnd,i,n)}}function Wd(e,t,n){Zd(e,t,n),(n.flags&64)==64&&Qd(e,t,n)}function Gd(e,t,n=go){let r=t.localNames;if(r!==null){let i=t.index+1;for(let a=0;a=s&&i<=c){let o=t.data[i],s=r[e+1];Hd(o,n[i],s,a),l=!0}else if(i>c)break}}return o!==null&&Object.hasOwn(r.inputs,i)&&(Hd(r,n[o],i,a),l=!0),l}function uf(e,t){let n=bo(t,e),r=n[1];df(r,n);let i=n[0];i!==null&&n[6]===null&&(n[6]=iu(i,n[9])),Pc(xc.ComponentStart);try{ff(r,n,n[8])}finally{Pc(xc.ComponentEnd,n[8])}}function df(e,t){for(let n=t.length;n{ko(e.lView)},consumerOnSignalRead(){this.lView[24]=this}};function wf(e){let t=e[24]??Object.create(Tf);return t.lView=e,t}var Tf={...sn,consumerIsAlwaysLive:!0,kind:`template`,consumerMarkedDirty:e=>{let t=jo(e.lView);for(;t&&!Ef(t[1]);)t=jo(t);t&&To(t)},consumerOnSignalRead(){this.lView[24]=this}};function Ef(e){return e.type!==2}function Df(e){if(e[23]===null)return;let t=!0;for(;t;){let n=!1;for(let t of e[23])if(t.dirty&&(n=!0,t.zone===null||Zone.current===t.zone?t.run():t.zone.run(()=>t.run()),e[23]===null))return;t=n&&!!(e[2]&8192)}}var Of=100;function kf(e,t=0){let n=e[10].rendererFactory;n.begin?.();try{Af(e,t)}finally{n.end?.()}}function Af(e,t){let n=Yo();try{Xo(!0),If(e,t);let n=0;for(;Do(e);){if(n===Of)throw new pi(103,!1);n++,If(e,1)}}finally{Xo(n)}}function jf(e,t,n,r){if(uo(t))return;let i=t[2];is(t);let a=!0,o=null,s=null;Ef(e)?(s=bf(t),o=hn(s)):on()===null?(a=!1,s=wf(t),o=hn(s)):t[24]&&=(bn(t[24]),null);try{wo(t),Jee(e.bindingStartIndex),n!==null&&Ud(e,t,n,2,r);let a=(i&3)==3;if(a){let n=e.preOrderCheckHooks;n!==null&&Lc(t,n,null)}else{let n=e.preOrderHooks;n!==null&&Rc(t,n,0,null),zc(t,0)}if(Nf(t),Df(t),Mf(t,0),e.contentQueries!==null&&au(e,t),a){let n=e.contentCheckHooks;n!==null&&Lc(t,n)}else{let n=e.contentHooks;n!==null&&Rc(t,n,1),zc(t,1)}Rf(e,t);let o=e.components;o!==null&&Lf(t,o,0);let s=e.viewQuery;if(s!==null&&ou(2,s,r),a){let n=e.viewCheckHooks;n!==null&&Lc(t,n)}else{let n=e.viewHooks;n!==null&&Rc(t,n,2),zc(t,2)}if(e.firstUpdatePass===!0&&(e.firstUpdatePass=!1),t[22]){for(let e of t[22])e();t[22]=null}vf(t),t[2]&=-73}catch(e){throw ko(t),e}finally{s!==null&&(_n(s,o),a&&Sf(s)),ls()}}function Mf(e,t){for(let n=Kl(e);n!==null;n=ql(n))for(let e=10;e0&&(e[n-1][4]=r[4]);let a=pa(e,10+t);Hte(r[1],r);let o=a[18];o!==null&&o.detachView(a[1]),r[3]=null,r[4]=null,r[2]&=-129}return r}function Gf(e,t,n,r){let i=10+r,a=n.length;r>0&&(n[i-1][4]=t),r-1&&(Wf(e,n),pa(t,n))}this._attachedToViewContainer=!1}yd(this._lView[1],this._lView)}onDestroy(e){Ao(this._lView,e)}markForCheck(){zf(this._cdRefInjectingView||this._lView,4)}detach(){this._lView[2]&=-129}reattach(){Oo(this._lView),this._lView[2]|=128}detectChanges(){this._lView[2]|=1024,kf(this._lView)}checkNoChanges(){}attachToViewContainerRef(){if(this._appRef)throw new pi(902,!1);this._attachedToViewContainer=!0}detachFromAppRef(){this._appRef=null;let e=lo(this._lView),t=this._lView[16];t!==null&&!e&&vd(t,this._lView),_d(this._lView[1],this._lView)}attachToAppRef(e){if(this._attachedToViewContainer)throw new pi(902,!1);this._appRef=e;let t=lo(this._lView),n=this._lView[16];n!==null&&!t&&Kf(n,this._lView),Oo(this._lView)}},Jf=(()=>{class e{_declarationLView;_declarationTContainer;elementRef;static __NG_ELEMENT_ID__=Yf;constructor(e,t,n){this._declarationLView=e,this._declarationTContainer=t,this.elementRef=n}get ssrId(){return this._declarationTContainer.tView?.ssrId||null}createEmbeddedView(e,t){return this.createEmbeddedViewImpl(e,t)}createEmbeddedViewImpl(e,t,n){return new qf(mf(this._declarationLView,this._declarationTContainer,e,{embeddedViewInjector:t,dehydratedView:n}))}}return e})();function Yf(){return Xf(Uo(),Vo())}function Xf(e,t){return e.type&4?new Jf(t,e,Ml(e,t)):null}function Zf(e,t,n,r,i){let a=e.data[t];if(a===null)a=Qf(e,t,n,r,i),Yee()&&(a.flags|=32);else if(a.type&64){a.type=n,a.value=r,a.attrs=i;let e=qee();a.injectorIndex=e===null?-1:e.injectorIndex}return Go(a,!0),a}function Qf(e,t,n,r,i){let a=Wo(),o=Ko(),s=o?a:a&&a.parent,c=e.data[t]=ep(e,s,n,t,r,i);return $f(e,c,a,o),c}function $f(e,t,n,r){e.firstChild===null&&(e.firstChild=t),n!==null&&(r?n.child==null&&t.parent!==null&&(n.child=t):n.next===null&&(n.next=t,t.prev=n))}function ep(e,t,n,r,i,a){let o=t?t.injectorIndex:-1,s=0;return Ro()&&(s|=128),{type:n,index:r,insertBeforeIndex:null,injectorIndex:o,directiveStart:-1,directiveEnd:-1,directiveStylingLast:-1,componentOffset:-1,controlDirectiveIndex:-1,customControlIndex:-1,propertyBindings:null,flags:s,providerIndexes:0,value:i,namespace:hs(),attrs:a,mergedAttrs:null,localNames:null,initialInputs:null,inputs:null,hostDirectiveInputs:null,outputs:null,hostDirectiveOutputs:null,directiveToIndex:null,tView:null,next:null,prev:null,projectionNext:null,child:null,parent:t,projection:null,styles:null,stylesWithoutHost:null,residualStyles:void 0,classes:null,classesWithoutHost:null,residualClasses:void 0,classBindings:0,styleBindings:0}}function tp(e){let t=e[6]??[],n=e[3][11],r=[];for(let e of t)e.data.di===void 0?np(e,n):r.push(e);e[6]=r}function np(e,t){let n=0,r=e.firstChild;if(r){let i=e.data.r;for(;nnull,ip=()=>null;function ap(e,t){return rp(e,t)}function op(e,t,n){return ip(e,t,n)}var sp=class{},cp=class{},lp=class{destroyNode=null;static __NG_ELEMENT_ID__=()=>up()};function up(){let e=Vo(),t=bo(Uo().index,e);return(ro(t)?t:e)[11]}var dp=(()=>{class e{static ɵprov=xi({token:e,providedIn:`root`,factory:()=>null})}return e})();function fp(e){return e.debugInfo?.className||e.type.name||null}var pp={},mp=class{injector;parentInjector;constructor(e,t){this.injector=e,this.parentInjector=t}get(e,t,n){let r=this.injector.get(e,pp,n);return r!==pp||t===pp?r:this.parentInjector.get(e,t,n)}};function hp(e,t,n){return e[t]=n}function gp(e,t){return e[t]}function _p(e,t,n){if(n===Iu)return!1;let r=e[t];return!Object.is(r,n)&&(e[t]=n,!0)}function vp(e,t,n,r){let i=_p(e,t,n);return _p(e,t+1,r)||i}function yp(e,t,n,r,i){let a=vp(e,t,n,r);return _p(e,t+2,i)||a}function bp(e,t,n,r,i,a){let o=vp(e,t,n,r);return vp(e,t+2,i,a)||o}function xp(e,t,n){return function r(i){let a=r.__ngNativeEl__;a!==void 0&&tu(i,a),zf(oo(e)?bo(e.index,t):t,5);let o=t[8],s=Sp(t,o,n,i),c=r.__ngNextListenerFn__;for(;c;)s=Sp(t,o,c,i)&&s,c=c.__ngNextListenerFn__;return s}}function Sp(e,t,n,r){let i=an(null);try{return Pc(xc.OutputStart,t,n),n(r)!==!1}catch(t){return sf(e,t),!1}finally{Pc(xc.OutputEnd,t,n),an(i)}}function Cp(e,t,n,r,i,a,o,s){let c=so(e),l=!1,u=null;if(!r&&c&&(u=Tp(t,n,a,e.index)),u!==null){let e=u.__ngLastListenerFn__||u;e.__ngNextListenerFn__=o,u.__ngLastListenerFn__=o,l=!0}else{let o=go(e,n),c=r?r(o):o;r||(s.__ngNativeEl__=o);let l=i.listen(c,a,s);wp(a)||Ep(r?t=>r(mo(t[e.index])):e.index,t,n,a,s,l,!1)}return l}function wp(e){return e.startsWith(`animation`)||e.startsWith(`transition`)}function Tp(e,t,n,r){let i=e.cleanup;if(i!=null)for(let e=0;er?n[r]:null}typeof a==`string`&&(e+=2)}return null}function Ep(e,t,n,r,i,a,o){let s=t.firstCreatePass?No(t):null,c=Mo(n),l=c.length;c.push(i,a),s&&s.push(r,e,l,(l+1)*(o?-1:1))}function Dp(e,t,n,r,i){let a=null,o=null,s=null,c=!1,l=e.directiveToIndex.get(n.type);if(typeof l==`number`?a=l:[a,o,s]=l,o!==null&&s!==null&&e.hostDirectiveOutputs&&Object.hasOwn(e.hostDirectiveOutputs,r)){let n=e.hostDirectiveOutputs[r];for(let a=0;a=o&&l<=s)c=!0,Op(e,t,l,n[a+1],r,i);else if(l>s)break}}return Object.hasOwn(n.outputs,r)&&(c=!0,Op(e,t,a,r,r,i)),c}function Op(e,t,n,r,i,a){let o=t[n],s=t[1],c=o[s.data[n].outputs[r]].subscribe(a);Ep(e.index,s,t,i,a,c,!0)}function kp(){Ap()}function Ap(){let e=Vo(),t=Ho(),n=Uo();if(t.firstCreatePass&&Ip(t,n),n.controlDirectiveIndex===-1)return;id(`NgSignalForms`);let r=e[n.controlDirectiveIndex];t.data[n.controlDirectiveIndex].controlDef.create(r,new Np(e,t,n))}function jp(){Mp()}function Mp(){let e=Vo(),t=Ho(),n=fs();if(n.controlDirectiveIndex===-1)return;let r=t.data[n.controlDirectiveIndex].controlDef,i=e[n.controlDirectiveIndex];r.update(i,new Np(e,t,n))}var Np=class{lView;tView;tNode;hasPassThrough;constructor(e,t,n){this.lView=e,this.tView=t,this.tNode=n,this.hasPassThrough=!!(n.flags&4096)}get customControl(){return this.tNode.customControlIndex===-1?void 0:this.lView[this.tNode.customControlIndex]}get nativeElement(){return go(this.tNode,this.lView)}get descriptor(){return`<${this.tNode.value}>`}listenToCustomControlOutput(e,t){let n=this.tView.data[this.tNode.customControlIndex];Dp(this.tNode,this.lView,n,e,xp(this.tNode,this.lView,t))}listenToCustomControlModel(e){let t=this.tNode.flags&1024?`valueChange`:`checkedChange`,n=this.tView.data[this.tNode.customControlIndex];Dp(this.tNode,this.lView,n,t,xp(this.tNode,this.lView,e))}listenToDom(e,t){Cp(this.tNode,this.tView,this.lView,void 0,this.lView[11],e,t,xp(this.tNode,this.lView,t))}setInputOnDirectives(e,t,n){let r=this.tNode.inputs?.[e],i=this.tNode.hostDirectiveInputs?.[e];if(!r&&!i)return!1;let a=!1;if(r)for(let i of r){if(i===this.tNode.controlDirectiveIndex)continue;let r=this.lView[i],o=this.tView.data[i];(!n||n(Fp(r,o,e)))&&(Hd(o,r,e,t),a=!0)}if(i)for(let r=0;r0;){let e=n.shift();if(typeof e!=`function`){for(let n in e.inputs)t[e.inputs[n]]=!0;let r=Pp(e.directive);r!==null&&n.push(...r);continue}for(let r of e()){if(typeof r==`function`)continue;if(r.inputs)for(let e=0;e1){t.flags|=4096;return}Lp(e,t)}function Lp(e,t){for(let n=t.directiveStart;n{let r=t.hostDirectiveInputs[e],i=t.hostDirectiveOutputs[e+`Change`];if(!r||!i)return!1;for(let e=0;e=i&&a<=o)return t.flags|=n,t.customControlIndex=r,!0}}return!1};if(e(`value`,1024)||e(`checked`,2048))return}}function Rp(e,t){return zp(e,t)&&Bp(e,t+`Change`)}function zp(e,t){return t in e.inputs}function Bp(e,t){return t in e.outputs}var Vp=Symbol(`BINDING`),Hp=new Oi(``);function Up(e,t,n){let r=n?e.styles:null,i=n?e.classes:null,a=0;if(t!==null)for(let e=0;e0&&(n.directiveToIndex=new Map);for(let c=0;c0;){let n=e[--t];if(typeof n==`number`&&n<0)return n}return 0}function rm(e,t,n){if(n){if(t.exportAs)for(let r=0;r{let[n,r,i]=e[t],a={propName:n,templateName:t,isSignal:(r&Vd.SignalBased)!==0};return i&&(a.transform=i),a})}function dm(e){return Object.keys(e).map(t=>({propName:e[t],templateName:t}))}function fm(e,t,n){let r=t instanceof Ha?t:t?.injector;return r&&e.getStandaloneInjector!==null&&(r=e.getStandaloneInjector(r)||r),r?new mp(n,r):n}function pm(e){let t=e.get(cp,null);if(t===null)throw new pi(407,!1);return{rendererFactory:t,sanitizer:e.get(dp,null),changeDetectionScheduler:e.get(ic,null),ngReflect:!1,tracingService:e.get(nd,null,{optional:!0})}}function mm(e,t,n){let r=gm(e);return Su(t,r,r===`svg`?`svg`:r===`math`?po:n)}function hm(e){if((e&&`localName`in e&&typeof e.localName==`string`?e.localName:e?.tagName)?.toLowerCase()===`script`)throw new pi(905,!1)}function gm(e){return(e.selectors[0][0]||`div`).toLowerCase()}var _m=class{componentDef;ngModule;selector;componentType;ngContentSelectors;isBoundToModule;cachedInputs=null;cachedOutputs=null;get inputs(){return this.cachedInputs??=um(this.componentDef.inputs),this.cachedInputs}get outputs(){return this.cachedOutputs??=dm(this.componentDef.outputs),this.cachedOutputs}constructor(e,t){this.componentDef=e,this.ngModule=t,this.componentType=e.type,this.selector=hte(e.selectors),this.ngContentSelectors=e.ngContentSelectors??[],this.isBoundToModule=!!t}create(e,t,n,r,i,a,o){Pc(xc.DynamicComponentStart);let s=an(null);try{let s=this.componentDef,c=fm(s,r||this.ngModule,e),l=pm(c),u=l.tracingService;return u&&u.componentCreate?u.componentCreate(fp(s),()=>this.createComponentRef(l,c,t,n,i,a,o)):this.createComponentRef(l,c,t,n,i,a,o)}finally{an(s)}}createComponentRef(e,t,n,r,i,a,o){let s=this.componentDef,c=vm(r,s,a,i),l=e.rendererFactory.createRenderer(null,s),u=r?Kd(l,r,s.encapsulation,t):mm(s,l,o??null);hm(u);let d=t.get(Hp,null),f=ym(u,()=>t.get(Ss,null)??Zl());d&&d.addHost(f);let p=a?.some(xm)||i?.some(e=>typeof e!=`function`&&e.bindings.some(xm)),m=Fd(null,c,null,512|Ld(s),null,null,e,l,t,null,iu(u,t,!0));d&&cm&&f instanceof ShadowRoot&&Ao(m,()=>{d.removeHost(f)}),m[27]=u,is(m);let ee=null;try{let e=am(27,m,2,`#host`,()=>c.directiveRegistry,!0,0);Du(l,u,e),Gl(u,m),Wd(c,m,e),su(c,e,m),om(c,e),n!==void 0&&Cm(e,this.ngContentSelectors,n),ee=bo(e.index,m),m[8]=ee[8],ff(c,m,null)}catch(e){throw ee!==null&&Ul(ee),Ul(m),e}finally{Pc(xc.DynamicComponentEnd),ls()}return new Sm(this.componentType,m,!!p)}};function vm(e,t,n,r){let i=e?[`ng-version`,`22.1.7`]:gte(t.selectors[0]),a=null,o=null,s=0;if(n)for(let e of n)s+=e[Vp].requiredVars,e.create&&(e.targetIdx=0,(a??=[]).push(e)),e.update&&(e.targetIdx=0,(o??=[]).push(e));if(r)for(let e=0;e{if(n&1&&e)for(let t of e)t.create();if(n&2&&t)for(let e of t)e.update()}}function xm(e){let t=e[Vp].kind;return t===`input`||t===`twoWay`}var Sm=class extends sp{_rootLView;_hasInputBindings;instance;hostView;changeDetectorRef;componentType;location;previousInputValues=null;_tNode;constructor(e,t,n){super(),this._rootLView=t,this._hasInputBindings=n,this._tNode=_o(t[1],27),this.location=Ml(this._tNode,t),this.instance=bo(this._tNode.index,t)[8],this.hostView=this.changeDetectorRef=new qf(t,void 0),this.componentType=e}setInput(e,t){this._hasInputBindings;let n=this._tNode;if(this.previousInputValues??=new Map,this.previousInputValues.has(e)&&Object.is(this.previousInputValues.get(e),t))return;let r=this._rootLView;cf(n,r[1],r,e,t),this.previousInputValues.set(e,t),zf(bo(n.index,r),1)}get injector(){return new wl(this._tNode,this._rootLView)}destroy(){this.hostView.destroy()}onDestroy(e){this.hostView.onDestroy(e)}};function Cm(e,t,n){let r=e.projection=[];for(let e=0;e{class e{static __NG_ELEMENT_ID__=Tm}return e})();function Tm(){return km(Uo(),Vo())}var Em=class e extends wm{_lContainer;_hostTNode;_hostLView;constructor(e,t,n){super(),this._lContainer=e,this._hostTNode=t,this._hostLView=n}get element(){return Ml(this._hostTNode,this._hostLView)}get injector(){return new wl(this._hostTNode,this._hostLView)}get parentInjector(){let e=fl(this._hostTNode,this._hostLView);if(Qc(e)){let t=tl(e,this._hostLView),n=$c(e),r=t[1].data[n+8];return new wl(r,t)}return new wl(null,this._hostLView)}clear(){for(;this.length>0;)this.remove(this.length-1)}get(e){let t=Dm(this._lContainer);return t!==null&&t[e]||null}get length(){return this._lContainer.length-10}createEmbeddedView(e,t,n){let r,i;typeof n==`number`?r=n:n!=null&&(r=n.index,i=n.injector);let a=ap(this._lContainer,e.ssrId),o=e.createEmbeddedViewImpl(t||{},i,a);return this.insertImpl(o,r,hf(this._hostTNode,a)),o}createComponent(e,t,n,r,i,a,o){let s,c=t||{};s=c.index,n=c.injector,r=c.projectableNodes,i=c.environmentInjector||c.ngModuleRef,a=c.directives,o=c.bindings;let l=new _m(Ii(e)),u=n||this.parentInjector;if(!i&&l.ngModule==null){let e=this.parentInjector.get(Ha,null);e&&(i=e)}let d=Ii(l.componentType??{}),f=ap(this._lContainer,d?.id??null),p=f?.firstChild??null,m=l.create(u,r,p,i,a,o,this._getHostElementNamespace());return this.insertImpl(m.hostView,s,hf(this._hostTNode,f)),m}_getHostElementNamespace(){if(this._hostTNode.type&2){let e=this._hostTNode.parent??this._hostLView[5];return e!==null&&e.type&2&&typeof e.value==`string`&&e.value.toLowerCase()===`foreignobject`?null:e?.namespace??null}return this._hostTNode.namespace}insert(e,t){return this.insertImpl(e,t,!0)}insertImpl(t,n,r){let i=t._lView;if(So(i)){let n=this.indexOf(t);if(n!==-1)this.detach(n);else{let n=i[3],r=new e(n,n[5],n[3]);r.detach(r.indexOf(t))}}let a=this._adjustIndex(n),o=this._lContainer;return Hf(o,i,a,r),t.attachToViewContainerRef(),fa(Om(o),a,t),t}move(e,t){return this.insert(e,t)}indexOf(e){let t=Dm(this._lContainer);return t===null?-1:t.indexOf(e)}remove(e){let t=this._adjustIndex(e,-1),n=Wf(this._lContainer,t);n&&(pa(Om(this._lContainer),t),yd(n[1],n))}detach(e){let t=this._adjustIndex(e,-1),n=Wf(this._lContainer,t);return n&&pa(Om(this._lContainer),t)!=null?new qf(n):null}_adjustIndex(e,t=0){return e??this.length+t}};function Dm(e){return e[8]}function Om(e){return e[8]||=[]}function km(e,t){let n,r=t[e.index];return io(r)?n=r:(n=Bf(r,t,null,e),t[e.index]=n,zd(t,n)),jm(n,t,e,r),new Em(n,e,t)}function Am(e,t){let n=e[11],r=n.createComment(``),i=go(t,e);return Cu(n,n.parentNode(i),r,n.nextSibling(i),!1),r}var jm=Pm,Mm=()=>!1;function Nm(e,t,n){return Mm(e,t,n)}function Pm(e,t,n,r){if(e[7])return;let i;i=n.type&8?mo(r):Am(t,n),e[7]=i}var Fm=class e{queryList;matches=null;constructor(e){this.queryList=e}clone(){return new e(this.queryList)}setDirty(){this.queryList.setDirty()}},Im=class e{queries;constructor(e=[]){this.queries=e}createEmbeddedView(t){let n=t.queries;if(n!==null){let r=t.contentQueries===null?n.length:t.contentQueries[0],i=[];for(let e=0;e0)r.push(o[e/2]);else{let i=a[e+1],o=t[-n];for(let e=10;ee.trim())}function Xm(e,t,n){e.queries===null&&(e.queries=new Rm),e.queries.track(new zm(t,n))}function Zm(e,t){return e.queries.getByIndex(t)}function Qm(e,t){let n=e[1],r=Zm(n,t);return r.crossesNgTemplate?Gm(n,e,t,[]):Wm(n,e,r,t)}function $m(e,t,n){let r,i=En(()=>{r._dirtyCounter();let n=rh(r,e);if(t&&n===void 0)throw new pi(-951,!1);return n});return r=i[rn],r._dirtyCounter=T(0),r._flatValue=void 0,i}function eh(e){return $m(!0,!1,e)}function th(e){return $m(!0,!0,e)}function nh(e,t){let n=e[rn];n._lView=Vo(),n._queryIndex=t,n._queryList=Km(n._lView,t),n._queryList.onDirty(()=>n._dirtyCounter.update(e=>e+1))}function rh(e,t){let n=e._lView,r=e._queryIndex;if(n===void 0||r===void 0||n[2]&4)return t?void 0:xa;let i=Km(n,r),a=Qm(n,r);return i.reset(a,Pl),t?i.first:i._changesDetected||e._flatValue===void 0?e._flatValue=i.toArray():e._flatValue}function ih(e){return!!e&&typeof e.then==`function`}function ah(e){return!!e&&typeof e.subscribe==`function`}var oh=class{},sh=class extends oh{injector;instance=null;constructor(e){super();let t=new Ua([...e.providers,{provide:oh,useValue:this}],e.parent||Va(),e.debugName,new Set([`environment`]));this.injector=t,e.runEnvironmentInitializers&&t.resolveInjectorInitializers()}destroy(){this.injector.destroy()}onDestroy(e){this.injector.onDestroy(e)}};function ch(e,t,n=null){return new sh({providers:e,parent:t,debugName:n,runEnvironmentInitializers:!0}).injector}var lh=(()=>{class e{_injector;cachedInjectors=new Map;constructor(e){this._injector=e}getOrCreateStandaloneInjector(e){if(!e.standalone)return null;if(!this.cachedInjectors.has(e)){let t=Da(!1,e.type),n=t.length>0?ch([t],this._injector,``):null;this.cachedInjectors.set(e,n)}return this.cachedInjectors.get(e)}ngOnDestroy(){try{for(let e of this.cachedInjectors.values())e!==null&&e.destroy()}finally{this.cachedInjectors.clear()}}static ɵprov=xi({token:e,providedIn:`environment`,factory:()=>new e(ra(Ha))})}return e})();function O(e){return bc(()=>{let t=hh(e),n={...t,decls:e.decls,vars:e.vars,template:e.template,consts:e.consts||null,ngContentSelectors:e.ngContentSelectors,onPush:e.changeDetection!==Rl.Eager,directiveDefs:null,pipeDefs:null,dependencies:t.standalone&&e.dependencies||null,getStandaloneInjector:t.standalone?e=>e.get(lh).getOrCreateStandaloneInjector(n):null,getExternalStyles:null,signals:e.signals??!1,data:e.data||{},encapsulation:e.encapsulation||cu.Emulated,styles:e.styles||xa,_:null,schemas:e.schemas||null,tView:null,id:``};t.standalone&&id(`NgStandalone`),gh(n);let r=e.dependencies;return n.directiveDefs=_h(r,uh),n.pipeDefs=_h(r,Ri),n.id=vh(n),n})}function uh(e){return Ii(e)||Li(e)}function dh(e,t){if(e==null)return ba;let n={};for(let r in e)if(Object.hasOwn(e,r)){let i=e[r],a,o,s,c;Array.isArray(i)?(s=i[0],a=i[1],o=i[2]??a,c=i[3]||null):(a=i,o=i,s=Vd.None,c=null),n[a]=[r,s,c],t[a]=o}return n}function fh(e){if(e==null)return ba;let t={};for(let n in e)Object.hasOwn(e,n)&&(t[e[n]]=n);return t}function ph(e){return bc(()=>{let t=hh(e);return gh(t),t})}function mh(e){return{type:e.type,name:e.name,factory:null,pure:e.pure!==!1,standalone:e.standalone??!0,onDestroy:e.type.prototype.ngOnDestroy||null}}function hh(e){let t={};return{type:e.type,providersResolver:null,viewProvidersResolver:null,factory:null,hostBindings:e.hostBindings||null,hostVars:e.hostVars||0,hostAttrs:e.hostAttrs||null,contentQueries:e.contentQueries||null,declaredInputs:t,inputConfig:e.inputs||ba,exportAs:e.exportAs||null,standalone:e.standalone??!0,signals:e.signals===!0,selectors:e.selectors||xa,viewQuery:e.viewQuery||null,features:e.features||null,setInput:null,resolveHostDirectives:null,hostDirectives:null,controlDef:null,signalFormsInputPresence:null,inputs:dh(e.inputs,t),outputs:fh(e.outputs),debugInfo:null}}function gh(e){e.features?.forEach(t=>t(e))}function _h(e,t){return e?()=>{let n=typeof e==`function`?e():e,r=[];for(let e of n){let n=t(e);n!==null&&r.push(n)}return r}:null}function vh(e){let t=0,n=typeof e.consts==`function`?``:e.consts,r=[e.selectors,e.ngContentSelectors,e.hostVars,e.hostAttrs,n,e.vars,e.decls,e.encapsulation,e.standalone,e.signals,e.exportAs,JSON.stringify(e.inputs),JSON.stringify(e.outputs),Object.getOwnPropertyNames(e.type.prototype),!!e.contentQueries,!!e.viewQuery];for(let e of r.join(`|`))t=Math.imul(31,t)+e.charCodeAt(0)<<0;return t+=2147483648,`c`+t}var yh=new Oi(``),bh=(()=>{class e{resolve;reject;initialized=!1;done=!1;donePromise=new Promise((e,t)=>{this.resolve=e,this.reject=t});appInits=x(yh,{optional:!0})??[];injector=x(xs);constructor(){}runInitializers(){if(this.initialized)return;let e=[];for(let t of this.appInits){let n=eo(this.injector,t);if(ih(n))e.push(n);else if(ah(n)){let t=new Promise((e,t)=>{n.subscribe({complete:e,error:t})});e.push(t)}}let t=()=>{this.done=!0,this.resolve()};Promise.all(e).then(()=>{t()}).catch(e=>{this.reject(e)}),e.length===0&&t(),this.initialized=!0}static ɵfac=function(t){return new(t||e)};static ɵprov=Al({token:e,factory:e.ɵfac})}return e})();function xh(e){return t=>{t.controlDef={create:(e,t)=>{e?.ɵngControlCreate(t)},update:(e,t)=>{e?.ɵngControlUpdate?.(t)},passThroughInput:e}}}function Sh(e){return Object.getPrototypeOf(e.prototype).constructor}function Ch(e){let t=Sh(e.type),n=!0,r=[e];for(;t&&t!==Function.prototype&&t!==Object.prototype;){let i,a=Object.hasOwn(t,Ai)?t[Ai]:void 0,o=Object.hasOwn(t,ji)?t[ji]:void 0;if(co(e))i=a??o;else{if(a)throw new pi(903,!1);i=o}if(i){if(n){r.push(i);let t=e;t.inputs=Eh(e.inputs),t.declaredInputs=Eh(e.declaredInputs),t.outputs=Eh(e.outputs);let n=i.hostBindings;n&&kh(e,n);let a=i.viewQuery,o=i.contentQueries;if(a&&Dh(e,a),o&&Oh(e,o),wh(e,i),Vee(e.outputs,i.outputs),co(i)&&i.data.animation){let t=e.data;t.animation=(t.animation||[]).concat(i.data.animation)}}let t=i.features;if(t)for(let r=0;r=0;r--){let i=e[r];i.hostVars=t+=i.hostVars,i.hostAttrs=Xc(i.hostAttrs,n=Xc(n,i.hostAttrs))}}function Eh(e){return e===ba?{}:e===xa?[]:e}function Dh(e,t){let n=e.viewQuery;e.viewQuery=n?(e,r)=>{t(e,r),n(e,r)}:t}function Oh(e,t){let n=e.contentQueries;e.contentQueries=n?(e,r,i)=>{t(e,r,i),n(e,r,i)}:t}function kh(e,t){let n=e.hostBindings;e.hostBindings=n?(e,r)=>{t(e,r),n(e,r)}:t}function Ah(e,t,n,r,i,a,o,s){if(n.firstCreatePass){e.mergedAttrs=Xc(e.mergedAttrs,e.attrs);let t=e.tView=Md(2,e,i,a,o,n.directiveRegistry,n.pipeRegistry,null,n.schemas,n.consts,null);n.queries!==null&&(n.queries.template(n,e),t.queries=n.queries.embeddedTView(e))}s&&(e.flags|=s),Go(e,!1);let c=Ph(n,t,e,r);_s()&&Cd(n,t,c,e),Gl(c,t);let l=Bf(c,t,c,e);t[r+27]=l,zd(t,l),Nm(l,e,t)}function jh(e,t,n,r,i,a,o,s,c,l,u){let d=n+27,f;return t.firstCreatePass?(f=Zf(t,d,4,o||null,s||null),Lo()&&Gp(t,e,f,Co(t.consts,l),ef),Ic(t,f)):f=t.data[d],Ah(f,e,t,n,r,i,a,c),so(f)&&Wd(t,e,f),l!=null&&Gd(e,f,u),f}function Mh(e,t,n,r,i,a,o,s,c,l,u){let d=n+27,f;if(t.firstCreatePass){if(f=Zf(t,d,4,o||null,s||null),l!=null){let e=Co(t.consts,l);f.localNames=[];for(let t=0;t{throw new pi(600,``)})}var zh=10,Bh=(()=>{class e{_runningTick=!1;_destroyed=!1;_destroyListeners=[];_views=[];internalErrorHandler=x(Js);afterRenderManager=x(ad);zonelessEnabled=x(ac);rootEffectScheduler=x(sc);dirtyFlags=0;tracingSnapshot=null;allTestViews=new Set;autoDetectTestViews=new Set;includeAllTestViews=!1;afterTick=new Wr;get allViews(){return[...(this.includeAllTestViews?this.allTestViews:this.autoDetectTestViews).keys(),...this._views]}get destroyed(){return this._destroyed}componentTypes=[];components=[];internalPendingTask=x(Ds);get isStable(){return this.internalPendingTask.hasPendingTasksObservable.pipe(di(e=>!e))}constructor(){x(nd,{optional:!0})}whenStable(){let e;return new Promise(t=>{e=this.isStable.subscribe({next:e=>{e&&t()}})}).finally(()=>{e.unsubscribe()})}_injector=x(Ha);_rendererFactory=null;get injector(){return this._injector}bootstrap(e,t){return this.bootstrapImpl(e,t)}bootstrapImpl(e,t,n=xs.NULL){return this._injector.get(Fs).run(()=>{if(Pc(xc.BootstrapComponentStart),!this._injector.get(bh).done)throw new pi(405,``);let r=Ii(e),i=this._injector.get(oh),a=new _m(r,i);this.componentTypes.push(e);let{hostElement:o,directives:s,bindings:c}=Vh(t),l=o||a.selector,u=a.create(n,[],l,i.injector,s,c),d=u.location.nativeElement,f=u.injector.get(Ih,null);return f?.registerApplication(d),u.onDestroy(()=>{this.detachView(u.hostView),Hh(this.components,u),f?.unregisterApplication(d)}),this._loadComponent(u),Pc(xc.BootstrapComponentEnd,u),u})}tick(){this.zonelessEnabled||(this.dirtyFlags|=1),this._tick()}_tick(){Pc(xc.ChangeDetectionStart),this.tracingSnapshot===null?this.tickImpl():this.tracingSnapshot.run(td.CHANGE_DETECTION,this.tickImpl)}tickImpl=()=>{if(this._runningTick)throw Pc(xc.ChangeDetectionEnd),new pi(101,!1);let e=an(null);try{this._runningTick=!0,this.synchronize()}finally{this._runningTick=!1,this.tracingSnapshot?.dispose(),this.tracingSnapshot=null,an(e),this.afterTick.next(),Pc(xc.ChangeDetectionEnd)}};synchronize(){this._rendererFactory===null&&!this._injector.destroyed&&(this._rendererFactory=this._injector.get(cp,null,{optional:!0}));let e=0;for(;this.dirtyFlags!==0&&e++Do(e))){this.dirtyFlags|=2;return}this.dirtyFlags&=-8}attachView(e){let t=e;this._views.push(t),t.attachToAppRef(this)}detachView(e){let t=e;Hh(this._views,t),t.detachFromAppRef()}_loadComponent(e){this.attachView(e.hostView);try{this.tick()}catch(e){this.internalErrorHandler(e)}this.components.push(e),this._injector.get(Lh,[]).forEach(t=>t(e))}ngOnDestroy(){if(!this._destroyed)try{this._destroyListeners.forEach(e=>e()),this._views.slice().forEach(e=>e.destroy())}finally{this._destroyed=!0,this._views=[],this._destroyListeners=[]}}onDestroy(e){return this._destroyListeners.push(e),()=>Hh(this._destroyListeners,e)}destroy(){if(this._destroyed)throw new pi(406,!1);let e=this._injector;e.destroy&&!e.destroyed&&e.destroy()}get viewCount(){return this._views.length}static ɵfac=function(t){return new(t||e)};static ɵprov=Al({token:e,factory:e.ɵfac})}return e})();function Vh(e){return e===void 0||typeof e==`string`||e instanceof Element?{hostElement:e}:e}function Hh(e,t){let n=e.indexOf(t);n>-1&&e.splice(n,1)}function k(e,t,n,r){let i=Vo();return _p(i,$o(),t)&&(Ho(),tf(fs(),i,e,t,n,r)),k}function Uh(e){if(id(`NgAnimateEnter`),!Gu)return Uh;let t=Vo();if(Ete(t))return Uh;let n=Uo(),r=t[9].get(Fs);return jte(Qu(t),n,()=>Wh(t,n,e,r)),Lte(t[9]),fd(t[9],Qu(t)),Uh}function Wh(e,t,n,r){let i=go(t,e),a=e[11],o=Ate(n),s=[],c=!1,l=e=>{if($u(e)!==i)return;let t=e instanceof AnimationEvent?`animationend`:`transitionend`;r.runOutsideAngular(()=>{a.listen(i,t,u)})},u=e=>{$u(e)===i&&(ed(e,i)&&(c=!0),Gh(e,i,a))};if(o&&o.length>0){r.runOutsideAngular(()=>{s.push(a.listen(i,`animationstart`,l)),s.push(a.listen(i,`transitionstart`,l))}),Dte(i,o,s);for(let e of o)a.addClass(i,e);r.runOutsideAngular(()=>{requestAnimationFrame(()=>{if(!c&&(Ste(i,Ju,Gu),!Ju.has(i))){for(let e of o)a.removeClass(i,e);Ku(i)}})})}}function Gh(e,t,n){let r=qu.get(t);if($u(e)===t&&r&&ed(e,t)){e.stopPropagation();for(let e of r.classList)n.removeClass(t,e);Ku(t)}}var Kh=class{destroy(e){}updateValue(e,t){}swap(e,t){let n=Math.min(e,t),r=Math.max(e,t),i=this.detach(r);if(r-n>1){let e=this.detach(n);this.attach(n,i),this.attach(r,e)}else this.attach(n,i)}move(e,t){this.attach(t,this.detach(e))}};function qh(e,t,n,r,i){return e===n&&Object.is(t,r)?1:Object.is(i(e,t),i(n,r))?-1:0}function Jh(e,t,n,r){let i,a,o=0,s=e.length-1;if(Array.isArray(t)){an(r);let c=t.length-1;for(an(null);o<=s&&o<=c;){let r=e.at(o),l=t[o],u=qh(o,r,o,l,n);if(u!==0){u<0&&e.updateValue(o,l),o++;continue}let d=e.at(s),f=t[c],p=qh(s,d,c,f,n);if(p!==0){p<0&&e.updateValue(s,f),s--,c--;continue}let m=n(o,r),ee=n(s,d),h=n(o,l);if(Object.is(h,ee)){let t=n(c,f);Object.is(t,m)?(e.swap(o,s),e.updateValue(s,f),c--,s--):e.move(s,o),e.updateValue(o,l),o++;continue}if(i??=new Qh,a??=Zh(e,o,s,n),Yh(e,i,o,h))e.updateValue(o,l),o++,s++;else if(a.has(h))i.set(m,e.detach(o)),s--;else{let n=e.create(o,t[o]);e.attach(o,n),o++,s++}}for(;o<=c;)Xh(e,i,n,o,t[o]),o++}else if(t!=null){an(r);let c=t[Symbol.iterator]();an(null);let l=c.next();for(;!l.done&&o<=s;){let t=e.at(o),r=l.value,u=qh(o,t,o,r,n);if(u!==0)u<0&&e.updateValue(o,r),o++,l=c.next();else{i??=new Qh,a??=Zh(e,o,s,n);let u=n(o,r);if(Yh(e,i,o,u))e.updateValue(o,r),o++,s++,l=c.next();else if(!a.has(u))e.attach(o,e.create(o,r)),o++,s++,l=c.next();else{let r=n(o,t);i.set(r,e.detach(o)),s--}}}for(;!l.done;)Xh(e,i,n,e.length,l.value),l=c.next()}for(;o<=s;)e.destroy(e.detach(s--));i?.forEach(t=>{e.destroy(t)})}function Yh(e,t,n,r){return t!==void 0&&t.has(r)?(e.attach(n,t.get(r)),t.delete(r),!0):!1}function Xh(e,t,n,r,i){if(Yh(e,t,r,n(r,i)))e.updateValue(r,i);else{let t=e.create(r,i);e.attach(r,t)}}function Zh(e,t,n,r){let i=new Set;for(let a=t;a<=n;a++)i.add(r(a,e.at(a)));return i}var Qh=class{kvMap=new Map;_vMap=void 0;has(e){return this.kvMap.has(e)}delete(e){if(!this.has(e))return!1;let t=this.kvMap.get(e);return this._vMap!==void 0&&this._vMap.has(t)?(this.kvMap.set(e,this._vMap.get(t)),this._vMap.delete(t)):this.kvMap.delete(e),!0}get(e){return this.kvMap.get(e)}set(e,t){if(this.kvMap.has(e)){let n=this.kvMap.get(e);this._vMap===void 0&&(this._vMap=new Map);let r=this._vMap;for(;r.has(n);)n=r.get(n);r.set(n,t)}else this.kvMap.set(e,t)}forEach(e){for(let[t,n]of this.kvMap)if(e(n,t),this._vMap!==void 0){let r=this._vMap;for(;r.has(n);)n=r.get(n),e(n,t)}}};function A(e,t,n,r,i,a,o,s){id(`NgControlFlow`);let c=Vo(),l=Ho();return Mh(c,l,e,t,n,r,i,Co(l.consts,a),256,o,s),$h}function $h(e,t,n,r,i,a,o,s){id(`NgControlFlow`);let c=Vo(),l=Ho();return Mh(c,l,e,t,n,r,i,Co(l.consts,a),512,o,s),$h}function j(e,t){id(`NgControlFlow`);let n=Vo(),r=$o(),i=n[r]===Iu?-1:n[r],a=i===-1?void 0:ag(n,27+i);if(_p(n,r,e)){let r=an(null);try{if(a!==void 0&&Uf(a,0),e!==-1){let r=27+e,i=ag(n,r),a=ug(n[1],r),o=op(i,a,n);Hf(i,mf(n,a,t,{dehydratedView:o}),0,hf(a,o))}}finally{an(r)}}else if(a!==void 0){let e=Vf(a,0);e!==void 0&&(e[8]=t)}}var eg=class{lContainer;$implicit;$index;constructor(e,t,n){this.lContainer=e,this.$implicit=t,this.$index=n}get $count(){return this.lContainer.length-10}};function tg(e){return e}function ng(e,t){return t}var rg=class{hasEmptyBlock;trackByFn;liveCollection;constructor(e,t,n){this.hasEmptyBlock=e,this.trackByFn=t,this.liveCollection=n}};function M(e,t,n,r,i,a,o,s,c,l,u,d,f){id(`NgControlFlow`);let p=Vo(),m=Ho(),ee=c!==void 0,h=Vo(),g=new rg(ee,s?o.bind(h[15][8]):o);h[27+e]=g,Mh(p,m,e+1,t,n,r,i,Co(m.consts,a),256),ee&&Mh(p,m,e+2,c,l,u,d,Co(m.consts,f),512)}var ig=class extends Kh{lContainer;hostLView;templateTNode;operationsCounter=void 0;needsIndexUpdate=!1;constructor(e,t,n){super(),this.lContainer=e,this.hostLView=t,this.templateTNode=n}get length(){return this.lContainer.length-10}at(e){return this.getLView(e)[8].$implicit}attach(e,t){let n=t[6];this.needsIndexUpdate||=e!==this.length,Hf(this.lContainer,t,e,hf(this.templateTNode,n)),og(this.lContainer,e)}detach(e){return this.needsIndexUpdate||=e!==this.length-1,sg(this.lContainer,e),cg(this.lContainer,e)}create(e,t){let n=ap(this.lContainer,this.templateTNode.tView.ssrId);return mf(this.hostLView,this.templateTNode,new eg(this.lContainer,t,e),{dehydratedView:n})}destroy(e){yd(e[1],e)}updateValue(e,t){this.getLView(e)[8].$implicit=t}reset(){this.needsIndexUpdate=!1}updateIndexes(){if(this.needsIndexUpdate)for(let e=0;e0){let e=n[9];Fte(e,r),Wu.delete(n[19]),r.detachedLeaveAnimationFns=void 0}}function sg(e,t){if(e.length<=10)return;let n=e[10+t],r=n?n[26]:void 0;r&&r.leave&&r.leave.size>0&&(r.detachedLeaveAnimationFns=[])}function cg(e,t){return Wf(e,t)}function lg(e,t){return Vf(e,t)}function ug(e,t){return _o(e,t)}function P(e,t,n){let r=Vo();return _p(r,$o(),t)&&(Ho(),Jd(fs(),r,e,t,r[11],n)),P}function dg(e,t,n,r,i){cf(t,e,n,i?`class`:`style`,r)}function F(e,t,n,r){let i=Vo(),a=i[1],o=e+27,s=a.firstCreatePass?am(o,i,2,t,ef,Lo(),n,r):a.data[o];if(oo(s)){let n=i[10].tracingService;if(n&&n.componentCreate){let o=a.data[s.directiveStart+s.componentOffset];return n.componentCreate(fp(o),()=>(fg(e,t,i,s,r),F))}}return fg(e,t,i,s,r),F}function fg(e,t,n,r,i){if(af(r,n,e,t,mg),so(r)){let e=n[1];Wd(e,n,r),su(e,r,n)}i!=null&&Gd(n,r)}function I(){let e=Ho(),t=of(Uo());return e.firstCreatePass&&om(e,t),zo(t)&&Bo(),Io(),t.classesWithoutHost!=null&&Gc(t)&&dg(e,t,Vo(),t.classesWithoutHost,!0),t.stylesWithoutHost!=null&&Kc(t)&&dg(e,t,Vo(),t.stylesWithoutHost,!1),I}function L(e,t,n,r){return F(e,t,n,r),I(),L}function R(e,t,n,r){let i=Vo(),a=i[1],o=e+27,s=a.firstCreatePass?sm(o,a,2,t,n,r):a.data[o];return af(s,i,e,t,mg),r!=null&&Gd(i,s),R}function z(){return zo(of(Uo()))&&Bo(),Io(),z}function pg(e,t,n,r){return R(e,t,n,r),z(),pg}var mg=(e,t,n,r,i)=>(vs(!0),Su(t[11],r,hs()));function hg(e,t,n){let r=Vo(),i=r[1],a=e+27,o=i.firstCreatePass?am(a,r,8,`ng-container`,ef,Lo(),t,n):i.data[a];if(af(o,r,e,`ng-container`,vg),so(o)){let e=r[1];Wd(e,r,o),su(e,o,r)}return n!=null&&Gd(r,o),hg}function gg(){let e=Ho(),t=of(Uo());return e.firstCreatePass&&om(e,t),gg}function _g(e,t,n){return hg(e,t,n),gg(),_g}var vg=(e,t,n,r,i)=>(vs(!0),xu(t[11],``));function B(){return Vo()}function V(e,t,n){let r=Vo();return _p(r,$o(),t)&&(Ho(),Yd(fs(),r,e,t,r[11],n)),V}var yg=void 0;function bg(e){let t=Math.floor(Math.abs(e)),n=e.toString().replace(/^[^.]*\.?/,``).length;return t===1&&n===0?1:5}var xg=[`en`,[[`a`,`p`],[`AM`,`PM`]],[[`AM`,`PM`]],[[`S`,`M`,`T`,`W`,`T`,`F`,`S`],[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`],[`Su`,`Mo`,`Tu`,`We`,`Th`,`Fr`,`Sa`]],yg,[[`J`,`F`,`M`,`A`,`M`,`J`,`J`,`A`,`S`,`O`,`N`,`D`],[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`]],yg,[[`B`,`A`],[`BC`,`AD`],[`Before Christ`,`Anno Domini`]],0,[6,0],[`M/d/yy`,`MMM d, y`,`MMMM d, y`,`EEEE, MMMM d, y`],[`h:mm a`,`h:mm:ss a`,`h:mm:ss a z`,`h:mm:ss a zzzz`],[`{1}, {0}`,yg,yg,yg],[`.`,`,`,`;`,`%`,`+`,`-`,`E`,`×`,`‰`,`∞`,`NaN`,`:`],[`#,##0.###`,`#,##0%`,`¤#,##0.00`,`#E0`],`USD`,`$`,`US Dollar`,{},`ltr`,bg],Sg=Object.create(null);function Cg(e){let t=Eg(e),n=wg(t);if(n)return n;let r=t.split(`-`)[0];if(n=wg(r),n)return n;if(r===`en`)return xg;throw new pi(701,!1)}function wg(e){if(!(e in Sg)){let t=Qi.ng&&Qi.ng.common&&Qi.ng.common.locales&&Qi.ng.common.locales[e];return t!==void 0&&(Sg[e]=t),t}return Sg[e]}var Tg={LocaleId:0,DayPeriodsFormat:1,DayPeriodsStandalone:2,DaysFormat:3,DaysStandalone:4,MonthsFormat:5,MonthsStandalone:6,Eras:7,FirstDayOfWeek:8,WeekendRange:9,DateFormat:10,TimeFormat:11,DateTimeFormat:12,NumberSymbols:13,NumberFormats:14,CurrencyCode:15,CurrencySymbol:16,CurrencyName:17,Currencies:18,Directionality:19,PluralCase:20,ExtraData:21};function Eg(e){return e.toLowerCase().replace(/_/g,`-`)}var Dg=`en-US`;function Og(e){typeof e==`string`&&e.toLowerCase().replace(/_/g,`-`)}function H(e,t,n){let r=Vo(),i=Ho(),a=Uo();return kg(i,r,r[11],a,e,t,n),H}function U(e,t,n){let r=Vo(),i=Ho(),a=Uo();return(a.type&3||n)&&Cp(a,i,r,n,r[11],e,t,xp(a,r,t)),U}function kg(e,t,n,r,i,a,o){let s=!0,c=null;if((r.type&3||o)&&(c??=xp(r,t,a),Cp(r,e,t,o,n,i,a,c)&&(s=!1)),s){let e=r.outputs?.[i],n=r.hostDirectiveOutputs?.[i];if(n&&n.length)for(let e=0;e>17&32767}function zg(e){return(e&2)==2}function Bg(e,t){return e&131071|t<<17}function Vg(e){return e|2}function Hg(e){return(e&131068)>>2}function Ug(e,t){return e&-131069|t<<2}function Wg(e){return(e&1)==1}function Gg(e){return e|1}function Kg(e,t,n,r,i,a){let o=a?t.classBindings:t.styleBindings,s=Rg(o),c=Hg(o);e[r]=n;let l=!1,u;if(Array.isArray(n)){let e=n;u=e[1],(u===null||va(e,u)>0)&&(l=!0)}else u=n;if(i){if(c!==0){let t=Rg(e[s+1]);e[r+1]=Lg(t,s),t!==0&&(e[t+1]=Ug(e[t+1],r)),e[s+1]=Bg(e[s+1],r)}else e[r+1]=Lg(s,0),s!==0&&(e[s+1]=Ug(e[s+1],r)),s=r}else e[r+1]=Lg(c,0),s===0?s=r:e[c+1]=Ug(e[c+1],r),c=r;l&&(e[r+1]=Vg(e[r+1])),Jg(e,u,r,!0),Jg(e,u,r,!1),qg(t,u,e,r,a),o=Lg(s,c),a?t.classBindings=o:t.styleBindings=o}function qg(e,t,n,r,i){let a=i?e.residualClasses:e.residualStyles;a!=null&&typeof t==`string`&&va(a,t)>=0&&(n[r+1]=Gg(n[r+1]))}function Jg(e,t,n,r){let i=e[n+1],a=t===null,o=r?Rg(i):Hg(i),s=!1;for(;o!==0&&(s===!1||a);){let n=e[o],i=e[o+1];Yg(n,t)&&(s=!0,e[o+1]=r?Gg(i):Vg(i)),o=r?Rg(i):Hg(i)}s&&(e[n+1]=r?Vg(i):Gg(i))}function Yg(e,t){return e===null||t==null||(Array.isArray(e)?e[1]:e)===t?!0:Array.isArray(e)&&typeof t==`string`?va(e,t)>=0:!1}var Xg={textEnd:0,key:0,keyEnd:0,value:0,valueEnd:0};function Zg(e){return e.substring(Xg.key,Xg.keyEnd)}function Qg(e){return e_(e),$g(e,t_(e,0,Xg.textEnd))}function $g(e,t){let n=Xg.textEnd;return n===t?-1:(t=Xg.keyEnd=n_(e,Xg.key=t,n),t_(e,t,n))}function e_(e){Xg.key=0,Xg.keyEnd=0,Xg.value=0,Xg.valueEnd=0,Xg.textEnd=e.length}function t_(e,t,n){for(;t32;)t++;return t}function r_(e,t,n){return o_(e,t,n,!1),r_}function G(e,t){return o_(e,t,null,!0),G}function i_(e){s_(__,a_,e,!0)}function a_(e,t){for(let n=Qg(t);n>=0;n=$g(t,n))ga(e,Zg(t),!0)}function o_(e,t,n,r){let i=Vo(),a=Ho(),o=es(2);if(a.firstUpdatePass&&l_(a,e,o,r),t!==Iu&&_p(i,o,t)){let s=a.data[us()];y_(a,s,i,i[11],e,i[o+1]=S_(t,n),r,o)}}function s_(e,t,n,r){let i=Ho(),a=es(2);i.firstUpdatePass&&l_(i,null,a,r);let o=Vo();if(n!==Iu&&_p(o,a,n)){let s=i.data[us()];if(C_(s,r)&&!c_(i,a)){let e=r?s.classesWithoutHost:s.stylesWithoutHost;e!==null&&(n=_i(e,n||``)),dg(i,s,o,n,r)}else v_(i,s,o,o[11],o[a+1],o[a+1]=g_(e,t,n),r,a)}}function c_(e,t){return t>=e.expandoStartIndex}function l_(e,t,n,r){let i=e.data;if(i[n+1]===null){let a=i[us()],o=c_(e,n);C_(a,r)&&t===null&&!o&&(t=!1),t=u_(i,a,t,r),Kg(i,a,t,n,o,r)}}function u_(e,t,n,r){let i=Qee(e),a=r?t.residualClasses:t.residualStyles;if(i===null)(r?t.classBindings:t.styleBindings)===0&&(n=m_(null,e,t,n,r),n=h_(n,t.attrs,r),a=null);else{let o=t.directiveStylingLast;if(o===-1||e[o]!==i){if(n=m_(i,e,t,n,r),a===null){let n=d_(e,t,r);n!==void 0&&Array.isArray(n)&&(n=m_(null,e,t,n[1],r),n=h_(n,t.attrs,r),f_(e,t,r,n))}else a=p_(e,t,r)}}return a!==void 0&&(r?t.residualClasses=a:t.residualStyles=a),n}function d_(e,t,n){let r=n?t.classBindings:t.styleBindings;if(Hg(r)!==0)return e[Rg(r)]}function f_(e,t,n,r){let i=n?t.classBindings:t.styleBindings;e[Rg(i)]=r}function p_(e,t,n){let r,i=t.directiveEnd;for(let a=1+t.directiveStylingLast;a0;){let t=e[i],a=Array.isArray(t),c=a?t[1]:t,l=c===null,u=n[i+1];u===Iu&&(u=l?xa:void 0);let d=l?_a(u,r):c===r?u:void 0;if(a&&!x_(d)&&(d=_a(t,r)),x_(d)&&(s=d,o))return s;let f=e[i+1];i=o?Rg(f):Hg(f)}if(t!==null){let e=a?t.residualClasses:t.residualStyles;e!=null&&(s=_a(e,r))}return s}function x_(e){return e!==void 0}function S_(e,t){return e==null||e===``||(typeof t==`string`?e=uu(e)+t:typeof e==`object`&&(e=gi(uu(e)))),e}function C_(e,t){return!!(e.flags&(t?8:16))}function K(e,t=``){let n=Vo(),r=Ho(),i=e+27,a=r.firstCreatePass?Zf(r,i,1,t,null):r.data[i],o=w_(r,n,a,t);n[i]=o,_s()&&Cd(r,n,o,a),Go(a,!1)}var w_=(e,t,n,r)=>(vs(!0),yu(t[11],r));function T_(e,t,n,r=``){return _p(e,$o(),n)?t+Bi(n)+r:Iu}function E_(e,t,n,r,i,a=``){let o=vp(e,Qo(),n,i);return es(2),o?t+Bi(n)+r+Bi(i)+a:Iu}function D_(e,t,n,r,i,a,o,s=``){let c=yp(e,Qo(),n,i,o);return es(3),c?t+Bi(n)+r+Bi(i)+a+Bi(o)+s:Iu}function O_(e,t,n,r,i,a,o,s,c,l=``){let u=bp(e,Qo(),n,i,o,c);return es(4),u?t+Bi(n)+r+Bi(i)+a+Bi(o)+s+Bi(c)+l:Iu}function q(e){return J(``,e),q}function J(e,t,n){let r=Vo(),i=T_(r,e,t,n);return i!==Iu&&j_(r,us(),i),J}function Y(e,t,n,r,i){let a=Vo(),o=E_(a,e,t,n,r,i);return o!==Iu&&j_(a,us(),o),Y}function k_(e,t,n,r,i,a,o){let s=Vo(),c=D_(s,e,t,n,r,i,a,o);return c!==Iu&&j_(s,us(),c),k_}function A_(e,t,n,r,i,a,o,s,c){let l=Vo(),u=O_(l,e,t,n,r,i,a,o,s,c);return u!==Iu&&j_(l,us(),u),A_}function j_(e,t,n){let r=ho(t,e);bu(e[11],r,n)}function M_(e,t,n){_c(t)&&(t=t());let r=Vo();return _p(r,$o(),t)&&(Ho(),Jd(fs(),r,e,t,r[11],n)),M_}function N_(e,t){let n=_c(e);return n&&e.set(t),n}function P_(e,t){let n=Vo(),r=Ho(),i=Uo();return kg(r,n,n[11],i,e,t),P_}var F_={};function I_(e){id(`NgLet`);let t=Ho(),n=Vo(),r=e+27;return Go(Zf(t,r,128,null,null),!1),yo(t,n,r,F_),I_}function L_(e){return yo(Ho(),Vo(),us(),e),e}function R_(e){let t=vo(Jo(),27+e);if(t===F_)throw new pi(314,!1);return t}function z_(e,t,n=``){return T_(Vo(),e,t,n)}function B_(e,t,n){let r=Ho();r.firstCreatePass&&V_(t,r.data,r.blueprint,co(e),n)}function V_(e,t,n,r,i){if(e=yi(e),Array.isArray(e))for(let a=0;a>20;if(Fa(e)||!e.multi){let r=new Wc(l,i,Wp,null),p=W_(c,t,i?u:u+f,d);p===-1?(pl(ll(s,o),a,c),H_(a,e,t.length),t.push(c),s.directiveStart++,s.directiveEnd++,i&&(s.providerIndexes+=1048576),n.push(r),o.push(r)):(n[p]=r,o[p]=r)}else{let p=W_(c,t,u+f,d),m=W_(c,t,u,u+f),ee=p>=0&&n[p],h=m>=0&&n[m];if(i&&!h||!i&&!ee){pl(ll(s,o),a,c);let u=ene(i?$te:Qte,n.length,i,r,l,e);!i&&h&&(n[m].providerFactory=u),H_(a,e,t.length,0),t.push(c),s.directiveStart++,s.directiveEnd++,i&&(s.providerIndexes+=1048576),n.push(u),o.push(u)}else{let t=U_(n[i?m:p],l,!i&&r);H_(a,e,p>-1?p:m,t)}!i&&r&&h&&n[m].componentProviders++}}}function H_(e,t,n,r){let i=Fa(t),a=Ia(t);if(i||a){let o=(a?yi(t.useClass):t).prototype.ngOnDestroy;if(o){let a=e.destroyHooks||=[];if(!i&&t.multi){let e=a.indexOf(n);e===-1?a.push(n,[r,o]):a[e+1].push(r,o)}else a.push(n,o)}}}function U_(e,t,n){return n&&e.componentProviders++,e.multi.push(t)-1}function W_(e,t,n,r){for(let i=n;i{n.providersResolver=(t,n)=>B_(t,n?n(e):e,!1),t&&(n.viewProvidersResolver=(e,n)=>B_(e,n?n(t):t,!0))}}function q_(e,t){let n=Zo()+e,r=Vo();return r[n]===Iu?hp(r,n,t()):gp(r,n)}function J_(e,t,n){return Z_(Vo(),Zo(),e,t,n)}function Y_(e,t,n,r){return Q_(Vo(),Zo(),e,t,n,r)}function tne(e,t,n,r,i,a,o){return nne(Vo(),Zo(),e,t,n,r,i,a)}function X_(e,t){let n=e[t];return n===Iu?void 0:n}function Z_(e,t,n,r,i,a){let o=t+n;return _p(e,o,i)?hp(e,o+1,a?r.call(a,i):r(i)):X_(e,o+1)}function Q_(e,t,n,r,i,a,o){let s=t+n;return vp(e,s,i,a)?hp(e,s+2,o?r.call(o,i,a):r(i,a)):X_(e,s+2)}function nne(e,t,n,r,i,a,o,s,c){let l=t+n;return bp(e,l,i,a,o,s)?hp(e,l+4,c?r.call(c,i,a,o,s):r(i,a,o,s)):X_(e,l+4)}function $_(e,t){let n=Ho(),r,i=e+27;n.firstCreatePass?(r=rne(t,n.pipeRegistry),n.data[i]=r,r.onDestroy&&(n.destroyHooks??=[]).push(i,r.onDestroy)):r=n.data[i];let a=r.factory||(r.factory=ca(r.type,!0)),o=Xi(Wp);try{let e=rl(!1),t=a();return rl(e),yo(n,Vo(),i,t),t}finally{Xi(o)}}function rne(e,t){if(t)for(let n=t.length-1;n>=0;n--){let r=t[n];if(e===r.name)return r}}function ev(e,t,n){let r=e+27,i=Vo(),a=vo(i,r);return nv(i,r)?Z_(i,Zo(),t,a.transform,n,a):a.transform(n)}function tv(e,t,n,r){let i=e+27,a=Vo(),o=vo(a,i);return nv(a,i)?Q_(a,Zo(),t,o.transform,n,r,o):o.transform(n,r)}function nv(e,t){return e[1].data[t].pure}function rv(e,t){return Xf(e,t)}var ine=(()=>{class e{applicationErrorHandler=x(Js);appRef=x(Bh);taskService=x(Ds);ngZone=x(Fs);zonelessEnabled=x(ac);tracing=x(nd,{optional:!0});zoneIsDefined=typeof Zone<`u`&&!!Zone.root.run;schedulerTickApplyArgs=[{data:{__scheduler_tick__:!0}}];subscriptions=new cr;angularZoneId=this.zoneIsDefined?this.ngZone._inner?.get(Ns):null;scheduleInRootZone=!this.zonelessEnabled&&this.zoneIsDefined&&(x(oc,{optional:!0})??!1);cancelScheduledCallback=null;useMicrotaskScheduler=!1;runningTick=!1;pendingRenderTaskId=null;constructor(){this.subscriptions.add(this.appRef.afterTick.subscribe(()=>{let e=this.taskService.add();if(!this.runningTick&&(this.cleanup(),!this.zonelessEnabled||this.appRef.includeAllTestViews)){this.taskService.remove(e);return}this.switchToMicrotaskScheduler(),this.taskService.remove(e)})),this.subscriptions.add(this.ngZone.onUnstable.subscribe(()=>{this.runningTick||this.cleanup()}))}switchToMicrotaskScheduler(){this.ngZone.runOutsideAngular(()=>{let e=this.taskService.add();this.useMicrotaskScheduler=!0,queueMicrotask(()=>{this.useMicrotaskScheduler=!1,this.taskService.remove(e)})})}notify(e){if(!this.zonelessEnabled&&e===5)return;switch(e){case 0:case 2:this.appRef.dirtyFlags|=2;break;case 3:case 4:case 5:case 1:this.appRef.dirtyFlags|=4;break;case 6:this.appRef.dirtyFlags|=2;break;case 12:this.appRef.dirtyFlags|=16;break;case 13:this.appRef.dirtyFlags|=2;break;case 11:break;default:this.appRef.dirtyFlags|=8}if(this.appRef.tracingSnapshot=this.tracing?.snapshot(this.appRef.tracingSnapshot)??null,!this.shouldScheduleTick())return;let t=this.useMicrotaskScheduler?js:As;this.pendingRenderTaskId=this.taskService.add(),this.cancelScheduledCallback=this.scheduleInRootZone?Zone.root.run(()=>t(()=>this.tick())):this.ngZone.runOutsideAngular(()=>t(()=>this.tick()))}shouldScheduleTick(){return!(this.appRef.destroyed||this.pendingRenderTaskId!==null||this.runningTick||this.appRef._runningTick||!this.zonelessEnabled&&this.zoneIsDefined&&Zone.current.get(`isAngularZone_ID`+this.angularZoneId))}tick(){if(this.runningTick||this.appRef.destroyed)return;if(this.appRef.dirtyFlags===0){this.cleanup();return}!this.zonelessEnabled&&this.appRef.dirtyFlags&7&&(this.appRef.dirtyFlags|=1);let e=this.taskService.add();try{this.ngZone.run(()=>{this.runningTick=!0,this.appRef._tick()},void 0,this.schedulerTickApplyArgs)}catch(e){this.applicationErrorHandler(e)}finally{this.taskService.remove(e),this.cleanup()}}ngOnDestroy(){this.subscriptions.unsubscribe(),this.cleanup()}cleanup(){if(this.runningTick=!1,this.cancelScheduledCallback?.(),this.cancelScheduledCallback=null,this.pendingRenderTaskId!==null){let e=this.pendingRenderTaskId;this.pendingRenderTaskId=null,this.taskService.remove(e)}}static ɵfac=function(t){return new(t||e)};static ɵprov=Al({token:e,factory:e.ɵfac})}return e})();function ane(){return[{provide:ic,useExisting:ine},{provide:Fs,useClass:Us},{provide:ac,useValue:!0}]}function one(){return typeof $localize<`u`&&$localize.locale||`en-US`}var iv=new Oi(``,{factory:()=>x(iv,{optional:!0,skipSelf:!0})||one()}),av=class{destroyed=!1;listeners=null;errorHandler=x(qs,{optional:!0});isEmitting=!1;hasNullListeners=!1;destroyRef=x(Cs);constructor(){this.destroyRef.onDestroy(()=>{this.destroyed=!0,this.listeners=null})}subscribe(e){if(this.destroyed)throw new pi(953,!1);return(this.listeners??=[]).push(e),{unsubscribe:()=>{let t=this.listeners?this.listeners.indexOf(e):-1;t>-1&&(this.isEmitting?(this.hasNullListeners=!0,this.listeners[t]=null):this.listeners.splice(t,1))}}}emit(e){if(this.destroyed){console.warn(mi(953,!1));return}if(this.listeners===null)return;this.isEmitting=!0;let t=an(null);try{for(let t of this.listeners)try{t!==null&&t(e)}catch(e){this.errorHandler?.handleError(e)}}finally{this.hasNullListeners&&(this.hasNullListeners=!1,this.listeners&&sne(this.listeners)),an(t),this.isEmitting=!1}}};function sne(e){let t=e.length-1;for(;t>-1;)e[t]===null&&e.splice(t,1),t--}function X(e,t){return En(e,t?.equal)}function Z(e){return qn(e)}(class e extends Error{_brand;constructor(e){super(e)}static IDLE=new e(`IDLE`);static LOADING=new e(`LOADING`)});var cne=e=>e;function Q(e,t){return typeof e==`function`?ov(Un(e,cne,t?.equal),t?.debugName,t?.set):ov(Un(e.source,e.computation,e.equal),e.debugName,e.set)}function ov(e,t,n){let r=e[rn],i=e;if(n!==void 0){let t=e=>Wn(r,e);i.set=e=>n(e,t),i.update=r=>n(r(Z(e)),t)}else i.set=e=>Wn(r,e),i.update=e=>Gn(r,e);return i.asReadonly=Xs.bind(e),i}var sv=!1;function lne(){return sv}function cv(e){sv=e}function lv(e,t){let n=Object.create(yc);n.value=e,n.transformFn=t?.transform;function r(){if(cn(n),n.value===vc)throw new pi(-950,null);return n.value}return r[rn]=n,r}function uv(e){return new av}function dv(e,t){return lv(e,t)}function une(e){return lv(vc,e)}var $=(dv.required=une,dv);function fv(e,t){let n=Object.create(yc),r=new av;n.value=e;function i(){return cn(n),pv(n.value),n.value}return i[rn]=n,i.asReadonly=Xs.bind(i),i.set=e=>{n.equal(n.value,e)||(Mn(n,e),r.emit(e))},i.update=e=>{pv(n.value),i.set(e(n.value))},i.subscribe=r.subscribe.bind(r),i.destroyRef=r.destroyRef,i}function pv(e){if(e===vc)throw new pi(952,!1)}function mv(e,t){return fv(e,t)}function dne(e){return fv(vc,e)}var hv=(mv.required=dne,mv);function gv(e,t){return eh(t)}function fne(e,t){return th(t)}var _v=(gv.required=fne,gv),pne=(()=>{class e{static __NG_ELEMENT_ID__=mne}return e})();function mne(e){return hne(Uo(),Vo(),(e&16)==16)}function hne(e,t,n){if(oo(e)&&!n){let n=bo(e.index,t);return new qf(n,n)}if(e.type&175){let e=t[15];return new qf(e,t)}return null}var vv=new Oi(``),gne=new Oi(``);function yv(e){return!e.moduleRef}function _ne(e){let t=yv(e)?e.r3Injector:e.moduleRef.injector,n=t.get(Fs);return n.run(()=>{yv(e)?e.r3Injector.resolveInjectorInitializers():e.moduleRef.resolveInjectorInitializers();let r=t.get(Js),i;if(n.runOutsideAngular(()=>{i=n.onError.subscribe({next:r})}),yv(e)){let n=()=>t.destroy(),r=e.platformInjector.get(vv);r.add(n),t.onDestroy(()=>{i.unsubscribe(),r.delete(n)})}else{let t=()=>e.moduleRef.destroy(),n=e.platformInjector.get(vv);n.add(t),e.moduleRef.onDestroy(()=>{Hh(e.allPlatformModules,e.moduleRef),i.unsubscribe(),n.delete(t)})}return yne(r,n,()=>{let n=t.get(Ds),r=n.add(),i=t.get(bh);return i.runInitializers(),i.donePromise.then(()=>{if(Og(t.get(iv,Dg)||`en-US`),!t.get(gne,!0))return yv(e)?t.get(Bh):(e.allPlatformModules.push(e.moduleRef),e.moduleRef);if(yv(e)){let n=t.get(Bh);return e.rootComponent!==void 0&&n.bootstrap(e.rootComponent),n}return vne?.(e.moduleRef,e.allPlatformModules),e.moduleRef}).finally(()=>void n.remove(r))})})}var vne;function yne(e,t,n){try{let r=n();return ih(r)?r.catch(n=>{throw t.runOutsideAngular(()=>e(n)),n}):r}catch(n){throw t.runOutsideAngular(()=>e(n)),n}}var bv=null;function bne(e=[],t){return xs.create({name:t,providers:[{provide:La,useValue:`platform`},{provide:vv,useValue:new Set([()=>bv=null])},...e]})}function xne(e=[]){if(bv)return bv;let t=bne(e);return bv=t,Rh(),Sne(t),t}function Sne(e){let t=e.get($s,null);eo(e,()=>{t?.forEach(e=>e())})}function Cne(e){let{rootComponent:t,appProviders:n,platformProviders:r,platformRef:i}=e;Pc(xc.BootstrapApplicationStart);try{let e=i?.injector??xne(r);return _ne({r3Injector:new sh({providers:[ane(),Ys,...n||[]],parent:e,debugName:``,runEnvironmentInitializers:!1}).injector,platformInjector:e,rootComponent:t})}catch(e){return Promise.reject(e)}finally{Pc(xc.BootstrapApplicationEnd)}}function xv(e){return typeof e==`boolean`?e:e!=null&&e!==`false`}var Sv=Symbol(`NOT_SET`),Cv=new Set,wne={...Pn,kind:`afterRenderEffectPhase`,consumerIsAlwaysLive:!0,consumerAllowSignalWrites:!0,value:Sv,cleanup:null,consumerMarkedDirty(){if(this.sequence.impl.executing){if(this.sequence.lastPhase===null||this.sequence.lastPhase(cn(r),r.value),r.signal[rn]=r,r.registerCleanupFn=e=>(r.cleanup??=new Set).add(e),this.nodes[e]=r,this.hooks[e]=e=>r.phaseFn(e)}}afterRun(){super.afterRun(),this.lastPhase=null}destroy(){if(this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();super.destroy();for(let e of this.nodes)if(e)try{for(let t of e.cleanup??Cv)t()}finally{bn(e)}}};function wv(e,t){let n=t?.injector??x(xs),r=n.get(ic),i=n.get(ad),a=n.get(nd,null,{optional:!0});i.impl??=n.get(sd);let o=e;typeof o==`function`&&(o={mixedReadWrite:e});let s=n.get(nc,null,{optional:!0}),c=new Tne(i.impl,[o.earlyRead,o.write,o.mixedReadWrite,o.read],s?.view,r,n,a?.snapshot(null));return i.impl.register(c),c}var Tv=null;function Ev(){return Tv}function Ene(e){Tv??=e}var Dne=class{},Dv=(function(e){return e[e.Format=0]=`Format`,e[e.Standalone=1]=`Standalone`,e})(Dv||{}),Ov=(function(e){return e[e.Narrow=0]=`Narrow`,e[e.Abbreviated=1]=`Abbreviated`,e[e.Wide=2]=`Wide`,e[e.Short=3]=`Short`,e})(Ov||{}),kv=(function(e){return e[e.Short=0]=`Short`,e[e.Medium=1]=`Medium`,e[e.Long=2]=`Long`,e[e.Full=3]=`Full`,e})(kv||{}),Av={Decimal:0,Group:1,List:2,PercentSign:3,PlusSign:4,MinusSign:5,Exponential:6,SuperscriptingExponent:7,PerMille:8,Infinity:9,NaN:10,TimeSeparator:11,CurrencyDecimal:12,CurrencyGroup:13};function One(e){return Cg(e)[Tg.LocaleId]}function kne(e,t,n){let r=Cg(e);return Iv(Iv([r[Tg.DayPeriodsFormat],r[Tg.DayPeriodsStandalone]],t),n)}function Ane(e,t,n){let r=Cg(e);return Iv(Iv([r[Tg.DaysFormat],r[Tg.DaysStandalone]],t),n)}function jne(e,t,n){let r=Cg(e);return Iv(Iv([r[Tg.MonthsFormat],r[Tg.MonthsStandalone]],t),n)}function Mne(e,t){let n=Cg(e)[Tg.Eras];return Iv(n,t)}function jv(e,t){return Iv(Cg(e)[Tg.DateFormat],t)}function Mv(e,t){return Iv(Cg(e)[Tg.TimeFormat],t)}function Nv(e,t){let n=Cg(e)[Tg.DateTimeFormat];return Iv(n,t)}function Pv(e,t){let n=Cg(e),r=n[Tg.NumberSymbols][t];if(r===void 0){if(t===Av.CurrencyDecimal)return n[Tg.NumberSymbols][Av.Decimal];if(t===Av.CurrencyGroup)return n[Tg.NumberSymbols][Av.Group]}return r}function Fv(e){if(!e[Tg.ExtraData])throw new pi(2303,!1)}function Nne(e){let t=Cg(e);return Fv(t),(t[Tg.ExtraData][2]||[]).map(e=>typeof e==`string`?Lv(e):[Lv(e[0]),Lv(e[1])])}function Pne(e,t,n){let r=Cg(e);return Fv(r),Iv(Iv([r[Tg.ExtraData][0],r[Tg.ExtraData][1]],t)||[],n)||[]}function Iv(e,t){for(let n=t;n>-1;n--)if(e[n]!==void 0)return e[n];throw new pi(2304,!1)}function Lv(e){let[t,n]=e.split(`:`);return{hours:+t,minutes:+n}}var Fne=/^(\d{4,})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/,Rv=Object.create(null),Ine=/((?:[^BEGHLMOSWYZabcdhmswyz']+)|(?:'(?:[^']|'')*')|(?:G{1,5}|y{1,4}|Y{1,4}|M{1,5}|L{1,5}|w{1,2}|W{1}|d{1,2}|E{1,6}|c{1,6}|a{1,5}|b{1,5}|B{1,5}|h{1,2}|H{1,2}|m{1,2}|s{1,2}|S{1,3}|z{1,4}|Z{1,5}|O{1,4}))([\s\S]*)/,Lne=256;function Rne(e,t,n,r){let i=Jne(e);zne(t),t=Bv(n,t)||t;let a=[],o;for(;t;)if(o=Ine.exec(t),o){a=a.concat(o.slice(1));let e=a.pop();if(!e)break;t=e}else{a.push(t);break}let s=i.getTimezoneOffset();r&&(s=Zv(r,s),i=qne(i,r));let c=``;return a.forEach(e=>{let t=Gne(e);c+=t?t(i,n,s):e===`''`?`'`:e.replace(/(^'|'$)/g,``).replace(/''/g,`'`)}),c}function zne(e){if(e.length>Lne)throw new pi(2300,!1)}function zv(e,t,n){let r=new Date(0);return r.setFullYear(e,t,n),r.setHours(0,0,0),r}function Bv(e,t){let n=One(e);if(Rv[n]??=Object.create(null),Rv[n][t])return Rv[n][t];let r=``;switch(t){case`shortDate`:r=jv(e,kv.Short);break;case`mediumDate`:r=jv(e,kv.Medium);break;case`longDate`:r=jv(e,kv.Long);break;case`fullDate`:r=jv(e,kv.Full);break;case`shortTime`:r=Mv(e,kv.Short);break;case`mediumTime`:r=Mv(e,kv.Medium);break;case`longTime`:r=Mv(e,kv.Long);break;case`fullTime`:r=Mv(e,kv.Full);break;case`short`:let t=Bv(e,`shortTime`),n=Bv(e,`shortDate`);r=Vv(Nv(e,kv.Short),[t,n]);break;case`medium`:let i=Bv(e,`mediumTime`),a=Bv(e,`mediumDate`);r=Vv(Nv(e,kv.Medium),[i,a]);break;case`long`:let o=Bv(e,`longTime`),s=Bv(e,`longDate`);r=Vv(Nv(e,kv.Long),[o,s]);break;case`full`:let c=Bv(e,`fullTime`),l=Bv(e,`fullDate`);r=Vv(Nv(e,kv.Full),[c,l])}return r&&(Rv[n][t]=r),r}function Vv(e,t){return t&&(e=e.replace(/\{([^}]+)}/g,function(e,n){return Object.hasOwn(t,n)?t[n]:e})),e}function Hv(e,t,n=`-`,r,i){let a=``;(e<0||i&&e<=0)&&(i?e=-e+1:(e=-e,a=n));let o=String(e);for(;o.length0||s>-n)&&(s+=n),e===3)s===0&&n===-12&&(s=12);else if(e===6)return Bne(s,t);let c=Pv(o,Av.MinusSign);return Hv(s,t,c,r,i)}}function Vne(e,t){switch(e){case 0:return t.getFullYear();case 1:return t.getMonth();case 2:return t.getDate();case 3:return t.getHours();case 4:return t.getMinutes();case 5:return t.getSeconds();case 6:return t.getMilliseconds();case 7:return t.getDay();default:throw new pi(2301,!1)}}function Wv(e,t,n=Dv.Format,r=!1){return function(i,a){return Hne(i,a,e,t,n,r)}}function Hne(e,t,n,r,i,a){switch(n){case 2:return jne(t,i,r)[e.getMonth()];case 1:return Ane(t,i,r)[e.getDay()];case 0:let n=e.getHours(),o=e.getMinutes();if(a){let e=Nne(t),a=Pne(t,i,r),s=e.findIndex(e=>{if(Array.isArray(e)){let[t,r]=e,i=n>=t.hours&&o>=t.minutes,a=n0?Math.floor(i/60):Math.ceil(i/60);switch(e){case 0:return(i>=0?`+`:``)+Hv(o,2,a)+Hv(Math.abs(i%60),2,a);case 1:return`GMT`+(i>=0?`+`:``)+Hv(o,1,a);case 2:return`GMT`+(i>=0?`+`:``)+Hv(o,2,a)+`:`+Hv(Math.abs(i%60),2,a);case 3:return r===0?`Z`:(i>=0?`+`:``)+Hv(o,2,a)+`:`+Hv(Math.abs(i%60),2,a);default:throw new pi(2310,!1)}}}var Une=0,Kv=4;function Wne(e){let t=zv(e,Une,1).getDay();return zv(e,0,1+(t<=Kv?Kv:11)-t)}function qv(e){let t=e.getDay(),n=t===0?-3:Kv-t;return zv(e.getFullYear(),e.getMonth(),e.getDate()+n)}function Jv(e,t=!1){return function(n,r){let i;if(t){let e=new Date(n.getFullYear(),n.getMonth(),1).getDay()-1,t=n.getDate();i=1+Math.floor((t+e)/7)}else{let e=qv(n),t=Wne(e.getFullYear()),r=e.getTime()-t.getTime();i=1+Math.round(r/6048e5)}return Hv(i,e,Pv(r,Av.MinusSign))}}function Yv(e,t=!1){return function(n,r){return Hv(qv(n).getFullYear(),e,Pv(r,Av.MinusSign),t)}}var Xv=Object.create(null);function Gne(e){if(Xv[e])return Xv[e];let t;switch(e){case`G`:case`GG`:case`GGG`:t=Wv(3,Ov.Abbreviated);break;case`GGGG`:t=Wv(3,Ov.Wide);break;case`GGGGG`:t=Wv(3,Ov.Narrow);break;case`y`:t=Uv(0,1,0,!1,!0);break;case`yy`:t=Uv(0,2,0,!0,!0);break;case`yyy`:t=Uv(0,3,0,!1,!0);break;case`yyyy`:t=Uv(0,4,0,!1,!0);break;case`Y`:t=Yv(1);break;case`YY`:t=Yv(2,!0);break;case`YYY`:t=Yv(3);break;case`YYYY`:t=Yv(4);break;case`M`:case`L`:t=Uv(1,1,1);break;case`MM`:case`LL`:t=Uv(1,2,1);break;case`MMM`:t=Wv(2,Ov.Abbreviated);break;case`MMMM`:t=Wv(2,Ov.Wide);break;case`MMMMM`:t=Wv(2,Ov.Narrow);break;case`LLL`:t=Wv(2,Ov.Abbreviated,Dv.Standalone);break;case`LLLL`:t=Wv(2,Ov.Wide,Dv.Standalone);break;case`LLLLL`:t=Wv(2,Ov.Narrow,Dv.Standalone);break;case`w`:t=Jv(1);break;case`ww`:t=Jv(2);break;case`W`:t=Jv(1,!0);break;case`d`:t=Uv(2,1);break;case`dd`:t=Uv(2,2);break;case`c`:case`cc`:t=Uv(7,1);break;case`ccc`:t=Wv(1,Ov.Abbreviated,Dv.Standalone);break;case`cccc`:t=Wv(1,Ov.Wide,Dv.Standalone);break;case`ccccc`:t=Wv(1,Ov.Narrow,Dv.Standalone);break;case`cccccc`:t=Wv(1,Ov.Short,Dv.Standalone);break;case`E`:case`EE`:case`EEE`:t=Wv(1,Ov.Abbreviated);break;case`EEEE`:t=Wv(1,Ov.Wide);break;case`EEEEE`:t=Wv(1,Ov.Narrow);break;case`EEEEEE`:t=Wv(1,Ov.Short);break;case`a`:case`aa`:case`aaa`:t=Wv(0,Ov.Abbreviated);break;case`aaaa`:t=Wv(0,Ov.Wide);break;case`aaaaa`:t=Wv(0,Ov.Narrow);break;case`b`:case`bb`:case`bbb`:t=Wv(0,Ov.Abbreviated,Dv.Standalone,!0);break;case`bbbb`:t=Wv(0,Ov.Wide,Dv.Standalone,!0);break;case`bbbbb`:t=Wv(0,Ov.Narrow,Dv.Standalone,!0);break;case`B`:case`BB`:case`BBB`:t=Wv(0,Ov.Abbreviated,Dv.Format,!0);break;case`BBBB`:t=Wv(0,Ov.Wide,Dv.Format,!0);break;case`BBBBB`:t=Wv(0,Ov.Narrow,Dv.Format,!0);break;case`h`:t=Uv(3,1,-12);break;case`hh`:t=Uv(3,2,-12);break;case`H`:t=Uv(3,1);break;case`HH`:t=Uv(3,2);break;case`m`:t=Uv(4,1);break;case`mm`:t=Uv(4,2);break;case`s`:t=Uv(5,1);break;case`ss`:t=Uv(5,2);break;case`S`:t=Uv(6,1);break;case`SS`:t=Uv(6,2);break;case`SSS`:t=Uv(6,3);break;case`Z`:case`ZZ`:case`ZZZ`:t=Gv(0);break;case`ZZZZZ`:t=Gv(3);break;case`O`:case`OO`:case`OOO`:case`z`:case`zz`:case`zzz`:t=Gv(1);break;case`OOOO`:case`ZZZZ`:case`zzzz`:t=Gv(2);break;default:return null}return Xv[e]=t,t}function Zv(e,t){e=e.replace(/:/g,``);let n=Date.parse(`Jan 01, 1970 00:00:00 `+e)/6e4;return isNaN(n)?t:n}function Kne(e,t){return e=new Date(e.getTime()),e.setMinutes(e.getMinutes()+t),e}function qne(e,t,n){let r=e.getTimezoneOffset();return Kne(e,-1*(Zv(t,r)-r))}function Jne(e){if(Qv(e))return e;if(typeof e==`number`&&!isNaN(e))return new Date(e);if(typeof e==`string`){if(e=e.trim(),/^(\d{4}(-\d{1,2}(-\d{1,2})?)?)$/.test(e)){let[t,n=1,r=1]=e.split(`-`).map(e=>+e);return zv(t,n-1,r)}let t=parseFloat(e);if(!isNaN(e-t))return new Date(t);let n;if(n=e.match(Fne))return Yne(n)}let t=new Date(e);if(!Qv(t))throw new pi(2311,!1);return t}function Yne(e){let t=new Date(0),n=0,r=0,i=e[8]?t.setUTCFullYear:t.setFullYear,a=e[8]?t.setUTCHours:t.setHours;e[9]&&(n=Number(e[9]+e[10]),r=Number(e[9]+e[11])),i.call(t,Number(e[1]),Number(e[2])-1,Number(e[3]));let o=Number(e[4]||0)-n,s=Number(e[5]||0)-r,c=Number(e[6]||0),l=Math.floor(parseFloat(`0.`+(e[7]||0))*1e3);return a.call(t,o,s,c,l),t}function Qv(e){return e instanceof Date&&!isNaN(e.valueOf())}var $v=(()=>{class e{_viewContainerRef;_viewRef=null;ngTemplateOutletContext=null;ngTemplateOutlet=null;ngTemplateOutletInjector=null;injector=x(xs);constructor(e){this._viewContainerRef=e}ngOnChanges(e){if(this._shouldRecreateView(e)){let e=this._viewContainerRef;if(this._viewRef&&e.remove(e.indexOf(this._viewRef)),!this.ngTemplateOutlet){this._viewRef=null;return}let t=this._createContextForwardProxy();this._viewRef=e.createEmbeddedView(this.ngTemplateOutlet,t,{injector:this._getInjector()})}}_getInjector(){return this.ngTemplateOutletInjector===`outlet`?this.injector:this.ngTemplateOutletInjector??void 0}_shouldRecreateView(e){return!!e.ngTemplateOutlet||!!e.ngTemplateOutletInjector}_createContextForwardProxy(){return new Proxy({},{set:(e,t,n)=>this.ngTemplateOutletContext?Reflect.set(this.ngTemplateOutletContext,t,n):!1,get:(e,t,n)=>{if(this.ngTemplateOutletContext)return Reflect.get(this.ngTemplateOutletContext,t,n)}})}static ɵfac=function(t){return new(t||e)(Wp(wm))};static ɵdir=ph({type:e,selectors:[[``,`ngTemplateOutlet`,``]],inputs:{ngTemplateOutletContext:`ngTemplateOutletContext`,ngTemplateOutlet:`ngTemplateOutlet`,ngTemplateOutletInjector:`ngTemplateOutletInjector`},features:[Tc]})}return e})();function Xne(e,t){return new pi(2100,!1)}var Zne=`mediumDate`,Qne=new Oi(``),$ne=new Oi(``),ey=(()=>{class e{locale;defaultTimezone;defaultOptions;constructor(e,t,n){this.locale=e,this.defaultTimezone=t,this.defaultOptions=n}transform(t,n,r,i){if(t==null||t===``||t!==t)return null;try{let e=n??this.defaultOptions?.dateFormat??Zne,a=r??this.defaultOptions?.timezone??this.defaultTimezone??void 0;return Rne(t,e,i||this.locale,a)}catch(t){throw Xne(e,t.message)}}static ɵfac=function(t){return new(t||e)(Wp(iv,16),Wp(Qne,24),Wp($ne,24))};static ɵpipe=mh({name:`date`,type:e,pure:!0})}return e})(),ty=(()=>{class e{transform(e){return JSON.stringify(e,null,2)}static ɵfac=function(t){return new(t||e)};static ɵpipe=mh({name:`json`,type:e,pure:!1})}return e})();function ere(e,t){t=encodeURIComponent(t);for(let n of e.split(`;`)){let e=n.indexOf(`=`),[r,i]=e==-1?[n,``]:[n.slice(0,e),n.slice(e+1)];if(r.trim()!==t)continue;let a=i;try{a=decodeURIComponent(i)}catch{}return a.length>1&&a[0]===`"`&&a[a.length-1]===`"`&&(a=a.slice(1,-1)),a}return null}var tre=`browser`,ny=class{_doc;constructor(e){this._doc=e}manager},ry=(()=>{class e extends ny{constructor(e){super(e)}supports(e){return!0}addEventListener(e,t,n,r){return e.addEventListener(t,n,r),()=>this.removeEventListener(e,t,n,r)}removeEventListener(e,t,n,r){return e.removeEventListener(t,n,r)}static ɵfac=function(t){return new(t||e)(ra(Ss))};static ɵprov=xi({token:e,factory:e.ɵfac})}return e})(),iy=new Oi(``),ay=(()=>{class e{_zone;_plugins;_eventNameToPlugin=new Map;constructor(e,t){this._zone=t,e.forEach(e=>{e.manager=this});let n=e.filter(e=>!(e instanceof ry));this._plugins=n.slice().reverse();let r=e.find(e=>e instanceof ry);r&&this._plugins.push(r)}addEventListener(e,t,n,r){return this._findPluginFor(t).addEventListener(e,t,n,r)}getZone(){return this._zone}_findPluginFor(e){let t=this._eventNameToPlugin.get(e);if(t)return t;if(t=this._plugins.find(t=>t.supports(e)),!t)throw new pi(-5101,!1);return this._eventNameToPlugin.set(e,t),t}static ɵfac=function(t){return new(t||e)(ra(iy),ra(Fs))};static ɵprov=xi({token:e,factory:e.ɵfac})}return e})(),oy=`ng-app-id`;function sy(e){for(let t of e)t.remove()}function cy(e,t){let n=t.createElement(`style`);return n.textContent=e,n}function nre(e,t,n,r){let i=e.head?.querySelectorAll(`style[${oy}="${t}"],link[${oy}="${t}"]`);if(!i||i.length===0)return!1;for(let e of i)e.removeAttribute(oy),e instanceof HTMLLinkElement?r.set(e.href.slice(e.href.lastIndexOf(`/`)+1),{usage:0,elements:[e]}):e.textContent&&n.set(e.textContent,{usage:0,elements:[e]});return!0}function ly(e,t){let n=t.createElement(`link`);return n.setAttribute(`rel`,`stylesheet`),n.setAttribute(`href`,e),n}var uy=(()=>{class e{doc;appId;nonce;inline=new Map;external=new Map;hosts=new Set;constructor(e,t,n,r={}){this.doc=e,this.appId=t,this.nonce=n,nre(e,t,this.inline,this.external)&&this.hosts.add(e.head)}addStyles(e,t){for(let t of e)this.addUsage(t,this.inline,cy);t?.forEach(e=>this.addUsage(e,this.external,ly))}removeStyles(e,t){for(let t of e)this.removeUsage(t,this.inline);t?.forEach(e=>this.removeUsage(e,this.external))}addUsage(e,t,n){let r=t.get(e);r?r.usage++:t.set(e,{usage:1,elements:[...this.hosts].map(t=>this.addElement(t,n(e,this.doc)))})}removeUsage(e,t){let n=t.get(e);n&&(n.usage--,n.usage<=0&&(sy(n.elements),t.delete(e)))}ngOnDestroy(){for(let[,{elements:e}]of[...this.inline,...this.external])sy(e);this.hosts.clear()}addHost(e){if(!this.hosts.has(e)){this.hosts.add(e);for(let[t,{elements:n}]of this.inline)n.push(this.addElement(e,cy(t,this.doc)));for(let[t,{elements:n}]of this.external)n.push(this.addElement(e,ly(t,this.doc)))}}removeHost(e){this.hosts.delete(e);for(let t of[...this.inline.values(),...this.external.values()]){let n=[];for(let r of t.elements)r.parentNode===e?r.remove():n.push(r);t.elements=n}}addElement(e,t){return this.nonce&&t.setAttribute(`nonce`,this.nonce),e.appendChild(t)}static ɵfac=function(t){return new(t||e)(ra(Ss),ra(Zs),ra(tc,8),ra(ec))};static ɵprov=xi({token:e,factory:e.ɵfac})}return e})(),dy={svg:`http://www.w3.org/2000/svg`,xhtml:`http://www.w3.org/1999/xhtml`,xlink:`http://www.w3.org/1999/xlink`,xml:`http://www.w3.org/XML/1998/namespace`,xmlns:`http://www.w3.org/2000/xmlns/`,math:`http://www.w3.org/1998/Math/MathML`},fy=/%COMP%/g,py=`%COMP%`,rre=`_nghost-${py}`,ire=`_ngcontent-${py}`,are=!0,ore=new Oi(``,{factory:()=>are}),sre=new Oi(``);function cre(e){return ire.replace(fy,e)}function lre(e){return rre.replace(fy,e)}function my(e,t){return t.map(t=>t.replace(fy,e))}var hy=(()=>{class e{eventManager;sharedStylesHost;appId;removeStylesOnCompDestroy;doc;ngZone;nonce;tracingService;rendererByCompId=new Map;defaultRenderer;cssVarNamespace;constructor(e,t,n,r,i,a,o=null,s=null,c=null){this.eventManager=e,this.sharedStylesHost=t,this.appId=n,this.removeStylesOnCompDestroy=r,this.doc=i,this.ngZone=a,this.nonce=o,this.tracingService=s,this.cssVarNamespace=c??``,this.defaultRenderer=new gy(e,i,a,this.tracingService,this.cssVarNamespace)}createRenderer(e,t){if(!e||!t)return this.defaultRenderer;let n=this.getOrCreateRenderer(e,t);return n instanceof by?n.applyToHost(e):n instanceof yy&&n.applyStyles(),n}getOrCreateRenderer(e,t){let n=this.rendererByCompId,r=n.get(t.id);if(!r){let i=this.doc,a=this.ngZone,o=this.eventManager,s=this.sharedStylesHost,c=this.removeStylesOnCompDestroy,l=this.tracingService;switch(t.encapsulation){case cu.Emulated:r=new by(o,s,t,this.appId,c,i,a,l,this.cssVarNamespace);break;case cu.ShadowDom:return new vy(o,e,t,i,a,this.nonce,l,this.cssVarNamespace,s);case cu.ExperimentalIsolatedShadowDom:return new vy(o,e,t,i,a,this.nonce,l,this.cssVarNamespace);default:r=new yy(o,s,t,c,i,a,l,this.cssVarNamespace)}n.set(t.id,r)}return r}ngOnDestroy(){this.rendererByCompId.clear()}componentReplaced(e){this.rendererByCompId.delete(e)}static ɵfac=function(t){return new(t||e)(ra(ay),ra(Hp),ra(Zs),ra(ore),ra(Ss),ra(Fs),ra(tc),ra(nd,8),ra(sre,8))};static ɵprov=xi({token:e,factory:e.ɵfac})}return e})(),gy=class{eventManager;doc;ngZone;tracingService;cssVarNamespace;data=Object.create(null);throwOnSyntheticProps=!0;constructor(e,t,n,r,i=``){this.eventManager=e,this.doc=t,this.ngZone=n,this.tracingService=r,this.cssVarNamespace=i}destroy(){}destroyNode=null;createElement(e,t){return t?this.doc.createElementNS(dy[t]||t,e):this.doc.createElement(e)}createComment(e){return this.doc.createComment(e)}createText(e){return this.doc.createTextNode(e)}appendChild(e,t){(_y(e)?e.content:e).appendChild(t)}insertBefore(e,t,n){if(e){let r=_y(e)?e.content:e;if(n!=null&&n.parentNode!==r)throw new pi(-5106,!1);r.insertBefore(t,n)}}removeChild(e,t){t.remove()}selectRootElement(e,t){let n=typeof e==`string`?this.doc.querySelector(e):e;if(!n)throw new pi(-5104,!1);return t||(n.textContent=``),n}parentNode(e){return e.parentNode}nextSibling(e){return e.nextSibling}setAttribute(e,t,n,r){if(r){t=r+`:`+t;let i=dy[r];i?e.setAttributeNS(i,t,n):e.setAttribute(t,n)}else e.setAttribute(t,n)}removeAttribute(e,t,n){if(n){let r=dy[n];r?e.removeAttributeNS(r,t):e.removeAttribute(`${n}:${t}`)}else e.removeAttribute(t)}addClass(e,t){e.classList.add(t)}removeClass(e,t){e.classList.remove(t)}setStyle(e,t,n,r){let i=t.startsWith(`--`);i&&(t=t.replace(`%NS%`,this.cssVarNamespace)),i||r&(Lu.DashCase|Lu.Important)?e.style.setProperty(t,n,r&Lu.Important?`important`:``):e.style[t]=n}removeStyle(e,t,n){let r=t.startsWith(`--`);r&&(t=t.replace(`%NS%`,this.cssVarNamespace)),r||n&Lu.DashCase?e.style.removeProperty(t):e.style[t]=``}setProperty(e,t,n){e!=null&&(e[t]=n)}setValue(e,t){e.nodeValue=t}listen(e,t,n,r){if(typeof e==`string`&&(e=Ev().getGlobalEventTarget(this.doc,e),!e))throw new pi(-5102,!1);let i=this.decoratePreventDefault(n);return this.tracingService?.wrapEventListener&&(i=this.tracingService.wrapEventListener(e,t,i)),this.eventManager.addEventListener(e,t,i,r)}decoratePreventDefault(e){return t=>{if(t===`__ngUnwrap__`)return e;e(t)===!1&&t.preventDefault()}}};function _y(e){return e.tagName===`TEMPLATE`&&e.content!==void 0}var vy=class extends gy{hostEl;sharedStylesHost;shadowRoot;constructor(e,t,n,r,i,a,o,s,c){super(e,r,i,o,s),this.hostEl=t,this.sharedStylesHost=c,this.shadowRoot=t.attachShadow({mode:`open`}),this.sharedStylesHost&&this.sharedStylesHost.addHost(this.shadowRoot);let l=n.styles;l=my(n.id,l).map(e=>e.replace(/%NS%/g,s));for(let e of l){let t=document.createElement(`style`);a&&t.setAttribute(`nonce`,a),t.textContent=e,this.shadowRoot.appendChild(t)}let u=n.getExternalStyles?.();if(u)for(let e of u){let t=ly(e,r);a&&t.setAttribute(`nonce`,a),this.shadowRoot.appendChild(t)}}nodeOrShadowRoot(e){return e===this.hostEl?this.shadowRoot:e}appendChild(e,t){return super.appendChild(this.nodeOrShadowRoot(e),t)}insertBefore(e,t,n){return super.insertBefore(this.nodeOrShadowRoot(e),t,n)}removeChild(e,t){return super.removeChild(null,t)}parentNode(e){return this.nodeOrShadowRoot(super.parentNode(this.nodeOrShadowRoot(e)))}destroy(){this.sharedStylesHost&&this.sharedStylesHost.removeHost(this.shadowRoot)}},yy=class extends gy{sharedStylesHost;removeStylesOnCompDestroy;styles;styleUrls;constructor(e,t,n,r,i,a,o,s,c){super(e,i,a,o,s),this.sharedStylesHost=t,this.removeStylesOnCompDestroy=r;let l=n.styles,u=c?my(c,l):l;this.styles=u.map(e=>e.replace(/%NS%/g,s)),this.styleUrls=n.getExternalStyles?.(c)}applyStyles(){this.sharedStylesHost.addStyles(this.styles,this.styleUrls)}destroy(){this.removeStylesOnCompDestroy&&Wu.size===0&&this.sharedStylesHost.removeStyles(this.styles,this.styleUrls)}},by=class extends yy{contentAttr;hostAttr;constructor(e,t,n,r,i,a,o,s,c){let l=r+`-`+n.id;super(e,t,n,i,a,o,s,c,l),this.contentAttr=cre(l),this.hostAttr=lre(l)}applyToHost(e){this.applyStyles(),this.setAttribute(e,this.hostAttr,``)}createElement(e,t){let n=super.createElement(e,t);return super.setAttribute(n,this.contentAttr,``),n}},ure=class e extends Dne{supportsDOMEvents=!0;static makeCurrent(){Ene(new e)}onAndCancel(e,t,n,r){return e.addEventListener(t,n,r),()=>{e.removeEventListener(t,n,r)}}dispatchEvent(e,t){e.dispatchEvent(t)}remove(e){e.remove()}createElement(e,t){return t||=this.getDefaultDocument(),t.createElement(e)}createHtmlDocument(){return document.implementation.createHTMLDocument(`fakeTitle`)}getDefaultDocument(){return document}isElementNode(e){return e.nodeType===Node.ELEMENT_NODE}isShadowRoot(e){return e instanceof DocumentFragment}getGlobalEventTarget(e,t){return t===`window`?window:t===`document`?e:t===`body`?e.body:null}getBaseHref(e){let t=dre();return t==null?null:fre(t)}resetBaseElement(){xy=null}getUserAgent(){return window.navigator.userAgent}getCookie(e){return ere(document.cookie,e)}},xy=null;function dre(){return xy||=document.head.querySelector(`base`),xy?xy.getAttribute(`href`):null}function fre(e){return new URL(e,document.baseURI).pathname}var Sy=[`alt`,`control`,`meta`,`shift`],pre={"\b":`Backspace`," ":`Tab`,"":`Delete`,"\x1B":`Escape`,Del:`Delete`,Esc:`Escape`,Left:`ArrowLeft`,Right:`ArrowRight`,Up:`ArrowUp`,Down:`ArrowDown`,Menu:`ContextMenu`,Scroll:`ScrollLock`,Win:`OS`},mre={alt:e=>e.altKey,control:e=>e.ctrlKey,meta:e=>e.metaKey,shift:e=>e.shiftKey},hre=(()=>{class e extends ny{constructor(e){super(e)}supports(t){return e.parseEventName(t)!=null}addEventListener(t,n,r,i){let a=e.parseEventName(n),o=e.eventCallback(a.fullKey,r,this.manager.getZone());return this.manager.getZone().runOutsideAngular(()=>Ev().onAndCancel(t,a.domEventName,o,i))}static parseEventName(t){let n=t.toLowerCase().split(`.`),r=n.shift();if(n.length===0||r!==`keydown`&&r!==`keyup`)return null;let i=e._normalizeKey(n.pop()),a=``,o=n.indexOf(`code`);if(o>-1&&(n.splice(o,1),a=`code.`),Sy.forEach(e=>{let t=n.indexOf(e);t>-1&&(n.splice(t,1),a+=e+`.`)}),a+=i,n.length!=0||i.length===0)return null;let s={};return s.domEventName=r,s.fullKey=a,s}static matchEventFullKeyCode(e,t){let n=pre[e.key]||e.key,r=``;return t.indexOf(`code.`)>-1&&(n=e.code,r=`code.`),n==null||!n?!1:(n=n.toLowerCase(),n===` `?n=`space`:n===`.`&&(n=`dot`),Sy.forEach(t=>{if(t!==n){let n=mre[t];n(e)&&(r+=t+`.`)}}),r+=n,r===t)}static eventCallback(t,n,r){return i=>{e.matchEventFullKeyCode(i,t)&&r.runGuarded(()=>n(i))}}static _normalizeKey(e){return e===`esc`?`escape`:e}static ɵfac=function(t){return new(t||e)(ra(Ss))};static ɵprov=xi({token:e,factory:e.ɵfac})}return e})();async function gre(e,t,n){return Cne({rootComponent:e,..._re(t,n)})}function _re(e,t){return{platformRef:t?.platformRef,appProviders:[...Sre,...e?.providers??[]],platformProviders:xre}}function vre(){ure.makeCurrent()}function yre(){return new qs}function bre(){return Xl(document),document}var xre=[{provide:ec,useValue:tre},{provide:$s,useValue:vre,multi:!0},{provide:Ss,useFactory:bre}],Sre=[{provide:La,useValue:`root`},{provide:qs,useFactory:yre},{provide:iy,useClass:ry,multi:!0},{provide:iy,useClass:hre,multi:!0},hy,{provide:Hp,useClass:uy},{provide:uy,useExisting:Hp},ay,{provide:cp,useExisting:hy},[]];function Cy(e,t){let n=`\x1B[${e}m`,r=`\x1B[${t}m`;return((e,...t)=>{if(Array.isArray(e)&&`raw`in e){let i=e,a=``;for(let e=0;e{let r=new Tre({code:i,why:wy(a.why,e),fix:wy(a.fix,e),docs:o,cause:e.cause,sources:e.sources,data:wy(a.data,e)},s);for(let e of t)e(r,n);return r};n[i]=s}return n}function Ore(e){return t=>{let n=`${e.bold(e.red(`[${t.name}]`))} ${t.message}`,r=[];return t.fix&&r.push(`${e.dim(`fix:`)} ${t.fix}`),t.sources?.length&&r.push(`${e.dim(`sources:`)} ${t.sources.join(`, `)}`),t.docs&&r.push(`${e.dim(`see:`)} ${e.cyan(t.docs)}`),r.length===0?n:[n,...r.map((t,n)=>`${e.dim(n{e=n,t=r}),resolve:e,reject:t}}var Nre=Math.random.bind(Math),Ey=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function Dy(e=21){let t=``,n=e;for(;n--;)t+=Ey[Nre()*64|0];return t}var Oy=6e4,ky=e=>e,Ay=ky,{clearTimeout:jy,setTimeout:My}=globalThis;function Ny(e,t){let{post:n,on:r,off:i=()=>{},eventNames:a=[],serialize:o=ky,deserialize:s=Ay,resolver:c,bind:l=`rpc`,timeout:u=Oy,proxify:d=!0}=t,f=!1,p=new Map,m,ee;async function h(e,r,i,a){if(f)throw Error(`[birpc] rpc is closed, cannot call "${e}"`);let s={m:e,a:r,t:`q`};a&&(s.o=!0);let c=async e=>n(o(e));if(i){await c(s);return}if(m)try{await m}finally{m=void 0}let{promise:l,resolve:d,reject:h}=Mre(),g=Dy();s.i=g;let te;async function ne(n=s){return u>=0&&(te=My(()=>{try{if(t.onTimeoutError?.call(ee,e,r)!==!0)throw Error(`[birpc] timeout on calling "${e}"`)}catch(e){h(e)}p.delete(g)},u),typeof te==`object`&&(te=te.unref?.())),p.set(g,{resolve:d,reject:h,timeoutId:te,method:e}),await c(n),l}try{t.onRequest?await t.onRequest.call(ee,s,ne,d):await ne()}catch(e){if(t.onGeneralError?.call(ee,e)!==!0)throw e;return}finally{jy(te),p.delete(g)}return l}let g={$call:(e,...t)=>h(e,t,!1),$callOptional:(e,...t)=>h(e,t,!1,!0),$callEvent:(e,...t)=>h(e,t,!0),$callRaw:e=>h(e.method,e.args,e.event,e.optional),$rejectPendingCalls:ne,get $closed(){return f},get $meta(){return t.meta},$close:te,$functions:e};ee=d?new Proxy({},{get(t,n){if(Object.hasOwn(g,n))return g[n];if(n===`then`&&!a.includes(`then`)&&!(`then`in e))return;let r=(...e)=>h(n,e,!0);if(a.includes(n))return r.asEvent=r,r;let i=(...e)=>h(n,e,!1);return i.asEvent=r,i}}):g;function te(e){f=!0,p.forEach(({reject:t,method:n})=>{let r=Error(`[birpc] rpc is closed, cannot call "${n}"`);if(e)return e.cause??=r,t(e);t(r)}),p.clear(),i(re)}function ne(e){let t=Array.from(p.values()).map(({method:t,reject:n})=>e?e({method:t,reject:n}):n(Error(`[birpc]: rejected pending call "${t}".`)));return p.clear(),t}async function re(r,...i){let a;try{a=s(r)}catch(e){if(t.onGeneralError?.call(ee,e)!==!0)throw e;return}if(a.t===`q`){let{m:r,a:s,o:u}=a,d,f,p=await(c?c.call(ee,r,e[r]):e[r]);if(u&&(p||=()=>void 0),!p)f=Error(`[birpc] function "${r}" not found`);else try{d=await p.apply(l===`rpc`?ee:e,s)}catch(e){f=e}if(a.i){if(f&&t.onFunctionError&&t.onFunctionError.call(ee,f,r,s)===!0)return;if(!f)try{await n(o({t:`s`,i:a.i,r:d}),...i);return}catch(e){if(f=e,t.onGeneralError?.call(ee,e,r,s)!==!0)throw e}try{await n(o({t:`s`,i:a.i,e:f}),...i)}catch(e){if(t.onGeneralError?.call(ee,e,r,s)!==!0)throw e}}}else{let{i:e,r:t,e:n}=a,r=p.get(e);r&&(jy(r.timeoutId),n?r.reject(n):r.resolve(t)),p.delete(e)}}return m=r(re),ee}function Py(e,t){return t.safety?t.safety:e===`static`||e===`query`||e==null?`read`:`action`}var Fy=Object.freeze({type:`object`,additionalProperties:!0});function Iy(e){let t=e[`~standard`];if(t.jsonSchema)try{return t.jsonSchema.input({target:`draft-2020-12`})}catch{return Fy}return Fy}function Ly(e){if(!e||e.length===0)return{type:`object`,properties:{}};let t={},n=[];for(let r=0;rn[`arg${t}`]);if(`arg0`in n){let e=[];for(;`arg${e.length}`in n;)e.push(n[`arg${e.length}`]);return e}return Object.keys(n).length===0?[]:void 0}function zy(e,t){return Ry(e,t)??[e]}function By(e){return typeof e==`string`?`'${e}'`:new Wy().serialize(e)}var Vy=` _-,;:!?.'"()[]{}@*/\\&#%\`^+<=>|~$0123456789abcdefghijklmnopqrstuvwxyz`,Hy=(function(){let e=new Uint8Array(128);for(let t=0;t<69;t++)e[Vy.charCodeAt(t)]=t+1;for(let t=65;t<=90;t++)e[t]=e[t+32];return e})();function Uy(e,t){if(e===t)return 0;let n=Math.min(e.length,t.length),r=0;for(let i=0;ia?-1:1)}return e.length===t.length?r:e.lengththis.compare(e[0],t[0])),r=`${e}{`;for(let e=0;ethis.compare(e,t)))}`}$Map(e){return this.serializeObjectEntries(`Map`,e.entries())}}for(let t of[`Error`,`RegExp`,`URL`])e.prototype[`$`+t]=function(e){return`${t}(${e})`};for(let t of[`Int8Array`,`Uint8Array`,`Uint8ClampedArray`,`Int16Array`,`Uint16Array`,`Int32Array`,`Uint32Array`,`Float32Array`,`Float64Array`])e.prototype[`$`+t]=function(e){return`${t}[${e.join(`,`)}]`};for(let t of[`BigInt64Array`,`BigUint64Array`])e.prototype[`$`+t]=function(e){return`${t}[${e.join(`n,`)}${e.length>0?`n`:``}]`};return e})(),Gy=[1779033703,-1150833019,1013904242,-1521486534,1359893119,-1694144372,528734635,1541459225],Ky=[1116352408,1899447441,-1245643825,-373957723,961987163,1508970993,-1841331548,-1424204075,-670586216,310598401,607225278,1426881987,1925078388,-2132889090,-1680079193,-1046744716,-459576895,-272742522,264347078,604807628,770255983,1249150122,1555081692,1996064986,-1740746414,-1473132947,-1341970488,-1084653625,-958395405,-710438585,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,-2117940946,-1838011259,-1564481375,-1474664885,-1035236496,-949202525,-778901479,-694614492,-200395387,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,-2067236844,-1933114872,-1866530822,-1538233109,-1090935817,-965641998],qy=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_`,Jy=[],Yy=class{_data=new Xy;_hash=new Xy([...Gy]);_nDataBytes=0;_minBufferSize=0;finalize(e){e&&this._append(e);let t=this._nDataBytes*8,n=this._data.sigBytes*8;return this._data.words[n>>>5]|=128<<24-n%32,this._data.words[(n+64>>>9<<4)+14]=Math.floor(t/4294967296),this._data.words[(n+64>>>9<<4)+15]=t,this._data.sigBytes=this._data.words.length*4,this._process(),this._hash}_doProcessBlock(e,t){let n=this._hash.words,r=n[0],i=n[1],a=n[2],o=n[3],s=n[4],c=n[5],l=n[6],u=n[7];for(let n=0;n<64;n++){if(n<16)Jy[n]=e[t+n]|0;else{let e=Jy[n-15],t=(e<<25|e>>>7)^(e<<14|e>>>18)^e>>>3,r=Jy[n-2],i=(r<<15|r>>>17)^(r<<13|r>>>19)^r>>>10;Jy[n]=t+Jy[n-7]+i+Jy[n-16]}let d=s&c^~s&l,f=r&i^r&a^i&a,p=(r<<30|r>>>2)^(r<<19|r>>>13)^(r<<10|r>>>22),m=(s<<26|s>>>6)^(s<<21|s>>>11)^(s<<7|s>>>25),ee=u+m+d+Ky[n]+Jy[n],h=p+f;u=l,l=c,c=s,s=o+ee|0,o=a,a=i,i=r,r=ee+h|0}n[0]=n[0]+r|0,n[1]=n[1]+i|0,n[2]=n[2]+a|0,n[3]=n[3]+o|0,n[4]=n[4]+s|0,n[5]=n[5]+c|0,n[6]=n[6]+l|0,n[7]=n[7]+u|0}_append(e){typeof e==`string`&&(e=Xy.fromUtf8(e)),this._data.concat(e),this._nDataBytes+=e.sigBytes}_process(e){let t,n=this._data.sigBytes/64;n=e?Math.ceil(n):Math.max((n|0)-this._minBufferSize,0);let r=n*16,i=Math.min(r*4,this._data.sigBytes);if(r){for(let e=0;e>>2]|=(n.charCodeAt(e)&255)<<24-e%4*8;return new e(i,r)}toBase64(){let e=[];for(let t=0;t>>2]>>>24-t%4*8&255,r=this.words[t+1>>>2]>>>24-(t+1)%4*8&255,i=this.words[t+2>>>2]>>>24-(t+2)%4*8&255,a=n<<16|r<<8|i;for(let n=0;n<4&&t*8+n*6>>6*(3-n)&63))}return e.join(``)}concat(e){if(this.words[this.sigBytes>>>2]&=4294967295<<32-this.sigBytes%4*8,this.words.length=Math.ceil(this.sigBytes/4),this.sigBytes%4)for(let t=0;t>>2]>>>24-t%4*8&255;this.words[this.sigBytes+t>>>2]|=n<<24-(this.sigBytes+t)%4*8}else for(let t=0;t>>2]=e.words[t>>>2];this.sigBytes+=e.sigBytes}};function Zy(e){return new Yy().finalize(e).toBase64()}function Qy(e){return Zy(By(e))}function $y(e){return Qy(e)}function eb(){let e={};function t(t,...n){let r=e[t]||[];for(let e=0,t=r.length;e{e[t]=e[t]?.filter(e=>n!==e)}}function i(e,t){let n=r(e,((...e)=>(n(),t(...e))));return n}return{_listeners:e,emit:t,emitOnce:n,on:r,once:i}}var tb=/^[\w+.-]{2,}:\/\//;function nb(e){return e.endsWith(`/`)?e:`${e}/`}function rb(e){return(e.endsWith(`/`)?e.slice(0,-1):e)||`/`}function ib(e,...t){let n=e;for(let e of t)e&&e!==`/`&&(n=n?nb(n)+e.replace(/^\.?\//,``):e);return n}function ab(e,t){if(!t||t===`/`||tb.test(e))return e;let n=rb(t);return e.startsWith(n)?e:ib(n,e)}function ob(e,t){let n=e.match(tb);return t+(n?e.slice(n[0].length):e)}var sb=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function cb(e=21){let t=``,n=e;for(;n--;)t+=sb[Math.random()*64|0];return t}var lb=Symbol.for(`immer-nothing`),ub=Symbol.for(`immer-draftable`),db=Symbol.for(`immer-state`),fb=[function(e){return`The plugin for '${e}' has not been loaded into Immer. To enable the plugin, import and call \`enable${e}()\` when initializing your application.`},function(e){return`produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${e}'`},`This object has been frozen and should not be mutated`,function(e){return`Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? `+e},`An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.`,`Immer forbids circular references`,"The first or second argument to `produce` must be a function","The third argument to `produce` must be a function or undefined","First argument to `createDraft` must be a plain object, an array, or an immerable object","First argument to `finishDraft` must be a draft returned by `createDraft`",function(e){return`'current' expects a draft, got: ${e}`},`Object.defineProperty() cannot be used on an Immer draft`,`Object.setPrototypeOf() cannot be used on an Immer draft`,`Immer only supports deleting array indices`,`Immer only supports setting array indices and the 'length' property`,function(e){return`'original' expects a draft, got: ${e}`}];function pb(e,...t){{let n=fb[e],r=Lb(n)?n.apply(null,t):n;throw Error(`[Immer] ${r}`)}}var mb=Object,hb=mb.getPrototypeOf,gb=`constructor`,_b=`prototype`,vb=`configurable`,yb=`enumerable`,bb=`writable`,xb=`value`,Sb=e=>!!e&&!!e[db];function Cb(e){return e?Eb(e)||Nb(e)||!!e[ub]||!!e[gb]?.[ub]||Pb(e)||Fb(e):!1}var wb=mb[_b][gb].toString(),Tb=new WeakMap;function Eb(e){if(!e||!Ib(e))return!1;let t=hb(e);if(t===null||t===mb[_b])return!0;let n=mb.hasOwnProperty.call(t,gb)&&t[gb];if(n===Object)return!0;if(!Lb(n))return!1;let r=Tb.get(n);return r===void 0&&(r=Function.toString.call(n),Tb.set(n,r)),r===wb}function Db(e,t,n=!0){Ob(e)===0?(n?Reflect.ownKeys(e):mb.keys(e)).forEach(n=>{t(n,e[n],e)}):e.forEach((n,r)=>t(r,n,e))}function Ob(e){let t=e[db];return t?t.type_:Nb(e)?1:Pb(e)?2:Fb(e)?3:0}var kb=(e,t,n=Ob(e))=>n===2?e.has(t):mb[_b].hasOwnProperty.call(e,t),Ab=(e,t,n=Ob(e))=>n===2?e.get(t):e[t],jb=(e,t,n,r=Ob(e))=>{r===2?e.set(t,n):r===3?e.add(n):e[t]=n};function Mb(e,t){return e===t?e!==0||1/e==1/t:e!==e&&t!==t}var Nb=Array.isArray,Pb=e=>e instanceof Map,Fb=e=>e instanceof Set,Ib=e=>typeof e==`object`,Lb=e=>typeof e==`function`,Rb=e=>typeof e==`boolean`;function zb(e){let t=+e;return Number.isInteger(t)&&String(t)===e}var Bb=e=>Ib(e)?e?.[db]:null,Vb=e=>e.copy_||e.base_,Hb=e=>e.modified_?e.copy_:e.base_;function Ub(e,t){if(Pb(e))return new Map(e);if(Fb(e))return new Set(e);if(Nb(e))return Array[_b].slice.call(e);let n=Eb(e);if(t===!0||t===`class_only`&&!n){let t=mb.getOwnPropertyDescriptors(e);delete t[db];let n=Reflect.ownKeys(t);for(let r=0;r1&&mb.defineProperties(e,{set:Kb,add:Kb,clear:Kb,delete:Kb}),mb.freeze(e),t&&Db(e,(e,t)=>{Wb(t,!0)},!1),e)}function Gb(){pb(2)}var Kb={[xb]:Gb};function qb(e){return e===null||!Ib(e)||mb.isFrozen(e)}var Jb=`MapSet`,Yb=`Patches`,Xb=`ArrayMethods`,Zb={};function Qb(e){let t=Zb[e];return t||pb(0,e),t}var $b=e=>!!Zb[e];function ex(e,t){Zb[e]||(Zb[e]=t)}var tx,nx=()=>tx,rx=(e,t)=>({drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:$b(Jb)?Qb(Jb):void 0,arrayMethodsPlugin_:$b(Xb)?Qb(Xb):void 0});function ix(e,t){t&&(e.patchPlugin_=Qb(Yb),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function ax(e){ox(e),e.drafts_.forEach(cx),e.drafts_=null}function ox(e){e===tx&&(tx=e.parent_)}var sx=e=>tx=rx(tx,e);function cx(e){let t=e[db];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function lx(e,t){t.unfinalizedDrafts_=t.drafts_.length;let n=t.drafts_[0];if(e!==void 0&&e!==n){n[db].modified_&&(ax(t),pb(4)),Cb(e)&&(e=ux(t,e));let{patchPlugin_:r}=t;r&&r.generateReplacementPatches_(n[db].base_,e,t)}else e=ux(t,n);return dx(t,e,!0),ax(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e===lb?void 0:e}function ux(e,t){if(qb(t))return t;let n=t[db];if(!n)return yx(t,e.handledSet_,e);if(!px(n,e))return t;if(!n.modified_)return n.base_;if(!n.finalized_){let{callbacks_:t}=n;if(t)for(;t.length>0;)t.pop()(e);_x(n,e)}return n.copy_}function dx(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&Wb(t,n)}function fx(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var px=(e,t)=>e.scope_===t,mx=[];function hx(e,t,n,r){let i=Vb(e),a=e.type_;if(r!==void 0&&Ab(i,r,a)===t){jb(i,r,n,a);return}if(!e.draftLocations_){let t=e.draftLocations_=new Map;Db(i,(e,n)=>{if(Sb(n)){let r=t.get(n)||[];r.push(e),t.set(n,r)}})}let o=e.draftLocations_.get(t)??mx;for(let e of o)jb(i,e,n,a)}function gx(e,t,n){e.callbacks_.push(function(r){let i=t;if(!i||!px(i,r))return;r.mapSetPlugin_?.fixSetContents(i);let a=Hb(i);hx(e,i.draft_??i,a,n),_x(i,r)})}function _x(e,t){if(e.modified_&&!e.finalized_&&(e.type_===3||e.type_===1&&e.allIndicesReassigned_||(e.assigned_?.size??0)>0)){let{patchPlugin_:n}=t;if(n){let r=n.getPath(e);r&&n.generatePatches_(e,r,t)}fx(e)}}function vx(e,t,n){let{scope_:r}=e;if(Sb(n)){let i=n[db];px(i,r)&&i.callbacks_.push(function(){Ox(e),hx(e,n,Hb(i),t)})}else Cb(n)&&e.callbacks_.push(function(){let i=Vb(e);e.type_===3?i.has(n)&&yx(n,r.handledSet_,r):Ab(i,t,e.type_)===n&&r.drafts_.length>1&&(e.assigned_.get(t)??!1)===!0&&e.copy_&&yx(Ab(e.copy_,t,e.type_),r.handledSet_,r)})}function yx(e,t,n){return!n.immer_.autoFreeze_&&n.unfinalizedDrafts_<1||Sb(e)||t.has(e)||!Cb(e)||qb(e)?e:(t.add(e),Db(e,(r,i)=>{if(Sb(i)){let t=i[db];px(t,n)&&(jb(e,r,Hb(t),e.type_),fx(t))}else Cb(i)&&yx(i,t,n)}),e)}function bx(e,t){let n=Nb(e),r={type_:+!!n,scope_:t?t.scope_:nx(),modified_:!1,finalized_:!1,assigned_:void 0,parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1,callbacks_:void 0},i=r,a=xx;n&&(i=[r],a=Sx);let{revoke:o,proxy:s}=Proxy.revocable(i,a);return r.draft_=s,r.revoke_=o,[s,r]}var xx={get(e,t){if(t===db)return e;let n=e.scope_.arrayMethodsPlugin_,r=e.type_===1&&typeof t==`string`;if(r&&n?.isArrayOperationMethod(t))return n.createMethodInterceptor(e,t);let i=Vb(e);if(!kb(i,t,e.type_))return Tx(e,i,t);let a=i[t];if(e.finalized_||!Cb(a)||r&&e.operationMethod&&n?.isMutatingArrayMethod(e.operationMethod)&&zb(t))return a;if(a===Cx(e.base_,t)||wx(e,t,a)){Ox(e);let n=e.type_===1?+t:t,r=Ax(e.scope_,a,e,n);return e.copy_[n]=r}return a},has(e,t){return t in Vb(e)},ownKeys(e){return Reflect.ownKeys(Vb(e))},set(e,t,n){let r=Ex(Vb(e),t);if(r?.set)return r.set.call(e.draft_,n),!0;if(!e.modified_){let r=Cx(Vb(e),t),i=r?.[db];if(i&&i.base_===n)return e.copy_[t]=n,e.assigned_.delete(t),!0;if(Mb(n,r)&&(n!==void 0||kb(e.base_,t,e.type_)))return!0;Ox(e),Dx(e)}return e.copy_[t]===n&&(n!==void 0||kb(e.copy_,t,e.type_))||Number.isNaN(n)&&Number.isNaN(e.copy_[t])?!0:(e.copy_[t]=n,e.assigned_.set(t,!0),vx(e,t,n),!0)},deleteProperty(e,t){return Ox(e),Cx(e.base_,t)!==void 0||t in e.base_?(e.assigned_.set(t,!1),Dx(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){let n=Vb(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r&&{[bb]:!0,[vb]:e.type_!==1||t!==`length`,[yb]:r[yb],[xb]:n[t]}},defineProperty(){pb(11)},getPrototypeOf(e){return hb(e.base_)},setPrototypeOf(){pb(12)}},Sx={};for(let e in xx){let t=xx[e];Sx[e]=function(){let e=arguments;return e[0]=e[0][0],t.apply(this,e)}}Sx.deleteProperty=function(e,t){return isNaN(parseInt(t))&&pb(13),Sx.set.call(this,e,t,void 0)},Sx.set=function(e,t,n){return t!==`length`&&isNaN(parseInt(t))&&pb(14),xx.set.call(this,e[0],t,n,e[0])};function Cx(e,t){let n=e[db];return(n?Vb(n):e)[t]}function wx(e,t,n){return e.type_!==1||!e.allIndicesReassigned_||e.assigned_?.get(t)||!Cb(n)||n[db]?!1:e.baseRefs_.has(n)}function Tx(e,t,n){let r=Ex(t,n);return r?xb in r?r[xb]:r.get?.call(e.draft_):void 0}function Ex(e,t){if(!(t in e))return;let n=hb(e);for(;n;){let e=Object.getOwnPropertyDescriptor(n,t);if(e)return e;n=hb(n)}}function Dx(e){e.modified_||(e.modified_=!0,e.parent_&&Dx(e.parent_))}function Ox(e){e.copy_||=(e.assigned_=new Map,Ub(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var kx=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(e,t,n)=>{if(Lb(e)&&!Lb(t)){let n=t;t=e;let r=this;return function(e=n,...i){return r.produce(e,e=>t.call(this,e,...i))}}Lb(t)||pb(6),n!==void 0&&!Lb(n)&&pb(7);let r;if(Cb(e)){let i=sx(this),a=Ax(i,e,void 0),o=!0;try{r=t(a),o=!1}finally{o?ax(i):ox(i)}return ix(i,n),lx(r,i)}if(!e||!Ib(e)){if(r=t(e),r===void 0&&(r=e),r===lb&&(r=void 0),this.autoFreeze_&&Wb(r,!0),n){let t=[],i=[];Qb(Yb).generateReplacementPatches_(e,r,{patches_:t,inversePatches_:i}),n(t,i)}return r}pb(1,e)},this.produceWithPatches=(e,t)=>{if(Lb(e))return(t,...n)=>this.produceWithPatches(t,t=>e(t,...n));let n,r;return[this.produce(e,t,(e,t)=>{n=e,r=t}),n,r]},Rb(e?.autoFreeze)&&this.setAutoFreeze(e.autoFreeze),Rb(e?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),Rb(e?.useStrictIteration)&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){Cb(e)||pb(8),Sb(e)&&(e=jx(e));let t=sx(this),n=Ax(t,e,void 0);return n[db].isManual_=!0,ox(t),n}finishDraft(e,t){let n=e&&e[db];(!n||!n.isManual_)&&pb(9);let{scope_:r}=n;return ix(r,t),lx(void 0,r)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(e,t){let n;for(n=t.length-1;n>=0;n--){let r=t[n];if(r.path.length===0&&r.op===`replace`){e=r.value;break}}n>-1&&(t=t.slice(n+1));let r=Qb(Yb).applyPatches_;return Sb(e)?r(e,t):this.produce(e,e=>r(e,t))}};function Ax(e,t,n,r){let[i,a]=Pb(t)?Qb(Jb).proxyMap_(t,n):Fb(t)?Qb(Jb).proxySet_(t,n):bx(t,n);return(n?.scope_??nx()).drafts_.push(i),a.callbacks_=n?.callbacks_??[],a.key_=r,n&&r!==void 0?gx(n,a,r):a.callbacks_.push(function(e){e.mapSetPlugin_?.fixSetContents(a);let{patchPlugin_:t}=e;a.modified_&&t&&t.generatePatches_(a,[],e)}),i}function jx(e){return Sb(e)||pb(10,e),Mx(e)}function Mx(e){if(!Cb(e)||qb(e))return e;let t=e[db],n,r=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=Ub(e,t.scope_.immer_.useStrictShallowCopy_),r=t.scope_.immer_.shouldUseStrictIteration()}else n=Ub(e,!0);let i=n;return Fb(n)&&(n=new Set),Db(i,(e,t)=>{jb(n,e,Mx(t))},r),t&&(t.finalized_=!1),n}function Nx(){fb.push(`Sets cannot have "replace" patches.`,function(e){return`Unsupported patch operation: `+e},function(e){return`Cannot apply patch, path doesn't resolve: `+e},`Patching reserved attributes like __proto__, prototype and constructor is not allowed`);function e(n,r=[]){if(n.key_!==void 0){let e=n.parent_.copy_??n.parent_.base_,t=Bb(Ab(e,n.key_)),i=Ab(e,n.key_);if(i===void 0||i!==n.draft_&&i!==n.base_&&i!==n.copy_||t!=null&&t.base_!==n.base_)return null;let a=n.parent_.type_===3,o;if(a){let e=n.parent_;o=Array.from(e.drafts_.keys()).indexOf(n.key_)}else o=n.key_;if(!(a&&e.size>o||kb(e,o))||n.parent_.type_===1&&n.parent_.allIndicesReassigned_)return null;r.push(o)}if(n.parent_)return e(n.parent_,r);r.reverse();try{t(n.copy_,r)}catch{return null}return r}function t(e,t){let n=e;for(let e=0;e{let u=Ab(o,e,c),f=Ab(s,e,c),p=l?kb(o,e)?n:`add`:r;if(u===f&&p===n)return;let m=t.concat(e);i.push(p===r?{op:p,path:m}:{op:p,path:m,value:d(f)}),a.push(p===`add`?{op:r,path:m}:p===r?{op:`add`,path:m,value:d(u)}:{op:n,path:m,value:d(u)})})}function s(e,t,n,i){let{base_:a,copy_:o}=e,s=0;a.forEach(e=>{if(!o.has(e)){let a=t.concat([s]);n.push({op:r,path:a,value:e}),i.unshift({op:`add`,path:a,value:e})}s++}),s=0,o.forEach(e=>{if(!a.has(e)){let a=t.concat([s]);n.push({op:`add`,path:a,value:e}),i.unshift({op:r,path:a,value:e})}s++})}function c(e,t,r){let{patches_:i,inversePatches_:a}=r;i.push({op:n,path:[],value:t===lb?void 0:t}),a.push({op:n,path:[],value:e})}function l(e,t){return t.forEach(t=>{let{path:i,op:a}=t,o=e;for(let e=0;e[e,u(t)]));if(Fb(e))return new Set(Array.from(e).map(u));let t=Object.create(hb(e));for(let n in e)t[n]=u(e[n]);return kb(e,ub)&&(t[ub]=e[ub]),t}function d(e){return Sb(e)?u(e):e}ex(Yb,{applyPatches_:l,generatePatches_:i,generateReplacementPatches_:c,getPath:e})}globalThis.Iterator?.from;var Px=new kx,Fx=Px.produce,Ix=Px.produceWithPatches.bind(Px),Lx=Px.applyPatches.bind(Px),Rx=1e3;function zx(e,t){if(e.add(t),e.size>Rx){let t=e.values().next().value;t!==void 0&&e.delete(t)}}function Bx(e){let{enablePatches:t=!1}=e;t&&Nx();let n=eb(),r=e.initialValue,i=new Set;return{on:n.on,value:()=>r,patch:(e,t=cb())=>{i.has(t)||(Nx(),r=Lx(r,e),zx(i,t),n.emit(`updated`,r,void 0,t))},mutate:(e,a=cb())=>{if(!i.has(a)){if(zx(i,a),t){let[t,i]=Ix(r,e);if(t===r)return;r=t,n.emit(`updated`,r,i,a)}else{let t=Fx(r,e);if(t===r)return;r=t,n.emit(`updated`,r,void 0,a)}}},syncIds:i}}var Vx=typeof self==`object`?self:globalThis,Hx=new Set([`Error`,`EvalError`,`RangeError`,`ReferenceError`,`SyntaxError`,`TypeError`,`URIError`,`AggregateError`]),Ux=new Set([`Boolean`,`Number`,`String`,`Int8Array`,`Uint8Array`,`Uint8ClampedArray`,`Int16Array`,`Uint16Array`,`Int32Array`,`Uint32Array`,`Float16Array`,`Float32Array`,`Float64Array`,`BigInt64Array`,`BigUint64Array`]);function Wx(e,t){let n=(t,n)=>(e.set(n,t),t),r=i=>{if(e.has(i))return e.get(i);let[a,o]=t[i];switch(a){case 0:case-1:return n(o,i);case 1:{let e=n([],i);for(let t of o)e.push(r(t));return e}case 2:{let e=n({},i);for(let[t,n]of o)e[r(t)]=r(n);return e}case 3:return n(new Date(o),i);case 4:{let{source:e,flags:t}=o;return n(new RegExp(e,t),i)}case 5:{let e=n(new Map,i);for(let[t,n]of o)e.set(r(t),r(n));return e}case 6:{let e=n(new Set,i);for(let t of o)e.add(r(t));return e}case 7:{let{name:e,message:t}=o,r=Hx.has(e)?Vx[e]:void 0;return n(new(r??Vx.Error)(t),i)}case 8:return n(BigInt(o),i);case`BigInt`:return n(Object(BigInt(o)),i);case`ArrayBuffer`:return n(new Uint8Array(o).buffer,o);case`DataView`:{let{buffer:e}=new Uint8Array(o);return n(new DataView(e),o)}}if(typeof a==`string`&&Ux.has(a))return n(new Vx[a](o),i);throw TypeError(`unable to deserialize unsafe or unknown type: ${String(a)}`)};return r}function Gx(e){return Wx(new Map,e)(0)}var Kx=``,{toString:qx}={},{keys:Jx}=Object;function Yx(e){let t=typeof e;if(t!==`object`||!e)return[0,t];let n=qx.call(e).slice(8,-1);switch(n){case`Array`:return[1,Kx];case`Object`:return[2,Kx];case`Date`:return[3,Kx];case`RegExp`:return[4,Kx];case`Map`:return[5,Kx];case`Set`:return[6,Kx];case`DataView`:return[1,n]}return n.includes(`Array`)?[1,n]:n.includes(`Error`)?[7,n]:[2,n]}function Xx([e,t]){return e===0&&(t===`function`||t===`symbol`)}function Zx(e,t,n,r){let i=(e,t)=>{let i=r.push(e)-1;return n.set(t,i),i},a=r=>{if(n.has(r))return n.get(r);let[o,s]=Yx(r);switch(o){case 0:{let t=r;switch(s){case`bigint`:o=8,t=r.toString();break;case`function`:case`symbol`:if(e)throw TypeError(`unable to serialize ${s}`);t=null;break;case`undefined`:return i([-1],r)}return i([o,t],r)}case 1:{if(s){let e=r;return s===`DataView`?e=new Uint8Array(r.buffer):s===`ArrayBuffer`&&(e=new Uint8Array(r)),i([s,[...e]],r)}let e=[],t=i([o,e],r);for(let t of r)e.push(a(t));return t}case 2:{if(s)switch(s){case`BigInt`:return i([s,r.toString()],r);case`Boolean`:case`Number`:case`String`:return i([s,r.valueOf()],r)}if(t&&`toJSON`in r)return a(r.toJSON());let n=[],c=i([o,n],r);for(let t of Jx(r))(e||!Xx(Yx(r[t])))&&n.push([a(t),a(r[t])]);return c}case 3:return i([o,r.toISOString()],r);case 4:{let{source:e,flags:t}=r;return i([o,{source:e,flags:t}],r)}case 5:{let t=[],n=i([o,t],r);for(let[n,i]of r)(e||!(Xx(Yx(n))||Xx(Yx(i))))&&t.push([a(n),a(i)]);return n}case 6:{let t=[],n=i([o,t],r);for(let n of r)(e||!Xx(Yx(n)))&&t.push(a(n));return n}}let{message:c}=r;return i([o,{name:s,message:c}],r)};return a}function Qx(e,t={}){let n=[];return Zx(!(t.json||t.lossy),!!t.json,new Map,n)(e),n}var{parse:$x,stringify:eS}=JSON,tS={json:!0,lossy:!0};function nS(e){return Gx($x(e))}function rS(e){return eS(Qx(e,tS))}function iS(e){return Gx(e)}function aS(e){return rS(e)}function oS(e){return nS(e)}var sS=256,cS=class extends Error{name=`StreamClosedError`};function lS(e={}){let t=e.id??cb(),n=Math.max(0,e.replayWindow??0),r=eb(),i=new AbortController,a=[],o=!1,s=0;function c(e){if(o)throw new cS(`Cannot write to a closed stream "${t}"`);s+=1,n>0&&(a.push({seq:s,chunk:e}),a.length>n&&(a.length-n===1?a.shift():a.splice(0,a.length-n))),r.emit(`chunk`,s,e)}function l(e){if(o)return;o=!0;let t=dS(e);i.abort(e),r.emit(`end`,t)}function u(){o||(o=!0,i.signal.aborted||i.abort(`stream closed`),r.emit(`end`,void 0))}function d(e){o||i.signal.aborted||i.abort(e??`aborted`)}let f=new WritableStream({write(e){c(e)},close(){u()},abort(e){l(e)}});return{id:t,signal:i.signal,get closed(){return o},get lastSeq(){return s},write:c,error:l,close:u,abort:d,writable:f,events:r,buffer:a}}function uS(e={}){let t=e.id??cb(),n=Math.max(1,e.highWaterMark??sS),r=[],i=0,a=!1,o=!1,s,c,l,u;function d(){if(c){if(r.length>0){let e=r.shift(),t=c;c=void 0,t.resolve({value:e,done:!1});return}if(a){let e=c;if(c=void 0,s){let t=Error(s.message);t.name=s.name,e.reject(t)}else e.resolve({value:void 0,done:!0})}}}function f(){if(l){for(;r.length>0;){let e=r.shift();try{l.enqueue(e)}catch{break}}if(a&&l){try{if(s){let e=Error(s.message);e.name=s.name,l.error(e)}else l.close()}catch{}l=void 0}}}function p(t,s){if(!(a||o)&&!(t<=i)){if(i=t,r.push(s),r.length>n){let t=r.length-n;r.splice(0,t),e.onOverflow?.(t)}d(),u&&f()}}function m(e){a||(a=!0,s=e,d(),u&&f())}function ee(){o||a||(o=!0,e.onCancel?.(),m(void 0))}function h(){return u||(u=new ReadableStream({start(e){l=e,f()},cancel(){ee()}}),u)}return{id:t,get cancelled(){return o},get done(){return a},get lastSeenSeq(){return i},get readable(){return h()},cancel:ee,_push:p,_end:m,[Symbol.asyncIterator](){return{next(){if(r.length>0)return Promise.resolve({value:r.shift(),done:!1});if(a){if(s){let e=Error(s.message);return e.name=s.name,Promise.reject(e)}return Promise.resolve({value:void 0,done:!0})}return new Promise((e,t)=>{c={resolve:e,reject:t}})},return(){return ee(),Promise.resolve({value:void 0,done:!0})}}}}}function dS(e){if(e instanceof Error)return{name:e.name||`Error`,message:e.message};if(typeof e==`string`)return{name:`Error`,message:e};try{return{name:`Error`,message:JSON.stringify(e)}}catch{return{name:`Error`,message:String(e)}}}var fS=128;function pS(e){return e.replace(/[^\w-]+/g,`_`).slice(0,fS)}var mS=`modulepreload`,hS=function(e,t){return new URL(e,t).href},gS={},_S=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=hS(t,n),t=s(t),t in gS)return;gS[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:mS,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},vS=`__connection.json`,yS=`__DEVFRAME_CONNECTION__`,bS=`x-birpc-session`,xS=`__rpc-dump/index.json`,SS=`devframe:services`,CS=`devframe_otp`,wS=`devframe_auth_token`;Ty.postMessage.remoteAssetsError;var TS=class{cacheMap=new Map;options;keySerializer;constructor(e){this.options=e,this.keySerializer=e.keySerializer||(e=>$y(e))}updateOptions(e){this.options={...this.options,...e}}cached(e,t){let n=this.cacheMap.get(e);if(n)return n.get(this.keySerializer(t))}has(e,t){return this.cacheMap.get(e)?.has(this.keySerializer(t))??!1}apply(e,t){let n=this.cacheMap.get(e.m)||new Map;n.set(this.keySerializer(e.a),t),this.cacheMap.set(e.m,n)}validate(e){return this.options.functions.includes(e)}clear(e){e?this.cacheMap.delete(e):this.cacheMap.clear()}},ES=jre({docsBase:`https://devfra.me/errors`,codes:{DF0019:{why:e=>`RPC function "${e.name}" has \`agent\` set but \`jsonSerializable\` is \`false\`; MCP requires JSON-serializable data.`,fix:"Remove `jsonSerializable: false`, or remove `agent` to keep it RPC-only."},DF0020:{why:e=>`RPC function "${e.name}" declares \`jsonSerializable: true\` but the value at "${e.path}" is a ${e.type}.`,fix:"Either drop `jsonSerializable: true` (falls back to structured-clone) or change the value to a JSON-safe shape."},DF0021:{why:e=>`RPC function "${e.name}" is already registered`,fix:"Use the `force` parameter to overwrite an existing registration."},DF0022:{why:e=>`RPC function "${e.name}" is not registered. Use register() to add new functions.`},DF0023:{why:e=>`RPC function "${e.name}" is not registered`},DF0024:{why:e=>`Either handler or setup function must be provided for RPC function "${e.name}"`},DF0025:{why:e=>`Function "${e.name}" not found in dump store`},DF0026:{why:e=>`No dump match for "${e.name}" with args: ${e.args}`},DF0027:{why:e=>`Function "${e.name}" with type "${e.type}" cannot have dump configuration. Only "static" and "query" types support dumps.`},DF0028:{why:e=>`Function "${e.name}" with type "${e.type}" cannot use \`snapshot: true\`. Only "query" functions support this sugar; "static" functions have equivalent default behavior already.`,fix:"Remove `snapshot: true`, or change the function type to `query`."},DF0043:{why:e=>`RPC function "${e.name}" received an invalid argument at position ${e.index}: ${e.issues}`,fix:"Pass a value that satisfies the `args` schema declared for this function."},DF0044:{why:e=>`RPC function "${e.name}" returned a value that failed its \`returns\` schema: ${e.issues}`,fix:"Make the handler return a value that satisfies the `returns` schema, or relax the schema."}}});function DS(e){if(e.agent&&e.jsonSerializable===!1)throw ES.DF0019({name:e.name});e.agent&&!e.jsonSerializable&&(e.jsonSerializable=!0)}async function OS(e,t){let n=e[`~standard`].validate(t);return n instanceof Promise?await n:n}function kS(e){return e.map(e=>{let t=e.path?.map(e=>typeof e==`object`?e.key:e).join(`.`);return t?`${t}: ${e.message}`:e.message}).join(`; `)}async function AS(e,t,n){let r=n.slice();if(!t||t.length===0)return r;for(let r=0;r{n.get(t)===r&&n.delete(t)}),n.set(t,r)),await r}if(!e.__promise){let n=Promise.resolve(e.setup(t));n.catch(()=>{e.__promise===n&&(e.__promise=void 0)}),e.__promise=n}return await e.__promise}async function NS(e,t){let n=e.handler;if(!n){let r=await MS(e,t);if(!r.handler)throw ES.DF0024({name:e.name});n=r.handler}let r=e.args,i=e.returns;if(!r&&!i)return n;let a=n;return async(...t)=>{let n=await AS(e.name,r,t),o=await a(...n);return await jS(e.name,i,o)}}var PS=class{context;definitions=new Map;functions;_onChanged=[];constructor(e){this.context=e;let t=this.definitions,n=this;this.functions=new Proxy({},{get(e,r){let i=t.get(r);if(i)return NS(i,n.context)},has(e,n){return t.has(n)},getOwnPropertyDescriptor(e,n){return{value:t.get(n)?.handler,configurable:!0,enumerable:!0}},ownKeys(){return Array.from(t.keys())}})}register(e,t=!1){if(this.definitions.has(e.name)&&!t)throw ES.DF0021({name:e.name});DS(e),this.definitions.set(e.name,e),this._onChanged.forEach(t=>t(e.name))}update(e,t=!1){if(!this.definitions.has(e.name)&&!t)throw ES.DF0022({name:e.name});DS(e),this.definitions.set(e.name,e),this._onChanged.forEach(t=>t(e.name))}onChanged(e){return this._onChanged.push(e),()=>{let t=this._onChanged.indexOf(e);t!==-1&&this._onChanged.splice(t,1)}}async getHandler(e){return await NS(this.definitions.get(e),this.context)}getSchema(e){let t=this.definitions.get(e);if(!t)throw ES.DF0023({name:String(e)});return{args:t.args,returns:t.returns}}has(e){return this.definitions.has(e)}get(e){return this.definitions.get(e)}list(){return Array.from(this.definitions.keys())}};function FS(e,t=``){return JSON.stringify(e,function(e,n){let r=this,i=r==null?n:r[e];if(i===void 0){if(Array.isArray(r))throw LS(t,`undefined`,r,e);return n}return i!==null&&IS(i,r,e,t),n})}function IS(e,t,n,r){if(typeof e==`bigint`)throw LS(r,`BigInt`,t,n);if(typeof e!=`object`)return;if(e instanceof Map)throw LS(r,`Map`,t,n);if(e instanceof Set)throw LS(r,`Set`,t,n);if(e instanceof Date)throw LS(r,`Date`,t,n);if(Array.isArray(e))return;let i=Object.getPrototypeOf(e);if(i!==null&&i!==Object.prototype)throw LS(r,e.constructor?.name??`class instance`,t,n)}function LS(e,t,n,r){let i=RS(n,r);return ES.DF0020({name:e||``,type:t,path:i})}function RS(e,t){return Array.isArray(e)?`[${t}]`:t===``?``:t}var zS=`__DEVFRAME_CONNECTION_META__`,BS=`__DEVFRAME_CONNECTION_AUTH_TOKEN__`;function VS(e){let t=[()=>window?.[e],()=>globalThis?.[e],()=>parent.window?.[e]];for(let e of t)try{let t=e();if(t)return t}catch{}}function HS(){return VS(yS)}function US(){return VS(zS)}function WS(e){if(e)return e;try{let e=localStorage.getItem(BS);if(e)return e}catch{}return VS(BS)}function GS(e){globalThis[yS]=e,globalThis[zS]={...e.connectionMeta,baseUrl:e.metaBaseUrl},e.authToken&&KS(e.authToken)}function KS(e){try{localStorage.setItem(BS,e)}catch{}globalThis[BS]=e;let t=HS();t&&(globalThis[yS]={...t,authToken:e})}function qS(e){let t=ab(vS,e);try{return new URL(t,globalThis.location?.href).href}catch{return t}}function JS(e,t){return t&&t!==e.authToken?{...e,authToken:t}:e}function YS(){let e=HS();if(e)return JS(e,WS()??e.authToken??e.connectionMeta.authToken);let t=US();if(t)return{connectionMeta:t,metaBaseUrl:t.baseUrl??qS(`./`),authToken:WS(t.authToken)}}async function XS(e={}){if(e.connection){let t=JS(e.connection,WS(e.authToken??e.connection.authToken??e.connection.connectionMeta.authToken));return GS(t),t}let t=Array.isArray(e.baseURL)?e.baseURL:[e.baseURL??`./`];if(e.connectionMeta){let n={connectionMeta:e.connectionMeta,metaBaseUrl:qS(t[0]??`./`),authToken:WS(e.authToken??e.connectionMeta.authToken)};return GS(n),n}let n=YS();if(n){let t=JS(n,WS(e.authToken??n.authToken??n.connectionMeta.authToken));return GS(t),t}let r=[];for(let n of t){let t=ab(vS,n),i=qS(n);try{let n=await fetch(t);if(!n.ok)throw Error(`Failed to fetch connection meta from ${i}: ${n.status}`);let r=await n.json(),a=n.url||i,o={connectionMeta:r,metaBaseUrl:r.baseUrl?new URL(r.baseUrl,a).href:a,authToken:WS(e.authToken??r.authToken)};return GS(o),o}catch(e){r.push(e)}}throw Error(`Failed to get connection meta from ${t.join(`, `)}`,{cause:r})}var ZS=class extends Error{name=`DevframeConnectionError`;kind;constructor(e,t,n){super(t,n),this.kind=e}};function QS(e=CS){try{let t=globalThis.location?.hash?.replace(/^#/,``)??``;return new URLSearchParams(t).get(e)||void 0}catch{return}}function $S(e){try{let t=new URL(globalThis.location.href),n=new URLSearchParams(t.hash.replace(/^#/,``));if(!n.has(e))return;n.delete(e),t.hash=n.toString(),globalThis.history?.replaceState(globalThis.history.state,``,t.href)}catch{}}function eC(e=CS){let t=QS(e);return t&&$S(e),t}async function tC(e,t={}){let n=eC(t.param??`devframe_otp`);return n?e.isTrusted?!0:e.requestTrustWithCode(n):!1}function nC(e){let t={},n=new WeakMap,r,i=()=>(r??=e.sharedState.get(SS,{initialValue:{}}).then(e=>(t=e.value(),e.on(`updated`,e=>{t=e}),e)),r);return i(),{state:i,has:e=>e in t,keys:()=>Object.keys(t),get:r=>{let i=t[r];if(!i)return;let a=n.get(i);return a||(a={...i,rpc:e.scope(i.scope).rpc},n.set(i,a)),a}}}function rC(e){let t=new Map,n=new Map,r=new Map,i=new Set,a=e.connectionMeta.backend===`static`;function o(e,t){let n=r.get(e);return n&&typeof n==`object`&&!Array.isArray(n)&&typeof t==`object`&&!Array.isArray(t)?{...n,...t}:t}e.client.register({name:Ty.broadcast.clientStateUpdated,type:`event`,handler:(e,n,r)=>{let i=t.get(e);i&&!i.syncIds.has(r)&&i.mutate(()=>o(e,n),r)}}),e.client.register({name:Ty.broadcast.clientStatePatch,type:`event`,handler:(e,n,r)=>{let i=t.get(e);i&&!i.syncIds.has(r)&&i.patch(n,r)}});function s(t,n){let r=[];return r.push(n.on(`updated`,(n,r,i)=>{a||(r?e.callEvent(`devframe:rpc:server-state:patch`,t,r,i):e.callEvent(`devframe:rpc:server-state:set`,t,n,i))})),()=>{for(let e of r)e()}}return{keys:()=>Array.from(t.keys()),onKeyAdded(e){return i.add(e),()=>{i.delete(e)}},delete(e){let i=n.get(e);n.delete(e);let a=t.delete(e);return r.delete(e),i?.(),a},get:async(c,l)=>{if(l?.initialValue!==void 0&&r.set(c,l.initialValue),t.has(c))return t.get(c);let u=Bx({initialValue:l?.initialValue,enablePatches:!1});async function d(){if(a||e.callEvent(`devframe:rpc:server-state:subscribe`,c),l?.initialValue!==void 0){t.set(c,u);for(let e of i)e(c);return e.call(`devframe:rpc:server-state:get`,c).then(e=>{e!==void 0&&u.mutate(()=>o(c,e))}).catch(e=>{console.error(`Error getting server state`,e)}),n.set(c,s(c,u)),u}{let r=await e.call(`devframe:rpc:server-state:get`,c);u.mutate(()=>o(c,r)),t.set(c,u);for(let e of i)e(c);return n.set(c,s(c,u)),u}}return new Promise((t,n)=>{if(e.isTrusted)d().then(t,n);else{t(u);let n=!1;e.events.on(Ty.client.isTrustedUpdated,e=>{e&&!n&&(n=!0,d())})}})}}}var iC=new Map;function aC(e=iC){let t=new Map;return{serialize:n=>{let r;return n.t===`q`?r=n.m:(r=t.get(n.i),t.delete(n.i)),!(n.t===`s`&&`e`in n)&&r&&e.get(r)?.jsonSerializable===!0?FS(n,r??``):`s:${aS(n)}`},deserialize:e=>{let n=e.startsWith(`s:`)?oS(e.slice(2)):JSON.parse(e);return n.t===`q`&&n.i&&n.m&&t.set(n.i,n.m),n}}}function oC(){}function sC(e){let t=e.search(/\n\n|\r\n\r\n/);if(!(t<0))return{frame:e.slice(0,t),rest:e.slice(t+(e[t]===`\r`?4:2))}}function cC(e){let t=`message`,n=[];for(let r of e.split(/\r?\n/))r.startsWith(`:`)||(r.startsWith(`event:`)?t=r.slice(6).trimStart():r.startsWith(`data:`)&&n.push(r.slice(5).replace(/^ /,``)));return{event:t,data:n}}function lC(e){let{onConnected:t=oC,onError:n=oC,onDisconnected:r=oC,definitions:i,fetch:a=globalThis.fetch.bind(globalThis)}=e,o=e.url;e.authToken&&(o=`${o}${o.includes(`?`)?`&`:`?`}${wS}=${encodeURIComponent(e.authToken)}`);let s=aC(i),c=new AbortController,l=!1,u,d,f,p,m=new Promise((e,t)=>{f=e,p=t});m.catch(()=>{});function ee(e){l||(l=!0,p(e),n(e),r())}function h(){l||(l=!0,p(Error(`Devframe SSE stream closed`)),r())}function g(e,n){if(e===`session`){f(n),t();return}u?.(n)}async function te(e){let t=e.getReader();d=t;let n=new TextDecoder,r=``;for(;;){let{done:e,value:i}=await t.read();if(e)break;for(r+=n.decode(i,{stream:!0});;){let e=sC(r);if(!e)break;r=e.rest;let{event:t,data:n}=cC(e.frame);n.length>0&&g(t,n.join(` +`))}}h()}return(async()=>{try{let e=await a(o,{headers:{accept:`text/event-stream`},signal:c.signal});if(!e.ok||!e.body)throw Error(`Devframe SSE stream request failed: ${e.status}`);await te(e.body)}catch(e){if(c.signal.aborted){h();return}ee(e instanceof Error?e:Error(String(e)))}})(),{close:()=>{l=!0,c.abort(),d?.cancel().catch(()=>{})},on:e=>{u=e},post:async e=>{let t;try{t=await m}catch{return}if(l){n(Error(`Devframe SSE channel is closed; message dropped`));return}try{let n=await a(o,{method:`POST`,headers:{"content-type":`text/plain; charset=utf-8`,[bS]:t},body:e});if(n.status===200){let e=await n.text();e&&u?.(e);return}if(!n.ok)throw Error(`Devframe SSE POST failed: ${n.status}`)}catch(e){n(e instanceof Error?e:Error(String(e)))}},serialize:s.serialize,deserialize:s.deserialize}}function uC(e,t){let{channel:n,rpcOptions:r={}}=t;return Ny(e,{...n,timeout:-1,...r,proxify:!1})}function dC(e){let{transport:t,authToken:n,connectionMeta:r,events:i,clientRpc:a,rpcOptions:o={},callTimeout:s=0}=e,c=!1,l=`connecting`,u=null,d=Promise.withResolvers();function f(e,t=null){if(t?u=t:e===`connected`&&(u=null),e===l)return;let n=l;l=e,i.emit(Ty.client.connectionStatus,e,n)}let p=new Set;function m(e){for(let t of[...p])t.reject(e)}function ee(){return l===`disconnected`||l===`error`?new ZS(`connection`,`[devframe] Not connected to the devframe server`,{cause:u??void 0}):l===`unauthorized`?new ZS(`auth`,`[devframe] Not authorized by the devframe server`,{cause:u??void 0}):null}function h(e,t){return new Promise((n,r)=>{let a=!1,o,c={reject(e){a||(l(),i.emit(Ty.client.error,e,t),r(e))}};function l(){a=!0,p.delete(c),o&&clearTimeout(o)}p.add(c),s>0&&(o=setTimeout(()=>{c.reject(new ZS(`timeout`,`[devframe] RPC call "${t}" timed out after ${s}ms`))},s)),e.then(e=>{a||(l(),n(e))},e=>{if(a)return;l();let n=e instanceof Error?e:Error(String(e));i.emit(Ty.client.error,n,t),r(n)})})}let g=new Map;for(let e of r.jsonSerializableMethods??[])g.set(e,{jsonSerializable:!0});let te=e.createChannel({definitions:g,onError(e){f(`error`,e),i.emit(Ty.client.connectionError,e),m(new ZS(`connection`,`[devframe] Connection to the devframe server failed`,{cause:e}))},onDisconnected(){l!==`error`&&f(`disconnected`),m(new ZS(`connection`,`[devframe] Disconnected from the devframe server`,{cause:u??void 0}))}}),ne=uC(a.functions,{channel:te,rpcOptions:o});a.register({name:Ty.broadcast.authRevoked,type:`event`,handler:()=>{c=!1;let e=new ZS(`auth`,`[devframe] The devframe server revoked this client's trust`);f(`unauthorized`,e),i.emit(Ty.client.connectionError,e),m(e),i.emit(Ty.client.isTrustedUpdated,!1)}});let re=n;async function ie(e){re=e;let t=await ne.$call(`anonymous:devframe:auth`,{authToken:e,ua:navigator.userAgent,origin:location.origin});if(c=t.isTrusted,c)d.resolve(!0),f(`connected`);else{let e=new ZS(`auth`,`[devframe] The devframe server refused this client's credentials`);f(`unauthorized`,e),i.emit(Ty.client.connectionError,e)}return i.emit(Ty.client.isTrustedUpdated,c),t.isTrusted}async function ae(e){let t=(await ne.$call(`anonymous:devframe:auth:exchange`,{code:e,ua:navigator.userAgent,origin:location.origin}))?.authToken??null;return t&&(re=t,c=!0,d.resolve(!0),f(`connected`),i.emit(Ty.client.isTrustedUpdated,!0)),t}async function oe(e={}){await ne.$call(`anonymous:devframe:auth:request-code`,{ua:navigator.userAgent,origin:location.origin,...e.reissue?{reissue:!0}:{}})}async function se(){return c?!0:ie(re??``)}async function ce(e=6e4){if(c&&d.resolve(!0),e<=0)return d.promise;let t;try{return await Promise.race([d.promise,new Promise((n,r)=>{t=setTimeout(()=>{r(Error(`[devframe] Timeout waiting for rpc to be trusted`))},e)})]),c}finally{clearTimeout(t)}}return{transport:t,get isTrusted(){return c},get status(){return l},get connectionError(){return u},requestTrust:se,requestTrustWithToken:ie,requestTrustWithCode:ae,requestAuthCode:oe,ensureTrusted:ce,call:(...e)=>{let t=String(e[0]),n=ee();return n?(i.emit(Ty.client.error,n,t),Promise.reject(n)):h(ne.$call(...e),t)},callEvent:(...e)=>{let t=ee();if(t){i.emit(Ty.client.error,t,String(e[0]));return}return ne.$callEvent(...e)},callOptional:(...e)=>{let t=String(e[0]),n=ee();return n?(i.emit(Ty.client.error,n,t),Promise.reject(n)):h(ne.$callOptional(...e),t)},close:()=>{te.close()}}}function fC(e,t,n){let r=(()=>{try{return new URL(t,n.href)}catch{return new URL(n.href)}})();if(e&&typeof e==`object`){if(e.host!=null||e.port!=null){let t=e.host??`${r.hostname}:${e.port}`;return new URL(e.path??`/`,`${r.protocol}//${t}`).href}return new URL(e.path??``,r).href}let i=e??``;return/^https?:\/\//i.test(i)?i:new URL(i,r).href}function pC(e){let{authToken:t,connectionMeta:n,metaBaseUrl:r,events:i,clientRpc:a,rpcOptions:o={},sseOptions:s={},callTimeout:c=0}=e,l=fC(n.sse,r??`./`,location);return dC({transport:`sse`,authToken:t,connectionMeta:n,events:i,clientRpc:a,rpcOptions:o,callTimeout:c,createChannel:e=>lC({url:l,authToken:t,definitions:e.definitions,...s,onConnected(){s.onConnected?.()},onError(t){e.onError(t),s.onError?.(t)},onDisconnected(){e.onDisconnected(),s.onDisconnected?.()}})})}function mC(e){let{name:t,message:n,cause:r,...i}=e,a=r instanceof Error?r:hC(r)?mC(r):r,o=a===void 0?Error(n):Error(n,{cause:a});return o.name=t,Object.assign(o,i),o}function hC(e){return typeof e==`object`&&!!e&&typeof e.message==`string`&&typeof e.name==`string`}function gC(e){return typeof e==`object`&&!!e&&e.type===`static`&&typeof e.path==`string`}function _C(e){return typeof e==`object`&&!!e&&e.type===`query`&&typeof e.records==`object`&&e.records!==null}function vC(e){return typeof e==`object`&&!!e&&(`output`in e||`error`in e)}function yC(e){if(e.error)throw mC(e.error);return e.output}function bC(e){return e.some(e=>e!=null)}function xC(e){return typeof e==`object`&&e&&`serialization`in e&&`data`in e?e.data:e}function SC(e,t){let n=new Map,r=new Map;function i(e,t){return t===`structured-clone`&&Array.isArray(e)?iS(e):e}function a(e,t){return i(xC(e),t)}async function o(e){n.has(e.path)||n.set(e.path,t(e.path).then(t=>a(t,e.serialization)));let r=await n.get(e.path);return vC(r)?yC(r):r}async function s(e,n){return r.has(e)||r.set(e,t(e).then(e=>a(e,n))),await r.get(e)}async function c(t,n){if(!(t in e))throw Error(`[devframe-rpc] Function "${t}" not found in dump store`);let r=e[t];if(gC(r)){if(bC(n))throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`);return await o(r)}if(_C(r)){let e=$y(n),i=r.records[e];if(i)return yC(await s(i,r.serialization));if(r.fallback)return yC(await s(r.fallback,r.serialization));throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`)}if(!bC(n))return r;throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`)}return{call:async(e,t)=>await c(e,t),callOptional:async(t,n)=>{if(t in e)return await c(t,n)},callEvent:async(e,t)=>{}}}async function CC(e){let t=SC(await e.fetchJsonFromBases(xS),e.fetchJsonFromBases);return{transport:`static`,isTrusted:!0,status:`connected`,connectionError:null,requestTrust:async()=>!0,requestTrustWithToken:async()=>!0,requestTrustWithCode:async()=>null,requestAuthCode:async()=>{},ensureTrusted:async()=>!0,call:(...e)=>t.call(e[0],e.slice(1)),callEvent:(...e)=>t.callEvent(e[0],e.slice(1)),callOptional:(...e)=>t.callOptional(e[0],e.slice(1)),close:()=>{}}}var wC=``;function TC(e,t){return`${e}${wC}${t}`}function EC(e){let t=new Map,n=new Map;e.client.register({name:Ty.broadcast.streamingChunk,type:`event`,handler(e,n,r,i){t.get(TC(e,n))?._push(r,i)}}),e.client.register({name:Ty.broadcast.streamingEnd,type:`event`,handler(e,n,r){let i=TC(e,n),a=t.get(i);a&&(a._end(r),t.delete(i))}}),e.client.register({name:Ty.broadcast.streamingUploadCancel,type:`event`,handler(e,t){let r=TC(e,t),i=n.get(r);i&&(i.abort(`server cancelled upload`),n.delete(r))}}),e.events.on(Ty.client.isTrustedUpdated,n=>{if(n)for(let[n,r]of t){if(r.cancelled||r.done)continue;let t=n.indexOf(wC);if(t<0)continue;let i=n.slice(0,t),a=n.slice(t+1);e.callEvent(`devframe:streaming:subscribe`,i,a,{afterSeq:r.lastSeenSeq})}});function r(n,r,i={}){let a=TC(n,r),o=t.get(a);if(o)return o;let s=uS({id:r,highWaterMark:i.highWaterMark,onOverflow(e){console.warn(`[devframe] DF0029: Stream "${n}#${r}" dropped ${e} chunk(s) after exceeding the client high-water mark.`)},onCancel(){e.callEvent(`devframe:streaming:cancel`,n,r),t.delete(a)}});if(t.set(a,s),e.isTrusted)e.callEvent(`devframe:streaming:subscribe`,n,r,{afterSeq:0});else{let i=e.events.on(Ty.client.isTrustedUpdated,o=>{o&&(i(),t.has(a)&&!s.cancelled&&!s.done&&e.callEvent(`devframe:streaming:subscribe`,n,r,{afterSeq:s.lastSeenSeq}))})}return s}function i(t,r){let i=TC(t,r),a=n.get(i);if(a)return a;let o=lS({id:r});return o.events.on(`chunk`,(n,i)=>{e.callEvent(`devframe:streaming:upload-chunk`,t,r,n,i)}),o.events.on(`end`,a=>{e.callEvent(`devframe:streaming:upload-end`,t,r,a),n.delete(i)}),n.set(i,o),o}return{subscribe:r,upload:i}}function DC(){}var OC=new Map;function kC(e){let t=e.url;e.authToken&&(t=`${t}?${wS}=${encodeURIComponent(e.authToken)}`);let n=new WebSocket(t),{onConnected:r=DC,onError:i=DC,onDisconnected:a=DC,definitions:o=OC}=e;n.addEventListener(`open`,e=>{r(e)}),n.addEventListener(`error`,e=>{let t=e instanceof Error?e:Error(e.type);i(t)}),n.addEventListener(`close`,e=>{a(e)});let s=aC(o);return{close:()=>{n.close()},on:e=>{n.addEventListener(`message`,t=>{e(t.data)})},post:e=>{if(n.readyState===WebSocket.OPEN){n.send(e);return}if(n.readyState===WebSocket.CONNECTING){let t=()=>{i(),n.readyState===WebSocket.OPEN&&n.send(e)},r=()=>i();function i(){n.removeEventListener(`open`,t),n.removeEventListener(`close`,r)}n.addEventListener(`open`,t),n.addEventListener(`close`,r);return}i(Error(`Devframe WebSocket is not open; message dropped`))},serialize:s.serialize,deserialize:s.deserialize}}function AC(e,t,n){let r=(()=>{try{return new URL(t,n.href)}catch{return new URL(n.href)}})(),i=r.protocol===`https:`?`wss:`:`ws:`;if(e&&typeof e==`object`){if(e.host!=null||e.port!=null){let t=e.host??`${r.hostname}:${e.port}`,n=new URL(e.path??`/`,`${i}//${t}`);return n.protocol=i,n.href}let t=new URL(e.path??``,r);return t.protocol=i,t.href}if(typeof e==`number`)return`${i}//${r.hostname}:${e}`;let a=e??``;if(/^wss?:\/\//i.test(a))return a;if(/^https?:\/\//i.test(a))return ob(a,/^https/i.test(a)?`wss://`:`ws://`);let o=new URL(a,r);return o.protocol=i,o.href}function jC(e){let{authToken:t,connectionMeta:n,metaBaseUrl:r,events:i,clientRpc:a,rpcOptions:o={},wsOptions:s={},callTimeout:c=0}=e,l=AC(n.websocket,r??`./`,location);return dC({transport:`websocket`,authToken:t,connectionMeta:n,events:i,clientRpc:a,rpcOptions:o,callTimeout:c,createChannel:e=>kC({url:l,authToken:t,definitions:e.definitions,...s,onConnected(e){s.onConnected?.(e)},onError(t){e.onError(t),s.onError?.(t)},onDisconnected(t){e.onDisconnected(),s.onDisconnected?.(t)}})})}function MC(e){return e.includes(`:`)}function NC(e,t){return MC(t)?t:`${e}:${t}`}function PC(e){return{async get(t){return(await e()).value()?.[t]},async set(t,n){(await e()).mutate(e=>{if(e===void 0)return{[t]:n};e[t]=n})},async delete(t){(await e()).mutate(e=>{e!==void 0&&delete e[t]})},async all(){return(await e()).value()??{}},async onChange(t){return(await e()).on(`updated`,e=>t(e??{}))}}}function FC(e,t,n){let r=`devframe:settings:${n}:${t}`,i;function a(){return i||=(async()=>(await e.ensureTrusted(),e.sharedState.get(r)))().catch(e=>{throw i=void 0,e}),i}return PC(a)}function IC(e,t){return{global:FC(e,t,`global`),project:FC(e,t,`project`)}}function LC(e,t){return{namespace:t,base:e,rpc:{namespace:t,register(n){if(MC(n.name))throw Error(`[devframe] Scoped client RPC registration for namespace "${t}" received an already-namespaced function name "${n.name}". Pass a bare name without a ":" separator.`);e.client.register({...n,name:`${t}:${n.name}`})},call:((n,...r)=>e.call(NC(t,n),...r)),callEvent:((n,...r)=>e.callEvent(NC(t,n),...r)),callOptional:((n,...r)=>e.callOptional(NC(t,n),...r)),sharedState:((n,r)=>e.sharedState.get(NC(t,n),r)),streaming:{subscribe:(n,r,i)=>e.streaming.subscribe(NC(t,n),r,i),upload:(n,r)=>e.streaming.upload(NC(t,n),r)}},settings:IC(e,t),scope:e.scope}}function RC(){if(typeof document<`u`){let e=document.modelContext;if(e)return e}if(typeof navigator<`u`){let e=navigator.modelContext;if(e)return e}}function zC(e,t={}){let n=t.modelContext??RC();if(!n)return()=>{};let r=n,i=new Map,a=new Map;function o(t,n){let o=pS(t.name),s=a.get(o);if(s&&s!==t.name){console.warn(`[devframe] WebMCP tool name "${o}" (from "${t.name}") collides with "${s}"; keeping the first registration.`);return}let c=new AbortController,l=Py(t.type,n),u=r.registerTool({name:o,description:n.description,inputSchema:Ly(t.args),annotations:{title:n.title??t.name,readOnlyHint:l===`read`,destructiveHint:l===`destructive`},execute:n=>BC(t,e.context,n)},{signal:c.signal});u&&`then`in u&&u.then(()=>{},()=>{}),a.set(o,t.name),i.set(t.name,()=>{c.abort(),u&&`unregister`in u&&typeof u.unregister==`function`&&u.unregister(),a.delete(o)})}function s(t){let n=t?[t]:[...e.definitions.keys()];for(let t of n){i.get(t)?.(),i.delete(t);let n=e.definitions.get(t),r=n?.agent;n&&r&&o(n,r)}}s();let c=e.onChanged(e=>s(e));return()=>{c();for(let e of i.values())e();i.clear()}}async function BC(e,t,n){try{let r=zy(n,e.args?.length);return{content:[{type:`text`,text:VC(await(await NS(e,t))(...r))}]}}catch(e){return{isError:!0,content:[{type:`text`,text:HC(e)}]}}}function VC(e){return e===void 0?`undefined`:typeof e==`string`?e:JSON.stringify(e,null,2)}function HC(e){if(!(e instanceof Error))return String(e);let t=e.cause instanceof Error?` (cause: ${e.cause.message})`:``;return`${e.name}: ${e.message}${t}`}function UC(e,t){if(t.backend===`static`)return`static`;let n=t.websocket!==void 0,r=t.sse!==void 0;if(e===`websocket`){if(!n)throw Error(`[devframe] transport: 'websocket' was requested, but this server does not advertise a WebSocket endpoint`);return`websocket`}if(e===`sse`){if(!r)throw Error(`[devframe] transport: 'sse' was requested, but this server does not advertise an SSE endpoint`);return`sse`}if(t.backend===`sse`&&r)return`sse`;if(n)return`websocket`;if(r)return`sse`;throw Error(`[devframe] This server advertises no RPC transport (backend "none"), so there is nothing to connect to. Enable the WebSocket or SSE endpoint on the server, or use its static/MCP surfaces instead.`)}async function WC(e={}){let{baseURL:t=`./`,rpcOptions:n={},cacheOptions:r=!1}=e,i=eb(),a=Array.isArray(t)?t:[t],o=await XS(e),{connectionMeta:s,metaBaseUrl:c,authToken:l}=o,u=a[0]??`./`;try{u=new URL(`.`,c).href}catch{}let d=new TS({functions:[],...typeof e.cacheOptions==`object`?e.cacheOptions:{}}),f={rpc:void 0},p=new PS(f),m=e.webmcp===!1?void 0:zC(p),ee,h=!1,g=0,te;function ne(){g++,te=void 0,d.clear(),r===!0&&d.updateOptions({functions:[]})}r&&(p.register({name:Ty.broadcast.cacheInvalidate,type:`event`,handler:ne}),i.on(Ty.client.connectionStatus,ne),i.on(Ty.client.isTrustedUpdated,ne));async function re(e){let t=[u,...a.filter(e=>e!==u)].filter(e=>e!=null),n=[];for(let r of t)try{return await fetch(ab(e,r)).then(t=>{if(!t.ok)throw Error(`Failed to fetch ${e} from ${r}: ${t.status}`);return t.json()})}catch(e){n.push(e)}throw Error(`Failed to load ${e} from ${t.join(`, `)}`,{cause:n})}let ie=e.callTimeout??0,ae=ie>0?ie:1/0,oe,se={authToken:l,connectionMeta:s,metaBaseUrl:c,events:i,clientRpc:p,callTimeout:e.callTimeout,rpcOptions:{...n,async onRequest(e,t,i){let a=performance.now()+ae;if(await n.onRequest?.call(this,e,t,i),r===!0&&e.i&&oe.isTrusted&&!e.m.startsWith(`anonymous:`)&&e.m!==`devframe:rpc:cacheable-functions`){function t(){if(performance.now()>=a)throw new ZS(`timeout`,`[devframe] RPC call "${e.m}" timed out after ${ie}ms`)}for(;!te&&(t(),!(h||oe.status!==`connected`));){let e=g;te=oe.callOptional(`devframe:rpc:cacheable-functions`).then(t=>{e===g&&d.updateOptions({functions:t??[]})}).catch(t=>{throw e===g&&(te=void 0),t}),await te}await te,t()}let o=g;if(r&&e.i&&!h&&oe.isTrusted&&d.validate(e.m)){if(d.has(e.m,e.a))return i(d.cached(e.m,e.a));let n=await t(e);o===g&&!h&&d.apply(e,n)}else await t(e)}}},ce=UC(e.transport??`auto`,s);oe=ce===`static`?await CC({fetchJsonFromBases:re}):ce===`sse`?pC({...se,sseOptions:e.sseOptions}):jC({...se,wsOptions:e.wsOptions});let le;try{le=new BroadcastChannel(`devframe-auth`)}catch{}let ue,de=!1;function fe(e){return((...t)=>de||!ue?e(...t):ue.then(()=>e(...t)))}function pe(){h=!0,ne();try{ee?.(),m?.()}finally{try{le?.close()}finally{oe.close?.()}}}let me={events:i,get isTrusted(){return oe.isTrusted},get status(){return oe.status},get connectionError(){return oe.connectionError},get transport(){return oe.transport??ce},get connection(){return o},connectionMeta:s,ensureTrusted:oe.ensureTrusted,requestTrust:oe.requestTrust,requestTrustWithToken:async e=>(KS(e),o={...o,authToken:e},oe.requestTrustWithToken(e)),requestTrustWithCode:async e=>{let t=await oe.requestTrustWithCode(e);if(!t)return!1;KS(t),o={...o,authToken:t};try{le?.postMessage({type:`auth-update`,authToken:t})}catch{}return!0},requestAuthCode:e=>oe.requestAuthCode(e),call:fe(oe.call),callEvent:fe(oe.callEvent),callOptional:fe(oe.callOptional),client:p,sharedState:void 0,services:void 0,streaming:void 0,cacheManager:d,scope:void 0,close:pe};me.sharedState=rC(me),me.streaming=EC(me),me.services=nC(me);let he=new Map;me.scope=(e=>{if(!e)return me;let t=he.get(e);return t||(t=LC(me,e),he.set(e,t)),t}),f.rpc=me;function ge(){try{return typeof window<`u`&&window.self===window.top}catch{return!1}}async function _e(){if(e.simpleAuth!==!1&&ge()&&typeof globalThis.prompt==`function`)for(await me.requestAuthCode().catch(()=>{});!me.isTrusted;){let e=globalThis.prompt(`devframe: enter the authentication code shown in your terminal`);if(e==null)return;let t=e.trim();if(t&&await me.requestTrustWithCode(t))return}}async function ve(){let t=await oe.requestTrust(),n=e.otpParam??`devframe_otp`,r=n?await tC(me,{param:n}):!1;t||r||me.isTrusted||await _e()}return ue=ve().then(()=>{de=!0},()=>{de=!0}),s.mcp&&_S(async()=>{let{setupBrowserAgentRpcBridge:e}=await import(`./browser-agent-rpc-KH4HHvHf-Cke5mr2c.js`);return{setupBrowserAgentRpcBridge:e}},[],import.meta.url).then(({setupBrowserAgentRpcBridge:e})=>{h||(ee=e(me))}).catch(()=>{}),le&&(le.onmessage=e=>{e.data?.type===`auth-update`&&e.data.authToken&&me.requestTrustWithToken(e.data.authToken)}),me}var GC=WC,KC=[`components`,`injectors`,`signals`,`ngrx`,`tanstackQuery`,`forms`,`router`,`pipes`,`http`,`analog`,`capacitor`,`errors`,`plugins`,`performance`,`build`],qC=[`angular`,`ngrx`,`analog`,`angular-native`,`nativescript`,`capacitor`];function JC(e){return`pangular:${e}`}var YC=[`forms`,`router`,`ngrx`,`http`,`analog`,`components`,`tanstackQuery`,`plugins`],XC={refreshMs:{default:3e3,min:500,max:8e3},navigations:{default:50,min:5,max:500},formTimeline:{default:200,min:10,max:2e3},httpCalls:{default:200,min:10,max:2e3},changeLog:{default:200,min:10,max:2e3},cdCycles:{default:200,min:10,max:2e3},cdSlowMs:{default:16,min:1,max:1e3},capacitorCalls:{default:200,min:10,max:2e3},idleAfterMs:{default:6e4,min:0,max:6e5}},ZC={"opted-out":`the request sets transferCache: false`,post:`POST requests are left out unless includePostRequests is set`,method:`only GET, HEAD and POST requests are cached`,"auth-headers":`it sends an Authorization, Proxy-Authorization or Cookie header`,credentials:`it sends credentials (withCredentials or credentials: include/same-origin)`,"no-cache-request":`the request asks for no-store, no-cache or private`,"no-cache-response":`the response has Cache-Control no-store, no-cache or private`,"set-cookie":`the response sets a cookie`,error:`failed responses are not stored`,mocked:`a fault rule answered before the transfer cache ran`,filter:`the transferCache filter passed to withPangular() left it out`,"cache-off-or-filter":`the transfer cache is off, or its filter (or another withHttpTransferCacheOptions setting) left it out`},QC=[[0,`Network error (offline)`],[200,`OK`],[201,`Created`],[202,`Accepted`],[203,`Non-Authoritative Information`],[204,`No Content`],[205,`Reset Content`],[206,`Partial Content`],[207,`Multi-Status`],[208,`Already Reported`],[226,`IM Used`],[300,`Multiple Choices`],[301,`Moved Permanently`],[302,`Found`],[303,`See Other`],[304,`Not Modified`],[307,`Temporary Redirect`],[308,`Permanent Redirect`],[400,`Bad Request`],[401,`Unauthorized`],[402,`Payment Required`],[403,`Forbidden`],[404,`Not Found`],[405,`Method Not Allowed`],[406,`Not Acceptable`],[407,`Proxy Authentication Required`],[408,`Request Timeout`],[409,`Conflict`],[410,`Gone`],[411,`Length Required`],[412,`Precondition Failed`],[413,`Content Too Large`],[414,`URI Too Long`],[415,`Unsupported Media Type`],[416,`Range Not Satisfiable`],[417,`Expectation Failed`],[418,`I'm a Teapot`],[421,`Misdirected Request`],[422,`Unprocessable Content`],[423,`Locked`],[424,`Failed Dependency`],[425,`Too Early`],[426,`Upgrade Required`],[428,`Precondition Required`],[429,`Too Many Requests`],[431,`Request Header Fields Too Large`],[451,`Unavailable For Legal Reasons`],[499,`Client Closed Request`],[500,`Internal Server Error`],[501,`Not Implemented`],[502,`Bad Gateway`],[503,`Service Unavailable`],[504,`Gateway Timeout`],[505,`HTTP Version Not Supported`],[506,`Variant Also Negotiates`],[507,`Insufficient Storage`],[508,`Loop Detected`],[510,`Not Extended`],[511,`Network Authentication Required`],[520,`Web Server Returned an Unknown Error`],[521,`Web Server Is Down`],[522,`Connection Timed Out`],[523,`Origin Is Unreachable`],[524,`A Timeout Occurred`]];function $C(e){return QC.some(([t])=>t===e)}var ew=/^[a-z][a-z0-9-]{0,39}$/;function tw(e,t){let n=t.plugins?.[e],r=t.inspectors.plugins&&ew.test(e)&&(n?.enabled??!0);return{enabled:r,tools:r&&t.agent.tools.plugins&&(n?.tools??!0),actions:r&&t.actions.plugins&&(n?.actions??!0)}}var nw=`pangular`,rw={mod:`Mod`,ctrl:`Ctrl`,control:`Ctrl`,meta:`Meta`,cmd:`Meta`,command:`Meta`,alt:`Alt`,option:`Alt`,opt:`Alt`,shift:`Shift`},iw=[`Mod`,`Ctrl`,`Meta`,`Alt`,`Shift`];function aw(e){if(typeof e!=`string`||e.length>40)return;let t=e.split(`+`).map(e=>e.trim());if(t.some(e=>!e))return;let n=new Set,r;for(let e of t){let t=rw[e.toLowerCase()];if(t){if(n.has(t))return;n.add(t);continue}if(r!==void 0)return;if(/^[a-z0-9]$/i.test(e))r=e.toUpperCase();else if(/^f([1-9]|1[0-2])$/i.test(e))r=e.toUpperCase();else return}if(r&&[...n].some(e=>e!==`Shift`)&&!(n.has(`Mod`)&&(n.has(`Ctrl`)||n.has(`Meta`))))return[...iw.filter(e=>n.has(e)),r].join(`+`)}function ow(e,t,n){let r=t.split(`+`),i=r.pop(),a=new Set(r),o=a.has(`Ctrl`)||a.has(`Mod`)&&!n,s=a.has(`Meta`)||a.has(`Mod`)&&n;if(e.ctrlKey!==o||e.metaKey!==s||e.altKey!==a.has(`Alt`)||e.shiftKey!==a.has(`Shift`))return!1;if(/^F\d+$/.test(i))return e.key.toUpperCase()===i;let c=/^\d$/.test(i)?`Digit${i}`:`Key${i}`;return e.code?e.code===c:e.key.toUpperCase()===i}function sw(e,t){if(!t)return e.replace(/^Mod\b/,`Ctrl`);let n={Mod:`⌘`,Meta:`⌘`,Ctrl:`⌃`,Alt:`⌥`,Shift:`⇧`};return e.split(`+`).map(e=>n[e]??e).join(``)}var cw=[{id:`dashboard`,label:`Dashboard`},{id:`timeline`,label:`Timeline`},{id:`audit`,label:`Audit`},{id:`analog`,label:`Analog`,inspector:`analog`},{id:`components`,label:`Components`,inspector:`components`},{id:`routes`,label:`Routes`,inspector:`router`},{id:`signals`,label:`Signals`,inspector:`signals`},{id:`injectors`,label:`Injectors`,inspector:`injectors`},{id:`store`,label:`Store`,inspector:`ngrx`},{id:`queries`,label:`Queries`,inspector:`tanstackQuery`},{id:`forms`,label:`Forms`,inspector:`forms`},{id:`pipes`,label:`Pipes`,inspector:`pipes`},{id:`network`,label:`SSR & HTTP`,inspector:`http`},{id:`errors`,label:`Errors`,inspector:`errors`},{id:`performance`,label:`Performance`,inspector:`performance`},{id:`build`,label:`Build`,inspector:`build`},{id:`capacitor`,label:`Capacitor`,inspector:`capacitor`},{id:`plugins`,label:`Plugins`,inspector:`plugins`}],lw=1e4;function uw(e){return cw.filter(t=>!(`inspector`in t)||e.inspectors[t.inspector])}var dw={components:`a component instance, by its id in the component tree`,injectors:`a component's element injector, by the component's id`,signals:`a component's signal graph, by the component's id`,forms:`a form, by its id`},fw=200;function pw(e){let t=new URLSearchParams({tab:e.tab});return e.id&&t.set(`id`,e.id),e.page&&t.set(`page`,e.page),`#${t.toString()}`}function mw(e){let t=new URLSearchParams(e.replace(/^#/,``)),n=e=>{let n=t.get(e)?.trim();return n&&n.length<=fw?n:void 0},r=n(`tab`);if(!r)return null;let i=n(`id`),a=n(`page`);return{tab:r,...i?{id:i}:{},...a?{page:a}:{}}}var hw=[{id:`settings`,title:`Open settings`,group:`Go to`,keywords:`preferences tabs`},{id:`pick-component`,title:`Pick component on page`,group:`Actions`,keywords:`select inspect element`,inspector:`components`},{id:`cd-record-start`,title:`Start recording change detection`,group:`Actions`,keywords:`profiler cycles`,inspector:`components`},{id:`cd-record-stop`,title:`Stop recording change detection`,group:`Actions`,keywords:`profiler cycles`,inspector:`components`},{id:`cd-clear`,title:`Clear change detection recording`,group:`Actions`,keywords:`reset recordings cycles`,inspector:`components`},{id:`theme:system`,title:`Theme: follow the system`,group:`Theme`,keywords:`auto`},{id:`theme:light`,title:`Theme: light`,group:`Theme`},{id:`theme:dark`,title:`Theme: dark`,group:`Theme`},{id:`dock:float`,title:`Popup: float`,group:`Popup`,keywords:`dock`,popupOnly:!0},{id:`dock:bottom`,title:`Popup: dock to the bottom`,group:`Popup`,keywords:`dock`,popupOnly:!0},{id:`dock:right`,title:`Popup: dock to the right`,group:`Popup`,keywords:`dock`,popupOnly:!0},{id:`dock:reset-size`,title:`Popup: reset the docked size`,group:`Popup`,keywords:`splitter resize height width`,popupOnly:!0},{id:`popout`,title:`Popup: open in its own window`,group:`Popup`,keywords:`pop out detach new window`,popupOnly:!0},{id:`popout:return`,title:`Popup: back into the page`,group:`Popup`,keywords:`pop in attach dock window`,popupOnly:!0}];function gw(e){let t=uw(e).map(e=>({id:`tab:${e.id}`,title:`Go to ${e.label}`,group:`Go to`,keywords:`tab open`})),n=hw.filter(t=>!t.inspector||e.inspectors[t.inspector]).map(({inspector:e,...t})=>t);return[...t,...n]}function _w(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:{}}var vw=Object.freeze({minLength:24,threshold:4.5}),yw={min:16,max:512},bw={min:2,max:6};function xw(e){return typeof e==`number`&&Number.isInteger(e)&&e>=yw.min&&e<=yw.max}function Sw(e){return typeof e==`number`&&Number.isFinite(e)&&e>=bw.min&&e<=bw.max}function Cw(e){if(e===!0)return{...vw};if(!e||typeof e!=`object`||Array.isArray(e))return;let{minLength:t,threshold:n}=e;return{minLength:xw(t)?t:vw.minLength,threshold:Sw(n)?n:vw.threshold}}function ww(e){let t=Cw(e);return t?{entropy:t}:{}}function Tw(e,t){return typeof e==`boolean`?e:t}var Ew=100,Dw=100;function Ow(e){if(!Array.isArray(e))return[];let t=e.filter(e=>typeof e==`string`).map(e=>e.trim()).filter(e=>e&&e.length<=Dw);return[...new Set(t)].slice(0,Ew)}function kw(e,t){let{default:n,min:r,max:i}=XC[t];return typeof e!=`number`||!Number.isFinite(e)?n:Math.min(i,Math.max(r,Math.round(e)))}function Aw(e,t){return Object.fromEntries(e.map(e=>[e,t(e)]))}function jw(e){let t=_w(e),n=_w(t.agent),r=_w(t.inspectors),i=_w(n.tools),a=_w(t.actions),o=Tw(t.actions,!0),s=_w(t.redaction),c=_w(t.limits),l=Aw(KC,e=>Tw(r[e],!0));return{inspectors:l,agent:{readOnly:Tw(n.readOnly,!1),tools:Aw(KC,e=>l[e]&&Tw(i[e],!0)),browserTools:Tw(n.browserTools,!1)},actions:Aw(YC,e=>l[e]&&Tw(a[e],o)),redaction:{secretNames:Ow(s.secretNames),unmask:Ow(s.unmask),...ww(s.entropy)},limits:Object.fromEntries(Object.keys(XC).map(e=>[e,kw(c[e],e)])),popup:{hotkey:Rw(_w(t.popup).hotkey)},plugins:Lw(t.plugins),lint:{rules:Fw(t.lint)},analog:Nw(t.analog),ngrx:{trace:Tw(_w(t.ngrx).trace,!1)}}}var Mw=500;function Nw(e){let t=_w(e).contentSchema;return typeof t==`string`&&t.trim()&&t.length<=Mw?{contentSchema:t.trim()}:{}}var Pw=200;function Fw(e){let t=_w(_w(e).rules),n={};for(let[e,r]of Object.entries(t).slice(0,Pw))typeof r==`boolean`&&(n[e]=r);return n}var Iw=100;function Lw(e){let t={};for(let[n,r]of Object.entries(_w(e)).slice(0,Iw)){if(!ew.test(n))continue;if(typeof r==`boolean`){t[n]={enabled:r,tools:!0,actions:!0};continue}let e=_w(r);r!==void 0&&Object.keys(e).length&&(t[n]={enabled:Tw(e.enabled,!0),tools:Tw(e.tools,!0),actions:Tw(e.actions,!0)})}return t}function Rw(e){return e===!1?!1:aw(e)??`Alt+Shift+P`}function zw(e){let t=e?.configs;return jw(t?.[nw])}function Bw(e){return`${{forms:`Writing to forms`,router:`Navigating and clearing navigations`,ngrx:`Restoring NgRx state, dispatching actions and changing the Store DevTools history`,http:`Changing HTTP mock rules and SSR overrides, refetching the TransferState payload, and clearing HTTP calls`,analog:`Calling API routes, clearing server calls, running Nitro tasks and purging the Nitro cache`,components:`Editing component properties and signals`,tanstackQuery:`Invalidating and refetching TanStack queries`,plugins:`Running plugin actions`}[e]} is turned off in the devtools config (actions.${e}).`}var Vw=[`pangular:build-meta`],Hw={components:`Components`,injectors:`Injectors`,signals:`Signals`,ngrx:`NgRx`,tanstackQuery:`TanStack Query`,forms:`Forms`,router:`Router`,pipes:`Pipes`,http:`HTTP`,analog:`Analog`,capacitor:`Capacitor`,errors:`Errors`,plugins:`Plugins`,performance:`Performance`,build:`Build`},Uw={forms:`Form writes`,router:`Navigation`,ngrx:`NgRx restore, dispatch and Store DevTools`,http:`HTTP mocking`,analog:`Analog API calls`,components:`Component edits`,tanstackQuery:`TanStack Query invalidate and refetch`,plugins:`Plugin actions`},Ww={refreshMs:e=>`poll every ${e} ms`,navigations:e=>`${e} navigations`,formTimeline:e=>`${e} form events`,httpCalls:e=>`${e} HTTP calls`,changeLog:e=>`${e} NgRx changes`,cdCycles:e=>`${e} change detection cycles`,cdSlowMs:e=>`slow cycles over ${e} ms`,capacitorCalls:e=>`${e} Capacitor plugin calls`,idleAfterMs:e=>e?`idle ${e/1e3} s after the last agent call`:`never idle`};function Gw(e){if(!e)return[];let t=[`On`];return e.minLength!==vw.minLength&&t.push(`${e.minLength} characters or more`),e.threshold!==vw.threshold&&t.push(`up to ${e.threshold} bits per character`),t}function Kw(e){let t=[],n=(e,n)=>{n.length&&t.push({label:e,value:n.join(`, `)})},r=KC.filter(t=>e.inspectors[t]);n(`Inspectors off`,KC.filter(t=>!e.inspectors[t]).map(e=>Hw[e])),n(`Agent`,e.agent.readOnly?[`Read-only`]:[]),n(`Hidden from the agent`,r.filter(t=>!e.agent.tools[t]).map(e=>Hw[e])),n(`Blocked actions`,YC.filter(t=>e.inspectors[t]&&!e.actions[t]).map(e=>Uw[e])),n(`Extra secret names`,e.redaction.secretNames),n(`Unmasked names`,e.redaction.unmask),n(`Entropy masking`,Gw(e.redaction.entropy)),n(`Limits`,Object.keys(XC).filter(t=>e.limits[t]!==XC[t].default).map(t=>Ww[t](e.limits[t]))),e.popup.hotkey!==`Alt+Shift+P`&&n(`Popup shortcut`,[e.popup.hotkey===!1?`Off`:e.popup.hotkey]);let i=Object.entries(e.plugins??{});return n(`Plugins off`,i.filter(([,e])=>!e.enabled).map(([e])=>e)),n(`Plugin tools or actions off`,i.filter(([,e])=>e.enabled&&(!e.tools||!e.actions)).map(([e,t])=>`${e} (${[!t.tools&&`tools`,!t.actions&&`actions`].filter(Boolean).join(`, `)})`)),n(`Lint rules off`,Object.entries(e.lint?.rules??{}).filter(([,e])=>!e).map(([e])=>e)),t}function qw(e){let t={tags:[],directives:[],text:``},n=e.toLowerCase();return n=n.replace(/<\s*([^<>\s]+)\s*>/g,(e,n)=>(t.tags.push({value:n,exact:!0}),` `)),n=n.replace(/\[\s*([^[\]\s]+)\s*\]/g,(e,n)=>(t.directives.push({value:n,exact:!0}),` `)),n=n.replace(/(^|\s)([<[])([^<>[\]\s]*)$/,(e,n,r,i)=>(i&&(r===`<`?t.tags:t.directives).push({value:i,exact:!1}),n)),t.text=n.replace(/\s+/g,` `).trim(),t}function Jw(e){return!e.tags.length&&!e.directives.length&&!e.text}function Yw(e,t){let n=e.tag.toLowerCase(),r=(e.directives??[]).map(e=>e.toLowerCase()),i=(e.attributes??[]).map(e=>e.toLowerCase()),a=[...r,...r.map(e=>e.replace(/directive$/,``)),...i];for(let{value:e,exact:r}of t.tags)if(r?n!==e:!n.startsWith(e))return!1;for(let{value:e,exact:n}of t.directives)if(!a.some(t=>n?t===e:t.includes(e)))return!1;if(t.text){let a=t.text;if(!(e.name.toLowerCase().includes(a)||n.includes(a)||r.some(e=>e.includes(a))||i.some(e=>e.includes(a))))return!1}return!0}var Xw={debugApi:{subject:`Live data`,since:`12.0`},injectorProviders:{subject:`Reading providers and environment injectors`,since:`16.2`},injectorMetadata:{subject:`The full injector tree`,since:`17.0`},isSignal:{subject:`Telling signals apart in component values`,since:`17.1`},signalGraph:{subject:`The live signal graph`,since:`20.1`},deferBlocks:{subject:`Listing @defer blocks`,since:`19.1`},forBlocks:{subject:`Listing @for blocks`,since:`22.0`},profiler:{subject:`Recording change detection`,since:`20.0`},angularProfiling:{subject:`Angular profiling`,since:`20.0`},routerInstance:{subject:`The router debug util`,since:`20.3`}};function Zw(e){let t=/^(\d+)\.(\d+)/.exec(e.trim());return t?`${t[1]}.${t[2]}`:e.trim()}function Qw(e){let t=/^(\d+)(?:\.(\d+))?/.exec(e.trim());return t?[Number(t[1]),Number(t[2]??0)]:null}function $w(e,t){let n=Qw(e),r=Qw(t);return!n||!r?!1:n[0]===r[0]?n[1]>=r[1]:n[0]>r[0]}function eT(e,t){return e?.capabilities?.[t]===!1}function tT(e,t){let n=Xw[e],r=`${n.subject} needs Angular ${n.since} or later`;if(!t)return`${r}; this page's Angular version is unknown.`;let i=Zw(t);return $w(t,n.since)?`${r} in a development build; this page runs Angular ${i} without it, which usually means a production build.`:`${r}; this page runs Angular ${i}.`}function nT(e){return e.hydration===`hydrated`&&e.hydratedAt===void 0?`hydrated before inspection`:e.hydration}var rT=/^on (viewport|interaction|hover)\b/;function iT(e){let t=e.filter(e=>!/^(prefetch|hydrate) /.test(e));return t.length>0&&t.every(e=>rT.test(e))}function aT(e,t){let n=[],r=e.since>0?Math.max(0,Math.round((t-e.since)/1e3)):0;return e.state===`error`&&n.push({kind:`failed`,text:`failed to load`,label:`failed`}),(e.state===`placeholder`||e.state===`initial`)&&r*1e3>=1e4&&n.push(iT(e.triggers)?{kind:`waiting`,text:`waiting for its trigger for ${r}s`,label:`waiting ${r}s`,seconds:r}:{kind:`stuck`,text:`on its placeholder for ${r}s`,label:`stuck ${r}s`,seconds:r}),e.hydrateNever?n.push({kind:`hydrate-never`,text:`hydrate never: the server HTML stays static`,label:`hydrate never`}):e.hydration===`dehydrated`&&n.push({kind:`dehydrated`,text:`still dehydrated`,label:`dehydrated`}),n}var oT=`pangular-page-id`,sT=null;function cT(e){sT=e}function lT(){if(sT)return sT;try{return new URLSearchParams(location.search).get(`pageId`)||(window.top===window?null:sessionStorage.getItem(oT)||null)}catch{return null}}function uT(e,t){if(t.chosen&&e[t.chosen])return t.chosen;if(t.host)return t.host;if(t.previous&&e[t.previous])return t.previous;let n=null;for(let t of Object.values(e))(!n||t.reportedAt>n.reportedAt)&&(n=t);return n?.pageId??null}function dT(e,t){return e?t?e.pages?.[t]??null:e:null}function fT(e,t){return e?t?e.pages?.[t]??null:e.graph??null:null}function pT(){return{functions:[...Vw]}}function mT(e,t,n){return e?e.scope(`pangular`).rpc.call(t,...n===void 0?[]:[n]):Promise.resolve(null)}function hT(e,t,n){return mT(e,t,n).then(e=>e,()=>null)}function gT(e){return e?.connectionMeta.backend===`static`}function _T(e){let t=()=>{let t=e()?.scope(`pangular`).rpc;t&&(t.callEvent(`request-page-highlight`,null),t.callEvent(`request-form-highlight`,null))};return addEventListener(`pagehide`,t),()=>{removeEventListener(`pagehide`,t),t()}}function vT(e=globalThis){delete e.__DEVFRAME_CONNECTION__,delete e.__DEVFRAME_CONNECTION_META__}function yT(e){return e.split(`@`)[1]??``}var bT={signal:`Signal Forms`,reactive:`Reactive`,template:`Template-driven`},xT={own:`validator`,directive:`template attribute`,tree:`cross-field rule`,async:`async`,parse:`parse`,submission:`server`,schema:`schema`,manual:`setErrors`},ST=hT,CT={key:`name looks secret`,"input-type":`password input`,autocomplete:`autocomplete is a secret kind`,marker:`marked as mask`,parent:`inside a secret group`,config:`listed in mask`};function wT(e){return CT[e]??e}var TT=`https://pangular-inspector.dev/security/#opt-fields-in-or-out`;async function ET(e,t){return await ST(e,`request-form-action`,t)??{ok:!1,error:`The devtools server did not answer.`}}function DT(e){return`${e.ok?e.message??`Done.`:e.error??`Failed.`}${e.skipped?.length?` Skipped: ${e.skipped.map(e=>`${e.path} (${e.reason})`).join(`, `)}.`:``}${e.status?` Status: ${e.status}.`:``}`}var OT=/"(?:[^"\\\n]|\\.)*"|`([^`\n]*)`|\*\*/g;function kT(e){return(e??``).replace(/^_Labels, paths.*_\n\n/,``).replace(OT,(e,t)=>t??(e===`**`?``:e))}function AT(e,t){let n=Math.max(0,e-t),r=Math.ceil(n/6e4);if(r<60)return`in ${r} min`;let i=Math.round(r/60);return i<48?`in ${i} ${i===1?`hour`:`hours`}`:`in ${Math.round(i/24)} days`}function jT(e,t){return e.length?e.join(`, `):t}function MT(e,t){let n=[];if(n.push({label:`One-time code`,value:e.auth?e.oneTimeCode.state===`locked`?`Locked after too many wrong codes: run pangular token --rotate or restart the server for a new code`:e.oneTimeCode.expiresAt?`On, current code expires ${AT(e.oneTimeCode.expiresAt,t)}`:`On`:`Off: every client is trusted`}),e.auth){let{count:r,nextExpiresAt:i,lastExpiresAt:a}=e.tokens;n.push({label:`Trusted clients`,value:r?r===1||i===a?`${r} ${r===1?`token`:`tokens`}, expires ${AT(i??t,t)}`:`${r} tokens, the first expires ${AT(i??t,t)}, the last ${AT(a??t,t)}`:`None`}),e.pairingTokens&&n.push({label:`Pairing tokens`,value:`${e.pairingTokens} accepted instead of the code`})}return e.reported?(n.push({label:`Reach`,value:e.network?`This machine and other machines`:`This machine only`}),n.push({label:`Allowed origins`,value:e.originCheck?`${jT(e.allowedOrigins,`This machine and the Chrome extension`)}${e.customOrigins?`, plus a custom origin check`:``}`:`Any: the origin check is off`}),(e.allowedHosts===`any`||e.allowedHosts.length)&&n.push({label:`Allowed hosts`,value:e.allowedHosts===`any`?`Any`:e.allowedHosts.join(`, `)}),n):n}function NT(e){return zw(e?.connectionMeta)}function PT(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)?[...e]:void 0}function FT(e,t){if(!t||typeof t!=`object`)return e;let n=PT(t.secretNames),r=PT(t.unmask);if(!n||!r)return e;let i=Cw(t.entropy);return{...e,redaction:i?{secretNames:n,unmask:r,entropy:i}:{secretNames:n,unmask:r}}}function IT(e,t){return NT(e).actions[t]}var LT={components:`components`,routes:`router`,signals:`signals`,injectors:`injectors`,store:`ngrx`,queries:`tanstackQuery`,forms:`forms`,pipes:`pipes`,network:`http`,analog:`analog`,capacitor:`capacitor`,errors:`errors`,plugins:`plugins`,performance:`performance`,build:`build`};function RT(e){return LT[e]}var zT=`https://pangular-inspector.dev/getting-started/configuration/#inspectors-and-agent-tools`;function BT(e,t){let n=LT[e];return!n||t.inspectors[n]}function VT(e,t){e&1&&(w(),pg(0,`rect`,5)(1,`rect`,6)(2,`rect`,7)(3,`rect`,8))}function HT(e,t){e&1&&(w(),pg(0,`path`,9)(1,`circle`,10)(2,`circle`,11)(3,`path`,12))}function UT(e,t){e&1&&(w(),pg(0,`path`,13)(1,`path`,14))}function WT(e,t){e&1&&(w(),pg(0,`path`,15)(1,`path`,16)(2,`path`,17))}function GT(e,t){e&1&&(w(),pg(0,`circle`,18)(1,`path`,19)(2,`circle`,20))}function KT(e,t){e&1&&(w(),pg(0,`path`,1))}function qT(e,t){e&1&&(w(),pg(0,`path`,21)(1,`path`,22)(2,`path`,23)(3,`path`,24))}function JT(e,t){e&1&&(w(),pg(0,`ellipse`,25)(1,`path`,26)(2,`path`,27))}function YT(e,t){e&1&&(w(),pg(0,`rect`,28)(1,`path`,29)(2,`path`,30)(3,`path`,31))}function XT(e,t){e&1&&(w(),pg(0,`circle`,32)(1,`path`,9)(2,`path`,33))}function ZT(e,t){e&1&&(w(),pg(0,`path`,34)(1,`path`,35)(2,`path`,36)(3,`path`,37)(4,`circle`,38))}function QT(e,t){e&1&&(w(),pg(0,`circle`,39)(1,`path`,40))}function $T(e,t){e&1&&(w(),pg(0,`ellipse`,41)(1,`path`,42)(2,`path`,43)(3,`path`,44)(4,`path`,45))}function eE(e,t){e&1&&(w(),pg(0,`circle`,32)(1,`path`,46)(2,`path`,47))}function tE(e,t){e&1&&(w(),pg(0,`path`,48)(1,`path`,49))}function nE(e,t){e&1&&(w(),pg(0,`path`,50)(1,`path`,51)(2,`path`,52))}function rE(e,t){e&1&&(w(),pg(0,`path`,2))}function iE(e,t){e&1&&(w(),pg(0,`path`,3))}function aE(e,t){e&1&&(w(),pg(0,`path`,4))}var oE=class e{name=$.required();static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-tab-icon`]],inputs:{name:[1,`name`]},decls:20,vars:1,consts:[[`viewBox`,`0 0 24 24`,`width`,`16`,`height`,`16`,`fill`,`none`,`stroke`,`currentColor`,`stroke-width`,`1.8`,`stroke-linecap`,`round`,`stroke-linejoin`,`round`,`aria-hidden`,`true`],[`d`,`M22 12h-4l-3 9L9 3l-3 9H2`],[`d`,`M10 3h4v3a2 2 0 1 0 4 0V5h1a2 2 0 0 1 2 2v4h-2a2 2 0 1 0 0 4h2v4a2 2 0 0 1-2 2h-4v-2a2 2 0 1 0-4 0v2H7a2 2 0 0 1-2-2v-4H4a2 2 0 1 1 0-4h1V7a2 2 0 0 1 2-2h3Z`],[`d`,`m8 3 4 8 5-5 5 15H2L8 3z`],[`fill`,`currentColor`,`stroke`,`none`,`transform`,`translate(1.8 1.8) scale(0.85)`,`d`,`M24 3.7l-5.766 5.766 5.725 5.736-3.713 3.712L5.073 3.742 8.786.03l5.736 5.726L20.284 0 24 3.7zM.029 8.785l3.713-3.713 15.173 15.173-3.713 3.714-5.732-5.726L3.7 24 0 20.285l5.754-5.764L.029 8.785z`],[`x`,`3`,`y`,`3`,`width`,`7`,`height`,`9`,`rx`,`1.5`],[`x`,`14`,`y`,`3`,`width`,`7`,`height`,`5`,`rx`,`1.5`],[`x`,`14`,`y`,`12`,`width`,`7`,`height`,`9`,`rx`,`1.5`],[`x`,`3`,`y`,`16`,`width`,`7`,`height`,`5`,`rx`,`1.5`],[`d`,`M3 12h18`],[`cx`,`7`,`cy`,`12`,`r`,`2`],[`cx`,`14`,`cy`,`12`,`r`,`2`],[`d`,`M18 7v10`],[`d`,`M9 11l2 2 4-4`],[`d`,`M12 3 4 6v6c0 4.5 3.4 8.3 8 9 4.6-.7 8-4.5 8-9V6l-8-3Z`],[`d`,`M12 2 3 7l9 5 9-5-9-5Z`],[`d`,`m3 12 9 5 9-5`],[`d`,`m3 17 9 5 9-5`],[`cx`,`6`,`cy`,`19`,`r`,`3`],[`d`,`M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15`],[`cx`,`18`,`cy`,`5`,`r`,`3`],[`d`,`M12 22v-5`],[`d`,`M9 8V2`],[`d`,`M15 8V2`],[`d`,`M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8Z`],[`cx`,`12`,`cy`,`5`,`rx`,`9`,`ry`,`3`],[`d`,`M3 5v14a9 3 0 0 0 18 0V5`],[`d`,`M3 12a9 3 0 0 0 18 0`],[`x`,`3`,`y`,`4`,`width`,`18`,`height`,`16`,`rx`,`2`],[`d`,`M7 9h10`],[`d`,`M7 13h6`],[`d`,`M7 17h8`],[`cx`,`12`,`cy`,`12`,`r`,`9`],[`d`,`M12 3a14 14 0 0 1 0 18a14 14 0 0 1 0-18Z`],[`d`,`M4 7h10`],[`d`,`M4 17h6`],[`d`,`m14 13 4 4-4 4`],[`d`,`M10 17h8`],[`cx`,`18`,`cy`,`7`,`r`,`3`],[`cx`,`12`,`cy`,`12`,`r`,`3`],[`d`,`M19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1.1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1.1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3H9a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8V9a1.7 1.7 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1Z`],[`cx`,`11`,`cy`,`5`,`rx`,`8`,`ry`,`3`],[`d`,`M3 5v6c0 1.66 3.58 3 8 3`],[`d`,`M3 11v6c0 1.66 3.58 3 8 3`],[`d`,`M21 14a4 4 0 1 1-1.2-2.85L21 12.3`],[`d`,`M21 9v3.3h-3.3`],[`d`,`M12 7v6`],[`d`,`M12 16.5v.01`],[`d`,`M12 14l4-4`],[`d`,`M3.34 19a10 10 0 1 1 17.32 0`],[`d`,`M21 16V8l-9-5-9 5v8l9 5 9-5Z`],[`d`,`m3.3 7 8.7 5 8.7-5`],[`d`,`M12 22V12`]],template:function(e,t){if(e&1&&(w(),R(0,`svg`,0),A(1,VT,4,0)(2,HT,4,0)(3,UT,2,0)(4,WT,3,0)(5,GT,3,0)(6,KT,1,0,`:svg:path`,1)(7,qT,4,0)(8,JT,3,0)(9,YT,4,0)(10,XT,3,0)(11,ZT,5,0)(12,QT,2,0)(13,$T,5,0)(14,eE,3,0)(15,tE,2,0)(16,nE,3,0)(17,rE,1,0,`:svg:path`,2)(18,iE,1,0,`:svg:path`,3)(19,aE,1,0,`:svg:path`,4),z()),e&2){let e;D(),j((e=t.name())===`dashboard`?1:e===`timeline`?2:e===`audit`?3:e===`components`?4:e===`routes`?5:e===`signals`?6:e===`injectors`?7:e===`store`?8:e===`forms`?9:e===`network`?10:e===`pipes`?11:e===`settings`?12:e===`queries`?13:e===`errors`?14:e===`performance`?15:e===`build`?16:e===`plugins`?17:e===`analog`?18:e===`capacitor`?19:-1)}},styles:[`[_nghost-%COMP%] { display: inline-flex; flex-shrink: 0; -}`]})},cE=(e,t)=>t.tab,lE=(e,t)=>t.label;function uE(e,t){e&1&&K(0),e&2&&J(` `,W().meta()?.projectName,` `)}function dE(e,t){e&1&&K(0,` Project details unavailable `)}function fE(e,t){e&1&&K(0,` Loading… `)}function pE(e,t){e&1&&(K(0,` Run `),F(1,`code`),K(2,`pangular build`),I(),K(3,` again to rebuild the report. `))}function mE(e,t){e&1&&K(0,` Check that the dev server is running. `)}function hE(e,t){if(e&1){let e=B();F(0,`button`,13),H(`click`,function(){return S(e),C(W(2).loadMeta())}),K(1,`Try again`),I()}}function gE(e,t){if(e&1&&(F(0,`p`,11),A(1,pE,4,0)(2,mE,1,0),I(),A(3,hE,2,0,`button`,12)),e&2){let e=W();D(),j(e.staticReport()?1:2),D(2),j(e.staticReport()?-1:3)}}function _E(e,t){e&1&&(F(0,`li`,5)(1,`span`),K(2,`Analog`),I(),K(3),I()),e&2&&(D(3),q(t))}function vE(e,t){e&1&&(F(0,`li`)(1,`span`),K(2,`Change detection`),I(),K(3),I()),e&2&&(D(3),q(t))}function yE(e,t){if(e&1&&(F(0,`span`,20),K(1),I(),F(2,`span`,21),K(3),I()),e&2){let e=W().$implicit,t=W();D(),q(t.cards()[e.tab]?.value),D(2),q(t.cards()[e.tab]?.sub)}}function bE(e,t){e&1&&(F(0,`span`,22),K(1,`–`),I(),F(2,`span`,21),K(3,`Count unavailable`),I())}function xE(e,t){e&1&&(L(0,`span`,23),F(1,`span`,21),K(2,`Counting…`),I())}function SE(e,t){if(e&1){let e=B();F(0,`button`,14),H(`click`,function(){let t=S(e).$implicit;return C(W().navigate.emit(t.tab))}),F(1,`span`,15)(2,`span`,16),L(3,`app-tab-icon`,17),I(),F(4,`span`,18),K(5,`→`),I()(),F(6,`span`,19),K(7),I(),A(8,yE,4,2)(9,bE,4,0)(10,xE,3,0),I()}if(e&2){let e,n=t.$implicit,r=t.$index,i=W().stateOf(n.tab);n_(`animation-delay`,60*r,`ms`),k(`aria-busy`,i===`loading`),D(3),P(`name`,n.tab),D(4),q(n.label),D(),j((e=i)===`ready`?8:e===`error`?9:10)}}function CE(e,t){e&1&&(F(0,`p`),K(1,`Loading…`),I())}function wE(e,t){if(e&1&&(F(0,`div`)(1,`dt`),K(2),I(),F(3,`dd`),K(4),I()()),e&2){let e=t.$implicit;D(2),q(e.label),D(2),q(e.value)}}function TE(e,t){if(e&1&&(F(0,`dl`),M(1,wE,5,2,`div`,null,lE),I()),e&2){let e=W();D(),N(e.configItems())}}function EE(e,t){e&1&&(F(0,`p`),K(1,`Defaults`),I())}function DE(e,t){if(e&1&&(F(0,`div`)(1,`dt`),K(2),I(),F(3,`dd`),K(4),I()()),e&2){let e=t.$implicit;D(2),q(e.label),D(2),q(e.value)}}function OE(e,t){e&1&&(F(0,`section`,10)(1,`h2`,24),K(2,`Security`),I(),F(3,`dl`),M(4,DE,5,2,`div`,null,lE),I()()),e&2&&(D(4),N(t))}var kE=[{tab:`components`,label:`Components`},{tab:`routes`,label:`Routes`},{tab:`signals`,label:`Signals`},{tab:`injectors`,label:`Injectors`},{tab:`store`,label:`NgRx declarations`},{tab:`pipes`,label:`Pipes`},{tab:`forms`,label:`Forms`},{tab:`network`,label:`SSR & HTTP`}];function AE(e){return kE.filter(t=>VT(t.tab,e))}var jE={zoneless:`Zoneless`,zone:`zone.js`,"zone-unused":`Zoneless, zone.js loaded`};function ME(e){return e&&Object.hasOwn(jE,e)?jE[e]:null}var NE=new Set([`signal`,`computed`,`linkedSignal`,`effect`]),PE={action:[`action`,`actions`],reducer:[`reducer`,`reducers`],effect:[`effect`,`effects`],selector:[`selector`,`selectors`],feature:[`feature`,`features`],"store-setup":[`setup call`,`setup calls`],"signal-store":[`signal store`,`signal stores`],"signal-state":[`signal state`,`signal states`],"signal-method":[`signal method`,`signal methods`]};function FE(e,t,n){return`${e} ${e===1?t:n}`}function IE(e,t){for(let n of e??[])t(n),IE(n.children,t)}function LE(e){if(!e.some(e=>e.kind))return{value:e.length,sub:`discovered in source`};let t=e.filter(e=>e.kind===`directive`).length;return{value:e.length-t,sub:`components · ${FE(t,`directive`,`directives`)}`}}function RE(e){if(!e.some(e=>e.kind))return{value:e.length,sub:`route entries in source`};let t=e.filter(e=>e.kind===`redirect`).length;return{value:new Set(e.filter(e=>e.kind===`page`).map(e=>e.fullPath??e.path??``)).size,sub:`navigable paths · ${FE(t,`redirect`,`redirects`)}`}}function zE(e){let t=new Map;for(let n of e)n.kind&&t.set(n.kind,(t.get(n.kind)??0)+1);if(!t.size)return{value:e.length,sub:`declarations in source`};let n=[...t].sort((e,t)=>t[1]-e[1]).map(([e,t])=>{let[n,r]=PE[e]??[e,e];return FE(t,n,r)});return{value:e.length,sub:n.join(` · `)}}function BE(e,t){let n=e?.forms??[],r=t?n.filter(e=>bT(e.id)===t):n;if(!r.length)return{value:0,sub:`no forms on the page yet`};let i=r.filter(e=>e.root?.status===`INVALID`).length;return{value:r.length,sub:`${r.length===1?`form`:`forms`} · ${i} invalid`}}function VE(e){return e.cancelled||e.status===void 0?!1:e.status===0||e.status>=400}function HE(e,t){let n=e?.pages??[],r=t?n.find(e=>e.pageId===t)??null:n.reduce((e,t)=>!e||t.reportedAt>e.reportedAt?t:e,null),i=t&&!r?[]:e?.serverCalls??[],a=r?.initialUrl,o=[...a?i.filter(e=>!e.pageUrl||e.pageUrl===a):i,...r?.calls??[]];if(!o.length)return{value:0,sub:`no calls recorded yet`};let s=o.filter(VE).length;return{value:o.length,sub:`${o.length===1?`call`:`calls`} · ${s} failed`}}var UE=class e{rpc=$(null);navigate=lv();staticReport=X(()=>_T(this.rpc()));meta=T(null);security=T(null);redaction=T(null);config=X(()=>IT(PT(this.rpc()),this.redaction()));stats=X(()=>this.rpc()?AE(this.config()):[]);configItems=X(()=>qw(this.config()));metaState=T(`loading`);states=T({});rows=T({});injectorTree=T(null);signalGraph=T(null);formsState=T(null);httpState=T(null);pageId=uT();destroyRef=x(Ss);stopLive=[];zone=X(()=>ME(fT(this.injectorTree(),this.pageId)?.zone));liveInjectors=X(()=>{let e=fT(this.injectorTree(),this.pageId);if(!e?.roots?.length)return null;let t=0,n=0,r=e=>{t++,n+=e.providers?.length??0};return IE(e.roots,r),IE(e.environment,r),{injectors:t,providers:n}});liveSignals=X(()=>{let e=pT(this.signalGraph(),this.pageId);return e?.nodes?.length?e.nodes.filter(e=>NE.has(e.kind??``)).length:null});cards=X(()=>{let e=this.rows(),t={};if(e.components&&(t.components=LE(e.components)),e.routes&&(t.routes=RE(e.routes)),e.store&&(t.store=zE(e.store)),e.pipes){let n=e.pipes.filter(e=>e.builtin).length;t.pipes={value:e.pipes.length-n,sub:n?`custom pipes · ${n} built-in in use`:`custom pipes in source`}}let n=this.liveSignals();n===null?e.signals&&(t.signals={value:e.signals.length,sub:`signal declarations in source`}):t.signals={value:n,sub:e.signals?`live on the page · ${e.signals.length} declared in source`:`live on the page`};let r=this.liveInjectors();r?t.injectors={value:r.injectors,sub:`live injectors · ${FE(r.providers,`provider`,`providers`)}`}:e.injectors&&(t.injectors={value:e.injectors.filter(e=>e.type!==`injection`).length,sub:`provider declarations in source`});let i=this.formsState();i&&(t.forms=BE(i,this.pageId));let a=this.httpState();return a&&(t.network=HE(a,this.pageId)),t});loadMeta(e=this.rpc()){e&&(this.metaState.set(`loading`),e.scope(`pangular`).rpc.call(`build-meta`).then(t=>{this.rpc()===e&&(this.meta.set(t),this.metaState.set(`ready`))}).catch(()=>{this.rpc()===e&&this.metaState.set(`error`)}))}loadRedaction(e){this.redaction.set(null),!_T(e)&&hT(e,`redaction-config`).then(t=>{this.rpc()===e&&this.redaction.set(t)}).catch(()=>{})}loadSecurity(e){this.security.set(null),!_T(e)&&gT(e,`security-status`).then(t=>{this.rpc()===e&&t&&this.security.set(NT(t,Date.now()))})}constructor(){E(()=>{let e=this.rpc();if(!e)return;let t=e.scope(`pangular`);this.states.set({}),this.rows.set({}),this.formsState.set(null),this.httpState.set(null),this.loadMeta(e),this.loadRedaction(e),this.loadSecurity(e);let n=PT(e),r=e=>VT(e,n);r(`components`)&&this.load(t.rpc.call(`get-components`),`components`),r(`routes`)&&this.load(t.rpc.call(`get-routes`),`routes`),r(`signals`)&&this.load(t.rpc.call(`get-signals`),`signals`),r(`injectors`)&&this.load(t.rpc.call(`get-providers`),`injectors`),r(`store`)&&this.load(t.rpc.call(`get-ngrx-store`),`store`),r(`pipes`)&&this.load(t.rpc.call(`get-pipes`),`pipes`),this.watchLive(e,n)}),this.destroyRef.onDestroy(()=>this.unwatch())}stateOf(e){return(e===`signals`?this.liveSignals():e===`injectors`?this.liveInjectors():null)===null?this.states()[e]??`loading`:`ready`}load(e,t){let n=e=>this.states.update(n=>({...n,[t]:e}));e.then(e=>{this.rows.update(n=>({...n,[t]:Array.isArray(e)?e:[]})),n(`ready`)}).catch(()=>n(`error`))}async watchLive(e,t){this.unwatch();let n=e.scope(`pangular`).rpc,r=async(t,r,i)=>{let a=e=>i&&this.states.update(t=>({...t,[i]:e}));try{let i=await n.sharedState(t);if(this.destroyRef.destroyed||this.rpc()!==e)return;r(i.value()),a(`ready`),this.stopLive.push(i.on(`updated`,e=>r(e)))}catch{if(this.destroyRef.destroyed||this.rpc()!==e)return;r(null),a(`error`)}};await Promise.all([t.inspectors.injectors&&r(`injector-tree`,e=>this.injectorTree.set(e)),t.inspectors.signals&&r(`signal-graph`,e=>this.signalGraph.set(e)),VT(`forms`,t)&&r(`forms`,e=>this.formsState.set(e??{}),`forms`),VT(`network`,t)&&r(`http`,e=>this.httpState.set(e??{}),`network`)])}unwatch(){for(let e of this.stopLive.splice(0))e()}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-dashboard`]],inputs:{rpc:[1,`rpc`]},outputs:{navigate:`navigate`},decls:34,vars:15,consts:[[`aria-labelledby`,`project-title`,1,`project`],[1,`project-head`],[1,`eyebrow`],[`id`,`project-title`],[1,`chips`],[1,`analog`],[1,`grid`],[`type`,`button`,1,`stat`,3,`animation-delay`],[`aria-labelledby`,`config-title`,1,`config`],[`id`,`config-title`],[`aria-labelledby`,`security-title`,1,`config`],[1,`hint`],[`type`,`button`,1,`retry`],[`type`,`button`,1,`retry`,3,`click`],[`type`,`button`,1,`stat`,3,`click`],[1,`top`],[1,`icon`],[3,`name`],[`aria-hidden`,`true`,1,`go`],[1,`label`],[1,`big`],[1,`sub`],[1,`big`,`muted`],[`aria-hidden`,`true`,1,`big`,`skeleton`],[`id`,`security-title`]],template:function(e,t){if(e&1&&(F(0,`section`,0)(1,`div`,1)(2,`p`,2),K(3,`Project`),I(),F(4,`h2`,3),A(5,uE,1,1)(6,dE,1,0)(7,fE,1,0),I(),A(8,gE,4,2),I(),F(9,`ul`,4)(10,`li`)(11,`span`),K(12,`Angular`),I(),K(13),I(),F(14,`li`)(15,`span`),K(16,`TypeScript`),I(),K(17),I(),F(18,`li`)(19,`span`),K(20,`SSR`),I(),K(21),I(),A(22,_E,4,1,`li`,5),A(23,vE,4,1,`li`),I()(),F(24,`div`,6),M(25,SE,11,6,`button`,7,cE),I(),F(27,`section`,8)(28,`h2`,9),K(29,`Configuration`),I(),A(30,CE,2,0,`p`)(31,TE,3,0,`dl`)(32,EE,2,0,`p`),I(),A(33,OE,6,0,`section`,10)),e&2){let e,n,r,i;k(`aria-busy`,t.metaState()===`loading`),D(4),G(`muted`,t.metaState()!==`ready`),D(),j((e=t.metaState())===`ready`?5:e===`error`?6:7),D(3),j(t.metaState()===`error`?8:-1),D(),G(`pending`,t.metaState()===`loading`),D(4),q(t.meta()?.angularVersion??`…`),D(4),q(t.meta()?.typescript??`…`),D(4),q(t.meta()?t.meta()?.ssr?`On`:`Off`:`…`),D(),j((n=t.meta()?.analog)?22:-1,n),D(),j((r=t.zone())?23:-1,r),D(2),N(t.stats()),D(2),k(`aria-busy`,!t.rpc()),D(3),j(t.rpc()?t.configItems().length?31:32:30),D(3),j((i=t.security())?33:-1,i)}},dependencies:[sE],styles:[`[_nghost-%COMP%] { +}`]})},sE=(e,t)=>t.tab,cE=(e,t)=>t.label;function lE(e,t){e&1&&K(0),e&2&&J(` `,W().meta()?.projectName,` `)}function uE(e,t){e&1&&K(0,` Project details unavailable `)}function dE(e,t){e&1&&K(0,` Loading… `)}function fE(e,t){e&1&&(K(0,` Run `),F(1,`code`),K(2,`pangular build`),I(),K(3,` again to rebuild the report. `))}function pE(e,t){e&1&&K(0,` Check that the dev server is running. `)}function mE(e,t){if(e&1){let e=B();F(0,`button`,13),H(`click`,function(){return S(e),C(W(2).loadMeta())}),K(1,`Try again`),I()}}function hE(e,t){if(e&1&&(F(0,`p`,11),A(1,fE,4,0)(2,pE,1,0),I(),A(3,mE,2,0,`button`,12)),e&2){let e=W();D(),j(e.staticReport()?1:2),D(2),j(e.staticReport()?-1:3)}}function gE(e,t){e&1&&(F(0,`li`,5)(1,`span`),K(2,`Analog`),I(),K(3),I()),e&2&&(D(3),q(t))}function _E(e,t){e&1&&(F(0,`li`)(1,`span`),K(2,`Change detection`),I(),K(3),I()),e&2&&(D(3),q(t))}function vE(e,t){if(e&1&&(F(0,`span`,20),K(1),I(),F(2,`span`,21),K(3),I()),e&2){let e=W().$implicit,t=W();D(),q(t.cards()[e.tab]?.value),D(2),q(t.cards()[e.tab]?.sub)}}function yE(e,t){e&1&&(F(0,`span`,22),K(1,`–`),I(),F(2,`span`,21),K(3,`Count unavailable`),I())}function bE(e,t){e&1&&(L(0,`span`,23),F(1,`span`,21),K(2,`Counting…`),I())}function xE(e,t){if(e&1){let e=B();F(0,`button`,14),H(`click`,function(){let t=S(e).$implicit;return C(W().navigate.emit(t.tab))}),F(1,`span`,15)(2,`span`,16),L(3,`app-tab-icon`,17),I(),F(4,`span`,18),K(5,`→`),I()(),F(6,`span`,19),K(7),I(),A(8,vE,4,2)(9,yE,4,0)(10,bE,3,0),I()}if(e&2){let e,n=t.$implicit,r=t.$index,i=W().stateOf(n.tab);r_(`animation-delay`,60*r,`ms`),k(`aria-busy`,i===`loading`),D(3),P(`name`,n.tab),D(4),q(n.label),D(),j((e=i)===`ready`?8:e===`error`?9:10)}}function SE(e,t){e&1&&(F(0,`p`),K(1,`Loading…`),I())}function CE(e,t){if(e&1&&(F(0,`div`)(1,`dt`),K(2),I(),F(3,`dd`),K(4),I()()),e&2){let e=t.$implicit;D(2),q(e.label),D(2),q(e.value)}}function wE(e,t){if(e&1&&(F(0,`dl`),M(1,CE,5,2,`div`,null,cE),I()),e&2){let e=W();D(),N(e.configItems())}}function TE(e,t){e&1&&(F(0,`p`),K(1,`Defaults`),I())}function EE(e,t){if(e&1&&(F(0,`div`)(1,`dt`),K(2),I(),F(3,`dd`),K(4),I()()),e&2){let e=t.$implicit;D(2),q(e.label),D(2),q(e.value)}}function DE(e,t){e&1&&(F(0,`section`,10)(1,`h2`,24),K(2,`Security`),I(),F(3,`dl`),M(4,EE,5,2,`div`,null,cE),I()()),e&2&&(D(4),N(t))}var OE=[{tab:`components`,label:`Components`},{tab:`routes`,label:`Routes`},{tab:`signals`,label:`Signals`},{tab:`injectors`,label:`Injectors`},{tab:`store`,label:`NgRx declarations`},{tab:`pipes`,label:`Pipes`},{tab:`forms`,label:`Forms`},{tab:`network`,label:`SSR & HTTP`}];function kE(e){return OE.filter(t=>BT(t.tab,e))}var AE={zoneless:`Zoneless`,zone:`zone.js`,"zone-unused":`Zoneless, zone.js loaded`};function jE(e){return e&&Object.hasOwn(AE,e)?AE[e]:null}var ME=new Set([`signal`,`computed`,`linkedSignal`,`effect`]),NE={action:[`action`,`actions`],reducer:[`reducer`,`reducers`],effect:[`effect`,`effects`],selector:[`selector`,`selectors`],feature:[`feature`,`features`],"store-setup":[`setup call`,`setup calls`],"signal-store":[`signal store`,`signal stores`],"signal-state":[`signal state`,`signal states`],"signal-method":[`signal method`,`signal methods`]};function PE(e,t,n){return`${e} ${e===1?t:n}`}function FE(e,t){for(let n of e??[])t(n),FE(n.children,t)}function IE(e){if(!e.some(e=>e.kind))return{value:e.length,sub:`discovered in source`};let t=e.filter(e=>e.kind===`directive`).length;return{value:e.length-t,sub:`components · ${PE(t,`directive`,`directives`)}`}}function LE(e){if(!e.some(e=>e.kind))return{value:e.length,sub:`route entries in source`};let t=e.filter(e=>e.kind===`redirect`).length;return{value:new Set(e.filter(e=>e.kind===`page`).map(e=>e.fullPath??e.path??``)).size,sub:`navigable paths · ${PE(t,`redirect`,`redirects`)}`}}function RE(e){let t=new Map;for(let n of e)n.kind&&t.set(n.kind,(t.get(n.kind)??0)+1);if(!t.size)return{value:e.length,sub:`declarations in source`};let n=[...t].sort((e,t)=>t[1]-e[1]).map(([e,t])=>{let[n,r]=NE[e]??[e,e];return PE(t,n,r)});return{value:e.length,sub:n.join(` · `)}}function zE(e,t){let n=e?.forms??[],r=t?n.filter(e=>yT(e.id)===t):n;if(!r.length)return{value:0,sub:`no forms on the page yet`};let i=r.filter(e=>e.root?.status===`INVALID`).length;return{value:r.length,sub:`${r.length===1?`form`:`forms`} · ${i} invalid`}}function BE(e){return e.cancelled||e.status===void 0?!1:e.status===0||e.status>=400}function VE(e,t){let n=e?.pages??[],r=t?n.find(e=>e.pageId===t)??null:n.reduce((e,t)=>!e||t.reportedAt>e.reportedAt?t:e,null),i=t&&!r?[]:e?.serverCalls??[],a=r?.initialUrl,o=[...a?i.filter(e=>!e.pageUrl||e.pageUrl===a):i,...r?.calls??[]];if(!o.length)return{value:0,sub:`no calls recorded yet`};let s=o.filter(BE).length;return{value:o.length,sub:`${o.length===1?`call`:`calls`} · ${s} failed`}}var HE=class e{rpc=$(null);navigate=uv();staticReport=X(()=>gT(this.rpc()));meta=T(null);security=T(null);redaction=T(null);config=X(()=>FT(NT(this.rpc()),this.redaction()));stats=X(()=>this.rpc()?kE(this.config()):[]);configItems=X(()=>Kw(this.config()));metaState=T(`loading`);states=T({});rows=T({});injectorTree=T(null);signalGraph=T(null);formsState=T(null);httpState=T(null);pageId=lT();destroyRef=x(Cs);stopLive=[];zone=X(()=>jE(dT(this.injectorTree(),this.pageId)?.zone));liveInjectors=X(()=>{let e=dT(this.injectorTree(),this.pageId);if(!e?.roots?.length)return null;let t=0,n=0,r=e=>{t++,n+=e.providers?.length??0};return FE(e.roots,r),FE(e.environment,r),{injectors:t,providers:n}});liveSignals=X(()=>{let e=fT(this.signalGraph(),this.pageId);return e?.nodes?.length?e.nodes.filter(e=>ME.has(e.kind??``)).length:null});cards=X(()=>{let e=this.rows(),t={};if(e.components&&(t.components=IE(e.components)),e.routes&&(t.routes=LE(e.routes)),e.store&&(t.store=RE(e.store)),e.pipes){let n=e.pipes.filter(e=>e.builtin).length;t.pipes={value:e.pipes.length-n,sub:n?`custom pipes · ${n} built-in in use`:`custom pipes in source`}}let n=this.liveSignals();n===null?e.signals&&(t.signals={value:e.signals.length,sub:`signal declarations in source`}):t.signals={value:n,sub:e.signals?`live on the page · ${e.signals.length} declared in source`:`live on the page`};let r=this.liveInjectors();r?t.injectors={value:r.injectors,sub:`live injectors · ${PE(r.providers,`provider`,`providers`)}`}:e.injectors&&(t.injectors={value:e.injectors.filter(e=>e.type!==`injection`).length,sub:`provider declarations in source`});let i=this.formsState();i&&(t.forms=zE(i,this.pageId));let a=this.httpState();return a&&(t.network=VE(a,this.pageId)),t});loadMeta(e=this.rpc()){e&&(this.metaState.set(`loading`),e.scope(`pangular`).rpc.call(`build-meta`).then(t=>{this.rpc()===e&&(this.meta.set(t),this.metaState.set(`ready`))}).catch(()=>{this.rpc()===e&&this.metaState.set(`error`)}))}loadRedaction(e){this.redaction.set(null),!gT(e)&&mT(e,`redaction-config`).then(t=>{this.rpc()===e&&this.redaction.set(t)}).catch(()=>{})}loadSecurity(e){this.security.set(null),!gT(e)&&hT(e,`security-status`).then(t=>{this.rpc()===e&&t&&this.security.set(MT(t,Date.now()))})}constructor(){E(()=>{let e=this.rpc();if(!e)return;let t=e.scope(`pangular`);this.states.set({}),this.rows.set({}),this.formsState.set(null),this.httpState.set(null),this.loadMeta(e),this.loadRedaction(e),this.loadSecurity(e);let n=NT(e),r=e=>BT(e,n);r(`components`)&&this.load(t.rpc.call(`get-components`),`components`),r(`routes`)&&this.load(t.rpc.call(`get-routes`),`routes`),r(`signals`)&&this.load(t.rpc.call(`get-signals`),`signals`),r(`injectors`)&&this.load(t.rpc.call(`get-providers`),`injectors`),r(`store`)&&this.load(t.rpc.call(`get-ngrx-store`),`store`),r(`pipes`)&&this.load(t.rpc.call(`get-pipes`),`pipes`),this.watchLive(e,n)}),this.destroyRef.onDestroy(()=>this.unwatch())}stateOf(e){return(e===`signals`?this.liveSignals():e===`injectors`?this.liveInjectors():null)===null?this.states()[e]??`loading`:`ready`}load(e,t){let n=e=>this.states.update(n=>({...n,[t]:e}));e.then(e=>{this.rows.update(n=>({...n,[t]:Array.isArray(e)?e:[]})),n(`ready`)}).catch(()=>n(`error`))}async watchLive(e,t){this.unwatch();let n=e.scope(`pangular`).rpc,r=async(t,r,i)=>{let a=e=>i&&this.states.update(t=>({...t,[i]:e}));try{let i=await n.sharedState(t);if(this.destroyRef.destroyed||this.rpc()!==e)return;r(i.value()),a(`ready`),this.stopLive.push(i.on(`updated`,e=>r(e)))}catch{if(this.destroyRef.destroyed||this.rpc()!==e)return;r(null),a(`error`)}};await Promise.all([t.inspectors.injectors&&r(`injector-tree`,e=>this.injectorTree.set(e)),t.inspectors.signals&&r(`signal-graph`,e=>this.signalGraph.set(e)),BT(`forms`,t)&&r(`forms`,e=>this.formsState.set(e??{}),`forms`),BT(`network`,t)&&r(`http`,e=>this.httpState.set(e??{}),`network`)])}unwatch(){for(let e of this.stopLive.splice(0))e()}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-dashboard`]],inputs:{rpc:[1,`rpc`]},outputs:{navigate:`navigate`},decls:34,vars:15,consts:[[`aria-labelledby`,`project-title`,1,`project`],[1,`project-head`],[1,`eyebrow`],[`id`,`project-title`],[1,`chips`],[1,`analog`],[1,`grid`],[`type`,`button`,1,`stat`,3,`animation-delay`],[`aria-labelledby`,`config-title`,1,`config`],[`id`,`config-title`],[`aria-labelledby`,`security-title`,1,`config`],[1,`hint`],[`type`,`button`,1,`retry`],[`type`,`button`,1,`retry`,3,`click`],[`type`,`button`,1,`stat`,3,`click`],[1,`top`],[1,`icon`],[3,`name`],[`aria-hidden`,`true`,1,`go`],[1,`label`],[1,`big`],[1,`sub`],[1,`big`,`muted`],[`aria-hidden`,`true`,1,`big`,`skeleton`],[`id`,`security-title`]],template:function(e,t){if(e&1&&(F(0,`section`,0)(1,`div`,1)(2,`p`,2),K(3,`Project`),I(),F(4,`h2`,3),A(5,lE,1,1)(6,uE,1,0)(7,dE,1,0),I(),A(8,hE,4,2),I(),F(9,`ul`,4)(10,`li`)(11,`span`),K(12,`Angular`),I(),K(13),I(),F(14,`li`)(15,`span`),K(16,`TypeScript`),I(),K(17),I(),F(18,`li`)(19,`span`),K(20,`SSR`),I(),K(21),I(),A(22,gE,4,1,`li`,5),A(23,_E,4,1,`li`),I()(),F(24,`div`,6),M(25,xE,11,6,`button`,7,sE),I(),F(27,`section`,8)(28,`h2`,9),K(29,`Configuration`),I(),A(30,SE,2,0,`p`)(31,wE,3,0,`dl`)(32,TE,2,0,`p`),I(),A(33,DE,6,0,`section`,10)),e&2){let e,n,r,i;k(`aria-busy`,t.metaState()===`loading`),D(4),G(`muted`,t.metaState()!==`ready`),D(),j((e=t.metaState())===`ready`?5:e===`error`?6:7),D(3),j(t.metaState()===`error`?8:-1),D(),G(`pending`,t.metaState()===`loading`),D(4),q(t.meta()?.angularVersion??`…`),D(4),q(t.meta()?.typescript??`…`),D(4),q(t.meta()?t.meta()?.ssr?`On`:`Off`:`…`),D(),j((n=t.meta()?.analog)?22:-1,n),D(),j((r=t.zone())?23:-1,r),D(2),N(t.stats()),D(2),k(`aria-busy`,!t.rpc()),D(3),j(t.rpc()?t.configItems().length?31:32:30),D(3),j((i=t.security())?33:-1,i)}},dependencies:[oE],styles:[`[_nghost-%COMP%] { display: block; max-width: 1200px; } @@ -325,7 +325,7 @@ h2.muted[_ngcontent-%COMP%] { .skeleton[_ngcontent-%COMP%] { animation: none; } -}`]})},WE=`pangular:panel-action-result`,GE=6e3,KE=0;function qE(e=window){return e.location.protocol===`chrome-extension:`&&e.parent!==e}function JE(e,t=window){let n=`pa-${Date.now().toString(36)}-${++KE}`;return new Promise(r=>{let i=e=>{t.clearTimeout(o),t.removeEventListener(`message`,a),r(e)},a=({source:e,origin:r,data:a})=>{if(e!==t.parent||r!==t.location.origin)return;let o=a;if(o?.type!==WE||o.requestId!==n)return;let{opened:s,error:c}=a;i({ok:o.ok===!0,...s===`file`||s===`class`?{opened:s}:{},...typeof c==`string`?{error:c}:{}})},o=t.setTimeout(()=>i({ok:!1,error:`timeout`}),GE);t.addEventListener(`message`,a),t.parent.postMessage({...e,requestId:n},t.location.origin)})}var YE=class e{available=qE();reveal(e,t){return JE({type:`pangular:reveal-element`,pageId:e,id:t})}openSource(e,t,n){return JE({type:`pangular:open-source`,pageId:e,id:t,...n?{file:n.file,line:n.line}:{}})}static ɵfac=function(t){return new(t||e)};static ɵprov=kl({token:e,factory:e.ɵfac})};function XE(e){return new Date(e).toLocaleTimeString()}var ZE=/[ \t\n\r]/;function QE(e){let t=e.trim(),n;try{n=JSON.parse(t)}catch{return null}if(typeof n!=`object`||!n)return null;let r=``,i=0,a=()=>`\n${` `.repeat(i)}`;for(let e=0;et.name;function tD(e,t){e&1&&(R(0,`span`,11),K(1,`impure`),z())}function nD(e,t){e&1&&(R(0,`span`,11),K(1,`churning`),z())}function rD(e,t){e&1&&(R(0,`span`,11),K(1,`stale?`),z())}function iD(e,t){if(e&1&&(R(0,`span`,10),K(1),z()),e&2){let e=W(2).$implicit,t=W(3);D(),q(t.plural(e.calls,`call`))}}function aD(e,t){if(e&1){let e=B();R(0,`button`,7),U(`click`,function(){S(e);let t=W().$implicit;return C(W(3).showPipe.emit(t.name))}),R(1,`span`,8),K(2,`Show in Pipes:`),z(),R(3,`span`,9),K(4),z(),R(5,`span`,10),K(6),z(),A(7,tD,2,0,`span`,11),A(8,nD,2,0,`span`,11),A(9,rD,2,0,`span`,11),A(10,iD,2,1,`span`,10),z()}if(e&2){let e=W().$implicit;D(4),q(e.name),D(2),J(``,e.uses,`×`),D(),j(e.isPure?-1:7),D(),j(e.churn?8:-1),D(),j(e.stale?9:-1),D(),j(e.calls===void 0?-1:10)}}function oD(e,t){e&1&&(R(0,`span`,11),K(1,`impure`),z())}function sD(e,t){if(e&1&&(R(0,`span`,6)(1,`span`,9),K(2),z(),R(3,`span`,10),K(4),z(),A(5,oD,2,0,`span`,11),z()),e&2){let e=W().$implicit;D(2),q(e.name),D(2),J(``,e.uses,`×`),D(),j(e.isPure?-1:5)}}function cD(e,t){if(e&1&&(R(0,`li`),A(1,aD,11,6,`button`,5)(2,sD,6,3,`span`,6),z()),e&2){let e=W(3);D(),j(e.canShowPipes()?1:2)}}function lD(e,t){if(e&1&&(R(0,`ul`,3),M(1,cD,3,1,`li`,null,eD),z(),R(3,`p`,4),K(4,` Call counts cover every component that uses the pipe. Record calls in the Pipes tab to see them. `),z()),e&2){let e=W(2);D(),N(e.rows())}}function uD(e,t){e&1&&(R(0,`p`,2),K(1,`No pipe is in use in the rendered part of its template.`),z())}function dD(e,t){if(e&1&&(R(0,`div`,0)(1,`h3`),K(2,` Pipes in template `),R(3,`span`,1),K(4),z()(),A(5,lD,5,0)(6,uD,2,0,`p`,2),z()),e&2){let e=W();D(4),q(e.rows().length),D(),j(e.rows().length?5:6)}}function fD(e,t,n){let r=(t?e?.pages?.find(e=>e.pageId===t):void 0)?.pipes??e?.pipes??[],i=[];for(let e of r){let t=e.components.find(e=>e.name===n);t&&i.push({name:e.name,isPure:e.isPure,uses:t.count,...e.call?{calls:e.call.callCount}:{},churn:!!e.churn,stale:!!e.stale})}return i.sort((e,t)=>e.name.localeCompare(t.name))}var pD=class e{plural=$E;destroyRef=x(Ss);rpc=$(null);pageId=$(void 0);component=$.required();canShowPipes=$(!1);showPipe=lv();snapshot=T(void 0);loaded=T(!1);rows=X(()=>fD(this.snapshot(),this.pageId(),this.component()));unsubscribe;constructor(){E(()=>{let e=this.rpc();e&&this.subscribe(e)}),this.destroyRef.onDestroy(()=>this.unsubscribe?.())}async subscribe(e){try{let t=await e.scope(`pangular`).rpc.sharedState(`pipe-usage`);if(this.destroyRef.destroyed)return;let n=e=>{this.snapshot.set(e),this.loaded.set(!0)};n(t.value()),this.unsubscribe?.(),this.unsubscribe=t.on(`updated`,n)}catch{}}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-component-pipes`]],inputs:{rpc:[1,`rpc`],pageId:[1,`pageId`],component:[1,`component`],canShowPipes:[1,`canShowPipes`]},outputs:{showPipe:`showPipe`},decls:1,vars:1,consts:[[1,`block`],[1,`pill`],[1,`empty-line`],[1,`chips`],[1,`hint`],[`type`,`button`,1,`pipe`],[1,`pipe`],[`type`,`button`,1,`pipe`,3,`click`],[1,`sr-only`],[1,`mono`],[1,`note`],[1,`flag`,`warn`]],template:function(e,t){e&1&&A(0,dD,7,2,`div`,0),e&2&&j(t.loaded()?0:-1)},styles:[`[_nghost-%COMP%] { +}`]})},UE=`pangular:panel-action-result`,WE=6e3,GE=0;function KE(e=window){return e.location.protocol===`chrome-extension:`&&e.parent!==e}function qE(e,t=window){let n=`pa-${Date.now().toString(36)}-${++GE}`;return new Promise(r=>{let i=e=>{t.clearTimeout(o),t.removeEventListener(`message`,a),r(e)},a=({source:e,origin:r,data:a})=>{if(e!==t.parent||r!==t.location.origin)return;let o=a;if(o?.type!==UE||o.requestId!==n)return;let{opened:s,error:c}=a;i({ok:o.ok===!0,...s===`file`||s===`class`?{opened:s}:{},...typeof c==`string`?{error:c}:{}})},o=t.setTimeout(()=>i({ok:!1,error:`timeout`}),WE);t.addEventListener(`message`,a),t.parent.postMessage({...e,requestId:n},t.location.origin)})}var JE=class e{available=KE();reveal(e,t){return qE({type:`pangular:reveal-element`,pageId:e,id:t})}openSource(e,t,n){return qE({type:`pangular:open-source`,pageId:e,id:t,...n?{file:n.file,line:n.line}:{}})}static ɵfac=function(t){return new(t||e)};static ɵprov=Al({token:e,factory:e.ɵfac})};function YE(e){return new Date(e).toLocaleTimeString()}var XE=/[ \t\n\r]/;function ZE(e){let t=e.trim(),n;try{n=JSON.parse(t)}catch{return null}if(typeof n!=`object`||!n)return null;let r=``,i=0,a=()=>`\n${` `.repeat(i)}`;for(let e=0;et.name;function eD(e,t){e&1&&(R(0,`span`,11),K(1,`impure`),z())}function tD(e,t){e&1&&(R(0,`span`,11),K(1,`churning`),z())}function nD(e,t){e&1&&(R(0,`span`,11),K(1,`stale?`),z())}function rD(e,t){if(e&1&&(R(0,`span`,10),K(1),z()),e&2){let e=W(2).$implicit,t=W(3);D(),q(t.plural(e.calls,`call`))}}function iD(e,t){if(e&1){let e=B();R(0,`button`,7),U(`click`,function(){S(e);let t=W().$implicit;return C(W(3).showPipe.emit(t.name))}),R(1,`span`,8),K(2,`Show in Pipes:`),z(),R(3,`span`,9),K(4),z(),R(5,`span`,10),K(6),z(),A(7,eD,2,0,`span`,11),A(8,tD,2,0,`span`,11),A(9,nD,2,0,`span`,11),A(10,rD,2,1,`span`,10),z()}if(e&2){let e=W().$implicit;D(4),q(e.name),D(2),J(``,e.uses,`×`),D(),j(e.isPure?-1:7),D(),j(e.churn?8:-1),D(),j(e.stale?9:-1),D(),j(e.calls===void 0?-1:10)}}function aD(e,t){e&1&&(R(0,`span`,11),K(1,`impure`),z())}function oD(e,t){if(e&1&&(R(0,`span`,6)(1,`span`,9),K(2),z(),R(3,`span`,10),K(4),z(),A(5,aD,2,0,`span`,11),z()),e&2){let e=W().$implicit;D(2),q(e.name),D(2),J(``,e.uses,`×`),D(),j(e.isPure?-1:5)}}function sD(e,t){if(e&1&&(R(0,`li`),A(1,iD,11,6,`button`,5)(2,oD,6,3,`span`,6),z()),e&2){let e=W(3);D(),j(e.canShowPipes()?1:2)}}function cD(e,t){if(e&1&&(R(0,`ul`,3),M(1,sD,3,1,`li`,null,$E),z(),R(3,`p`,4),K(4,` Call counts cover every component that uses the pipe. Record calls in the Pipes tab to see them. `),z()),e&2){let e=W(2);D(),N(e.rows())}}function lD(e,t){e&1&&(R(0,`p`,2),K(1,`No pipe is in use in the rendered part of its template.`),z())}function uD(e,t){if(e&1&&(R(0,`div`,0)(1,`h3`),K(2,` Pipes in template `),R(3,`span`,1),K(4),z()(),A(5,cD,5,0)(6,lD,2,0,`p`,2),z()),e&2){let e=W();D(4),q(e.rows().length),D(),j(e.rows().length?5:6)}}function dD(e,t,n){let r=(t?e?.pages?.find(e=>e.pageId===t):void 0)?.pipes??e?.pipes??[],i=[];for(let e of r){let t=e.components.find(e=>e.name===n);t&&i.push({name:e.name,isPure:e.isPure,uses:t.count,...e.call?{calls:e.call.callCount}:{},churn:!!e.churn,stale:!!e.stale})}return i.sort((e,t)=>e.name.localeCompare(t.name))}var fD=class e{plural=QE;destroyRef=x(Cs);rpc=$(null);pageId=$(void 0);component=$.required();canShowPipes=$(!1);showPipe=uv();snapshot=T(void 0);loaded=T(!1);rows=X(()=>dD(this.snapshot(),this.pageId(),this.component()));unsubscribe;constructor(){E(()=>{let e=this.rpc();e&&this.subscribe(e)}),this.destroyRef.onDestroy(()=>this.unsubscribe?.())}async subscribe(e){try{let t=await e.scope(`pangular`).rpc.sharedState(`pipe-usage`);if(this.destroyRef.destroyed)return;let n=e=>{this.snapshot.set(e),this.loaded.set(!0)};n(t.value()),this.unsubscribe?.(),this.unsubscribe=t.on(`updated`,n)}catch{}}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-component-pipes`]],inputs:{rpc:[1,`rpc`],pageId:[1,`pageId`],component:[1,`component`],canShowPipes:[1,`canShowPipes`]},outputs:{showPipe:`showPipe`},decls:1,vars:1,consts:[[1,`block`],[1,`pill`],[1,`empty-line`],[1,`chips`],[1,`hint`],[`type`,`button`,1,`pipe`],[1,`pipe`],[`type`,`button`,1,`pipe`,3,`click`],[1,`sr-only`],[1,`mono`],[1,`note`],[1,`flag`,`warn`]],template:function(e,t){e&1&&A(0,uD,7,2,`div`,0),e&2&&j(t.loaded()?0:-1)},styles:[`[_nghost-%COMP%] { display: block; } @@ -436,7 +436,7 @@ button.pipe[_ngcontent-%COMP%]:focus-visible { button.pipe[_ngcontent-%COMP%] { transition: none; } -}`]})};function mD(e){let t=e?.pages;return t&&typeof t==`object`?t:{}}function hD(e){let t=x(Ss),n=T({}),r=null,i=null,a=async e=>{i?.(),i=null,r=e;try{let a=await e.scope(`pangular`).rpc.sharedState(`page-angular`);if(t.destroyed||r!==e)return;let o=e=>n.set(mD(e));o(a.value()),i=a.on(`updated`,o)}catch{r===e&&n.set({})}};return E(()=>{let t=e();t&&t!==r&&Z(()=>void a(t))}),t.onDestroy(()=>i?.()),n.asReadonly()}function gD(e,t){if(t)return e[t]??null;let n=null;for(let t of Object.values(e))(!n||t.reportedAt>n.reportedAt)&&(n=t);return n}var _D=[`*`];function vD(e,t){if(e&1&&(R(0,`div`,1)(1,`p`,2),K(2),z(),R(3,`p`,3),K(4),jg(5),R(6,`a`,4),K(7,`Supported versions`),z()()()),e&2){let e=W();G(`compact`,e.compact()),D(2),q(e.title()),D(2),J(` `,t,` `),D(2),V(`href`,e.docsUrl,Du)}}var yD=`https://pangular-inspector.dev/getting-started/installation/#supported-angular-versions`,bD=class e{page=$(null);capability=$.required();missing=$(!1,{transform:bv});compact=$(!1,{transform:bv});docsUrl=yD;text=X(()=>{let e=this.page();return!this.missing()&&!tT(e,this.capability())?null:nT(this.capability(),e?.version)});title=X(()=>{let e=this.page()?.version;return e?`Not available on Angular ${Qw(e)}`:`Not available on this page`});static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-angular-unavailable`]],inputs:{page:[1,`page`],capability:[1,`capability`],missing:[1,`missing`],compact:[1,`compact`]},ngContentSelectors:_D,decls:1,vars:1,consts:[[`role`,`status`,1,`unavailable`,3,`compact`],[`role`,`status`,1,`unavailable`],[1,`title`],[1,`hint`],[`target`,`_blank`,`rel`,`noopener noreferrer`,3,`href`]],template:function(e,t){if(e&1&&(Ag(),A(0,vD,8,5,`div`,0)),e&2){let e;j((e=t.text())?0:-1,e)}},styles:[`[_nghost-%COMP%] { +}`]})};function pD(e){let t=e?.pages;return t&&typeof t==`object`?t:{}}function mD(e){let t=x(Cs),n=T({}),r=null,i=null,a=async e=>{i?.(),i=null,r=e;try{let a=await e.scope(`pangular`).rpc.sharedState(`page-angular`);if(t.destroyed||r!==e)return;let o=e=>n.set(pD(e));o(a.value()),i=a.on(`updated`,o)}catch{r===e&&n.set({})}};return E(()=>{let t=e();t&&t!==r&&Z(()=>void a(t))}),t.onDestroy(()=>i?.()),n.asReadonly()}function hD(e,t){if(t)return e[t]??null;let n=null;for(let t of Object.values(e))(!n||t.reportedAt>n.reportedAt)&&(n=t);return n}var gD=[`*`];function _D(e,t){if(e&1&&(R(0,`div`,1)(1,`p`,2),K(2),z(),R(3,`p`,3),K(4),Mg(5),R(6,`a`,4),K(7,`Supported versions`),z()()()),e&2){let e=W();G(`compact`,e.compact()),D(2),q(e.title()),D(2),J(` `,t,` `),D(2),V(`href`,e.docsUrl,Ou)}}var vD=`https://pangular-inspector.dev/getting-started/installation/#supported-angular-versions`,yD=class e{page=$(null);capability=$.required();missing=$(!1,{transform:xv});compact=$(!1,{transform:xv});docsUrl=vD;text=X(()=>{let e=this.page();return!this.missing()&&!eT(e,this.capability())?null:tT(this.capability(),e?.version)});title=X(()=>{let e=this.page()?.version;return e?`Not available on Angular ${Zw(e)}`:`Not available on this page`});static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-angular-unavailable`]],inputs:{page:[1,`page`],capability:[1,`capability`],missing:[1,`missing`],compact:[1,`compact`]},ngContentSelectors:gD,decls:1,vars:1,consts:[[`role`,`status`,1,`unavailable`,3,`compact`],[`role`,`status`,1,`unavailable`],[1,`title`],[1,`hint`],[`target`,`_blank`,`rel`,`noopener noreferrer`,3,`href`]],template:function(e,t){if(e&1&&(jg(),A(0,_D,8,5,`div`,0)),e&2){let e;j((e=t.text())?0:-1,e)}},styles:[`[_nghost-%COMP%] { display: block; } @@ -483,7 +483,7 @@ a[_ngcontent-%COMP%] { a[_ngcontent-%COMP%]:focus-visible { outline: 2px solid var(--%NS%accent); outline-offset: 2px; -}`]})};function xD(e){return e?.platform===`angular-native`}function SD(e){return xD(e)||e?.platform===`nativescript`}function CD(e,t){let n=Object.values(e??{}).filter(xD);if(t&&n.some(e=>e.pageId===t))return t;let r=null;for(let e of n)(!r||e.reportedAt>r.reportedAt)&&(r=e);return r?.pageId??null}var wD=[`trigger`],TD=[`list`],ED=(e,t)=>t.value;function DD(e,t){if(e&1&&(R(0,`span`,4),K(1),z()),e&2){let e=W();D(),q(e.current().hint)}}function OD(e,t){if(e&1&&(R(0,`span`,15),K(1),z()),e&2){let e=W().$implicit;D(),q(e.hint)}}function kD(e,t){if(e&1){let e=B();R(0,`li`,11),U(`pointerenter`,function(){let t=S(e).$index;return C(W(2).active.set(t))})(`pointerdown`,function(e){return e.preventDefault()})(`click`,function(){let t=S(e).$index;return C(W(2).choose(t))}),w(),R(1,`svg`,12),fg(2,`path`,13),z(),fs(),R(3,`span`,14),K(4),z(),A(5,OD,2,1,`span`,15),z()}if(e&2){let e=t.$implicit,n=t.$index,r=W(2);G(`active`,n===r.active())(`selected`,e.value===r.value()),k(`id`,r.uid+`-opt-`+n)(`aria-selected`,e.value===r.value())(`aria-disabled`,e.disabled||null),D(4),q(e.label),D(),j(e.hint?5:-1)}}function AD(e,t){if(e&1&&(R(0,`li`,10),K(1),z()),e&2){let e=W(2);D(),q(e.emptyText())}}function jD(e,t){if(e&1&&(R(0,`ul`,8,1),Hh(`list-in`),U(`pointerdown`,function(e){return e.preventDefault()}),M(2,kD,6,9,`li`,9,ED,!1,AD,2,1,`li`,10),z()),e&2){let e=W();G(`up`,e.dropUp()),k(`id`,e.uid+`-list`)(`aria-labelledby`,e.labelledBy()||e.uid+`-trigger`),D(2),N(e.options())}}var MD=0,ND=class e{options=$.required();value=mv(null);placeholder=$(`Select…`);ariaLabel=$(``);labelledBy=$(``);describedBy=$(``);disabled=$(!1);emptyText=$(`Nothing to choose`);uid=`app-select-${++MD}`;open=T(!1);active=T(-1);dropUp=T(!1);current=X(()=>this.options().find(e=>e.value===this.value())??null);host=x(Ml);injector=x(bs);trigger=gv.required(`trigger`);list=gv(`list`);typed=``;typedAt=0;toggle(){this.open()?this.close():this.show()}choose(e){let t=this.options()[e];t&&!t.disabled&&(this.value.set(t.value),this.close(),this.trigger().nativeElement.focus())}onKey(e){let t=this.options(),n=this.open();switch(e.key){case`ArrowDown`:case`ArrowUp`:if(e.preventDefault(),!n){this.show();return}this.move(e.key===`ArrowDown`?1:-1);return;case`Home`:case`End`:if(!n)return;e.preventDefault(),this.setActive(e.key===`Home`?this.firstEnabled(0,1):this.firstEnabled(t.length-1,-1));return;case`Enter`:case` `:e.preventDefault(),n&&this.active()>=0?this.choose(this.active()):this.show();return;case`Escape`:if(!n)return;e.preventDefault(),e.stopPropagation(),this.close();return;case`Tab`:n&&this.close();return;default:e.key.length===1&&!e.metaKey&&!e.ctrlKey&&!e.altKey&&this.typeAhead(e.key)}}onBlur(e){let t=e.relatedTarget;t&&this.host.nativeElement.contains(t)||this.close()}onOutside(e){this.open()&&!this.host.nativeElement.contains(e.target)&&this.close()}show(){if(this.disabled())return;let e=this.host.nativeElement.getBoundingClientRect(),t=window.innerHeight-e.bottom;this.dropUp.set(t<220&&e.top>t);let n=this.options().findIndex(e=>e.value===this.value());this.open.set(!0),this.setActive(n>=0?n:this.firstEnabled(0,1))}close(){this.open.set(!1),this.active.set(-1)}move(e){let t=this.firstEnabled(this.active()+e,e);t>=0&&this.setActive(t)}firstEnabled(e,t){let n=this.options();for(let r=e;r>=0&&r{(this.list()?.nativeElement.querySelector(`#${this.uid}-opt-${e}`))?.scrollIntoView({block:`nearest`})},{injector:this.injector})}typeAhead(e){let t=performance.now();this.typed=t-this.typedAt>600?e.toLowerCase():this.typed+e.toLowerCase(),this.typedAt=t;let n=this.options().findIndex(e=>!e.disabled&&e.label.toLowerCase().startsWith(this.typed));n<0||(this.open()?this.setActive(n):this.value.set(this.options()[n].value))}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-select`]],viewQuery:function(e,t){e&1&&Ng(t.trigger,wD,5)(t.list,TD,5),e&2&&Pg(2)},hostAttrs:[1,`app-select`],hostVars:2,hostBindings:function(e,t){e&1&&H(`pointerdown`,function(e){return t.onOutside(e)},ku),e&2&&G(`open`,t.open())},inputs:{options:[1,`options`],value:[1,`value`],placeholder:[1,`placeholder`],ariaLabel:[1,`ariaLabel`],labelledBy:[1,`labelledBy`],describedBy:[1,`describedBy`],disabled:[1,`disabled`],emptyText:[1,`emptyText`]},outputs:{value:`valueChange`},decls:8,vars:13,consts:[[`trigger`,``],[`list`,``],[`type`,`button`,`role`,`combobox`,`aria-haspopup`,`listbox`,1,`trigger`,3,`click`,`keydown`,`blur`,`disabled`],[1,`value`],[1,`value-hint`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`chevron`],[`d`,`m6 9 6 6 6-6`],[`role`,`listbox`,`tabindex`,`-1`,1,`list`,3,`up`],[`role`,`listbox`,`tabindex`,`-1`,1,`list`,3,`pointerdown`],[`role`,`option`,3,`active`,`selected`],[`role`,`option`,`aria-disabled`,`true`,1,`empty`],[`role`,`option`,3,`pointerenter`,`pointerdown`,`click`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`check`],[`d`,`m5 12 5 5 9-10`],[1,`label`],[1,`hint`]],template:function(e,t){e&1&&(R(0,`button`,2,0),U(`click`,function(){return t.toggle()})(`keydown`,function(e){return t.onKey(e)})(`blur`,function(e){return t.onBlur(e)}),R(2,`span`,3),K(3),z(),A(4,DD,2,1,`span`,4),w(),R(5,`svg`,5),fg(6,`path`,6),z()(),A(7,jD,5,5,`ul`,7)),e&2&&(V(`disabled`,t.disabled()),k(`id`,t.uid+`-trigger`)(`aria-controls`,t.uid+`-list`)(`aria-expanded`,t.open())(`aria-label`,t.ariaLabel()||null)(`aria-labelledby`,t.labelledBy()||null)(`aria-describedby`,t.describedBy()||null)(`aria-activedescendant`,t.open()&&t.active()>=0?t.uid+`-opt-`+t.active():null),D(2),G(`placeholder`,!t.current()),D(),J(` `,t.current()?.label??t.placeholder(),` `),D(),j(t.current()?.hint?4:-1),D(3),j(t.open()?7:-1))},styles:[`[_nghost-%COMP%] { +}`]})};function bD(e){return e?.platform===`angular-native`}function xD(e){return bD(e)||e?.platform===`nativescript`}function SD(e,t){let n=Object.values(e??{}).filter(bD);if(t&&n.some(e=>e.pageId===t))return t;let r=null;for(let e of n)(!r||e.reportedAt>r.reportedAt)&&(r=e);return r?.pageId??null}var CD=[`trigger`],wD=[`list`],TD=(e,t)=>t.value;function ED(e,t){if(e&1&&(R(0,`span`,4),K(1),z()),e&2){let e=W();D(),q(e.current().hint)}}function DD(e,t){if(e&1&&(R(0,`span`,15),K(1),z()),e&2){let e=W().$implicit;D(),q(e.hint)}}function OD(e,t){if(e&1){let e=B();R(0,`li`,11),U(`pointerenter`,function(){let t=S(e).$index;return C(W(2).active.set(t))})(`pointerdown`,function(e){return e.preventDefault()})(`click`,function(){let t=S(e).$index;return C(W(2).choose(t))}),w(),R(1,`svg`,12),pg(2,`path`,13),z(),ps(),R(3,`span`,14),K(4),z(),A(5,DD,2,1,`span`,15),z()}if(e&2){let e=t.$implicit,n=t.$index,r=W(2);G(`active`,n===r.active())(`selected`,e.value===r.value()),k(`id`,r.uid+`-opt-`+n)(`aria-selected`,e.value===r.value())(`aria-disabled`,e.disabled||null),D(4),q(e.label),D(),j(e.hint?5:-1)}}function kD(e,t){if(e&1&&(R(0,`li`,10),K(1),z()),e&2){let e=W(2);D(),q(e.emptyText())}}function AD(e,t){if(e&1&&(R(0,`ul`,8,1),Uh(`list-in`),U(`pointerdown`,function(e){return e.preventDefault()}),M(2,OD,6,9,`li`,9,TD,!1,kD,2,1,`li`,10),z()),e&2){let e=W();G(`up`,e.dropUp()),k(`id`,e.uid+`-list`)(`aria-labelledby`,e.labelledBy()||e.uid+`-trigger`),D(2),N(e.options())}}var jD=0,MD=class e{options=$.required();value=hv(null);placeholder=$(`Select…`);ariaLabel=$(``);labelledBy=$(``);describedBy=$(``);disabled=$(!1);emptyText=$(`Nothing to choose`);uid=`app-select-${++jD}`;open=T(!1);active=T(-1);dropUp=T(!1);current=X(()=>this.options().find(e=>e.value===this.value())??null);host=x(Nl);injector=x(xs);trigger=_v.required(`trigger`);list=_v(`list`);typed=``;typedAt=0;toggle(){this.open()?this.close():this.show()}choose(e){let t=this.options()[e];t&&!t.disabled&&(this.value.set(t.value),this.close(),this.trigger().nativeElement.focus())}onKey(e){let t=this.options(),n=this.open();switch(e.key){case`ArrowDown`:case`ArrowUp`:if(e.preventDefault(),!n){this.show();return}this.move(e.key===`ArrowDown`?1:-1);return;case`Home`:case`End`:if(!n)return;e.preventDefault(),this.setActive(e.key===`Home`?this.firstEnabled(0,1):this.firstEnabled(t.length-1,-1));return;case`Enter`:case` `:e.preventDefault(),n&&this.active()>=0?this.choose(this.active()):this.show();return;case`Escape`:if(!n)return;e.preventDefault(),e.stopPropagation(),this.close();return;case`Tab`:n&&this.close();return;default:e.key.length===1&&!e.metaKey&&!e.ctrlKey&&!e.altKey&&this.typeAhead(e.key)}}onBlur(e){let t=e.relatedTarget;t&&this.host.nativeElement.contains(t)||this.close()}onOutside(e){this.open()&&!this.host.nativeElement.contains(e.target)&&this.close()}show(){if(this.disabled())return;let e=this.host.nativeElement.getBoundingClientRect(),t=window.innerHeight-e.bottom;this.dropUp.set(t<220&&e.top>t);let n=this.options().findIndex(e=>e.value===this.value());this.open.set(!0),this.setActive(n>=0?n:this.firstEnabled(0,1))}close(){this.open.set(!1),this.active.set(-1)}move(e){let t=this.firstEnabled(this.active()+e,e);t>=0&&this.setActive(t)}firstEnabled(e,t){let n=this.options();for(let r=e;r>=0&&r{(this.list()?.nativeElement.querySelector(`#${this.uid}-opt-${e}`))?.scrollIntoView({block:`nearest`})},{injector:this.injector})}typeAhead(e){let t=performance.now();this.typed=t-this.typedAt>600?e.toLowerCase():this.typed+e.toLowerCase(),this.typedAt=t;let n=this.options().findIndex(e=>!e.disabled&&e.label.toLowerCase().startsWith(this.typed));n<0||(this.open()?this.setActive(n):this.value.set(this.options()[n].value))}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-select`]],viewQuery:function(e,t){e&1&&Pg(t.trigger,CD,5)(t.list,wD,5),e&2&&Fg(2)},hostAttrs:[1,`app-select`],hostVars:2,hostBindings:function(e,t){e&1&&H(`pointerdown`,function(e){return t.onOutside(e)},Au),e&2&&G(`open`,t.open())},inputs:{options:[1,`options`],value:[1,`value`],placeholder:[1,`placeholder`],ariaLabel:[1,`ariaLabel`],labelledBy:[1,`labelledBy`],describedBy:[1,`describedBy`],disabled:[1,`disabled`],emptyText:[1,`emptyText`]},outputs:{value:`valueChange`},decls:8,vars:13,consts:[[`trigger`,``],[`list`,``],[`type`,`button`,`role`,`combobox`,`aria-haspopup`,`listbox`,1,`trigger`,3,`click`,`keydown`,`blur`,`disabled`],[1,`value`],[1,`value-hint`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`chevron`],[`d`,`m6 9 6 6 6-6`],[`role`,`listbox`,`tabindex`,`-1`,1,`list`,3,`up`],[`role`,`listbox`,`tabindex`,`-1`,1,`list`,3,`pointerdown`],[`role`,`option`,3,`active`,`selected`],[`role`,`option`,`aria-disabled`,`true`,1,`empty`],[`role`,`option`,3,`pointerenter`,`pointerdown`,`click`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`check`],[`d`,`m5 12 5 5 9-10`],[1,`label`],[1,`hint`]],template:function(e,t){e&1&&(R(0,`button`,2,0),U(`click`,function(){return t.toggle()})(`keydown`,function(e){return t.onKey(e)})(`blur`,function(e){return t.onBlur(e)}),R(2,`span`,3),K(3),z(),A(4,ED,2,1,`span`,4),w(),R(5,`svg`,5),pg(6,`path`,6),z()(),A(7,AD,5,5,`ul`,7)),e&2&&(V(`disabled`,t.disabled()),k(`id`,t.uid+`-trigger`)(`aria-controls`,t.uid+`-list`)(`aria-expanded`,t.open())(`aria-label`,t.ariaLabel()||null)(`aria-labelledby`,t.labelledBy()||null)(`aria-describedby`,t.describedBy()||null)(`aria-activedescendant`,t.open()&&t.active()>=0?t.uid+`-opt-`+t.active():null),D(2),G(`placeholder`,!t.current()),D(),J(` `,t.current()?.label??t.placeholder(),` `),D(),j(t.current()?.hint?4:-1),D(3),j(t.open()?7:-1))},styles:[`[_nghost-%COMP%] { position: relative; display: inline-flex; min-width: 0; @@ -678,7 +678,7 @@ li.selected[_ngcontent-%COMP%] .check[_ngcontent-%COMP%] { .chevron[_ngcontent-%COMP%] { transition: none; } -}`]})};function PD(e,t){let n=Jw(t);if(Yw(n))return{nodes:e,matches:0};let r=0,i=e=>e.flatMap(e=>{let t=Xw(e,n);t&&r++;let a=i(e.children);return t||a.length?[{...e,children:a}]:[]});return{nodes:i(e),matches:r}}function FD(e){return e.flatMap(e=>e.kind===`directive`?FD(e.children):[{...e,children:FD(e.children)}])}function ID(e){return(e.attributes?.length?e.attributes:e.directives??[e.name]).map(e=>`[${e}]`).join(` `)}var LD={hydrated:`Hydrated`,skipped:`Skipped`,mismatched:`Mismatch`,client:`Client`};function RD(e){return LD[e]}function zD(e,t,n,r=!1,i=0){let a=r?`${e}+`:`${e}`;if(n)return`${t} of ${r?`${e+i}+`:e+i}`;let o=i?` · ${i} directive ${i===1?`host`:`hosts`}`:``;return`${a} ${e===1&&!r?`instance`:`instances`}${o}`}function BD(e,t,n,r=!1,i=0){if(!n.trim())return``;if(!t)return`No components match.`;let a=e+i,o=r?`${a}+`:`${a}`,s=!r&&a===1;return`${t} of ${o} ${i?s?`row`:`rows`:s?`instance`:`instances`} match.`}function VD(e){let t=e?.components,n=e?.depth;return t&&n?`Showing the first ${t} component instances, and none nested more than ${n} elements deep. Others are not listed or searchable.`:t?`Showing the first ${t} component instances. Others are not listed or searchable.`:n?`Components nested more than ${n} elements deep are not listed or searchable.`:`The page has more components than the tree shows.`}function HD(e,t){let n=t?.detail?.id??null,r=t?.pageId??null;if(r!==e.pageId)return{pageId:r,selectedId:n,detailId:n,destroyed:null};let i=e.selectedId;return n&&n!==e.detailId&&n!==i&&(i=n),i&&t&&!t.truncated&&!UD(t.roots,i)?{pageId:r,selectedId:null,detailId:n,destroyed:i}:{pageId:r,selectedId:i,detailId:n,destroyed:null}}function UD(e,t){return e.some(e=>e.id===t||UD(e.children,t))}function WD(e,t,n){let r=e.indexOf(n);if(r<0)return null;for(let n=r+1;n=0;n--)if(t.has(e[n]))return e[n];return null}var GD=(e,t)=>t.key,KD=(e,t)=>t.id;function qD(e,t){e&1&&(R(0,`p`,2),K(1,` The HTML came from the server, but no component was hydrated, so the app rendered again on the client. Add `),R(2,`code`),K(3,`provideClientHydration()`),z(),K(4,` and use a development build to see each component's status. `),z())}function JD(e,t){if(e&1&&(R(0,`li`)(1,`span`,9),K(2),z(),K(3),z()),e&2){let e=t.$implicit;r_(`count count-`+e.key),D(2),q(e.value),D(),J(` `,e.label,` `)}}function YD(e,t){if(e&1&&(R(0,`span`,15),K(1,`Expected `),R(2,`code`),K(3),z()()),e&2){let e=W().$implicit;D(3),q(e.expected)}}function XD(e,t){if(e&1&&(R(0,`span`,15),K(1,`Found `),R(2,`code`),K(3),z()()),e&2){let e=W().$implicit;D(3),q(e.actual)}}function ZD(e,t){if(e&1){let e=B();R(0,`li`)(1,`button`,12),U(`click`,function(){let t=S(e).$implicit;return C(W(4).showNode.emit(t.id))})(`focus`,function(){let t=S(e).$implicit;return C(W(4).highlight.emit(t.id))})(`blur`,function(){return S(e),C(W(4).highlight.emit(null))})(`mouseenter`,function(){let t=S(e).$implicit;return C(W(4).highlight.emit(t.id))})(`mouseleave`,function(){return S(e),C(W(4).highlight.emit(null))}),R(2,`span`,13),K(3),z(),R(4,`span`,14),K(5),z(),A(6,YD,4,1,`span`,15),A(7,XD,4,1,`span`,15),z()()}if(e&2){let e=t.$implicit;D(3),q(e.name),D(2),J(`<`,e.tag,`>`),D(),j(e.expected?6:-1),D(),j(e.actual?7:-1)}}function QD(e,t){if(e&1&&(R(0,`h3`,10),K(1,`Mismatches`),z(),R(2,`ul`,11),M(3,ZD,8,4,`li`,null,KD),z()),e&2){let e=W(2);D(3),N(e.mismatches)}}function $D(e,t){if(e&1){let e=B();R(0,`div`,3)(1,`ul`,4),M(2,JD,4,4,`li`,5,GD),z(),R(4,`button`,6),U(`click`,function(){return S(e),C(W(2).toggleOverlay())}),w(),R(5,`svg`,7),fg(6,`rect`,8),z(),K(7,` Outline on page `),z()(),A(8,QD,5,0)}if(e&2){let e=W(),t=W();D(2),N(t.counts()),D(2),k(`aria-pressed`,t.overlayOn()),D(4),j(e.mismatches.length?8:-1)}}function eO(e,t){e&1&&A(0,qD,5,0,`p`,2)(1,$D,9,2),e&2&&j(+!!t.hydrated)}function tO(e,t){e&1&&(R(0,`p`,2),K(1,` This page was not rendered on the server, so there is nothing to hydrate. With server-side rendering and `),R(2,`code`),K(3,`provideClientHydration()`),z(),K(4,`, each component shows whether it was hydrated, skipped or mismatched. `),z())}var nO=class e{report=$(void 0);overlay=lv();showNode=lv();highlight=lv();overlayOn=Q(()=>this.report()?.overlay===!0);counts=X(()=>{let e=this.report()?.counts;return e?[{key:`hydrated`,label:`hydrated`,value:e.hydrated},{key:`skipped`,label:`skipped`,value:e.skipped},{key:`mismatched`,label:`mismatched`,value:e.mismatched},{key:`client`,label:`created on the client`,value:e.client},{key:`dehydratedBlocks`,label:e.dehydratedBlocks===1?`dehydrated @defer block`:`dehydrated @defer blocks`,value:e.dehydratedBlocks}]:[]});toggleOverlay(){let e=!this.overlayOn();this.overlayOn.set(e),this.overlay.emit(e)}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-hydration-section`]],inputs:{report:[1,`report`]},outputs:{overlay:`overlay`,showNode:`showNode`,highlight:`highlight`},decls:5,vars:1,consts:[[`aria-labelledby`,`ct-hydration-title`,1,`hydration`],[`id`,`ct-hydration-title`,1,`title`],[1,`empty`],[1,`summary`],[`aria-label`,`Hydration summary`,1,`counts`],[3,`class`],[`type`,`button`,1,`outline`,3,`click`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`],[`x`,`3`,`y`,`3`,`width`,`18`,`height`,`18`,`rx`,`2`,`stroke-dasharray`,`4 3`],[1,`num`],[1,`label`],[1,`mismatches`],[`type`,`button`,1,`mismatch`,3,`click`,`focus`,`blur`,`mouseenter`,`mouseleave`],[1,`name`,`mono`],[1,`mono`,`muted`],[1,`detail-line`]],template:function(e,t){if(e&1&&(R(0,`section`,0)(1,`h2`,1),K(2,`Hydration`),z(),A(3,eO,2,1)(4,tO,5,0,`p`,2),z()),e&2){let e;D(3),j((e=t.report())?3:4,e)}},styles:[`.hydration[_ngcontent-%COMP%] { +}`]})};function ND(e,t){let n=qw(t);if(Jw(n))return{nodes:e,matches:0};let r=0,i=e=>e.flatMap(e=>{let t=Yw(e,n);t&&r++;let a=i(e.children);return t||a.length?[{...e,children:a}]:[]});return{nodes:i(e),matches:r}}function PD(e){return e.flatMap(e=>e.kind===`directive`?PD(e.children):[{...e,children:PD(e.children)}])}function FD(e){return(e.attributes?.length?e.attributes:e.directives??[e.name]).map(e=>`[${e}]`).join(` `)}var ID={hydrated:`Hydrated`,skipped:`Skipped`,mismatched:`Mismatch`,client:`Client`};function LD(e){return ID[e]}function RD(e,t,n,r=!1,i=0){let a=r?`${e}+`:`${e}`;if(n)return`${t} of ${r?`${e+i}+`:e+i}`;let o=i?` · ${i} directive ${i===1?`host`:`hosts`}`:``;return`${a} ${e===1&&!r?`instance`:`instances`}${o}`}function zD(e,t,n,r=!1,i=0){if(!n.trim())return``;if(!t)return`No components match.`;let a=e+i,o=r?`${a}+`:`${a}`,s=!r&&a===1;return`${t} of ${o} ${i?s?`row`:`rows`:s?`instance`:`instances`} match.`}function BD(e){let t=e?.components,n=e?.depth;return t&&n?`Showing the first ${t} component instances, and none nested more than ${n} elements deep. Others are not listed or searchable.`:t?`Showing the first ${t} component instances. Others are not listed or searchable.`:n?`Components nested more than ${n} elements deep are not listed or searchable.`:`The page has more components than the tree shows.`}function VD(e,t){let n=t?.detail?.id??null,r=t?.pageId??null;if(r!==e.pageId)return{pageId:r,selectedId:n,detailId:n,destroyed:null};let i=e.selectedId;return n&&n!==e.detailId&&n!==i&&(i=n),i&&t&&!t.truncated&&!HD(t.roots,i)?{pageId:r,selectedId:null,detailId:n,destroyed:i}:{pageId:r,selectedId:i,detailId:n,destroyed:null}}function HD(e,t){return e.some(e=>e.id===t||HD(e.children,t))}function UD(e,t,n){let r=e.indexOf(n);if(r<0)return null;for(let n=r+1;n=0;n--)if(t.has(e[n]))return e[n];return null}var WD=(e,t)=>t.key,GD=(e,t)=>t.id;function KD(e,t){e&1&&(R(0,`p`,2),K(1,` The HTML came from the server, but no component was hydrated, so the app rendered again on the client. Add `),R(2,`code`),K(3,`provideClientHydration()`),z(),K(4,` and use a development build to see each component's status. `),z())}function qD(e,t){if(e&1&&(R(0,`li`)(1,`span`,9),K(2),z(),K(3),z()),e&2){let e=t.$implicit;i_(`count count-`+e.key),D(2),q(e.value),D(),J(` `,e.label,` `)}}function JD(e,t){if(e&1&&(R(0,`span`,15),K(1,`Expected `),R(2,`code`),K(3),z()()),e&2){let e=W().$implicit;D(3),q(e.expected)}}function YD(e,t){if(e&1&&(R(0,`span`,15),K(1,`Found `),R(2,`code`),K(3),z()()),e&2){let e=W().$implicit;D(3),q(e.actual)}}function XD(e,t){if(e&1){let e=B();R(0,`li`)(1,`button`,12),U(`click`,function(){let t=S(e).$implicit;return C(W(4).showNode.emit(t.id))})(`focus`,function(){let t=S(e).$implicit;return C(W(4).highlight.emit(t.id))})(`blur`,function(){return S(e),C(W(4).highlight.emit(null))})(`mouseenter`,function(){let t=S(e).$implicit;return C(W(4).highlight.emit(t.id))})(`mouseleave`,function(){return S(e),C(W(4).highlight.emit(null))}),R(2,`span`,13),K(3),z(),R(4,`span`,14),K(5),z(),A(6,JD,4,1,`span`,15),A(7,YD,4,1,`span`,15),z()()}if(e&2){let e=t.$implicit;D(3),q(e.name),D(2),J(`<`,e.tag,`>`),D(),j(e.expected?6:-1),D(),j(e.actual?7:-1)}}function ZD(e,t){if(e&1&&(R(0,`h3`,10),K(1,`Mismatches`),z(),R(2,`ul`,11),M(3,XD,8,4,`li`,null,GD),z()),e&2){let e=W(2);D(3),N(e.mismatches)}}function QD(e,t){if(e&1){let e=B();R(0,`div`,3)(1,`ul`,4),M(2,qD,4,4,`li`,5,WD),z(),R(4,`button`,6),U(`click`,function(){return S(e),C(W(2).toggleOverlay())}),w(),R(5,`svg`,7),pg(6,`rect`,8),z(),K(7,` Outline on page `),z()(),A(8,ZD,5,0)}if(e&2){let e=W(),t=W();D(2),N(t.counts()),D(2),k(`aria-pressed`,t.overlayOn()),D(4),j(e.mismatches.length?8:-1)}}function $D(e,t){e&1&&A(0,KD,5,0,`p`,2)(1,QD,9,2),e&2&&j(+!!t.hydrated)}function eO(e,t){e&1&&(R(0,`p`,2),K(1,` This page was not rendered on the server, so there is nothing to hydrate. With server-side rendering and `),R(2,`code`),K(3,`provideClientHydration()`),z(),K(4,`, each component shows whether it was hydrated, skipped or mismatched. `),z())}var tO=class e{report=$(void 0);overlay=uv();showNode=uv();highlight=uv();overlayOn=Q(()=>this.report()?.overlay===!0);counts=X(()=>{let e=this.report()?.counts;return e?[{key:`hydrated`,label:`hydrated`,value:e.hydrated},{key:`skipped`,label:`skipped`,value:e.skipped},{key:`mismatched`,label:`mismatched`,value:e.mismatched},{key:`client`,label:`created on the client`,value:e.client},{key:`dehydratedBlocks`,label:e.dehydratedBlocks===1?`dehydrated @defer block`:`dehydrated @defer blocks`,value:e.dehydratedBlocks}]:[]});toggleOverlay(){let e=!this.overlayOn();this.overlayOn.set(e),this.overlay.emit(e)}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-hydration-section`]],inputs:{report:[1,`report`]},outputs:{overlay:`overlay`,showNode:`showNode`,highlight:`highlight`},decls:5,vars:1,consts:[[`aria-labelledby`,`ct-hydration-title`,1,`hydration`],[`id`,`ct-hydration-title`,1,`title`],[1,`empty`],[1,`summary`],[`aria-label`,`Hydration summary`,1,`counts`],[3,`class`],[`type`,`button`,1,`outline`,3,`click`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`],[`x`,`3`,`y`,`3`,`width`,`18`,`height`,`18`,`rx`,`2`,`stroke-dasharray`,`4 3`],[1,`num`],[1,`label`],[1,`mismatches`],[`type`,`button`,1,`mismatch`,3,`click`,`focus`,`blur`,`mouseenter`,`mouseleave`],[1,`name`,`mono`],[1,`mono`,`muted`],[1,`detail-line`]],template:function(e,t){if(e&1&&(R(0,`section`,0)(1,`h2`,1),K(2,`Hydration`),z(),A(3,$D,2,1)(4,eO,5,0,`p`,2),z()),e&2){let e;D(3),j((e=t.report())?3:4,e)}},styles:[`.hydration[_ngcontent-%COMP%] { margin-top: 16px; } @@ -849,7 +849,7 @@ svg[_ngcontent-%COMP%] { button[_ngcontent-%COMP%] { transition: none; } -}`]})};function rO(e,t){if(e&1&&(R(0,`p`,0),K(1),R(2,`code`),K(3),z(),K(4,` to keep more. `),R(5,`a`,1),K(6,`About limits`),z()()),e&2){let e=W();D(),k_(` Showing the latest `,e.max(),` `,e.what(),`. `,e.dropped(),` older `,e.dropped()===1?`entry was`:`entries were`,` dropped. Raise `),D(2),J(`limits.`,e.limit()),D(2),V(`href`,e.docsUrl,Du)}}var iO=`https://pangular-inspector.dev/getting-started/configuration/#limits`,aO=class e{dropped=$(0);max=$.required();what=$.required();limit=$.required();docsUrl=iO;static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-limit-note`]],inputs:{dropped:[1,`dropped`],max:[1,`max`],what:[1,`what`],limit:[1,`limit`]},decls:1,vars:1,consts:[[1,`note`],[`target`,`_blank`,`rel`,`noopener noreferrer`,3,`href`]],template:function(e,t){e&1&&A(0,rO,7,6,`p`,0),e&2&&j(t.dropped()>0?0:-1)},styles:[`[_nghost-%COMP%] { +}`]})};function nO(e,t){if(e&1&&(R(0,`p`,0),K(1),R(2,`code`),K(3),z(),K(4,` to keep more. `),R(5,`a`,1),K(6,`About limits`),z()()),e&2){let e=W();D(),A_(` Showing the latest `,e.max(),` `,e.what(),`. `,e.dropped(),` older `,e.dropped()===1?`entry was`:`entries were`,` dropped. Raise `),D(2),J(`limits.`,e.limit()),D(2),V(`href`,e.docsUrl,Ou)}}var rO=`https://pangular-inspector.dev/getting-started/configuration/#limits`,iO=class e{dropped=$(0);max=$.required();what=$.required();limit=$.required();docsUrl=rO;static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-limit-note`]],inputs:{dropped:[1,`dropped`],max:[1,`max`],what:[1,`what`],limit:[1,`limit`]},decls:1,vars:1,consts:[[1,`note`],[`target`,`_blank`,`rel`,`noopener noreferrer`,3,`href`]],template:function(e,t){e&1&&A(0,nO,7,6,`p`,0),e&2&&j(t.dropped()>0?0:-1)},styles:[`[_nghost-%COMP%] { display: block; } @@ -876,7 +876,7 @@ a[_ngcontent-%COMP%] { a[_ngcontent-%COMP%]:focus-visible { outline: 2px solid var(--%NS%accent); outline-offset: 2px; -}`]})},oO=1e3;function sO(e){return typeof e==`number`&&Number.isFinite(e)&&e>0&&e<=oO?e:16}var cO=864e13,lO=200,uO=300,dO=100,fO=10,pO=100,mO=2e3,hO=2e3,gO=4e3,_O=1e3,vO=100,yO=3,bO=50,xO={component:`c`,hook:`h`,afterRender:`r`,output:`o`},SO=Object.values(xO),CO=e=>!!e&&typeof e==`object`&&!Array.isArray(e),wO=e=>typeof e==`number`&&Number.isFinite(e)&&e>=0?e:0,TO=(e,t)=>typeof e==`string`?e.slice(0,t):``,EO=e=>wO(e)>0?wO(e):void 0,DO=(e,t)=>Array.isArray(e)?e.slice(0,t):[];function OO(e){if(!CO(e))return null;let t=TO(e.name,lO);return t?{name:t,checks:wO(e.checks),ms:wO(e.ms)}:null}function kO(e,t){if(!Array.isArray(e)||e.length!==5)return null;let[n,r,i,a,o]=e;return typeof n!=`number`||!Number.isInteger(n)||n<0||n>=t||typeof r!=`number`||!Number.isFinite(r)||Math.abs(r)>1e7||typeof a!=`number`||!Number.isInteger(a)||a<0||a>_O||typeof o!=`string`||!SO.includes(o)?null:[n,r,wO(i),a,o]}function AO(e,t,n){if(!CO(e)||typeof e.id!=`number`)return null;let r=DO(e.components,fO).map(OO).filter(e=>!!e),i=TO(e.trigger,uO),a=DO(e.spans,40).map(e=>kO(e,t)).filter(e=>!!e),o=Array.isArray(e.spans)?e.spans.length-40:0,s=Math.floor(wO(e.droppedSpans))+Math.max(0,o),c={t:typeof e.t==`number`?wO(e.t):void 0,hookMs:EO(e.hookMs),afterRenderMs:EO(e.afterRenderMs),outputMs:EO(e.outputMs)},l=PO(e.cause),u=EO(e.refreshed),d=EO(e.unchanged);return{id:wO(e.id),at:wO(e.at),ms:wO(e.ms),passes:wO(e.passes),...i?{trigger:i}:{},checks:wO(e.checks),components:r,...Object.fromEntries(Object.entries(c).filter(([,e])=>e!==void 0)),...a.length?{spans:a}:{},...s?{droppedSpans:s}:{},...l?{cause:l}:{},...u?{refreshed:u}:{},...d?{unchanged:d}:{},...wO(e.ms)>n?{slow:!0}:{}}}var jO=[`event`,`http`,`timer`,`signal`,`effect`,`markForCheck`,`input`,`view`,`tick`,`zone`,`unknown`],MO={event:`Event`,http:`HTTP response`,timer:`Timer`,signal:`Signal write`,effect:`Effect`,markForCheck:`markForCheck`,input:`setInput`,view:`View change`,tick:`ApplicationRef.tick`,zone:`zone.js only`,unknown:`Unknown`},NO=e=>typeof e==`string`&&jO.includes(e);function PO(e){if(!CO(e)||!NO(e.kind))return;let t=[`component`,`listener`,`event`,`target`,`signal`,`task`],n={kind:e.kind};NO(e.via)&&(n.via=e.via);for(let r of t){let t=TO(e[r],lO);t&&(n[r]=t)}e.zone===!0&&(n.zone=!0);let r=DO(e.stack,yO).map(e=>TO(e,uO)).filter(Boolean);r.length&&(n.stack=r);let i=Math.floor(wO(e.more));return i&&(n.more=i),n}function FO(e){if(!CO(e))return null;let t=TO(e.name,lO);if(!t)return null;let n=e.strategy;return{name:t,refreshed:Math.floor(wO(e.refreshed)),unchanged:Math.floor(wO(e.unchanged)),...n===`OnPush`||n===`Eager`?{strategy:n}:{}}}function IO(e){if(!CO(e))return null;let t=TO(e.name,lO),n=TO(e.input,lO);if(!t||!n)return null;let r=TO(e.parent,lO);return{name:t,input:n,...r?{parent:r}:{},inPlace:Math.floor(wO(e.inPlace)),sameContents:Math.floor(wO(e.sameContents))}}function LO(e){if(!CO(e))return null;let t=TO(e.name,lO);if(!t)return null;let n=DO(e.tasks,3).map(e=>TO(e,lO)).filter(Boolean);return{name:t,ticks:Math.floor(wO(e.ticks)),...n.length?{tasks:n}:{}}}function RO(e){if(!CO(e))return;let t={};if(CO(e.causes))for(let n of jO){let r=Math.floor(wO(e.causes[n]));r&&(t[n]=r)}let n=DO(e.components,pO).map(FO).filter(e=>!!e),r=DO(e.inputs,bO).map(IO).filter(e=>!!e),i=DO(e.zone,bO).map(LO).filter(e=>!!e),a=Math.floor(wO(e.major));return{triggers:e.triggers===!0,waste:e.waste===!0,...a&&a<1e3?{major:a}:{},causes:t,components:n,...r.length?{inputs:r}:{},...i.length?{zone:i}:{},...typeof e.zoneJs==`boolean`?{zoneJs:e.zoneJs}:{}}}function zO(e){let t=[],n=e.component?` in ${e.component}${e.listener?` (${e.listener})`:``}`:``;switch(e.kind){case`event`:t.push(`${e.event??`Template listener`}${e.target?` on ${e.target}`:``}${n}`);break;case`http`:t.push(`HTTP response${n}`);break;case`timer`:t.push(`${e.task??`Timer`}${n}`);break;case`zone`:t.push(`zone.js tick with no Angular notification${e.task?` after ${e.task}`:``}`);break;case`tick`:t.push(`ApplicationRef.tick()${n}`);break;default:t.push(`${MO[e.kind]}${n}`)}return e.signal?t.push(e.signal===`?`?`wrote an unnamed signal`:`wrote signal ${e.signal}`):e.via&&e.via!==e.kind&&t.push(`via ${MO[e.via]}`),e.zone&&e.kind!==`zone`&&t.push(`run by zone.js`),e.more&&t.push(`${e.more} more notification${e.more===1?``:`s`}`),t.join(`, `)}function BO(e){if(!e)return[];let t=[],n=(e.major??0)>=22;for(let r of e.components){if(r.refreshed<10)continue;let e=r.refreshed-r.unchanged;if(e/r.refreshed>.2)continue;let i=`refreshed ${r.refreshed} times and changed something in ${e}`;r.strategy===`Eager`?t.push({name:r.name,kind:`on-push`,text:n?`${r.name} was ${i}. It opts out of OnPush, which is the default from Angular 22: remove \`changeDetection: ChangeDetectionStrategy.Eager\` (or \`Default\`) so Angular skips it until an input, event, signal or markForCheck marks it.`:`${r.name} was ${i}. Add \`changeDetection: ChangeDetectionStrategy.OnPush\` so Angular skips it until an input, event, signal or markForCheck marks it.`}):r.strategy===`OnPush`&&t.push({name:r.name,kind:`already-on-push`,text:`${r.name} was ${i}, and it is already OnPush${n?` (the default from Angular 22)`:``}. Something keeps marking it: an input that gets a new reference each time, an event or output in it, markForCheck, or a signal it reads that is set to an equal value.`})}for(let n of e.inputs??[]){let e=n.parent?` set by ${n.parent}`:``;n.inPlace&&t.push({name:n.name,kind:`in-place`,text:`Input ${n.input} of ${n.name}${e} changed in place ${n.inPlace} time${n.inPlace===1?``:`s`}: same reference, different contents. OnPush components, computed and signal equality don't see that. Pass a new object or array instead of mutating it.`}),n.sameContents&&t.push({name:n.name,kind:`same-contents`,text:`Input ${n.input} of ${n.name}${e} got a new reference with the same contents ${n.sameContents} time${n.sameContents===1?``:`s`}, so Angular refreshed ${n.name} for nothing. Keep the reference when nothing changed, for example with a computed instead of a method call in the template.`})}for(let n of e.zone??[]){let e=n.tasks?.length?` (after ${n.tasks.join(`, `)})`:``;t.push({name:n.name,kind:`zone`,text:`${n.name} changed in ${n.ticks} tick${n.ticks===1?``:`s`} that only zone.js started${e}. Without zone.js it would not update: keep that state in a signal, or call markForCheck after changing it.`})}return t}function VO(e){let t=OO(e);return!t||!CO(e)?null:{...t,maxMs:wO(e.maxMs),cycles:wO(e.cycles)}}function HO(e){if(!CO(e))return null;let t=TO(e.name,lO),n=TO(e.hook,dO);if(!t||!n)return null;let{calls:r,ms:i,maxMs:a}=e;return{name:t,hook:n,calls:wO(r),ms:wO(i),maxMs:wO(a)}}function UO(e){if(!CO(e))return null;let t=TO(e.name,lO);if(!t)return null;let n=TO(e.listener,lO);return{name:t,...n?{listener:n}:{},calls:wO(e.calls),ms:wO(e.ms),maxMs:wO(e.maxMs)}}function WO(e){if(CO(e)&&wO(e.runs))return{runs:wO(e.runs),ms:wO(e.ms),maxMs:wO(e.maxMs)}}function GO(e,t){if(!CO(e))return null;let n=DO(e.spanNames,gO).map(e=>TO(e,uO)),r=sO(e.slowMs),i=Array.isArray(e.cycles)?e.cycles.slice(-Math.min(t,hO)).map(e=>AO(e,n.length,r)).filter(e=>!!e):[],a={},o=0;if(CO(e.hosts)){let t=Object.entries(e.hosts);o=Math.max(0,t.length-mO);for(let[e,n]of t.slice(0,mO))e.length<50&&wO(n)&&(a[e]=wO(n))}let s=Array.isArray(e.components)?e.components:[],c=Math.floor(wO(e.droppedClasses))+Math.max(0,s.length-pO),l=Math.floor(wO(e.droppedHosts))+o,u=DO(e.hooks,vO).map(HO).filter(e=>!!e),d=DO(e.outputs,vO).map(UO).filter(e=>!!e),f=Math.max(0,DO(e.hooks,1/0).length-vO)+Math.max(0,DO(e.outputs,1/0).length-vO),p=Math.floor(wO(e.droppedTimings))+f,m=WO(e.afterRender),ee=i.some(e=>e.spans?.length),h=RO(e.diagnosis);return{recording:e.recording===!0,startedAt:typeof e.startedAt==`number`&&e.startedAt<=cO?wO(e.startedAt):null,dropped:wO(e.dropped),slowMs:r,cycles:i,components:s.slice(0,pO).map(VO).filter(e=>!!e),...c?{droppedClasses:c}:{},hosts:a,...l?{droppedHosts:l}:{},...u.length?{hooks:u}:{},...d.length?{outputs:d}:{},...p?{droppedTimings:p}:{},...m?{afterRender:m}:{},...ee?{spanNames:n}:{},...h?{diagnosis:h}:{}}}var KO=`pangular-inspector/change-detection`;function qO(e,t,n=Date.now()){return{format:KO,version:1,exportedAt:n,pageId:t,recording:{...GO(e,hO)??e,recording:!1,hosts:{}}}}function JO(e,t){if(e.length>2e7||e.length*3>2e7&&new TextEncoder().encode(e).byteLength>2e7)return{ok:!1,error:`The file is larger than 20 MB.`};let n;try{n=JSON.parse(e)}catch{return{ok:!1,error:`The file is not valid JSON.`}}if(!CO(n))return{ok:!1,error:`The file is not a recording.`};if(n.format!==void 0&&n.format!==`pangular-inspector/change-detection`)return{ok:!1,error:`The file is not a change detection recording.`};let r=CO(n.recording)?n.recording:n;if(!Array.isArray(r.cycles))return{ok:!1,error:`The file has no change detection cycles.`};let i=GO(r,t);if(!i)return{ok:!1,error:`The file is not a recording.`};let a=TO(n.pageId??r.pageId,49)||`imported`,o=EO(n.exportedAt);return{ok:!0,pageId:a,...o?{exportedAt:o}:{},recording:{...i,recording:!1}}}var YO=1,XO=1,ZO=2,QO={c:`component`,h:`lifecycle-hook`,r:`after-render`,o:`output`},$O=e=>Math.round(e*1e6)/1e3;function ek(e,t){let n=e.spanNames??[],r=e.cycles[0]?.at??0,i=e.startedAt??r,a=[],o=0,s=0;for(let t of e.cycles){let e=t.t??Math.max(0,t.at-i),r=e+t.ms;a.push({name:`Change detection #${t.id}`,cat:`change-detection`,ph:`X`,pid:YO,tid:XO,ts:$O(e),dur:$O(t.ms),args:{checks:t.checks,passes:t.passes,...t.trigger?{trigger:t.trigger}:{},...t.hookMs?{hookMs:t.hookMs}:{},...t.afterRenderMs?{afterRenderMs:t.afterRenderMs}:{},...t.outputMs?{outputMs:t.outputMs}:{},...t.cause?{cause:zO(t.cause)}:{},...t.unchanged?{unchanged:t.unchanged}:{},slowest:t.components.map(e=>`${e.name} ${e.checks}x ${e.ms}ms`)}}),s+=t.droppedSpans??0;let c=[{end:r}],l=[...t.spans??[]].sort((e,t)=>e[1]-t[1]||t[2]-e[2]);for(let[r,i,s,u,d]of l){o++;let l=n[r]??`?`;if(d===xO.output){let n=e+i;a.push({name:l,cat:QO[d],ph:`X`,pid:YO,tid:ZO,ts:$O(n),dur:$O(i<0?Math.max(0,Math.min(s,-i)):s),args:{cycle:t.id}});continue}let f=Math.max(e,e+i);for(;c.length>1&&c.at(-1).end<=f;)c.pop();let p=c.at(-1).end,m=Math.min(f+s,p);me.ts??0));if(c<0)for(let e of a)e.ts=$O((e.ts-c)/1e3);a.sort((e,t)=>e.ts-t.ts||t.dur-e.dur);let l=(e,t,n)=>({name:t,ph:`M`,pid:YO,tid:e,args:{name:n}});return{traceEvents:[l(0,`process_name`,`Angular change detection (page ${t})`),l(XO,`thread_name`,`Change detection`),l(ZO,`thread_name`,`Outputs`),...a],displayTimeUnit:`ms`,otherData:{source:`Pangular Inspector change detection recording`,pageId:t,cycles:e.cycles.length,droppedCycles:e.dropped,spans:o,droppedSpans:s,...e.startedAt&&e.startedAt<=cO?{startedAt:new Date(e.startedAt).toISOString()}:{}}}}function tk(e,t=16){return e.ms>t}function nk(e){return`${e<10?e.toFixed(2):Math.round(e)} ms`}function rk(e,t){if(!t)return[...e];let n=Math.min(t.from,t.to),r=Math.max(t.from,t.to),i=e.filter(e=>e.id>=n&&e.id<=r);return i.length?i:[...e]}function ik(e){let t=new Map;for(let n of e)for(let e of n.components){let n=t.get(e.name);n?(n.checks+=e.checks,n.ms+=e.ms,n.maxMs=Math.max(n.maxMs,e.ms),n.cycles+=1):t.set(e.name,{name:e.name,checks:e.checks,ms:e.ms,maxMs:e.ms,cycles:1})}return[...t.values()].sort((e,t)=>t.ms-e.ms||e.name.localeCompare(t.name))}function ak(e,t=16){let n=e.reduce((e,t)=>Math.max(e,t.ms),0);return Math.max(n,t*1.25)}function ok(e,t,n=3){let r=e.map(e=>({item:e,value:t(e)})).filter(e=>e.value>0).sort((e,t)=>t.value-e.value),i=r.reduce((e,t)=>e+t.value,0);if(!i)return[];let a=n/i,o=[],s=0,c=0,l=n,u=1,d=[],f=(e,t)=>{let n=e.reduce((e,t)=>e+t,0),r=Math.max(...e),i=Math.min(...e);return Math.max(t*t*r/(n*n),n*n/(t*t*i))},p=()=>{let e=d.reduce((e,t)=>e+t.area,0);if(l>=u){let t=e/u,n=c;for(let e of d){let r=e.area/t;o.push({item:e.item,x:s,y:n,w:t,h:r}),n+=r}s+=t,l-=t}else{let t=e/l,n=s;for(let e of d){let r=e.area/t;o.push({item:e.item,x:n,y:c,w:r,h:t}),n+=r}c+=t,u-=t}d=[]};for(let e of r){let t=e.value*a,n=Math.min(l,u),r=d.map(e=>e.area);d.length&&f([...r,t],n)>f(r,n)&&p(),d.push({item:e.item,area:t})}return d.length&&p(),o.map(e=>({item:e.item,x:e.x/n*100,y:e.y*100,w:e.w/n*100,h:e.h*100}))}var sk={c:`component`,h:`hook`,r:`afterRender`,o:`output`};function ck(e,t){if(t===`c`)return e||null;if(t===`h`){let t=e.lastIndexOf(`.`);return t>0?e.slice(0,t):null}if(t===`o`){let t=e.indexOf(` (`),n=t>0?e.slice(0,t):e;return n&&n!==`?`?n:null}return null}function lk(e,t){let n=e.filter(e=>e.spans?.length);if(!n.length)return null;let r=n.map(e=>{let t=e.spans,n=Math.min(0,...t.map(e=>e[1])),r=Math.max(e.ms,...t.map(e=>e[1]+e[2]));return{cycle:e,spans:t,from:n,width:Math.max(r-n,.001)}}),i=r.reduce((e,t)=>e+t.width,0),a=[],o=[],s=0,c=0;for(let{cycle:e,spans:n,from:l,width:u}of r){o.push({id:e.id,x:s/i*100,w:u/i*100,droppedSpans:e.droppedSpans??0});let r=[...n].sort((e,t)=>e[1]-t[1]||e[3]-t[3]),d=[];for(let[n,o,u,f,p]of r){let r=t[n]??`unknown`,m=d[f-1],ee=f>0&&m!==void 0&&ot.kind,dk=(e,t)=>t.name,fk=(e,t)=>t.name+`.`+t.input;function pk(e,t){e&1&&(R(0,`p`,3),K(1,` The page has no Angular change detection scheduler the overlay could find (it needs Angular 18 or later), so cycles have no cause. `),z())}function mk(e,t){if(e&1&&(R(0,`tr`)(1,`td`),K(2),z(),R(3,`td`,6),K(4),z()()),e&2){let e=t.$implicit;D(2),q(e.label),D(2),q(e.count)}}function hk(e,t){if(e&1&&(R(0,`table`)(1,`thead`)(2,`tr`)(3,`th`,4),K(4,`Trigger`),z(),R(5,`th`,5),K(6,`Cycles`),z()()(),R(7,`tbody`),M(8,mk,5,2,`tr`,null,uk),z()()),e&2){let e=W(2);D(8),N(e.causes())}}function gk(e,t){e&1&&(R(0,`p`,3),K(1,`No cycle has a cause yet.`),z())}function _k(e,t){if(e&1&&(R(0,`tr`)(1,`td`,7),K(2),z(),R(3,`td`,6),K(4),z(),R(5,`td`,7),K(6),z()()),e&2){let e=t.$implicit;D(2),q(e.name),D(2),q(e.ticks),D(2),q(e.tasks?.join(`, `))}}function vk(e,t){if(e&1&&(R(0,`table`)(1,`thead`)(2,`tr`)(3,`th`,4),K(4,`Component`),z(),R(5,`th`,5),K(6,`Zone-only ticks`),z(),R(7,`th`,4),K(8,`After`),z()()(),R(9,`tbody`),M(10,_k,7,3,`tr`,null,dk),z()()),e&2){let e=W(3);D(10),N(e.zone())}}function yk(e,t){if(e&1&&(R(0,`p`,3),K(1),z()),e&2){let e=W(3);D(),q(e.zoneNote())}}function bk(e,t){if(e&1&&(R(0,`div`)(1,`h4`),K(2,`Depends on zone.js`),z(),A(3,vk,12,0,`table`)(4,yk,2,1,`p`,3),z()),e&2){let e=W(),t=W();D(3),j(t.zone().length?3:e.triggers?4:-1)}}function xk(e,t){e&1&&(R(0,`p`,3),K(1,`The page can't watch DOM updates, so wasted checks are not counted.`),z())}function Sk(e,t){if(e&1&&(R(0,`tr`)(1,`td`,7),K(2),z(),R(3,`td`,6),K(4),z(),R(5,`td`,6),K(6),z(),R(7,`td`),K(8),z()()),e&2){let e=t.$implicit,n=W(3);D(2),q(e.name),D(2),q(e.refreshed),D(2),Y(``,e.unchanged,` (`,n.share(e.unchanged,e.refreshed),`)`),D(2),q(e.strategy??`Unknown`)}}function Ck(e,t){if(e&1&&(R(0,`table`)(1,`thead`)(2,`tr`)(3,`th`,4),K(4,`Component`),z(),R(5,`th`,5),K(6,`Refreshed`),z(),R(7,`th`,5),K(8,`Changed nothing`),z(),R(9,`th`,4),K(10,`Strategy`),z()()(),R(11,`tbody`),M(12,Sk,9,5,`tr`,null,dk),z()()),e&2){let e=W(2);D(12),N(e.wasted())}}function wk(e,t){e&1&&(R(0,`p`,3),K(1,`Every refreshed check changed something.`),z())}function Tk(e,t){if(e&1&&(R(0,`tr`)(1,`td`,7),K(2),z(),R(3,`td`,7),K(4),z(),R(5,`td`,6),K(6),z(),R(7,`td`,6),K(8),z()()),e&2){let e=t.$implicit;D(2),Y(``,e.name,`.`,e.input),D(2),q(e.parent??`Unknown`),D(2),q(e.inPlace),D(2),q(e.sameContents)}}function Ek(e,t){if(e&1&&(R(0,`h4`),K(1,`Inputs that break OnPush`),z(),R(2,`table`)(3,`thead`)(4,`tr`)(5,`th`,4),K(6,`Input`),z(),R(7,`th`,4),K(8,`Set by`),z(),R(9,`th`,5),K(10,`Changed in place`),z(),R(11,`th`,5),K(12,`Same contents, new reference`),z()()(),R(13,`tbody`),M(14,Tk,9,5,`tr`,null,fk),z()()),e&2){let e=W(2);D(14),N(e.inputs())}}function Dk(e,t){if(e&1&&(R(0,`li`),K(1),z()),e&2){let e=t.$implicit;D(),q(e.text)}}function Ok(e,t){if(e&1&&(R(0,`h4`),K(1,`Hints`),z(),R(2,`ul`,8),M(3,Dk,2,1,`li`,null,eg),z()),e&2){let e=W(2);D(3),N(e.hints())}}function kk(e,t){if(e&1&&(R(0,`section`,0)(1,`h3`,1),K(2,`Why it ran and what it wasted`),z(),R(3,`div`,2)(4,`div`)(5,`h4`),K(6,`What started the cycles`),z(),A(7,pk,2,0,`p`,3)(8,hk,10,0,`table`)(9,gk,2,0,`p`,3),z(),A(10,bk,5,1,`div`),z(),R(11,`h4`),K(12,`Wasted checks`),z(),A(13,xk,2,0,`p`,3)(14,Ck,14,0,`table`)(15,wk,2,0,`p`,3),A(16,Ek,16,0),A(17,Ok,5,0),z()),e&2){let e=t,n=W();D(7),j(e.triggers?n.causes().length?8:9:7),D(3),j(n.hasZone()?10:-1),D(3),j(e.waste?n.wasted().length?14:15:13),D(3),j(n.inputs().length?16:-1),D(),j(n.hints().length?17:-1)}}var Ak=10,jk=class e{page=$(null);diagnosis=X(()=>this.page()?.diagnosis??null);causes=X(()=>{let e=this.diagnosis()?.causes??{};return jO.filter(t=>e[t]).map(t=>({kind:t,label:MO[t],count:e[t]}))});zone=X(()=>(this.diagnosis()?.zone??[]).slice(0,Ak));zoneTicks=X(()=>this.diagnosis()?.causes.zone??0);hasZone=X(()=>this.diagnosis()?.zoneJs??(this.zone().length>0||this.zoneTicks()>0));zoneNote=X(()=>{let e=this.zoneTicks();return e?`${e} ${e===1?`tick`:`ticks`} came from zone.js alone, and no component changed in them.`:`No component changed in a tick only zone.js started.`});wasted=X(()=>(this.diagnosis()?.components??[]).filter(e=>e.unchanged>0).slice(0,Ak));inputs=X(()=>(this.diagnosis()?.inputs??[]).slice(0,Ak));hints=X(()=>BO(this.diagnosis()??void 0).slice(0,Ak));share(e,t){return t?`${Math.round(e/t*100)}%`:`0%`}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-cd-diagnosis`]],inputs:{page:[1,`page`]},decls:1,vars:1,consts:[[`aria-labelledby`,`cd-diagnosis-heading`,1,`diagnosis`],[`id`,`cd-diagnosis-heading`],[1,`grid`],[1,`note`],[`scope`,`col`],[`scope`,`col`,1,`num`],[1,`num`],[1,`mono`],[1,`hints`]],template:function(e,t){if(e&1&&A(0,kk,18,5,`section`,0),e&2){let e;j((e=t.diagnosis())?0:-1,e)}},styles:[`[_nghost-%COMP%] { +}`]})},aO=1e3;function oO(e){return typeof e==`number`&&Number.isFinite(e)&&e>0&&e<=aO?e:16}var sO=864e13,cO=200,lO=300,uO=100,dO=10,fO=100,pO=2e3,mO=2e3,hO=4e3,gO=1e3,_O=100,vO=3,yO=50,bO={component:`c`,hook:`h`,afterRender:`r`,output:`o`},xO=Object.values(bO),SO=e=>!!e&&typeof e==`object`&&!Array.isArray(e),CO=e=>typeof e==`number`&&Number.isFinite(e)&&e>=0?e:0,wO=(e,t)=>typeof e==`string`?e.slice(0,t):``,TO=e=>CO(e)>0?CO(e):void 0,EO=(e,t)=>Array.isArray(e)?e.slice(0,t):[];function DO(e){if(!SO(e))return null;let t=wO(e.name,cO);return t?{name:t,checks:CO(e.checks),ms:CO(e.ms)}:null}function OO(e,t){if(!Array.isArray(e)||e.length!==5)return null;let[n,r,i,a,o]=e;return typeof n!=`number`||!Number.isInteger(n)||n<0||n>=t||typeof r!=`number`||!Number.isFinite(r)||Math.abs(r)>1e7||typeof a!=`number`||!Number.isInteger(a)||a<0||a>gO||typeof o!=`string`||!xO.includes(o)?null:[n,r,CO(i),a,o]}function kO(e,t,n){if(!SO(e)||typeof e.id!=`number`)return null;let r=EO(e.components,dO).map(DO).filter(e=>!!e),i=wO(e.trigger,lO),a=EO(e.spans,40).map(e=>OO(e,t)).filter(e=>!!e),o=Array.isArray(e.spans)?e.spans.length-40:0,s=Math.floor(CO(e.droppedSpans))+Math.max(0,o),c={t:typeof e.t==`number`?CO(e.t):void 0,hookMs:TO(e.hookMs),afterRenderMs:TO(e.afterRenderMs),outputMs:TO(e.outputMs)},l=NO(e.cause),u=TO(e.refreshed),d=TO(e.unchanged);return{id:CO(e.id),at:CO(e.at),ms:CO(e.ms),passes:CO(e.passes),...i?{trigger:i}:{},checks:CO(e.checks),components:r,...Object.fromEntries(Object.entries(c).filter(([,e])=>e!==void 0)),...a.length?{spans:a}:{},...s?{droppedSpans:s}:{},...l?{cause:l}:{},...u?{refreshed:u}:{},...d?{unchanged:d}:{},...CO(e.ms)>n?{slow:!0}:{}}}var AO=[`event`,`http`,`timer`,`signal`,`effect`,`markForCheck`,`input`,`view`,`tick`,`zone`,`unknown`],jO={event:`Event`,http:`HTTP response`,timer:`Timer`,signal:`Signal write`,effect:`Effect`,markForCheck:`markForCheck`,input:`setInput`,view:`View change`,tick:`ApplicationRef.tick`,zone:`zone.js only`,unknown:`Unknown`},MO=e=>typeof e==`string`&&AO.includes(e);function NO(e){if(!SO(e)||!MO(e.kind))return;let t=[`component`,`listener`,`event`,`target`,`signal`,`task`],n={kind:e.kind};MO(e.via)&&(n.via=e.via);for(let r of t){let t=wO(e[r],cO);t&&(n[r]=t)}e.zone===!0&&(n.zone=!0);let r=EO(e.stack,vO).map(e=>wO(e,lO)).filter(Boolean);r.length&&(n.stack=r);let i=Math.floor(CO(e.more));return i&&(n.more=i),n}function PO(e){if(!SO(e))return null;let t=wO(e.name,cO);if(!t)return null;let n=e.strategy;return{name:t,refreshed:Math.floor(CO(e.refreshed)),unchanged:Math.floor(CO(e.unchanged)),...n===`OnPush`||n===`Eager`?{strategy:n}:{}}}function FO(e){if(!SO(e))return null;let t=wO(e.name,cO),n=wO(e.input,cO);if(!t||!n)return null;let r=wO(e.parent,cO);return{name:t,input:n,...r?{parent:r}:{},inPlace:Math.floor(CO(e.inPlace)),sameContents:Math.floor(CO(e.sameContents))}}function IO(e){if(!SO(e))return null;let t=wO(e.name,cO);if(!t)return null;let n=EO(e.tasks,3).map(e=>wO(e,cO)).filter(Boolean);return{name:t,ticks:Math.floor(CO(e.ticks)),...n.length?{tasks:n}:{}}}function LO(e){if(!SO(e))return;let t={};if(SO(e.causes))for(let n of AO){let r=Math.floor(CO(e.causes[n]));r&&(t[n]=r)}let n=EO(e.components,fO).map(PO).filter(e=>!!e),r=EO(e.inputs,yO).map(FO).filter(e=>!!e),i=EO(e.zone,yO).map(IO).filter(e=>!!e),a=Math.floor(CO(e.major));return{triggers:e.triggers===!0,waste:e.waste===!0,...a&&a<1e3?{major:a}:{},causes:t,components:n,...r.length?{inputs:r}:{},...i.length?{zone:i}:{},...typeof e.zoneJs==`boolean`?{zoneJs:e.zoneJs}:{}}}function RO(e){let t=[],n=e.component?` in ${e.component}${e.listener?` (${e.listener})`:``}`:``;switch(e.kind){case`event`:t.push(`${e.event??`Template listener`}${e.target?` on ${e.target}`:``}${n}`);break;case`http`:t.push(`HTTP response${n}`);break;case`timer`:t.push(`${e.task??`Timer`}${n}`);break;case`zone`:t.push(`zone.js tick with no Angular notification${e.task?` after ${e.task}`:``}`);break;case`tick`:t.push(`ApplicationRef.tick()${n}`);break;default:t.push(`${jO[e.kind]}${n}`)}return e.signal?t.push(e.signal===`?`?`wrote an unnamed signal`:`wrote signal ${e.signal}`):e.via&&e.via!==e.kind&&t.push(`via ${jO[e.via]}`),e.zone&&e.kind!==`zone`&&t.push(`run by zone.js`),e.more&&t.push(`${e.more} more notification${e.more===1?``:`s`}`),t.join(`, `)}function zO(e){if(!e)return[];let t=[],n=(e.major??0)>=22;for(let r of e.components){if(r.refreshed<10)continue;let e=r.refreshed-r.unchanged;if(e/r.refreshed>.2)continue;let i=`refreshed ${r.refreshed} times and changed something in ${e}`;r.strategy===`Eager`?t.push({name:r.name,kind:`on-push`,text:n?`${r.name} was ${i}. It opts out of OnPush, which is the default from Angular 22: remove \`changeDetection: ChangeDetectionStrategy.Eager\` (or \`Default\`) so Angular skips it until an input, event, signal or markForCheck marks it.`:`${r.name} was ${i}. Add \`changeDetection: ChangeDetectionStrategy.OnPush\` so Angular skips it until an input, event, signal or markForCheck marks it.`}):r.strategy===`OnPush`&&t.push({name:r.name,kind:`already-on-push`,text:`${r.name} was ${i}, and it is already OnPush${n?` (the default from Angular 22)`:``}. Something keeps marking it: an input that gets a new reference each time, an event or output in it, markForCheck, or a signal it reads that is set to an equal value.`})}for(let n of e.inputs??[]){let e=n.parent?` set by ${n.parent}`:``;n.inPlace&&t.push({name:n.name,kind:`in-place`,text:`Input ${n.input} of ${n.name}${e} changed in place ${n.inPlace} time${n.inPlace===1?``:`s`}: same reference, different contents. OnPush components, computed and signal equality don't see that. Pass a new object or array instead of mutating it.`}),n.sameContents&&t.push({name:n.name,kind:`same-contents`,text:`Input ${n.input} of ${n.name}${e} got a new reference with the same contents ${n.sameContents} time${n.sameContents===1?``:`s`}, so Angular refreshed ${n.name} for nothing. Keep the reference when nothing changed, for example with a computed instead of a method call in the template.`})}for(let n of e.zone??[]){let e=n.tasks?.length?` (after ${n.tasks.join(`, `)})`:``;t.push({name:n.name,kind:`zone`,text:`${n.name} changed in ${n.ticks} tick${n.ticks===1?``:`s`} that only zone.js started${e}. Without zone.js it would not update: keep that state in a signal, or call markForCheck after changing it.`})}return t}function BO(e){let t=DO(e);return!t||!SO(e)?null:{...t,maxMs:CO(e.maxMs),cycles:CO(e.cycles)}}function VO(e){if(!SO(e))return null;let t=wO(e.name,cO),n=wO(e.hook,uO);if(!t||!n)return null;let{calls:r,ms:i,maxMs:a}=e;return{name:t,hook:n,calls:CO(r),ms:CO(i),maxMs:CO(a)}}function HO(e){if(!SO(e))return null;let t=wO(e.name,cO);if(!t)return null;let n=wO(e.listener,cO);return{name:t,...n?{listener:n}:{},calls:CO(e.calls),ms:CO(e.ms),maxMs:CO(e.maxMs)}}function UO(e){if(SO(e)&&CO(e.runs))return{runs:CO(e.runs),ms:CO(e.ms),maxMs:CO(e.maxMs)}}function WO(e,t){if(!SO(e))return null;let n=EO(e.spanNames,hO).map(e=>wO(e,lO)),r=oO(e.slowMs),i=Array.isArray(e.cycles)?e.cycles.slice(-Math.min(t,mO)).map(e=>kO(e,n.length,r)).filter(e=>!!e):[],a={},o=0;if(SO(e.hosts)){let t=Object.entries(e.hosts);o=Math.max(0,t.length-pO);for(let[e,n]of t.slice(0,pO))e.length<50&&CO(n)&&(a[e]=CO(n))}let s=Array.isArray(e.components)?e.components:[],c=Math.floor(CO(e.droppedClasses))+Math.max(0,s.length-fO),l=Math.floor(CO(e.droppedHosts))+o,u=EO(e.hooks,_O).map(VO).filter(e=>!!e),d=EO(e.outputs,_O).map(HO).filter(e=>!!e),f=Math.max(0,EO(e.hooks,1/0).length-_O)+Math.max(0,EO(e.outputs,1/0).length-_O),p=Math.floor(CO(e.droppedTimings))+f,m=UO(e.afterRender),ee=i.some(e=>e.spans?.length),h=LO(e.diagnosis);return{recording:e.recording===!0,startedAt:typeof e.startedAt==`number`&&e.startedAt<=sO?CO(e.startedAt):null,dropped:CO(e.dropped),slowMs:r,cycles:i,components:s.slice(0,fO).map(BO).filter(e=>!!e),...c?{droppedClasses:c}:{},hosts:a,...l?{droppedHosts:l}:{},...u.length?{hooks:u}:{},...d.length?{outputs:d}:{},...p?{droppedTimings:p}:{},...m?{afterRender:m}:{},...ee?{spanNames:n}:{},...h?{diagnosis:h}:{}}}var GO=`pangular-inspector/change-detection`;function KO(e,t,n=Date.now()){return{format:GO,version:1,exportedAt:n,pageId:t,recording:{...WO(e,mO)??e,recording:!1,hosts:{}}}}function qO(e,t){if(e.length>2e7||e.length*3>2e7&&new TextEncoder().encode(e).byteLength>2e7)return{ok:!1,error:`The file is larger than 20 MB.`};let n;try{n=JSON.parse(e)}catch{return{ok:!1,error:`The file is not valid JSON.`}}if(!SO(n))return{ok:!1,error:`The file is not a recording.`};if(n.format!==void 0&&n.format!==`pangular-inspector/change-detection`)return{ok:!1,error:`The file is not a change detection recording.`};let r=SO(n.recording)?n.recording:n;if(!Array.isArray(r.cycles))return{ok:!1,error:`The file has no change detection cycles.`};let i=WO(r,t);if(!i)return{ok:!1,error:`The file is not a recording.`};let a=wO(n.pageId??r.pageId,49)||`imported`,o=TO(n.exportedAt);return{ok:!0,pageId:a,...o?{exportedAt:o}:{},recording:{...i,recording:!1}}}var JO=1,YO=1,XO=2,ZO={c:`component`,h:`lifecycle-hook`,r:`after-render`,o:`output`},QO=e=>Math.round(e*1e6)/1e3;function $O(e,t){let n=e.spanNames??[],r=e.cycles[0]?.at??0,i=e.startedAt??r,a=[],o=0,s=0;for(let t of e.cycles){let e=t.t??Math.max(0,t.at-i),r=e+t.ms;a.push({name:`Change detection #${t.id}`,cat:`change-detection`,ph:`X`,pid:JO,tid:YO,ts:QO(e),dur:QO(t.ms),args:{checks:t.checks,passes:t.passes,...t.trigger?{trigger:t.trigger}:{},...t.hookMs?{hookMs:t.hookMs}:{},...t.afterRenderMs?{afterRenderMs:t.afterRenderMs}:{},...t.outputMs?{outputMs:t.outputMs}:{},...t.cause?{cause:RO(t.cause)}:{},...t.unchanged?{unchanged:t.unchanged}:{},slowest:t.components.map(e=>`${e.name} ${e.checks}x ${e.ms}ms`)}}),s+=t.droppedSpans??0;let c=[{end:r}],l=[...t.spans??[]].sort((e,t)=>e[1]-t[1]||t[2]-e[2]);for(let[r,i,s,u,d]of l){o++;let l=n[r]??`?`;if(d===bO.output){let n=e+i;a.push({name:l,cat:ZO[d],ph:`X`,pid:JO,tid:XO,ts:QO(n),dur:QO(i<0?Math.max(0,Math.min(s,-i)):s),args:{cycle:t.id}});continue}let f=Math.max(e,e+i);for(;c.length>1&&c.at(-1).end<=f;)c.pop();let p=c.at(-1).end,m=Math.min(f+s,p);me.ts??0));if(c<0)for(let e of a)e.ts=QO((e.ts-c)/1e3);a.sort((e,t)=>e.ts-t.ts||t.dur-e.dur);let l=(e,t,n)=>({name:t,ph:`M`,pid:JO,tid:e,args:{name:n}});return{traceEvents:[l(0,`process_name`,`Angular change detection (page ${t})`),l(YO,`thread_name`,`Change detection`),l(XO,`thread_name`,`Outputs`),...a],displayTimeUnit:`ms`,otherData:{source:`Pangular Inspector change detection recording`,pageId:t,cycles:e.cycles.length,droppedCycles:e.dropped,spans:o,droppedSpans:s,...e.startedAt&&e.startedAt<=sO?{startedAt:new Date(e.startedAt).toISOString()}:{}}}}function ek(e,t=16){return e.ms>t}function tk(e){return`${e<10?e.toFixed(2):Math.round(e)} ms`}function nk(e,t){if(!t)return[...e];let n=Math.min(t.from,t.to),r=Math.max(t.from,t.to),i=e.filter(e=>e.id>=n&&e.id<=r);return i.length?i:[...e]}function rk(e){let t=new Map;for(let n of e)for(let e of n.components){let n=t.get(e.name);n?(n.checks+=e.checks,n.ms+=e.ms,n.maxMs=Math.max(n.maxMs,e.ms),n.cycles+=1):t.set(e.name,{name:e.name,checks:e.checks,ms:e.ms,maxMs:e.ms,cycles:1})}return[...t.values()].sort((e,t)=>t.ms-e.ms||e.name.localeCompare(t.name))}function ik(e,t=16){let n=e.reduce((e,t)=>Math.max(e,t.ms),0);return Math.max(n,t*1.25)}function ak(e,t,n=3){let r=e.map(e=>({item:e,value:t(e)})).filter(e=>e.value>0).sort((e,t)=>t.value-e.value),i=r.reduce((e,t)=>e+t.value,0);if(!i)return[];let a=n/i,o=[],s=0,c=0,l=n,u=1,d=[],f=(e,t)=>{let n=e.reduce((e,t)=>e+t,0),r=Math.max(...e),i=Math.min(...e);return Math.max(t*t*r/(n*n),n*n/(t*t*i))},p=()=>{let e=d.reduce((e,t)=>e+t.area,0);if(l>=u){let t=e/u,n=c;for(let e of d){let r=e.area/t;o.push({item:e.item,x:s,y:n,w:t,h:r}),n+=r}s+=t,l-=t}else{let t=e/l,n=s;for(let e of d){let r=e.area/t;o.push({item:e.item,x:n,y:c,w:r,h:t}),n+=r}c+=t,u-=t}d=[]};for(let e of r){let t=e.value*a,n=Math.min(l,u),r=d.map(e=>e.area);d.length&&f([...r,t],n)>f(r,n)&&p(),d.push({item:e.item,area:t})}return d.length&&p(),o.map(e=>({item:e.item,x:e.x/n*100,y:e.y*100,w:e.w/n*100,h:e.h*100}))}var ok={c:`component`,h:`hook`,r:`afterRender`,o:`output`};function sk(e,t){if(t===`c`)return e||null;if(t===`h`){let t=e.lastIndexOf(`.`);return t>0?e.slice(0,t):null}if(t===`o`){let t=e.indexOf(` (`),n=t>0?e.slice(0,t):e;return n&&n!==`?`?n:null}return null}function ck(e,t){let n=e.filter(e=>e.spans?.length);if(!n.length)return null;let r=n.map(e=>{let t=e.spans,n=Math.min(0,...t.map(e=>e[1])),r=Math.max(e.ms,...t.map(e=>e[1]+e[2]));return{cycle:e,spans:t,from:n,width:Math.max(r-n,.001)}}),i=r.reduce((e,t)=>e+t.width,0),a=[],o=[],s=0,c=0;for(let{cycle:e,spans:n,from:l,width:u}of r){o.push({id:e.id,x:s/i*100,w:u/i*100,droppedSpans:e.droppedSpans??0});let r=[...n].sort((e,t)=>e[1]-t[1]||e[3]-t[3]),d=[];for(let[n,o,u,f,p]of r){let r=t[n]??`unknown`,m=d[f-1],ee=f>0&&m!==void 0&&ot.kind,uk=(e,t)=>t.name,dk=(e,t)=>t.name+`.`+t.input;function fk(e,t){e&1&&(R(0,`p`,3),K(1,` The page has no Angular change detection scheduler the overlay could find (it needs Angular 18 or later), so cycles have no cause. `),z())}function pk(e,t){if(e&1&&(R(0,`tr`)(1,`td`),K(2),z(),R(3,`td`,6),K(4),z()()),e&2){let e=t.$implicit;D(2),q(e.label),D(2),q(e.count)}}function mk(e,t){if(e&1&&(R(0,`table`)(1,`thead`)(2,`tr`)(3,`th`,4),K(4,`Trigger`),z(),R(5,`th`,5),K(6,`Cycles`),z()()(),R(7,`tbody`),M(8,pk,5,2,`tr`,null,lk),z()()),e&2){let e=W(2);D(8),N(e.causes())}}function hk(e,t){e&1&&(R(0,`p`,3),K(1,`No cycle has a cause yet.`),z())}function gk(e,t){if(e&1&&(R(0,`tr`)(1,`td`,7),K(2),z(),R(3,`td`,6),K(4),z(),R(5,`td`,7),K(6),z()()),e&2){let e=t.$implicit;D(2),q(e.name),D(2),q(e.ticks),D(2),q(e.tasks?.join(`, `))}}function _k(e,t){if(e&1&&(R(0,`table`)(1,`thead`)(2,`tr`)(3,`th`,4),K(4,`Component`),z(),R(5,`th`,5),K(6,`Zone-only ticks`),z(),R(7,`th`,4),K(8,`After`),z()()(),R(9,`tbody`),M(10,gk,7,3,`tr`,null,uk),z()()),e&2){let e=W(3);D(10),N(e.zone())}}function vk(e,t){if(e&1&&(R(0,`p`,3),K(1),z()),e&2){let e=W(3);D(),q(e.zoneNote())}}function yk(e,t){if(e&1&&(R(0,`div`)(1,`h4`),K(2,`Depends on zone.js`),z(),A(3,_k,12,0,`table`)(4,vk,2,1,`p`,3),z()),e&2){let e=W(),t=W();D(3),j(t.zone().length?3:e.triggers?4:-1)}}function bk(e,t){e&1&&(R(0,`p`,3),K(1,`The page can't watch DOM updates, so wasted checks are not counted.`),z())}function xk(e,t){if(e&1&&(R(0,`tr`)(1,`td`,7),K(2),z(),R(3,`td`,6),K(4),z(),R(5,`td`,6),K(6),z(),R(7,`td`),K(8),z()()),e&2){let e=t.$implicit,n=W(3);D(2),q(e.name),D(2),q(e.refreshed),D(2),Y(``,e.unchanged,` (`,n.share(e.unchanged,e.refreshed),`)`),D(2),q(e.strategy??`Unknown`)}}function Sk(e,t){if(e&1&&(R(0,`table`)(1,`thead`)(2,`tr`)(3,`th`,4),K(4,`Component`),z(),R(5,`th`,5),K(6,`Refreshed`),z(),R(7,`th`,5),K(8,`Changed nothing`),z(),R(9,`th`,4),K(10,`Strategy`),z()()(),R(11,`tbody`),M(12,xk,9,5,`tr`,null,uk),z()()),e&2){let e=W(2);D(12),N(e.wasted())}}function Ck(e,t){e&1&&(R(0,`p`,3),K(1,`Every refreshed check changed something.`),z())}function wk(e,t){if(e&1&&(R(0,`tr`)(1,`td`,7),K(2),z(),R(3,`td`,7),K(4),z(),R(5,`td`,6),K(6),z(),R(7,`td`,6),K(8),z()()),e&2){let e=t.$implicit;D(2),Y(``,e.name,`.`,e.input),D(2),q(e.parent??`Unknown`),D(2),q(e.inPlace),D(2),q(e.sameContents)}}function Tk(e,t){if(e&1&&(R(0,`h4`),K(1,`Inputs that break OnPush`),z(),R(2,`table`)(3,`thead`)(4,`tr`)(5,`th`,4),K(6,`Input`),z(),R(7,`th`,4),K(8,`Set by`),z(),R(9,`th`,5),K(10,`Changed in place`),z(),R(11,`th`,5),K(12,`Same contents, new reference`),z()()(),R(13,`tbody`),M(14,wk,9,5,`tr`,null,dk),z()()),e&2){let e=W(2);D(14),N(e.inputs())}}function Ek(e,t){if(e&1&&(R(0,`li`),K(1),z()),e&2){let e=t.$implicit;D(),q(e.text)}}function Dk(e,t){if(e&1&&(R(0,`h4`),K(1,`Hints`),z(),R(2,`ul`,8),M(3,Ek,2,1,`li`,null,tg),z()),e&2){let e=W(2);D(3),N(e.hints())}}function Ok(e,t){if(e&1&&(R(0,`section`,0)(1,`h3`,1),K(2,`Why it ran and what it wasted`),z(),R(3,`div`,2)(4,`div`)(5,`h4`),K(6,`What started the cycles`),z(),A(7,fk,2,0,`p`,3)(8,mk,10,0,`table`)(9,hk,2,0,`p`,3),z(),A(10,yk,5,1,`div`),z(),R(11,`h4`),K(12,`Wasted checks`),z(),A(13,bk,2,0,`p`,3)(14,Sk,14,0,`table`)(15,Ck,2,0,`p`,3),A(16,Tk,16,0),A(17,Dk,5,0),z()),e&2){let e=t,n=W();D(7),j(e.triggers?n.causes().length?8:9:7),D(3),j(n.hasZone()?10:-1),D(3),j(e.waste?n.wasted().length?14:15:13),D(3),j(n.inputs().length?16:-1),D(),j(n.hints().length?17:-1)}}var kk=10,Ak=class e{page=$(null);diagnosis=X(()=>this.page()?.diagnosis??null);causes=X(()=>{let e=this.diagnosis()?.causes??{};return AO.filter(t=>e[t]).map(t=>({kind:t,label:jO[t],count:e[t]}))});zone=X(()=>(this.diagnosis()?.zone??[]).slice(0,kk));zoneTicks=X(()=>this.diagnosis()?.causes.zone??0);hasZone=X(()=>this.diagnosis()?.zoneJs??(this.zone().length>0||this.zoneTicks()>0));zoneNote=X(()=>{let e=this.zoneTicks();return e?`${e} ${e===1?`tick`:`ticks`} came from zone.js alone, and no component changed in them.`:`No component changed in a tick only zone.js started.`});wasted=X(()=>(this.diagnosis()?.components??[]).filter(e=>e.unchanged>0).slice(0,kk));inputs=X(()=>(this.diagnosis()?.inputs??[]).slice(0,kk));hints=X(()=>zO(this.diagnosis()??void 0).slice(0,kk));share(e,t){return t?`${Math.round(e/t*100)}%`:`0%`}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-cd-diagnosis`]],inputs:{page:[1,`page`]},decls:1,vars:1,consts:[[`aria-labelledby`,`cd-diagnosis-heading`,1,`diagnosis`],[`id`,`cd-diagnosis-heading`],[1,`grid`],[1,`note`],[`scope`,`col`],[`scope`,`col`,1,`num`],[1,`num`],[1,`mono`],[1,`hints`]],template:function(e,t){if(e&1&&A(0,Ok,18,5,`section`,0),e&2){let e;j((e=t.diagnosis())?0:-1,e)}},styles:[`[_nghost-%COMP%] { display: block; } @@ -955,7 +955,7 @@ td.mono[_ngcontent-%COMP%] { .hints[_ngcontent-%COMP%] li[_ngcontent-%COMP%] + li[_ngcontent-%COMP%] { margin-top: 4px; -}`]})},Mk=(e,t)=>t.cycle.id,Nk=(e,t)=>t.id;function Pk(e,t){if(e&1){let e=B();R(0,`button`,27),U(`click`,function(){return S(e),C(W().showAll())}),K(1,`Show all cycles`),z()}}function Fk(e,t){if(e&1&&fg(0,`div`,28),e&2){let e=t;n_(`left`,e.left,`%`)(`width`,e.width,`%`)}}function Ik(e,t){if(e&1&&(R(0,`div`,29),fg(1,`span`,30),z()),e&2){let e=t.$implicit,n=W();G(`over`,e.over)(`out`,!n.inRange(e.index)&&!!n.range())(`active`,n.focused()&&n.active()===e.index),V(`id`,n.optionId(e.index)),k(`data-index`,e.index)(`aria-selected`,n.inRange(e.index))(`aria-label`,e.label),D(),n_(`height`,e.height,`%`)}}function Lk(e,t){e&1&&(R(0,`span`,33),K(1,`over budget`),z())}function Rk(e,t){if(e&1&&(R(0,`p`),K(1,` after `),R(2,`span`,35),K(3),z()()),e&2){let e=W();D(3),q(e.cycle.trigger)}}function zk(e,t){if(e&1&&(R(0,`p`,34)(1,`span`,36),K(2),z(),R(3,`span`),K(4),z()()),e&2){let e=t.$implicit,n=W(2);D(2),q(e.name),D(2),q(n.fmt(e.ms))}}function Bk(e,t){if(e&1&&(R(0,`div`,31)(1,`p`,32)(2,`strong`),K(3),z(),R(4,`span`),K(5),z(),A(6,Lk,2,0,`span`,33),z(),A(7,Rk,4,1,`p`),R(8,`p`),K(9),z(),M(10,zk,5,2,`p`,34,eg),z()),e&2){let e=t,n=W();n_(`left`,e.left)(`right`,e.right),D(3),q(n.fmt(e.cycle.ms)),D(2),J(`cycle `,e.cycle.id),D(),j(e.over?6:-1),D(),j(e.cycle.trigger?7:-1),D(2),k_(` `,e.cycle.checks,` `,e.cycle.checks===1?`check`:`checks`,`, `,e.cycle.passes,` `,e.cycle.passes===1?`pass`:`passes`,` `),D(),N(e.top)}}function Vk(e,t){if(e&1&&fg(0,`span`),e&2){let e=t.$implicit;G(`over`,e.over)}}function Hk(e,t){if(e&1&&K(0),e&2){let e=t,n=W(2);Y(` `,e.name,` (`,n.fmt(e.ms),`) `)}}function Uk(e,t){if(e&1&&(R(0,`tr`)(1,`td`,37),K(2),z(),R(3,`td`,37),K(4),z(),R(5,`td`),K(6),z(),R(7,`td`,37),K(8),z(),R(9,`td`,37),K(10),z(),R(11,`td`,35),K(12),z(),R(13,`td`,35),A(14,Hk,1,2),z()()),e&2){let e,n=t.$implicit,r=W();D(2),q(n.id),D(2),q(r.fmt(n.ms)),D(2),q(r.isOver(n)?`Over`:`Within`),D(2),q(n.checks),D(2),q(n.passes),D(2),q(n.trigger??``),D(2),j((e=n.components[0])?14:-1,e)}}var Wk=0,Gk=80,Kk=10,qk=class e{cycles=$([]);range=mv(null);slowMs=$(16);gapUntil=Gk;budgetLabel=X(()=>`${this.slowMs()} ms budget`);uid=`cd-chart-${Wk++}`;hintId=`${this.uid}-hint`;active=T(null);anchor=null;dragging=!1;hover=T(null);focused=T(!1);max=X(()=>ak(this.cycles(),this.slowMs()));budgetAt=X(()=>this.slowMs()/this.max()*100);bars=X(()=>{let e=this.max();return this.cycles().map((t,n)=>({cycle:t,index:n,height:t.ms/e*100,over:tk(t,this.slowMs()),label:this.describe(t)}))});firstId=X(()=>this.cycles()[0]?.id??0);lastId=X(()=>this.cycles().at(-1)?.id??0);span=X(()=>{let e=this.range();if(!e)return null;let t=this.cycles(),n=Math.min(e.from,e.to),r=Math.max(e.from,e.to),i=t.findIndex(e=>e.id>=n),a=-1;for(let e=t.length-1;e>=0;e--)if(t[e].id<=r){a=e;break}return i<0||ark(this.cycles(),this.range()));startId=X(()=>this.selected()[0]?.id??``);endId=X(()=>this.selected().at(-1)?.id??``);band=X(()=>{let e=this.span(),t=this.cycles().length;return!e||!t?null:{left:e.start/t*100,width:(e.end-e.start+1)/t*100}});summary=X(()=>{let e=this.selected(),t=this.slowMs(),n=e.filter(e=>tk(e,t)).length;return`${this.span()?e.length===1?`Cycle ${e[0].id}`:`Cycles ${e[0].id} to ${e.at(-1).id} (${e.length})`:`All ${e.length} ${e.length===1?`cycle`:`cycles`}`}. ${n} over the ${t} ms budget.`});tableLabel=X(()=>this.span()?`Picked cycles, ${this.summary()}`:`All recorded cycles`);activeOptionId=X(()=>{let e=this.active();return this.focused()&&e!==null&&e{let e=this.hover()??(this.focused()?this.active():null),t=e===null?void 0:this.cycles()[e];return!t||e===null?null:{cycle:t,over:tk(t,this.slowMs()),top:t.components.slice(0,3),...this.tipSide(e)}});tipSide(e){let t=this.cycles().length;return e+.5=t.start&&e<=t.end}describe(e){let t=[`Cycle ${e.id}`,nk(e.ms)];tk(e,this.slowMs())&&t.push(`over budget`),e.trigger&&t.push(`after ${e.trigger}`),t.push(`${e.checks} ${e.checks===1?`check`:`checks`}`);let n=e.components[0];return n&&t.push(`slowest ${n.name} ${nk(n.ms)}`),t.join(`, `)}select(e,t){let n=this.cycles(),r=n[Math.min(e,t)],i=n[Math.max(e,t)];r&&i&&this.range.set({from:r.id,to:i.id})}showAll(){this.range.set(null),this.anchor=null}setEnd(e,t){if(!this.cycles().length)return;let n=t.target,r=Number.parseInt(n.value,10);if(Number.isNaN(r)){n.value=String(e===`from`?this.startId():this.endId());return}let i=Math.min(Math.max(r,this.firstId()),this.lastId()),a=this.selected(),o=e===`from`?i:a[0]?.id??this.firstId(),s=e===`to`?i:a.at(-1)?.id??this.lastId();this.range.set({from:Math.min(o,s),to:Math.max(o,s)}),n.value=String(e===`from`?Math.min(o,s):Math.max(o,s))}onFocus(){this.focused.set(!0),(this.active()===null||this.active()>=this.cycles().length)&&this.active.set(this.span()?.start??Math.max(this.cycles().length-1,0)),this.anchor??=this.active()}onKey(e){let t=this.cycles().length;if(!t)return;let n=Math.min(this.active()??t-1,t-1),r=null;switch(e.key){case`ArrowRight`:case`ArrowDown`:r=n+1;break;case`ArrowLeft`:case`ArrowUp`:r=n-1;break;case`PageDown`:r=n+Kk;break;case`PageUp`:r=n-Kk;break;case`Home`:r=0;break;case`End`:r=t-1;break;case`Enter`:case` `:e.preventDefault(),this.anchor=n,this.select(n,n);return;case`Escape`:this.range()&&(e.preventDefault(),this.showAll());return;default:return}e.preventDefault(),r=Math.min(Math.max(r,0),t-1),this.active.set(r),this.hover.set(null),e.shiftKey?(this.anchor??=n,this.select(this.anchor,r)):this.anchor=r}indexAt(e){let t=e.target?.closest?.(`[data-index]`);if(t)return Number(t.getAttribute(`data-index`));let n=e.currentTarget?.getBoundingClientRect(),r=this.cycles().length;if(!n?.width||!r)return null;let i=(e.clientX-n.left)/n.width;return Math.min(Math.max(Math.floor(i*r),0),r-1)}startDrag(e){if(e.button!==0)return;let t=this.indexAt(e);t!==null&&(this.dragging=!0,this.anchor=t,this.active.set(t),this.select(t,t))}onPointerMove(e){let t=this.indexAt(e);this.hover.set(t),this.dragging&&t!==null&&this.anchor!==null&&(this.active.set(t),this.select(this.anchor,t))}endDrag(){this.dragging=!1}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-cd-cycle-chart`]],hostBindings:function(e,t){e&1&&H(`pointerup`,function(){return t.endDrag()},Ou)(`pointercancel`,function(){return t.endDrag()},Ou)},inputs:{cycles:[1,`cycles`],range:[1,`range`],slowMs:[1,`slowMs`]},outputs:{range:`rangeChange`},decls:69,vars:25,consts:[[1,`range`],[`type`,`number`,`inputmode`,`numeric`,3,`change`,`min`,`max`,`value`],[`type`,`button`],[1,`summary`],[1,`hint`,3,`id`],[1,`plot`],[`aria-hidden`,`true`,1,`axis`],[1,`tick`,`top`],[1,`tick`,`zero`],[1,`area`],[`aria-hidden`,`true`,1,`band`,3,`left`,`width`],[`aria-hidden`,`true`,1,`budget`],[`role`,`listbox`,`aria-multiselectable`,`true`,`aria-orientation`,`horizontal`,`tabindex`,`0`,1,`bars`,3,`keydown`,`focus`,`blur`,`pointerdown`,`pointermove`,`pointerleave`],[`role`,`option`,1,`col`,3,`id`,`over`,`out`,`active`],[`aria-hidden`,`true`,1,`tip`,3,`left`,`right`],[`aria-hidden`,`true`,1,`markers`],[3,`over`],[`aria-label`,`Chart key`,1,`legend`],[`aria-hidden`,`true`,1,`key`,`ok`],[`aria-hidden`,`true`,1,`key`,`over`],[`aria-hidden`,`true`,1,`key-marker`],[`aria-hidden`,`true`,1,`key`,`line`],[1,`table`],[`tabindex`,`0`,`role`,`region`,1,`table-wrap`],[1,`sr-only`],[`scope`,`col`,1,`num`],[`scope`,`col`],[`type`,`button`,3,`click`],[`aria-hidden`,`true`,1,`band`],[`role`,`option`,1,`col`,3,`id`],[1,`bar`],[`aria-hidden`,`true`,1,`tip`],[1,`tip-head`],[1,`flag`],[1,`tip-row`],[1,`mono`],[1,`mono`,`name`],[1,`num`]],template:function(e,t){if(e&1&&(R(0,`div`,0)(1,`label`)(2,`span`),K(3,`Start`),z(),R(4,`input`,1),U(`change`,function(e){return t.setEnd(`from`,e)}),z()(),R(5,`label`)(6,`span`),K(7,`End`),z(),R(8,`input`,1),U(`change`,function(e){return t.setEnd(`to`,e)}),z()(),A(9,Pk,2,0,`button`,2),R(10,`p`,3),K(11),z()(),R(12,`p`,4),K(13,` Drag across the bars to pick a range of cycles. With the chart focused, the arrow keys move between cycles, Shift with an arrow key extends the range, Enter picks one cycle and Escape shows all cycles again. `),z(),R(14,`div`,5)(15,`div`,6)(16,`span`,7),K(17),z(),R(18,`span`,8),K(19,`0 ms`),z()(),R(20,`div`,9),A(21,Fk,1,4,`div`,10),R(22,`div`,11)(23,`span`),K(24),z()(),R(25,`div`,12),U(`keydown`,function(e){return t.onKey(e)})(`focus`,function(){return t.onFocus()})(`blur`,function(){return t.focused.set(!1)})(`pointerdown`,function(e){return t.startDrag(e)})(`pointermove`,function(e){return t.onPointerMove(e)})(`pointerleave`,function(){return t.hover.set(null)}),M(26,Ik,2,12,`div`,13,Mk),z(),A(28,Bk,12,12,`div`,14),z()(),R(29,`div`,15),M(30,Vk,1,2,`span`,16,Mk),z(),R(32,`ul`,17)(33,`li`),fg(34,`span`,18),K(35,`Within budget`),z(),R(36,`li`),fg(37,`span`,19)(38,`span`,20),K(39,`Over budget `),z(),R(40,`li`),fg(41,`span`,21),K(42),z()(),R(43,`details`,22)(44,`summary`),K(45,`Show the cycles as a table`),z(),R(46,`div`,23)(47,`table`)(48,`caption`,24),K(49),z(),R(50,`thead`)(51,`tr`)(52,`th`,25),K(53,`Cycle`),z(),R(54,`th`,25),K(55,`Duration`),z(),R(56,`th`,26),K(57,`Budget`),z(),R(58,`th`,25),K(59,`Checks`),z(),R(60,`th`,25),K(61,`Passes`),z(),R(62,`th`,26),K(63,`After`),z(),R(64,`th`,26),K(65,`Slowest component`),z()()(),R(66,`tbody`),M(67,Uk,15,7,`tr`,null,Nk),z()()()()),e&2){let e,n;D(4),V(`min`,t.firstId())(`max`,t.lastId())(`value`,t.startId()),D(4),V(`min`,t.firstId())(`max`,t.lastId())(`value`,t.endId()),D(),j(t.range()?9:-1),D(2),q(t.summary()),D(),V(`id`,t.hintId),D(2),G(`flush`,t.bars().length>t.gapUntil),D(3),q(t.fmt(t.max())),D(4),j((e=t.band())?21:-1,e),D(),n_(`bottom`,t.budgetAt(),`%`),D(2),q(t.budgetLabel()),D(),k(`aria-label`,`Change detection cycles, `+t.summary())(`aria-describedby`,t.hintId)(`aria-activedescendant`,t.activeOptionId()),D(),N(t.bars()),D(2),j((n=t.tip())?28:-1,n),D(),G(`flush`,t.bars().length>t.gapUntil),D(),N(t.bars()),D(12),q(t.budgetLabel()),D(4),k(`aria-label`,t.tableLabel()),D(3),J(` `,t.tableLabel(),` `),D(18),N(t.selected())}},styles:[`[_nghost-%COMP%] { +}`]})},jk=(e,t)=>t.cycle.id,Mk=(e,t)=>t.id;function Nk(e,t){if(e&1){let e=B();R(0,`button`,27),U(`click`,function(){return S(e),C(W().showAll())}),K(1,`Show all cycles`),z()}}function Pk(e,t){if(e&1&&pg(0,`div`,28),e&2){let e=t;r_(`left`,e.left,`%`)(`width`,e.width,`%`)}}function Fk(e,t){if(e&1&&(R(0,`div`,29),pg(1,`span`,30),z()),e&2){let e=t.$implicit,n=W();G(`over`,e.over)(`out`,!n.inRange(e.index)&&!!n.range())(`active`,n.focused()&&n.active()===e.index),V(`id`,n.optionId(e.index)),k(`data-index`,e.index)(`aria-selected`,n.inRange(e.index))(`aria-label`,e.label),D(),r_(`height`,e.height,`%`)}}function Ik(e,t){e&1&&(R(0,`span`,33),K(1,`over budget`),z())}function Lk(e,t){if(e&1&&(R(0,`p`),K(1,` after `),R(2,`span`,35),K(3),z()()),e&2){let e=W();D(3),q(e.cycle.trigger)}}function Rk(e,t){if(e&1&&(R(0,`p`,34)(1,`span`,36),K(2),z(),R(3,`span`),K(4),z()()),e&2){let e=t.$implicit,n=W(2);D(2),q(e.name),D(2),q(n.fmt(e.ms))}}function zk(e,t){if(e&1&&(R(0,`div`,31)(1,`p`,32)(2,`strong`),K(3),z(),R(4,`span`),K(5),z(),A(6,Ik,2,0,`span`,33),z(),A(7,Lk,4,1,`p`),R(8,`p`),K(9),z(),M(10,Rk,5,2,`p`,34,tg),z()),e&2){let e=t,n=W();r_(`left`,e.left)(`right`,e.right),D(3),q(n.fmt(e.cycle.ms)),D(2),J(`cycle `,e.cycle.id),D(),j(e.over?6:-1),D(),j(e.cycle.trigger?7:-1),D(2),A_(` `,e.cycle.checks,` `,e.cycle.checks===1?`check`:`checks`,`, `,e.cycle.passes,` `,e.cycle.passes===1?`pass`:`passes`,` `),D(),N(e.top)}}function Bk(e,t){if(e&1&&pg(0,`span`),e&2){let e=t.$implicit;G(`over`,e.over)}}function Vk(e,t){if(e&1&&K(0),e&2){let e=t,n=W(2);Y(` `,e.name,` (`,n.fmt(e.ms),`) `)}}function Hk(e,t){if(e&1&&(R(0,`tr`)(1,`td`,37),K(2),z(),R(3,`td`,37),K(4),z(),R(5,`td`),K(6),z(),R(7,`td`,37),K(8),z(),R(9,`td`,37),K(10),z(),R(11,`td`,35),K(12),z(),R(13,`td`,35),A(14,Vk,1,2),z()()),e&2){let e,n=t.$implicit,r=W();D(2),q(n.id),D(2),q(r.fmt(n.ms)),D(2),q(r.isOver(n)?`Over`:`Within`),D(2),q(n.checks),D(2),q(n.passes),D(2),q(n.trigger??``),D(2),j((e=n.components[0])?14:-1,e)}}var Uk=0,Wk=80,Gk=10,Kk=class e{cycles=$([]);range=hv(null);slowMs=$(16);gapUntil=Wk;budgetLabel=X(()=>`${this.slowMs()} ms budget`);uid=`cd-chart-${Uk++}`;hintId=`${this.uid}-hint`;active=T(null);anchor=null;dragging=!1;hover=T(null);focused=T(!1);max=X(()=>ik(this.cycles(),this.slowMs()));budgetAt=X(()=>this.slowMs()/this.max()*100);bars=X(()=>{let e=this.max();return this.cycles().map((t,n)=>({cycle:t,index:n,height:t.ms/e*100,over:ek(t,this.slowMs()),label:this.describe(t)}))});firstId=X(()=>this.cycles()[0]?.id??0);lastId=X(()=>this.cycles().at(-1)?.id??0);span=X(()=>{let e=this.range();if(!e)return null;let t=this.cycles(),n=Math.min(e.from,e.to),r=Math.max(e.from,e.to),i=t.findIndex(e=>e.id>=n),a=-1;for(let e=t.length-1;e>=0;e--)if(t[e].id<=r){a=e;break}return i<0||ank(this.cycles(),this.range()));startId=X(()=>this.selected()[0]?.id??``);endId=X(()=>this.selected().at(-1)?.id??``);band=X(()=>{let e=this.span(),t=this.cycles().length;return!e||!t?null:{left:e.start/t*100,width:(e.end-e.start+1)/t*100}});summary=X(()=>{let e=this.selected(),t=this.slowMs(),n=e.filter(e=>ek(e,t)).length;return`${this.span()?e.length===1?`Cycle ${e[0].id}`:`Cycles ${e[0].id} to ${e.at(-1).id} (${e.length})`:`All ${e.length} ${e.length===1?`cycle`:`cycles`}`}. ${n} over the ${t} ms budget.`});tableLabel=X(()=>this.span()?`Picked cycles, ${this.summary()}`:`All recorded cycles`);activeOptionId=X(()=>{let e=this.active();return this.focused()&&e!==null&&e{let e=this.hover()??(this.focused()?this.active():null),t=e===null?void 0:this.cycles()[e];return!t||e===null?null:{cycle:t,over:ek(t,this.slowMs()),top:t.components.slice(0,3),...this.tipSide(e)}});tipSide(e){let t=this.cycles().length;return e+.5=t.start&&e<=t.end}describe(e){let t=[`Cycle ${e.id}`,tk(e.ms)];ek(e,this.slowMs())&&t.push(`over budget`),e.trigger&&t.push(`after ${e.trigger}`),t.push(`${e.checks} ${e.checks===1?`check`:`checks`}`);let n=e.components[0];return n&&t.push(`slowest ${n.name} ${tk(n.ms)}`),t.join(`, `)}select(e,t){let n=this.cycles(),r=n[Math.min(e,t)],i=n[Math.max(e,t)];r&&i&&this.range.set({from:r.id,to:i.id})}showAll(){this.range.set(null),this.anchor=null}setEnd(e,t){if(!this.cycles().length)return;let n=t.target,r=Number.parseInt(n.value,10);if(Number.isNaN(r)){n.value=String(e===`from`?this.startId():this.endId());return}let i=Math.min(Math.max(r,this.firstId()),this.lastId()),a=this.selected(),o=e===`from`?i:a[0]?.id??this.firstId(),s=e===`to`?i:a.at(-1)?.id??this.lastId();this.range.set({from:Math.min(o,s),to:Math.max(o,s)}),n.value=String(e===`from`?Math.min(o,s):Math.max(o,s))}onFocus(){this.focused.set(!0),(this.active()===null||this.active()>=this.cycles().length)&&this.active.set(this.span()?.start??Math.max(this.cycles().length-1,0)),this.anchor??=this.active()}onKey(e){let t=this.cycles().length;if(!t)return;let n=Math.min(this.active()??t-1,t-1),r=null;switch(e.key){case`ArrowRight`:case`ArrowDown`:r=n+1;break;case`ArrowLeft`:case`ArrowUp`:r=n-1;break;case`PageDown`:r=n+Gk;break;case`PageUp`:r=n-Gk;break;case`Home`:r=0;break;case`End`:r=t-1;break;case`Enter`:case` `:e.preventDefault(),this.anchor=n,this.select(n,n);return;case`Escape`:this.range()&&(e.preventDefault(),this.showAll());return;default:return}e.preventDefault(),r=Math.min(Math.max(r,0),t-1),this.active.set(r),this.hover.set(null),e.shiftKey?(this.anchor??=n,this.select(this.anchor,r)):this.anchor=r}indexAt(e){let t=e.target?.closest?.(`[data-index]`);if(t)return Number(t.getAttribute(`data-index`));let n=e.currentTarget?.getBoundingClientRect(),r=this.cycles().length;if(!n?.width||!r)return null;let i=(e.clientX-n.left)/n.width;return Math.min(Math.max(Math.floor(i*r),0),r-1)}startDrag(e){if(e.button!==0)return;let t=this.indexAt(e);t!==null&&(this.dragging=!0,this.anchor=t,this.active.set(t),this.select(t,t))}onPointerMove(e){let t=this.indexAt(e);this.hover.set(t),this.dragging&&t!==null&&this.anchor!==null&&(this.active.set(t),this.select(this.anchor,t))}endDrag(){this.dragging=!1}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-cd-cycle-chart`]],hostBindings:function(e,t){e&1&&H(`pointerup`,function(){return t.endDrag()},ku)(`pointercancel`,function(){return t.endDrag()},ku)},inputs:{cycles:[1,`cycles`],range:[1,`range`],slowMs:[1,`slowMs`]},outputs:{range:`rangeChange`},decls:69,vars:25,consts:[[1,`range`],[`type`,`number`,`inputmode`,`numeric`,3,`change`,`min`,`max`,`value`],[`type`,`button`],[1,`summary`],[1,`hint`,3,`id`],[1,`plot`],[`aria-hidden`,`true`,1,`axis`],[1,`tick`,`top`],[1,`tick`,`zero`],[1,`area`],[`aria-hidden`,`true`,1,`band`,3,`left`,`width`],[`aria-hidden`,`true`,1,`budget`],[`role`,`listbox`,`aria-multiselectable`,`true`,`aria-orientation`,`horizontal`,`tabindex`,`0`,1,`bars`,3,`keydown`,`focus`,`blur`,`pointerdown`,`pointermove`,`pointerleave`],[`role`,`option`,1,`col`,3,`id`,`over`,`out`,`active`],[`aria-hidden`,`true`,1,`tip`,3,`left`,`right`],[`aria-hidden`,`true`,1,`markers`],[3,`over`],[`aria-label`,`Chart key`,1,`legend`],[`aria-hidden`,`true`,1,`key`,`ok`],[`aria-hidden`,`true`,1,`key`,`over`],[`aria-hidden`,`true`,1,`key-marker`],[`aria-hidden`,`true`,1,`key`,`line`],[1,`table`],[`tabindex`,`0`,`role`,`region`,1,`table-wrap`],[1,`sr-only`],[`scope`,`col`,1,`num`],[`scope`,`col`],[`type`,`button`,3,`click`],[`aria-hidden`,`true`,1,`band`],[`role`,`option`,1,`col`,3,`id`],[1,`bar`],[`aria-hidden`,`true`,1,`tip`],[1,`tip-head`],[1,`flag`],[1,`tip-row`],[1,`mono`],[1,`mono`,`name`],[1,`num`]],template:function(e,t){if(e&1&&(R(0,`div`,0)(1,`label`)(2,`span`),K(3,`Start`),z(),R(4,`input`,1),U(`change`,function(e){return t.setEnd(`from`,e)}),z()(),R(5,`label`)(6,`span`),K(7,`End`),z(),R(8,`input`,1),U(`change`,function(e){return t.setEnd(`to`,e)}),z()(),A(9,Nk,2,0,`button`,2),R(10,`p`,3),K(11),z()(),R(12,`p`,4),K(13,` Drag across the bars to pick a range of cycles. With the chart focused, the arrow keys move between cycles, Shift with an arrow key extends the range, Enter picks one cycle and Escape shows all cycles again. `),z(),R(14,`div`,5)(15,`div`,6)(16,`span`,7),K(17),z(),R(18,`span`,8),K(19,`0 ms`),z()(),R(20,`div`,9),A(21,Pk,1,4,`div`,10),R(22,`div`,11)(23,`span`),K(24),z()(),R(25,`div`,12),U(`keydown`,function(e){return t.onKey(e)})(`focus`,function(){return t.onFocus()})(`blur`,function(){return t.focused.set(!1)})(`pointerdown`,function(e){return t.startDrag(e)})(`pointermove`,function(e){return t.onPointerMove(e)})(`pointerleave`,function(){return t.hover.set(null)}),M(26,Fk,2,12,`div`,13,jk),z(),A(28,zk,12,12,`div`,14),z()(),R(29,`div`,15),M(30,Bk,1,2,`span`,16,jk),z(),R(32,`ul`,17)(33,`li`),pg(34,`span`,18),K(35,`Within budget`),z(),R(36,`li`),pg(37,`span`,19)(38,`span`,20),K(39,`Over budget `),z(),R(40,`li`),pg(41,`span`,21),K(42),z()(),R(43,`details`,22)(44,`summary`),K(45,`Show the cycles as a table`),z(),R(46,`div`,23)(47,`table`)(48,`caption`,24),K(49),z(),R(50,`thead`)(51,`tr`)(52,`th`,25),K(53,`Cycle`),z(),R(54,`th`,25),K(55,`Duration`),z(),R(56,`th`,26),K(57,`Budget`),z(),R(58,`th`,25),K(59,`Checks`),z(),R(60,`th`,25),K(61,`Passes`),z(),R(62,`th`,26),K(63,`After`),z(),R(64,`th`,26),K(65,`Slowest component`),z()()(),R(66,`tbody`),M(67,Hk,15,7,`tr`,null,Mk),z()()()()),e&2){let e,n;D(4),V(`min`,t.firstId())(`max`,t.lastId())(`value`,t.startId()),D(4),V(`min`,t.firstId())(`max`,t.lastId())(`value`,t.endId()),D(),j(t.range()?9:-1),D(2),q(t.summary()),D(),V(`id`,t.hintId),D(2),G(`flush`,t.bars().length>t.gapUntil),D(3),q(t.fmt(t.max())),D(4),j((e=t.band())?21:-1,e),D(),r_(`bottom`,t.budgetAt(),`%`),D(2),q(t.budgetLabel()),D(),k(`aria-label`,`Change detection cycles, `+t.summary())(`aria-describedby`,t.hintId)(`aria-activedescendant`,t.activeOptionId()),D(),N(t.bars()),D(2),j((n=t.tip())?28:-1,n),D(),G(`flush`,t.bars().length>t.gapUntil),D(),N(t.bars()),D(12),q(t.budgetLabel()),D(4),k(`aria-label`,t.tableLabel()),D(3),J(` `,t.tableLabel(),` `),D(18),N(t.selected())}},styles:[`[_nghost-%COMP%] { display: block; min-width: 0; } @@ -1335,7 +1335,7 @@ td.mono[_ngcontent-%COMP%] { .bar[_ngcontent-%COMP%] { transition: none; } -}`]})},Jk=(e,t)=>t.id,Yk=(e,t)=>t.index,Xk=(e,t)=>t.kind;function Zk(e,t){if(e&1&&(R(0,`p`,0),K(1),z()),e&2){let e=W(2);D(),Y(` Pick `,e.max,` cycles or fewer to see their spans. `,e.count(),` are picked. `)}}function Qk(e,t){if(e&1&&(R(0,`span`),K(1),z()),e&2){let e=t.$implicit;n_(`left`,e.x,`%`)(`width`,e.w,`%`),D(),J(`cycle `,e.id)}}function $k(e,t){if(e&1){let e=B();R(0,`button`,11),U(`focus`,function(){let t=S(e).$implicit;return C(W(3).current.set(t.index))})(`mouseenter`,function(){let t=S(e).$implicit;return C(W(3).hover.set(t.index))})(`mouseleave`,function(){return S(e),C(W(3).hover.set(null))})(`click`,function(){let t=S(e).$implicit;return C(W(3).choose(t))}),R(1,`span`,12),K(2),z()()}if(e&2){let e=t.$implicit,n=W(3);r_(R_(`block kind-`,e.kind)),n_(`left`,e.x,`%`)(`width`,e.w,`%`)(`top`,e.depth*n.row,`px`),G(`narrow`,e.w<4),k(`tabindex`,e.index===n.tabStop()?0:-1)(`data-index`,e.index)(`aria-label`,n.describe(e))(`aria-disabled`,e.component?null:`true`),D(2),q(e.name)}}function eA(e,t){if(e&1&&(R(0,`li`),fg(1,`span`,13),K(2),z()),e&2){let e=t.$implicit;D(),r_(R_(`key kind-`,e.kind)),D(),q(e.label)}}function tA(e,t){if(e&1&&(R(0,`p`,0),K(1),z()),e&2){let e=W(3);D(),Y(` Each cycle keeps its longest spans. `,e.dropped(),` shorter `,e.dropped()===1?`span was`:`spans were`,` left out. `)}}function nA(e,t){if(e&1&&(R(0,`tr`)(1,`td`,17),K(2),z(),R(3,`td`,18),K(4),z(),R(5,`td`),K(6),z(),R(7,`td`,17),K(8),z(),R(9,`td`,17),K(10),z(),R(11,`td`,17),K(12),z(),R(13,`td`,17),K(14),z()()),e&2){let e=t.$implicit,n=W(4);D(2),q(e.cycleId),D(),n_(`padding-left`,6+e.depth*8,`px`),D(),q(e.name),D(2),q(n.kindLabel(e)),D(2),q(e.depth),D(2),q(n.fmt(e.start)),D(2),q(n.fmt(e.ms)),D(2),q(n.fmt(e.selfMs))}}function rA(e,t){if(e&1&&(R(0,`div`,10)(1,`table`)(2,`caption`,14),K(3),z(),R(4,`thead`)(5,`tr`)(6,`th`,15),K(7,`Cycle`),z(),R(8,`th`,16),K(9,`Span`),z(),R(10,`th`,16),K(11,`Kind`),z(),R(12,`th`,15),K(13,`Depth`),z(),R(14,`th`,15),K(15,`Start`),z(),R(16,`th`,15),K(17,`Total`),z(),R(18,`th`,15),K(19,`Self`),z()()(),R(20,`tbody`),M(21,nA,15,9,`tr`,null,Yk),z()()()),e&2){let e=W(),t=W(2);k(`aria-label`,t.tableLabel()),D(3),J(` `,t.tableLabel(),` `),D(18),N(e.blocks)}}function iA(e,t){if(e&1){let e=B();R(0,`div`,1),U(`keydown`,function(t){return S(e),C(W(2).onKey(t))}),R(1,`div`,2),M(2,Qk,2,5,`span`,3,Jk),z(),R(4,`div`,4),M(5,$k,3,16,`button`,5,Yk),z()(),R(7,`p`,6),K(8),z(),R(9,`ul`,7),M(10,eA,3,4,`li`,null,Xk),z(),R(12,`p`,8),K(13,` Arrow keys move along a row, Up goes to the enclosing span and Down to the first nested one. Enter on a component shows it in the tree. `),z(),A(14,tA,2,2,`p`,0),R(15,`details`,9),U(`toggle`,function(t){return S(e),C(W(2).onToggle(t))}),R(16,`summary`),K(17,`Show the spans as a table`),z(),A(18,rA,23,2,`div`,10),z()}if(e&2){let e=t,n=W(2);k(`aria-label`,n.label()),D(2),N(e.cycles),D(2),n_(`height`,e.depth*n.row,`px`),D(),N(e.blocks),D(3),q(n.readout()),D(2),N(n.kinds),D(4),j(n.dropped()?14:-1),D(4),j(n.tableOpen()?18:-1)}}function aA(e,t){if(e&1&&(R(0,`h3`),K(1,`Spans in the picked cycles`),z(),A(2,Zk,2,2,`p`,0)(3,iA,19,6)),e&2){let e,t=W();D(2),j(t.tooMany()?2:(e=t.graph())?3:-1,e)}}var oA=22;function sA(e,t){for(let n=e.length-1;n>=0;n--)if(t(e[n]))return e[n]}var cA=class e{cycles=$([]);names=$([]);scope=$(`the recording`);pick=lv();row=oA;max=30;kinds=[`c`,`h`,`r`,`o`].map(e=>({kind:e,label:sk[e]}));current=T(0);tableOpen=T(!1);hover=T(null);hasSpans=X(()=>this.cycles().some(e=>e.spans?.length));count=X(()=>this.cycles().length);tooMany=X(()=>this.count()>30);graph=X(()=>this.tooMany()?null:lk(this.cycles(),this.names()));tabStop=X(()=>Math.min(this.current(),Math.max((this.graph()?.blocks.length??1)-1,0)));dropped=X(()=>this.graph()?.cycles.reduce((e,t)=>e+t.droppedSpans,0)??0);label=X(()=>`Spans in ${this.scope()} over time, nested by depth. Pick a component to show it in the tree.`);readout=X(()=>{let e=(this.graph()?.blocks??[])[this.hover()??this.tabStop()];return e?this.describe(e):``});tableLabel=X(()=>`Timed spans in ${this.scope()}`);fmt(e){return nk(e)}kindLabel(e){return sk[e.kind]}onToggle(e){this.tableOpen.set(e.target.open)}describe(e){let t=[e.name,sk[e.kind],`${nk(e.ms)} total`];return e.selfMs!==e.ms&&t.push(`${nk(e.selfMs)} self`),t.push(e.start<0?`cycle ${e.cycleId}, ${nk(-e.start)} before it started`:`cycle ${e.cycleId} at ${nk(e.start)}`),t.join(`, `)}choose(e){this.current.set(e.index),e.component&&this.pick.emit(e.component)}onKey(e){let t=this.graph()?.blocks??[];if(!t.length)return;let n=t[this.tabStop()],r;switch(e.key){case`ArrowRight`:r=t.find(e=>e.index>n.index&&e.depth===n.depth);break;case`ArrowLeft`:r=sA(t,e=>e.indexe.indexe.parent===n.index)??t.find(e=>e.index>n.index&&e.depth===n.depth+1);break;case`Home`:r=t[0];break;case`End`:r=t.at(-1);break;default:return}e.preventDefault(),this.hover.set(null),r&&(this.current.set(r.index),e.currentTarget.querySelector(`button[data-index="${r.index}"]`)?.focus())}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-cd-flame-graph`]],inputs:{cycles:[1,`cycles`],names:[1,`names`],scope:[1,`scope`]},outputs:{pick:`pick`},decls:1,vars:1,consts:[[1,`note`],[`role`,`group`,1,`flame`,3,`keydown`],[`aria-hidden`,`true`,1,`cycles`],[3,`left`,`width`],[1,`rows`],[`type`,`button`,3,`class`,`narrow`,`left`,`width`,`top`],[`aria-hidden`,`true`,1,`readout`],[`aria-label`,`Span kinds`,1,`legend`],[1,`hint`],[1,`table`,3,`toggle`],[`tabindex`,`0`,`role`,`region`,1,`table-wrap`],[`type`,`button`,3,`focus`,`mouseenter`,`mouseleave`,`click`],[1,`text`],[`aria-hidden`,`true`],[1,`sr-only`],[`scope`,`col`,1,`num`],[`scope`,`col`],[1,`num`],[1,`mono`]],template:function(e,t){e&1&&A(0,aA,4,1),e&2&&j(t.hasSpans()?0:-1)},styles:[`[_nghost-%COMP%] { +}`]})},qk=(e,t)=>t.id,Jk=(e,t)=>t.index,Yk=(e,t)=>t.kind;function Xk(e,t){if(e&1&&(R(0,`p`,0),K(1),z()),e&2){let e=W(2);D(),Y(` Pick `,e.max,` cycles or fewer to see their spans. `,e.count(),` are picked. `)}}function Zk(e,t){if(e&1&&(R(0,`span`),K(1),z()),e&2){let e=t.$implicit;r_(`left`,e.x,`%`)(`width`,e.w,`%`),D(),J(`cycle `,e.id)}}function Qk(e,t){if(e&1){let e=B();R(0,`button`,11),U(`focus`,function(){let t=S(e).$implicit;return C(W(3).current.set(t.index))})(`mouseenter`,function(){let t=S(e).$implicit;return C(W(3).hover.set(t.index))})(`mouseleave`,function(){return S(e),C(W(3).hover.set(null))})(`click`,function(){let t=S(e).$implicit;return C(W(3).choose(t))}),R(1,`span`,12),K(2),z()()}if(e&2){let e=t.$implicit,n=W(3);i_(z_(`block kind-`,e.kind)),r_(`left`,e.x,`%`)(`width`,e.w,`%`)(`top`,e.depth*n.row,`px`),G(`narrow`,e.w<4),k(`tabindex`,e.index===n.tabStop()?0:-1)(`data-index`,e.index)(`aria-label`,n.describe(e))(`aria-disabled`,e.component?null:`true`),D(2),q(e.name)}}function $k(e,t){if(e&1&&(R(0,`li`),pg(1,`span`,13),K(2),z()),e&2){let e=t.$implicit;D(),i_(z_(`key kind-`,e.kind)),D(),q(e.label)}}function eA(e,t){if(e&1&&(R(0,`p`,0),K(1),z()),e&2){let e=W(3);D(),Y(` Each cycle keeps its longest spans. `,e.dropped(),` shorter `,e.dropped()===1?`span was`:`spans were`,` left out. `)}}function tA(e,t){if(e&1&&(R(0,`tr`)(1,`td`,17),K(2),z(),R(3,`td`,18),K(4),z(),R(5,`td`),K(6),z(),R(7,`td`,17),K(8),z(),R(9,`td`,17),K(10),z(),R(11,`td`,17),K(12),z(),R(13,`td`,17),K(14),z()()),e&2){let e=t.$implicit,n=W(4);D(2),q(e.cycleId),D(),r_(`padding-left`,6+e.depth*8,`px`),D(),q(e.name),D(2),q(n.kindLabel(e)),D(2),q(e.depth),D(2),q(n.fmt(e.start)),D(2),q(n.fmt(e.ms)),D(2),q(n.fmt(e.selfMs))}}function nA(e,t){if(e&1&&(R(0,`div`,10)(1,`table`)(2,`caption`,14),K(3),z(),R(4,`thead`)(5,`tr`)(6,`th`,15),K(7,`Cycle`),z(),R(8,`th`,16),K(9,`Span`),z(),R(10,`th`,16),K(11,`Kind`),z(),R(12,`th`,15),K(13,`Depth`),z(),R(14,`th`,15),K(15,`Start`),z(),R(16,`th`,15),K(17,`Total`),z(),R(18,`th`,15),K(19,`Self`),z()()(),R(20,`tbody`),M(21,tA,15,9,`tr`,null,Jk),z()()()),e&2){let e=W(),t=W(2);k(`aria-label`,t.tableLabel()),D(3),J(` `,t.tableLabel(),` `),D(18),N(e.blocks)}}function rA(e,t){if(e&1){let e=B();R(0,`div`,1),U(`keydown`,function(t){return S(e),C(W(2).onKey(t))}),R(1,`div`,2),M(2,Zk,2,5,`span`,3,qk),z(),R(4,`div`,4),M(5,Qk,3,16,`button`,5,Jk),z()(),R(7,`p`,6),K(8),z(),R(9,`ul`,7),M(10,$k,3,4,`li`,null,Yk),z(),R(12,`p`,8),K(13,` Arrow keys move along a row, Up goes to the enclosing span and Down to the first nested one. Enter on a component shows it in the tree. `),z(),A(14,eA,2,2,`p`,0),R(15,`details`,9),U(`toggle`,function(t){return S(e),C(W(2).onToggle(t))}),R(16,`summary`),K(17,`Show the spans as a table`),z(),A(18,nA,23,2,`div`,10),z()}if(e&2){let e=t,n=W(2);k(`aria-label`,n.label()),D(2),N(e.cycles),D(2),r_(`height`,e.depth*n.row,`px`),D(),N(e.blocks),D(3),q(n.readout()),D(2),N(n.kinds),D(4),j(n.dropped()?14:-1),D(4),j(n.tableOpen()?18:-1)}}function iA(e,t){if(e&1&&(R(0,`h3`),K(1,`Spans in the picked cycles`),z(),A(2,Xk,2,2,`p`,0)(3,rA,19,6)),e&2){let e,t=W();D(2),j(t.tooMany()?2:(e=t.graph())?3:-1,e)}}var aA=22;function oA(e,t){for(let n=e.length-1;n>=0;n--)if(t(e[n]))return e[n]}var sA=class e{cycles=$([]);names=$([]);scope=$(`the recording`);pick=uv();row=aA;max=30;kinds=[`c`,`h`,`r`,`o`].map(e=>({kind:e,label:ok[e]}));current=T(0);tableOpen=T(!1);hover=T(null);hasSpans=X(()=>this.cycles().some(e=>e.spans?.length));count=X(()=>this.cycles().length);tooMany=X(()=>this.count()>30);graph=X(()=>this.tooMany()?null:ck(this.cycles(),this.names()));tabStop=X(()=>Math.min(this.current(),Math.max((this.graph()?.blocks.length??1)-1,0)));dropped=X(()=>this.graph()?.cycles.reduce((e,t)=>e+t.droppedSpans,0)??0);label=X(()=>`Spans in ${this.scope()} over time, nested by depth. Pick a component to show it in the tree.`);readout=X(()=>{let e=(this.graph()?.blocks??[])[this.hover()??this.tabStop()];return e?this.describe(e):``});tableLabel=X(()=>`Timed spans in ${this.scope()}`);fmt(e){return tk(e)}kindLabel(e){return ok[e.kind]}onToggle(e){this.tableOpen.set(e.target.open)}describe(e){let t=[e.name,ok[e.kind],`${tk(e.ms)} total`];return e.selfMs!==e.ms&&t.push(`${tk(e.selfMs)} self`),t.push(e.start<0?`cycle ${e.cycleId}, ${tk(-e.start)} before it started`:`cycle ${e.cycleId} at ${tk(e.start)}`),t.join(`, `)}choose(e){this.current.set(e.index),e.component&&this.pick.emit(e.component)}onKey(e){let t=this.graph()?.blocks??[];if(!t.length)return;let n=t[this.tabStop()],r;switch(e.key){case`ArrowRight`:r=t.find(e=>e.index>n.index&&e.depth===n.depth);break;case`ArrowLeft`:r=oA(t,e=>e.indexe.indexe.parent===n.index)??t.find(e=>e.index>n.index&&e.depth===n.depth+1);break;case`Home`:r=t[0];break;case`End`:r=t.at(-1);break;default:return}e.preventDefault(),this.hover.set(null),r&&(this.current.set(r.index),e.currentTarget.querySelector(`button[data-index="${r.index}"]`)?.focus())}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-cd-flame-graph`]],inputs:{cycles:[1,`cycles`],names:[1,`names`],scope:[1,`scope`]},outputs:{pick:`pick`},decls:1,vars:1,consts:[[1,`note`],[`role`,`group`,1,`flame`,3,`keydown`],[`aria-hidden`,`true`,1,`cycles`],[3,`left`,`width`],[1,`rows`],[`type`,`button`,3,`class`,`narrow`,`left`,`width`,`top`],[`aria-hidden`,`true`,1,`readout`],[`aria-label`,`Span kinds`,1,`legend`],[1,`hint`],[1,`table`,3,`toggle`],[`tabindex`,`0`,`role`,`region`,1,`table-wrap`],[`type`,`button`,3,`focus`,`mouseenter`,`mouseleave`,`click`],[1,`text`],[`aria-hidden`,`true`],[1,`sr-only`],[`scope`,`col`,1,`num`],[`scope`,`col`],[1,`num`],[1,`mono`]],template:function(e,t){e&1&&A(0,iA,4,1),e&2&&j(t.hasSpans()?0:-1)},styles:[`[_nghost-%COMP%] { display: block; min-width: 0; } @@ -1542,7 +1542,7 @@ td.mono[_ngcontent-%COMP%] { .num[_ngcontent-%COMP%] { text-align: right; font-variant-numeric: tabular-nums; -}`]})};function lA(e,t){if(e&1&&(R(0,`tr`)(1,`td`,5),K(2),z(),R(3,`td`,6),K(4),z(),R(5,`td`,6),K(6),z(),R(7,`td`,6),K(8),z()()),e&2){let e=t.$implicit,n=W(3);D(2),Y(``,e.name,`.`,e.hook),D(2),q(e.calls),D(2),q(n.ms(e.ms)),D(2),q(n.ms(e.maxMs))}}function uA(e,t){if(e&1&&(R(0,`div`)(1,`h3`),K(2,`Lifecycle hooks`),z(),R(3,`table`)(4,`thead`)(5,`tr`)(6,`th`,3),K(7,`Hook`),z(),R(8,`th`,4),K(9,`Calls`),z(),R(10,`th`,4),K(11,`Time`),z(),R(12,`th`,4),K(13,`Slowest`),z()()(),R(14,`tbody`),M(15,lA,9,5,`tr`,null,eg),z()()()),e&2){let e=W(2);D(15),N(e.hooks())}}function dA(e,t){if(e&1&&K(0),e&2){let e=W().$implicit;J(` (`,e.listener,`) `)}}function fA(e,t){if(e&1&&(R(0,`tr`)(1,`td`,5),K(2),A(3,dA,1,1),z(),R(4,`td`,6),K(5),z(),R(6,`td`,6),K(7),z(),R(8,`td`,6),K(9),z()()),e&2){let e=t.$implicit,n=W(3);D(2),J(` `,e.name,` `),D(),j(e.listener?3:-1),D(2),q(e.calls),D(2),q(n.ms(e.ms)),D(2),q(n.ms(e.maxMs))}}function pA(e,t){if(e&1&&(R(0,`div`)(1,`h3`),K(2,`Output listeners`),z(),R(3,`table`)(4,`thead`)(5,`tr`)(6,`th`,3),K(7,`Listener`),z(),R(8,`th`,4),K(9,`Calls`),z(),R(10,`th`,4),K(11,`Time`),z(),R(12,`th`,4),K(13,`Slowest`),z()()(),R(14,`tbody`),M(15,fA,10,5,`tr`,null,eg),z()()()),e&2){let e=W(2);D(15),N(e.outputs())}}function mA(e,t){if(e&1&&(R(0,`p`,1),K(1),z()),e&2){let e=t,n=W(2);D(),k_(` afterRender callbacks ran `,e.runs,` `,e.runs===1?`time`:`times`,`, `,n.ms(e.ms),` in total, slowest `,n.ms(e.maxMs),`. `)}}function hA(e,t){if(e&1&&(R(0,`p`,2),K(1),z()),e&2){let e=W(2);D(),Y(` `,e.dropped(),` more hook or output `,e.dropped()===1?`row is`:`rows are`,` left out. A recording lists at most 100 of each. `)}}function gA(e,t){if(e&1&&(R(0,`div`,0),A(1,uA,17,0,`div`),A(2,pA,17,0,`div`),z(),A(3,mA,2,4,`p`,1),A(4,hA,2,2,`p`,2)),e&2){let e,t=W();D(),j(t.hooks().length?1:-1),D(),j(t.outputs().length?2:-1),D(),j((e=t.afterRender())?3:-1,e),D(),j(t.dropped()?4:-1)}}var _A=10;function vA(e){return`${e<10?e.toFixed(2):Math.round(e)} ms`}var yA=class e{page=$(null);hooks=X(()=>(this.page()?.hooks??[]).slice(0,_A));outputs=X(()=>(this.page()?.outputs??[]).slice(0,_A));afterRender=X(()=>{let e=this.page()?.afterRender;return e?.runs?e:null});dropped=X(()=>this.page()?.droppedTimings??0);ms(e){return vA(e)}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-cd-timing`]],inputs:{page:[1,`page`]},decls:1,vars:1,consts:[[1,`timing`],[1,`after-render`],[1,`note`],[`scope`,`col`],[`scope`,`col`,1,`num`],[1,`mono`],[1,`num`]],template:function(e,t){e&1&&A(0,gA,5,4),e&2&&j(t.hooks().length||t.outputs().length||t.afterRender()?0:-1)},styles:[`[_nghost-%COMP%] { +}`]})};function cA(e,t){if(e&1&&(R(0,`tr`)(1,`td`,5),K(2),z(),R(3,`td`,6),K(4),z(),R(5,`td`,6),K(6),z(),R(7,`td`,6),K(8),z()()),e&2){let e=t.$implicit,n=W(3);D(2),Y(``,e.name,`.`,e.hook),D(2),q(e.calls),D(2),q(n.ms(e.ms)),D(2),q(n.ms(e.maxMs))}}function lA(e,t){if(e&1&&(R(0,`div`)(1,`h3`),K(2,`Lifecycle hooks`),z(),R(3,`table`)(4,`thead`)(5,`tr`)(6,`th`,3),K(7,`Hook`),z(),R(8,`th`,4),K(9,`Calls`),z(),R(10,`th`,4),K(11,`Time`),z(),R(12,`th`,4),K(13,`Slowest`),z()()(),R(14,`tbody`),M(15,cA,9,5,`tr`,null,tg),z()()()),e&2){let e=W(2);D(15),N(e.hooks())}}function uA(e,t){if(e&1&&K(0),e&2){let e=W().$implicit;J(` (`,e.listener,`) `)}}function dA(e,t){if(e&1&&(R(0,`tr`)(1,`td`,5),K(2),A(3,uA,1,1),z(),R(4,`td`,6),K(5),z(),R(6,`td`,6),K(7),z(),R(8,`td`,6),K(9),z()()),e&2){let e=t.$implicit,n=W(3);D(2),J(` `,e.name,` `),D(),j(e.listener?3:-1),D(2),q(e.calls),D(2),q(n.ms(e.ms)),D(2),q(n.ms(e.maxMs))}}function fA(e,t){if(e&1&&(R(0,`div`)(1,`h3`),K(2,`Output listeners`),z(),R(3,`table`)(4,`thead`)(5,`tr`)(6,`th`,3),K(7,`Listener`),z(),R(8,`th`,4),K(9,`Calls`),z(),R(10,`th`,4),K(11,`Time`),z(),R(12,`th`,4),K(13,`Slowest`),z()()(),R(14,`tbody`),M(15,dA,10,5,`tr`,null,tg),z()()()),e&2){let e=W(2);D(15),N(e.outputs())}}function pA(e,t){if(e&1&&(R(0,`p`,1),K(1),z()),e&2){let e=t,n=W(2);D(),A_(` afterRender callbacks ran `,e.runs,` `,e.runs===1?`time`:`times`,`, `,n.ms(e.ms),` in total, slowest `,n.ms(e.maxMs),`. `)}}function mA(e,t){if(e&1&&(R(0,`p`,2),K(1),z()),e&2){let e=W(2);D(),Y(` `,e.dropped(),` more hook or output `,e.dropped()===1?`row is`:`rows are`,` left out. A recording lists at most 100 of each. `)}}function hA(e,t){if(e&1&&(R(0,`div`,0),A(1,lA,17,0,`div`),A(2,fA,17,0,`div`),z(),A(3,pA,2,4,`p`,1),A(4,mA,2,2,`p`,2)),e&2){let e,t=W();D(),j(t.hooks().length?1:-1),D(),j(t.outputs().length?2:-1),D(),j((e=t.afterRender())?3:-1,e),D(),j(t.dropped()?4:-1)}}var gA=10;function _A(e){return`${e<10?e.toFixed(2):Math.round(e)} ms`}var vA=class e{page=$(null);hooks=X(()=>(this.page()?.hooks??[]).slice(0,gA));outputs=X(()=>(this.page()?.outputs??[]).slice(0,gA));afterRender=X(()=>{let e=this.page()?.afterRender;return e?.runs?e:null});dropped=X(()=>this.page()?.droppedTimings??0);ms(e){return _A(e)}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-cd-timing`]],inputs:{page:[1,`page`]},decls:1,vars:1,consts:[[1,`timing`],[1,`after-render`],[1,`note`],[`scope`,`col`],[`scope`,`col`,1,`num`],[1,`mono`],[1,`num`]],template:function(e,t){e&1&&A(0,hA,5,4),e&2&&j(t.hooks().length||t.outputs().length||t.afterRender()?0:-1)},styles:[`[_nghost-%COMP%] { display: block; } @@ -1602,7 +1602,7 @@ td.mono[_ngcontent-%COMP%] { margin: 8px 0 0; color: var(--%NS%text-2); font-size: 12px; -}`]})};function bA(e,t){if(e&1&&(R(0,`p`,5),K(1),z()),e&2){let e=W();D(),q(e.error())}}function xA(e,t){let n=new Blob([JSON.stringify(e,null,2)],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=t,document.body.append(i),i.click(),i.remove(),setTimeout(()=>URL.revokeObjectURL(r),0)}var SA=class e{page=$(null);maxCycles=$(200);imported=lv();error=T(``);hasCycles(){return(this.page()?.cycles.length??0)>0}exportJson(){let e=this.page();e&&xA(qO(e,e.pageId),`change-detection-${e.pageId}.json`)}exportTrace(){let e=this.page();e&&xA(ek(e,e.pageId),`change-detection-${e.pageId}.trace.json`)}async read(e){let t=e.files?.[0];if(e.value=``,!t)return;if(t.size>2e7){this.error.set(`${t.name}: The file is larger than 20 MB.`);return}let n;try{n=await t.text()}catch{this.error.set(`Could not read the file.`);return}let r=JO(n,this.maxCycles());if(!r.ok){this.error.set(`${t.name}: ${r.error}`);return}this.error.set(``),this.imported.emit({fileName:t.name,page:{...r.recording,pageId:r.pageId,supported:!0}})}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-cd-transfer`]],inputs:{page:[1,`page`],maxCycles:[1,`maxCycles`]},outputs:{imported:`imported`},decls:10,vars:3,consts:[[`file`,``],[`role`,`group`,`aria-label`,`Export and import the recording`,1,`transfer`],[`type`,`button`,3,`click`,`disabled`],[`type`,`button`,3,`click`],[`type`,`file`,`accept`,`.json,application/json`,`hidden`,``,3,`change`],[`role`,`alert`,1,`error`]],template:function(e,t){if(e&1){let e=B();R(0,`div`,1)(1,`button`,2),U(`click`,function(){return t.exportJson()}),K(2,`Export JSON`),z(),R(3,`button`,2),U(`click`,function(){return t.exportTrace()}),K(4,` Export trace (Perfetto) `),z(),R(5,`button`,3),U(`click`,function(){return S(e),C(Fg(8).click())}),K(6,`Import`),z(),R(7,`input`,4,0),U(`change`,function(){S(e);let n=Fg(8);return C(t.read(n))}),z()(),A(9,bA,2,1,`p`,5)}e&2&&(D(),V(`disabled`,!t.hasCycles()),D(2),V(`disabled`,!t.hasCycles()),D(6),j(t.error()?9:-1))},styles:[`[_nghost-%COMP%] { +}`]})};function yA(e,t){if(e&1&&(R(0,`p`,5),K(1),z()),e&2){let e=W();D(),q(e.error())}}function bA(e,t){let n=new Blob([JSON.stringify(e,null,2)],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=t,document.body.append(i),i.click(),i.remove(),setTimeout(()=>URL.revokeObjectURL(r),0)}var xA=class e{page=$(null);maxCycles=$(200);imported=uv();error=T(``);hasCycles(){return(this.page()?.cycles.length??0)>0}exportJson(){let e=this.page();e&&bA(KO(e,e.pageId),`change-detection-${e.pageId}.json`)}exportTrace(){let e=this.page();e&&bA($O(e,e.pageId),`change-detection-${e.pageId}.trace.json`)}async read(e){let t=e.files?.[0];if(e.value=``,!t)return;if(t.size>2e7){this.error.set(`${t.name}: The file is larger than 20 MB.`);return}let n;try{n=await t.text()}catch{this.error.set(`Could not read the file.`);return}let r=qO(n,this.maxCycles());if(!r.ok){this.error.set(`${t.name}: ${r.error}`);return}this.error.set(``),this.imported.emit({fileName:t.name,page:{...r.recording,pageId:r.pageId,supported:!0}})}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-cd-transfer`]],inputs:{page:[1,`page`],maxCycles:[1,`maxCycles`]},outputs:{imported:`imported`},decls:10,vars:3,consts:[[`file`,``],[`role`,`group`,`aria-label`,`Export and import the recording`,1,`transfer`],[`type`,`button`,3,`click`,`disabled`],[`type`,`button`,3,`click`],[`type`,`file`,`accept`,`.json,application/json`,`hidden`,``,3,`change`],[`role`,`alert`,1,`error`]],template:function(e,t){if(e&1){let e=B();R(0,`div`,1)(1,`button`,2),U(`click`,function(){return t.exportJson()}),K(2,`Export JSON`),z(),R(3,`button`,2),U(`click`,function(){return t.exportTrace()}),K(4,` Export trace (Perfetto) `),z(),R(5,`button`,3),U(`click`,function(){return S(e),C(Ig(8).click())}),K(6,`Import`),z(),R(7,`input`,4,0),U(`change`,function(){S(e);let n=Ig(8);return C(t.read(n))}),z()(),A(9,yA,2,1,`p`,5)}e&2&&(D(),V(`disabled`,!t.hasCycles()),D(2),V(`disabled`,!t.hasCycles()),D(6),j(t.error()?9:-1))},styles:[`[_nghost-%COMP%] { display: contents; } @@ -1644,7 +1644,7 @@ button[_ngcontent-%COMP%]:disabled { margin: 0; color: var(--%NS%danger-text); font-size: 12px; -}`]})},CA=(e,t)=>t.stat.name;function wA(e,t){if(e&1&&(R(0,`span`,8),K(1),z()),e&2){let e=W(2).$implicit;D(),J(``,e.other,` more`)}}function TA(e,t){if(e&1&&(R(0,`div`,6)(1,`span`,7),K(2),z(),A(3,wA,2,1,`span`,8),z()),e&2){let e=W().$implicit;n_(`--%NS%tone`,e.tone+`%`),D(2),q(e.label),D(),j(e.roomy?3:-1)}}function EA(e,t){if(e&1&&(R(0,`span`,10),K(1),z(),R(2,`span`,11),K(3),z()),e&2){let e=W(2).$implicit,t=W(2);D(),q(e.stat.name),D(2),q(t.fmt(e.stat.ms))}}function DA(e,t){if(e&1){let e=B();R(0,`button`,9),U(`focus`,function(){S(e);let t=W().$index;return C(W(2).current.set(t))})(`click`,function(){S(e);let t=W().$implicit;return C(W(2).pick.emit(t.stat.name))}),A(1,EA,4,2),z()}if(e&2){let e=W(),t=e.$implicit,n=e.$index,r=W(2);n_(`--%NS%tone`,t.tone+`%`),k(`tabindex`,n===r.tabStop()?0:-1)(`aria-label`,t.label)(`data-index`,n),D(),j(t.roomy?1:-1)}}function OA(e,t){if(e&1&&(R(0,`li`),A(1,TA,4,4,`div`,4)(2,DA,2,6,`button`,5),z()),e&2){let e=t.$implicit;n_(`left`,e.x,`%`)(`top`,e.y,`%`)(`width`,e.w,`%`)(`height`,e.h,`%`),D(),j(e.other?1:2)}}function kA(e,t){if(e&1){let e=B();R(0,`ul`,2),U(`keydown`,function(t){return S(e),C(W().onKey(t))}),M(1,OA,3,9,`li`,3,CA),z()}if(e&2){let e=W();k(`aria-label`,e.label()),D(),N(e.cells())}}function AA(e,t){e&1&&(R(0,`p`,1),K(1,`No component time in these cycles.`),z())}var jA=24,MA=3,NA=class e{stats=$([]);scope=$(`the recording`);pick=lv();current=T(0);label=X(()=>`Self time per component in ${this.scope()}, largest first. Pick one to show it in the tree.`);cells=X(()=>{let e=this.stats().filter(e=>e.ms>0),t=e.slice(0,jA),n=e.slice(jA),r=n.reduce((e,t)=>e+t.ms,0),i=t.map(e=>({stat:e,other:0}));n.length&&i.push({stat:{name:`Other components`,checks:0,ms:r,maxMs:0,cycles:0},other:n.length});let a=e.reduce((e,t)=>e+t.ms,0),o=t[0]?.ms??1,s=ok(i,e=>e.stat.ms,MA);return s.sort((e,t)=>Number(e.item.other>0)-Number(t.item.other>0)),s.map(e=>{let{stat:t,other:n}=e.item,r=a?Math.round(t.ms/a*100):0;return{stat:t,other:n,x:e.x,y:e.y,w:e.w,h:e.h,tone:n?0:14+Math.round(26*Math.min(t.ms/o,1)),roomy:e.w>=10&&e.h>=22,label:n?`${n} more components, ${nk(t.ms)}, ${r}% of self time`:`${t.name}, ${nk(t.ms)} self time, ${r}%, ${t.checks} ${t.checks===1?`check`:`checks`}`}})});tabStop=X(()=>Math.min(this.current(),Math.max(this.cells().filter(e=>!e.other).length-1,0)));fmt(e){return nk(e)}onKey(e){let t=this.cells().filter(e=>!e.other).length;if(!t)return;let n=this.tabStop(),r;switch(e.key){case`ArrowRight`:case`ArrowDown`:r=Math.min(n+1,t-1);break;case`ArrowLeft`:case`ArrowUp`:r=Math.max(n-1,0);break;case`Home`:r=0;break;case`End`:r=t-1;break;default:return}e.preventDefault(),this.current.set(r),e.currentTarget.querySelector(`button[data-index="${r}"]`)?.focus()}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-cd-treemap`]],inputs:{stats:[1,`stats`],scope:[1,`scope`]},outputs:{pick:`pick`},decls:2,vars:1,consts:[[1,`map`],[1,`empty`],[1,`map`,3,`keydown`],[3,`left`,`top`,`width`,`height`],[1,`cell`,`other`,3,`--%NS%tone`],[`type`,`button`,1,`cell`,3,`--%NS%tone`],[1,`cell`,`other`],[1,`sr-only`],[`aria-hidden`,`true`,1,`name`],[`type`,`button`,1,`cell`,3,`focus`,`click`],[1,`name`,`mono`],[1,`ms`]],template:function(e,t){e&1&&A(0,kA,3,1,`ul`,0)(1,AA,2,0,`p`,1),e&2&&j(+!t.cells().length)},styles:[`[_nghost-%COMP%] { +}`]})},SA=(e,t)=>t.stat.name;function CA(e,t){if(e&1&&(R(0,`span`,8),K(1),z()),e&2){let e=W(2).$implicit;D(),J(``,e.other,` more`)}}function wA(e,t){if(e&1&&(R(0,`div`,6)(1,`span`,7),K(2),z(),A(3,CA,2,1,`span`,8),z()),e&2){let e=W().$implicit;r_(`--%NS%tone`,e.tone+`%`),D(2),q(e.label),D(),j(e.roomy?3:-1)}}function TA(e,t){if(e&1&&(R(0,`span`,10),K(1),z(),R(2,`span`,11),K(3),z()),e&2){let e=W(2).$implicit,t=W(2);D(),q(e.stat.name),D(2),q(t.fmt(e.stat.ms))}}function EA(e,t){if(e&1){let e=B();R(0,`button`,9),U(`focus`,function(){S(e);let t=W().$index;return C(W(2).current.set(t))})(`click`,function(){S(e);let t=W().$implicit;return C(W(2).pick.emit(t.stat.name))}),A(1,TA,4,2),z()}if(e&2){let e=W(),t=e.$implicit,n=e.$index,r=W(2);r_(`--%NS%tone`,t.tone+`%`),k(`tabindex`,n===r.tabStop()?0:-1)(`aria-label`,t.label)(`data-index`,n),D(),j(t.roomy?1:-1)}}function DA(e,t){if(e&1&&(R(0,`li`),A(1,wA,4,4,`div`,4)(2,EA,2,6,`button`,5),z()),e&2){let e=t.$implicit;r_(`left`,e.x,`%`)(`top`,e.y,`%`)(`width`,e.w,`%`)(`height`,e.h,`%`),D(),j(e.other?1:2)}}function OA(e,t){if(e&1){let e=B();R(0,`ul`,2),U(`keydown`,function(t){return S(e),C(W().onKey(t))}),M(1,DA,3,9,`li`,3,SA),z()}if(e&2){let e=W();k(`aria-label`,e.label()),D(),N(e.cells())}}function kA(e,t){e&1&&(R(0,`p`,1),K(1,`No component time in these cycles.`),z())}var AA=24,jA=3,MA=class e{stats=$([]);scope=$(`the recording`);pick=uv();current=T(0);label=X(()=>`Self time per component in ${this.scope()}, largest first. Pick one to show it in the tree.`);cells=X(()=>{let e=this.stats().filter(e=>e.ms>0),t=e.slice(0,AA),n=e.slice(AA),r=n.reduce((e,t)=>e+t.ms,0),i=t.map(e=>({stat:e,other:0}));n.length&&i.push({stat:{name:`Other components`,checks:0,ms:r,maxMs:0,cycles:0},other:n.length});let a=e.reduce((e,t)=>e+t.ms,0),o=t[0]?.ms??1,s=ak(i,e=>e.stat.ms,jA);return s.sort((e,t)=>Number(e.item.other>0)-Number(t.item.other>0)),s.map(e=>{let{stat:t,other:n}=e.item,r=a?Math.round(t.ms/a*100):0;return{stat:t,other:n,x:e.x,y:e.y,w:e.w,h:e.h,tone:n?0:14+Math.round(26*Math.min(t.ms/o,1)),roomy:e.w>=10&&e.h>=22,label:n?`${n} more components, ${tk(t.ms)}, ${r}% of self time`:`${t.name}, ${tk(t.ms)} self time, ${r}%, ${t.checks} ${t.checks===1?`check`:`checks`}`}})});tabStop=X(()=>Math.min(this.current(),Math.max(this.cells().filter(e=>!e.other).length-1,0)));fmt(e){return tk(e)}onKey(e){let t=this.cells().filter(e=>!e.other).length;if(!t)return;let n=this.tabStop(),r;switch(e.key){case`ArrowRight`:case`ArrowDown`:r=Math.min(n+1,t-1);break;case`ArrowLeft`:case`ArrowUp`:r=Math.max(n-1,0);break;case`Home`:r=0;break;case`End`:r=t-1;break;default:return}e.preventDefault(),this.current.set(r),e.currentTarget.querySelector(`button[data-index="${r}"]`)?.focus()}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-cd-treemap`]],inputs:{stats:[1,`stats`],scope:[1,`scope`]},outputs:{pick:`pick`},decls:2,vars:1,consts:[[1,`map`],[1,`empty`],[1,`map`,3,`keydown`],[3,`left`,`top`,`width`,`height`],[1,`cell`,`other`,3,`--%NS%tone`],[`type`,`button`,1,`cell`,3,`--%NS%tone`],[1,`cell`,`other`],[1,`sr-only`],[`aria-hidden`,`true`,1,`name`],[`type`,`button`,1,`cell`,3,`focus`,`click`],[1,`name`,`mono`],[1,`ms`]],template:function(e,t){e&1&&A(0,OA,3,1,`ul`,0)(1,kA,2,0,`p`,1),e&2&&j(+!t.cells().length)},styles:[`[_nghost-%COMP%] { display: block; min-width: 0; } @@ -1720,7 +1720,7 @@ button.cell[_ngcontent-%COMP%]:focus-visible { .empty[_ngcontent-%COMP%] { margin: 8px 0; color: var(--%NS%text-2); -}`]})},PA=(e,t)=>t.id;function FA(e,t){if(e&1){let e=B();F(0,`button`,14),H(`click`,function(){return S(e),C(W(2).clear())}),K(1,`Clear`),I()}}function IA(e,t){if(e&1){let e=B();F(0,`button`,11),H(`click`,function(){return S(e),C(W().toggle())}),L(1,`span`,12),K(2),I(),A(3,FA,2,0,`button`,13)}if(e&2){let e=W();G(`on`,e.recording()),P(`disabled`,!e.pageId()),D(2),J(` `,e.recording()?`Stop recording`:`Record`,` `),D(),j(e.cycles().length?3:-1)}}function LA(e,t){if(e&1){let e=B();F(0,`p`,6)(1,`span`,15),K(2,`Imported recording`),I(),F(3,`span`,16),K(4),I(),F(5,`button`,14),H(`click`,function(){return S(e),C(W().closeImport())}),K(6,`Back to live recording`),I()()}e&2&&(D(4),q(t.fileName))}function RA(e,t){e&1&&K(0,` An app on a device has no DOM, so checks that changed nothing are not counted there. `)}function zA(e,t){e&1&&K(0,` A recording keeps running when the tab reloads, so it catches the next start of the app. The cycles from before the reload are gone with the old page. `)}function BA(e,t){e&1&&(F(0,`p`,9),K(1,` The page has Angular's profiler hook, but the recording could not attach to it yet. The page tries again on its next update while recording is on. If this stays, stop and start the recording, or reload the page. `),I())}function VA(e,t){e&1&&L(0,`app-angular-unavailable`,17),e&2&&P(`page`,W(2).angularPage())}function HA(e,t){e&1&&A(0,BA,2,0,`p`,9)(1,VA,1,1,`app-angular-unavailable`,17),e&2&&j(+!W().attachPending())}function UA(e,t){e&1&&(F(0,`p`,9),K(1,`Angular profiling stays on until the page reloads.`),I())}function WA(e,t){e&1&&L(0,`app-angular-unavailable`,21),e&2&&P(`page`,W(2).angularPage())}function GA(e,t){if(e&1){let e=B();F(0,`div`,18)(1,`span`,19),K(2,`Live views`),I(),F(3,`button`,20),H(`click`,function(){S(e);let t=W();return C(t.setView(`flash`,!t.views().flash))}),L(4,`span`,12),K(5,` Flash checks `),I(),F(6,`button`,20),H(`click`,function(){S(e);let t=W();return C(t.setView(`track`,!t.views().track))}),L(7,`span`,12),K(8,` Performance track `),I(),F(9,`button`,20),H(`click`,function(){return S(e),C(W().setView(`angularProfiling`,!0))}),L(10,`span`,12),K(11,` Angular profiling `),I()(),F(12,`p`,7),K(13,` Flash checks draws a box over each component on the page as Angular checks it, with its name and how often it was checked, fading over a second. Performance track adds a Pangular track to the Chrome Performance panel with every component check, hook and output. Angular profiling turns on Angular's own track there. `),I(),A(14,UA,2,0,`p`,9)(15,WA,1,1,`app-angular-unavailable`,21)}if(e&2){let e=W();D(3),P(`disabled`,!e.canShowViews()),k(`aria-pressed`,e.views().flash),D(3),P(`disabled`,!e.canShowViews()),k(`aria-pressed`,e.views().track),D(3),P(`disabled`,!e.canShowViews()||e.views().angularProfiling||!e.views().angularProfilingAvailable),k(`aria-pressed`,e.views().angularProfiling),D(5),j(e.views().angularProfiling?14:e.views().angularProfilingAvailable?-1:15)}}function KA(e,t){if(e&1&&(F(0,`p`,9),K(1),I()),e&2){let e=t.$implicit;D(),q(e)}}function qA(e,t){if(e&1&&(F(0,`p`,24),K(1),I()),e&2){let e=W(2);D(),J(` `,e.range()?`The picked cycles have no timed spans, so there is no flame graph for them.`:`This recording has no timed spans, so there is no flame graph. A recording from an older version, or a file saved without spans, has none.`,` `)}}function JA(e,t){e&1&&(F(0,`p`,9),K(1,` For picked cycles, totals come from the 10 slowest components each cycle lists. `),I())}function YA(e,t){if(e&1){let e=B();F(0,`h3`),K(1,`Cycles`),I(),F(2,`app-cd-cycle-chart`,22),N_(`rangeChange`,function(t){S(e);let n=W();return M_(n.range,t)||(n.range=t),C(t)}),I(),F(3,`app-cd-flame-graph`,23),H(`pick`,function(t){return S(e),C(W().showComponent.emit(t))}),I(),A(4,qA,2,1,`p`,24),F(5,`h3`),K(6,`Self time by component`),I(),A(7,JA,2,0,`p`,9),F(8,`app-cd-treemap`,25),H(`pick`,function(t){return S(e),C(W().showComponent.emit(t))}),I()}if(e&2){let e=W();D(2),P(`cycles`,e.cycles())(`slowMs`,e.slowMs()),j_(`range`,e.range),D(),P(`cycles`,e.picked())(`names`,e.spanNames())(`scope`,e.scope()),D(),j(e.hasSpans()?-1:4),D(3),j(e.range()?7:-1),D(),P(`stats`,e.stats())(`scope`,e.scope())}}function XA(e,t){if(e&1){let e=B();F(0,`tr`)(1,`td`,16)(2,`button`,31),H(`click`,function(){let t=S(e).$implicit;return C(W(2).showComponent.emit(t.name))}),K(3),I()(),F(4,`td`,32),K(5),I(),F(6,`td`,32),K(7),I(),F(8,`td`,32),K(9),I()()}if(e&2){let e=t.$implicit,n=W(2);D(3),J(` `,e.name,` `),D(2),q(e.checks),D(2),q(n.ms(e.ms)),D(2),q(n.ms(e.maxMs))}}function ZA(e,t){e&1&&(F(0,`tr`)(1,`td`,33),K(2,`No component time in the picked cycles.`),I()())}function QA(e,t){if(e&1){let e=B();F(0,`tr`)(1,`td`,16)(2,`button`,31),H(`click`,function(){let t=S(e).$implicit;return C(W(2).showComponent.emit(t.name))}),K(3),I()(),F(4,`td`,32),K(5),I(),F(6,`td`,32),K(7),I(),F(8,`td`,32),K(9),I()()}if(e&2){let e=t.$implicit,n=W(2);D(3),J(` `,e.name,` `),D(2),q(e.checks),D(2),q(e.cycles),D(2),q(n.ms(e.ms))}}function $A(e,t){e&1&&(F(0,`tr`)(1,`td`,33),K(2,`No component checks in the picked cycles.`),I()())}function ej(e,t){if(e&1&&(F(0,`span`,35),K(1,`from `),F(2,`span`,16),K(3),I()()),e&2){let e=W(3);D(3),q(e.causeText(t))}}function tj(e,t){if(e&1&&(F(0,`span`,35),K(1,`after `),F(2,`span`,16),K(3),I()()),e&2){let e=W().$implicit;D(3),q(e.trigger)}}function nj(e,t){if(e&1&&(F(0,`span`,36),K(1),I()),e&2){let e=W().$implicit;D(),J(``,e.unchanged,` changed nothing`)}}function rj(e,t){if(e&1&&(F(0,`span`,36),K(1),I()),e&2){let e=W().$implicit,t=W(2);D(),J(`hooks `,t.ms(e.hookMs))}}function ij(e,t){if(e&1&&(F(0,`span`,36),K(1),I()),e&2){let e=W().$implicit,t=W(2);D(),J(`afterRender `,t.ms(e.afterRenderMs))}}function aj(e,t){if(e&1&&(F(0,`span`,37),K(1,` slowest `),F(2,`span`,16),K(3),I(),K(4),I()),e&2){let e=t,n=W(3);D(3),q(e.name),D(),J(` `,n.ms(e.ms),` `)}}function oj(e,t){if(e&1&&(F(0,`li`)(1,`span`,34),K(2),I(),F(3,`span`,16),K(4),I(),F(5,`span`),K(6),I(),A(7,ej,4,1,`span`,35)(8,tj,4,1,`span`,35),A(9,nj,2,1,`span`,36),A(10,rj,2,1,`span`,36),A(11,ij,2,1,`span`,36),A(12,aj,5,2,`span`,37),I()),e&2){let e,n,r=t.$implicit,i=W(2);D(2),q(i.clock(r.at)),D(2),q(i.ms(r.ms)),D(2),k_(` `,r.checks,` `,r.checks===1?`check`:`checks`,`, `,r.passes,` `,r.passes===1?`pass`:`passes`,` `),D(),j((e=r.cause)?7:r.trigger?8:-1,e),D(2),j(r.unchanged?9:-1),D(),j(r.hookMs?10:-1),D(),j(r.afterRenderMs?11:-1),D(),j((n=r.components[0])?12:-1,n)}}function sj(e,t){if(e&1&&(F(0,`div`,26)(1,`div`)(2,`h3`),K(3),I(),F(4,`table`)(5,`thead`)(6,`tr`)(7,`th`,27),K(8,`Component`),I(),F(9,`th`,28),K(10,`Checks`),I(),F(11,`th`,28),K(12,`Self time`),I(),F(13,`th`,28),K(14,`Slowest`),I()()(),F(15,`tbody`),M(16,XA,10,4,`tr`,null,eg,!1,ZA,3,0,`tr`),I()(),F(19,`h3`),K(20),I(),F(21,`table`)(22,`thead`)(23,`tr`)(24,`th`,27),K(25,`Component`),I(),F(26,`th`,28),K(27,`Checks`),I(),F(28,`th`,28),K(29,`Cycles`),I(),F(30,`th`,28),K(31,`Self time`),I()()(),F(32,`tbody`),M(33,QA,10,4,`tr`,null,eg,!1,$A,3,0,`tr`),I()(),F(36,`p`,7),K(37,` Select a component name to show its most checked instance in the tree. `),I()(),F(38,`div`)(39,`h3`),K(40,`Latest cycles`),I(),F(41,`ol`,29),M(42,oj,13,11,`li`,null,PA),I()()(),L(44,`app-cd-timing`,30)(45,`app-cd-diagnosis`,30)),e&2){let e=W();D(3),J(` `,e.range()?`Slowest components in the picked cycles`:`Slowest components`,` `),D(13),N(e.slowest()),D(4),J(` `,e.range()?`Most often checked in the picked cycles`:`Most often checked`,` `),D(13),N(e.busiest()),D(9),N(e.latest()),D(2),P(`page`,e.page()),D(),P(`page`,e.page())}}function cj(e,t){e&1&&(F(0,`p`,10),K(1,`Use the app. Cycles show up here as Angular runs change detection.`),I())}var lj=3e3,uj=10,dj=class e{livePage=$(null,{alias:`page`});pageId=$(null);rpc=$(null);native=$(!1);angularPages=hD(()=>this.rpc());angularPage=X(()=>gD(this.angularPages(),this.pageId()));attachPending=X(()=>this.angularPage()?.capabilities.profiler===!0);showComponent=lv();range=T(null);imported=T(null);page=X(()=>this.imported()?.page??this.livePage());views=Q(()=>this.livePage()?.options??{flash:!1,track:!1,angularProfiling:!1,angularProfilingAvailable:!0});canShowViews=X(()=>!!this.pageId()&&this.livePage()?.supported!==!1);message=T(``);announcement=T(``);recording=X(()=>this.page()?.recording===!0);cycles=X(()=>this.page()?.cycles??[]);slowMs=X(()=>this.page()?.slowMs??16);maxCycles=X(()=>PT(this.rpc()).limits.cdCycles);picked=X(()=>rk(this.cycles(),this.range()));hasSpans=X(()=>this.picked().some(e=>e.spans?.length));spanNames=X(()=>this.page()?.spanNames??[]);stats=X(()=>this.range()?ik(this.picked()):[...this.page()?.components??[]].sort((e,t)=>t.ms-e.ms));scope=X(()=>{let e=this.range()?this.picked():[];return e.length?e.length===1?`cycle ${e[0].id}`:`cycles ${e[0].id} to ${e.at(-1).id}`:`the recording`});slowest=X(()=>this.stats().slice(0,uj));busiest=X(()=>[...this.stats()].sort((e,t)=>t.checks-e.checks).slice(0,uj));latest=X(()=>this.cycles().slice(-30).reverse());capNotes=X(()=>{let e=this.page()?.droppedClasses??0,t=this.page()?.droppedHosts??0,n=[];return e>0&&n.push(`${e} more component ${e===1?`class was`:`classes were`} checked than a recording keeps, so ${e===1?`it is`:`they are`} left out of these totals.`),t>0&&n.push(`${t} component ${t===1?`instance was`:`instances were`} checked past the 2000 a recording counts, so ${t===1?`its tree row shows`:`their tree rows show`} no check count.`),n});status=X(()=>{if(this.message())return this.message();let e=this.cycles().length;return this.imported()?`${e} ${e===1?`cycle`:`cycles`} imported.`:this.recording()?`Recording. ${e} ${e===1?`cycle`:`cycles`} so far.`:e?`${e} ${e===1?`cycle`:`cycles`} recorded.`:``});ms(e){return`${e<10?e.toFixed(2):Math.round(e)} ms`}clock(e){return XE(e)}causeText(e){return zO(e)}confirming=T(null);confirmTimer;constructor(){E(()=>{let e=this.confirming();e!==null&&this.livePage()?.recording===!0===e&&Z(()=>this.confirmed(e))}),x(Ss).onDestroy(()=>clearTimeout(this.confirmTimer))}confirmed(e){clearTimeout(this.confirmTimer),this.confirming.set(null),this.message.set(``);let t=this.livePage()?.cycles.length??0;this.announce(e?`Recording started.`:`Recording stopped. ${t} ${t===1?`cycle`:`cycles`} recorded.`)}unconfirmed(e){let t=`The page did not confirm that the recording ${e?`started`:`stopped`}. The tab may be in the background, closed or reloading.`;this.message.set(t),this.announce(t)}async toggle(){let e=!this.recording();clearTimeout(this.confirmTimer),this.confirming.set(null),await this.send({on:e},e?`Starting…`:`Stopping…`,()=>``,`request-change-detection-record`,{quiet:!0,keepPending:!0})&&(this.confirming.set(e),this.confirmTimer=setTimeout(()=>{this.confirming()===e&&this.unconfirmed(e)},lj))}showImport(e){this.message.set(``),this.range.set(null),this.imported.set(e);let t=e.page.cycles.length;this.announce(`Imported ${e.fileName}: ${t} ${t===1?`cycle`:`cycles`}. Showing the imported recording.`)}closeImport(){this.imported.set(null),this.range.set(null),this.announce(`Showing the live recording.`)}async clear(){this.range.set(null),await this.send({clear:!0},``,()=>`Cleared the recorded cycles.`)}async setView(e,t){let n=this.views();this.views.set({...n,[e]:t});let r={flash:t?`Flash checks on.`:`Flash checks off.`,track:t?`Performance track on. Record in the Chrome Performance panel to see it.`:`Performance track off.`,angularProfiling:`Angular profiling on. It stays on until the page reloads.`}[e];await this.send({[e]:t},``,()=>r,`request-change-detection-options`)||this.views.set(n)}async send(e,t,n,r=`request-change-detection-record`,{quiet:i=!1,keepPending:a=!1}={}){this.message.set(t);try{if(!this.rpc())throw Error(`no client`);return await hT(this.rpc(),r,{pageId:this.pageId(),...e}),a||this.message.set(``),i||this.announce(n()),!0}catch{let e=`Could not reach the page.`;return this.message.set(e),this.announce(e),!1}}announce(e){this.announcement.update(t=>t===e?`${e} `:e)}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-cd-recording`]],inputs:{livePage:[1,`page`,`livePage`],pageId:[1,`pageId`],rpc:[1,`rpc`],native:[1,`native`]},outputs:{showComponent:`showComponent`},decls:23,vars:13,consts:[[`aria-labelledby`,`cd-heading`,1,`cd`],[1,`cd-head`],[`id`,`cd-heading`],[3,`imported`,`page`,`maxCycles`],[1,`status`],[`role`,`status`,1,`sr-only`],[1,`imported`],[1,`hint`],[`what`,`cycles`,`limit`,`cdCycles`,3,`dropped`,`max`],[1,`note`],[1,`empty`],[`type`,`button`,3,`click`,`disabled`],[`aria-hidden`,`true`,1,`dot`],[`type`,`button`],[`type`,`button`,3,`click`],[1,`badge`],[1,`mono`],[`capability`,`profiler`,`missing`,``,`compact`,``,3,`page`],[`role`,`group`,`aria-labelledby`,`cd-views-label`,1,`views`],[`id`,`cd-views-label`,1,`views-label`],[`type`,`button`,1,`view`,3,`click`,`disabled`],[`capability`,`angularProfiling`,`missing`,``,`compact`,``,3,`page`],[3,`rangeChange`,`cycles`,`slowMs`,`range`],[3,`pick`,`cycles`,`names`,`scope`],[1,`spans-note`],[3,`pick`,`stats`,`scope`],[1,`cd-grid`],[`scope`,`col`],[`scope`,`col`,1,`num`],[`aria-label`,`Latest change detection cycles, newest first`,1,`cycles`],[3,`page`],[`type`,`button`,1,`name-link`,3,`click`],[1,`num`],[`colspan`,`4`],[1,`when`],[1,`trigger`],[1,`timing`],[1,`top`]],template:function(e,t){if(e&1&&(F(0,`section`,0)(1,`div`,1)(2,`h2`,2),K(3,`Change detection`),I(),A(4,IA,4,5),F(5,`app-cd-transfer`,3),H(`imported`,function(e){return t.showImport(e)}),I(),F(6,`p`,4),K(7),I(),F(8,`p`,5),K(9),I()(),A(10,LA,7,1,`p`,6),F(11,`p`,7),K(12,` Records each change detection cycle with Angular's profiler: how long it took, how many components it checked, what started it and which checks changed nothing. Tree rows show how often each instance was checked. Times come from a development build. While it records, the page also wraps Angular's scheduler, adds a signal write hook and watches DOM updates; all of it stops with the recording. `),A(13,RA,1,0)(14,zA,1,0),I(),A(15,HA,2,1),A(16,GA,16,7),L(17,`app-limit-note`,8),M(18,KA,2,1,`p`,9,tg),A(20,YA,9,10),A(21,sj,46,6)(22,cj,2,0,`p`,10),I()),e&2){let e;D(4),j(t.imported()?-1:4),D(),P(`page`,t.page())(`maxCycles`,t.maxCycles()),D(2),q(t.status()),D(2),q(t.announcement()),D(),j((e=t.imported())?10:-1,e),D(3),j(t.native()?13:14),D(2),j(t.page()?.supported===!1?15:-1),D(),j(!t.imported()&&!t.native()?16:-1),D(),P(`dropped`,t.page()?.dropped??0)(`max`,t.maxCycles()),D(),N(t.capNotes()),D(2),j(t.cycles().length?20:-1),D(),j(t.page()?.components?.length?21:t.recording()?22:-1)}},dependencies:[bD,aO,yA,jk,SA,qk,cA,NA],styles:[`[_nghost-%COMP%] { +}`]})},NA=(e,t)=>t.id;function PA(e,t){if(e&1){let e=B();F(0,`button`,14),H(`click`,function(){return S(e),C(W(2).clear())}),K(1,`Clear`),I()}}function FA(e,t){if(e&1){let e=B();F(0,`button`,11),H(`click`,function(){return S(e),C(W().toggle())}),L(1,`span`,12),K(2),I(),A(3,PA,2,0,`button`,13)}if(e&2){let e=W();G(`on`,e.recording()),P(`disabled`,!e.pageId()),D(2),J(` `,e.recording()?`Stop recording`:`Record`,` `),D(),j(e.cycles().length?3:-1)}}function IA(e,t){if(e&1){let e=B();F(0,`p`,6)(1,`span`,15),K(2,`Imported recording`),I(),F(3,`span`,16),K(4),I(),F(5,`button`,14),H(`click`,function(){return S(e),C(W().closeImport())}),K(6,`Back to live recording`),I()()}e&2&&(D(4),q(t.fileName))}function LA(e,t){e&1&&K(0,` An app on a device has no DOM, so checks that changed nothing are not counted there. `)}function RA(e,t){e&1&&K(0,` A recording keeps running when the tab reloads, so it catches the next start of the app. The cycles from before the reload are gone with the old page. `)}function zA(e,t){e&1&&(F(0,`p`,9),K(1,` The page has Angular's profiler hook, but the recording could not attach to it yet. The page tries again on its next update while recording is on. If this stays, stop and start the recording, or reload the page. `),I())}function BA(e,t){e&1&&L(0,`app-angular-unavailable`,17),e&2&&P(`page`,W(2).angularPage())}function VA(e,t){e&1&&A(0,zA,2,0,`p`,9)(1,BA,1,1,`app-angular-unavailable`,17),e&2&&j(+!W().attachPending())}function HA(e,t){e&1&&(F(0,`p`,9),K(1,`Angular profiling stays on until the page reloads.`),I())}function UA(e,t){e&1&&L(0,`app-angular-unavailable`,21),e&2&&P(`page`,W(2).angularPage())}function WA(e,t){if(e&1){let e=B();F(0,`div`,18)(1,`span`,19),K(2,`Live views`),I(),F(3,`button`,20),H(`click`,function(){S(e);let t=W();return C(t.setView(`flash`,!t.views().flash))}),L(4,`span`,12),K(5,` Flash checks `),I(),F(6,`button`,20),H(`click`,function(){S(e);let t=W();return C(t.setView(`track`,!t.views().track))}),L(7,`span`,12),K(8,` Performance track `),I(),F(9,`button`,20),H(`click`,function(){return S(e),C(W().setView(`angularProfiling`,!0))}),L(10,`span`,12),K(11,` Angular profiling `),I()(),F(12,`p`,7),K(13,` Flash checks draws a box over each component on the page as Angular checks it, with its name and how often it was checked, fading over a second. Performance track adds a Pangular track to the Chrome Performance panel with every component check, hook and output. Angular profiling turns on Angular's own track there. `),I(),A(14,HA,2,0,`p`,9)(15,UA,1,1,`app-angular-unavailable`,21)}if(e&2){let e=W();D(3),P(`disabled`,!e.canShowViews()),k(`aria-pressed`,e.views().flash),D(3),P(`disabled`,!e.canShowViews()),k(`aria-pressed`,e.views().track),D(3),P(`disabled`,!e.canShowViews()||e.views().angularProfiling||!e.views().angularProfilingAvailable),k(`aria-pressed`,e.views().angularProfiling),D(5),j(e.views().angularProfiling?14:e.views().angularProfilingAvailable?-1:15)}}function GA(e,t){if(e&1&&(F(0,`p`,9),K(1),I()),e&2){let e=t.$implicit;D(),q(e)}}function KA(e,t){if(e&1&&(F(0,`p`,24),K(1),I()),e&2){let e=W(2);D(),J(` `,e.range()?`The picked cycles have no timed spans, so there is no flame graph for them.`:`This recording has no timed spans, so there is no flame graph. A recording from an older version, or a file saved without spans, has none.`,` `)}}function qA(e,t){e&1&&(F(0,`p`,9),K(1,` For picked cycles, totals come from the 10 slowest components each cycle lists. `),I())}function JA(e,t){if(e&1){let e=B();F(0,`h3`),K(1,`Cycles`),I(),F(2,`app-cd-cycle-chart`,22),P_(`rangeChange`,function(t){S(e);let n=W();return N_(n.range,t)||(n.range=t),C(t)}),I(),F(3,`app-cd-flame-graph`,23),H(`pick`,function(t){return S(e),C(W().showComponent.emit(t))}),I(),A(4,KA,2,1,`p`,24),F(5,`h3`),K(6,`Self time by component`),I(),A(7,qA,2,0,`p`,9),F(8,`app-cd-treemap`,25),H(`pick`,function(t){return S(e),C(W().showComponent.emit(t))}),I()}if(e&2){let e=W();D(2),P(`cycles`,e.cycles())(`slowMs`,e.slowMs()),M_(`range`,e.range),D(),P(`cycles`,e.picked())(`names`,e.spanNames())(`scope`,e.scope()),D(),j(e.hasSpans()?-1:4),D(3),j(e.range()?7:-1),D(),P(`stats`,e.stats())(`scope`,e.scope())}}function YA(e,t){if(e&1){let e=B();F(0,`tr`)(1,`td`,16)(2,`button`,31),H(`click`,function(){let t=S(e).$implicit;return C(W(2).showComponent.emit(t.name))}),K(3),I()(),F(4,`td`,32),K(5),I(),F(6,`td`,32),K(7),I(),F(8,`td`,32),K(9),I()()}if(e&2){let e=t.$implicit,n=W(2);D(3),J(` `,e.name,` `),D(2),q(e.checks),D(2),q(n.ms(e.ms)),D(2),q(n.ms(e.maxMs))}}function XA(e,t){e&1&&(F(0,`tr`)(1,`td`,33),K(2,`No component time in the picked cycles.`),I()())}function ZA(e,t){if(e&1){let e=B();F(0,`tr`)(1,`td`,16)(2,`button`,31),H(`click`,function(){let t=S(e).$implicit;return C(W(2).showComponent.emit(t.name))}),K(3),I()(),F(4,`td`,32),K(5),I(),F(6,`td`,32),K(7),I(),F(8,`td`,32),K(9),I()()}if(e&2){let e=t.$implicit,n=W(2);D(3),J(` `,e.name,` `),D(2),q(e.checks),D(2),q(e.cycles),D(2),q(n.ms(e.ms))}}function QA(e,t){e&1&&(F(0,`tr`)(1,`td`,33),K(2,`No component checks in the picked cycles.`),I()())}function $A(e,t){if(e&1&&(F(0,`span`,35),K(1,`from `),F(2,`span`,16),K(3),I()()),e&2){let e=W(3);D(3),q(e.causeText(t))}}function ej(e,t){if(e&1&&(F(0,`span`,35),K(1,`after `),F(2,`span`,16),K(3),I()()),e&2){let e=W().$implicit;D(3),q(e.trigger)}}function tj(e,t){if(e&1&&(F(0,`span`,36),K(1),I()),e&2){let e=W().$implicit;D(),J(``,e.unchanged,` changed nothing`)}}function nj(e,t){if(e&1&&(F(0,`span`,36),K(1),I()),e&2){let e=W().$implicit,t=W(2);D(),J(`hooks `,t.ms(e.hookMs))}}function rj(e,t){if(e&1&&(F(0,`span`,36),K(1),I()),e&2){let e=W().$implicit,t=W(2);D(),J(`afterRender `,t.ms(e.afterRenderMs))}}function ij(e,t){if(e&1&&(F(0,`span`,37),K(1,` slowest `),F(2,`span`,16),K(3),I(),K(4),I()),e&2){let e=t,n=W(3);D(3),q(e.name),D(),J(` `,n.ms(e.ms),` `)}}function aj(e,t){if(e&1&&(F(0,`li`)(1,`span`,34),K(2),I(),F(3,`span`,16),K(4),I(),F(5,`span`),K(6),I(),A(7,$A,4,1,`span`,35)(8,ej,4,1,`span`,35),A(9,tj,2,1,`span`,36),A(10,nj,2,1,`span`,36),A(11,rj,2,1,`span`,36),A(12,ij,5,2,`span`,37),I()),e&2){let e,n,r=t.$implicit,i=W(2);D(2),q(i.clock(r.at)),D(2),q(i.ms(r.ms)),D(2),A_(` `,r.checks,` `,r.checks===1?`check`:`checks`,`, `,r.passes,` `,r.passes===1?`pass`:`passes`,` `),D(),j((e=r.cause)?7:r.trigger?8:-1,e),D(2),j(r.unchanged?9:-1),D(),j(r.hookMs?10:-1),D(),j(r.afterRenderMs?11:-1),D(),j((n=r.components[0])?12:-1,n)}}function oj(e,t){if(e&1&&(F(0,`div`,26)(1,`div`)(2,`h3`),K(3),I(),F(4,`table`)(5,`thead`)(6,`tr`)(7,`th`,27),K(8,`Component`),I(),F(9,`th`,28),K(10,`Checks`),I(),F(11,`th`,28),K(12,`Self time`),I(),F(13,`th`,28),K(14,`Slowest`),I()()(),F(15,`tbody`),M(16,YA,10,4,`tr`,null,tg,!1,XA,3,0,`tr`),I()(),F(19,`h3`),K(20),I(),F(21,`table`)(22,`thead`)(23,`tr`)(24,`th`,27),K(25,`Component`),I(),F(26,`th`,28),K(27,`Checks`),I(),F(28,`th`,28),K(29,`Cycles`),I(),F(30,`th`,28),K(31,`Self time`),I()()(),F(32,`tbody`),M(33,ZA,10,4,`tr`,null,tg,!1,QA,3,0,`tr`),I()(),F(36,`p`,7),K(37,` Select a component name to show its most checked instance in the tree. `),I()(),F(38,`div`)(39,`h3`),K(40,`Latest cycles`),I(),F(41,`ol`,29),M(42,aj,13,11,`li`,null,NA),I()()(),L(44,`app-cd-timing`,30)(45,`app-cd-diagnosis`,30)),e&2){let e=W();D(3),J(` `,e.range()?`Slowest components in the picked cycles`:`Slowest components`,` `),D(13),N(e.slowest()),D(4),J(` `,e.range()?`Most often checked in the picked cycles`:`Most often checked`,` `),D(13),N(e.busiest()),D(9),N(e.latest()),D(2),P(`page`,e.page()),D(),P(`page`,e.page())}}function sj(e,t){e&1&&(F(0,`p`,10),K(1,`Use the app. Cycles show up here as Angular runs change detection.`),I())}var cj=3e3,lj=10,uj=class e{livePage=$(null,{alias:`page`});pageId=$(null);rpc=$(null);native=$(!1);angularPages=mD(()=>this.rpc());angularPage=X(()=>hD(this.angularPages(),this.pageId()));attachPending=X(()=>this.angularPage()?.capabilities.profiler===!0);showComponent=uv();range=T(null);imported=T(null);page=X(()=>this.imported()?.page??this.livePage());views=Q(()=>this.livePage()?.options??{flash:!1,track:!1,angularProfiling:!1,angularProfilingAvailable:!0});canShowViews=X(()=>!!this.pageId()&&this.livePage()?.supported!==!1);message=T(``);announcement=T(``);recording=X(()=>this.page()?.recording===!0);cycles=X(()=>this.page()?.cycles??[]);slowMs=X(()=>this.page()?.slowMs??16);maxCycles=X(()=>NT(this.rpc()).limits.cdCycles);picked=X(()=>nk(this.cycles(),this.range()));hasSpans=X(()=>this.picked().some(e=>e.spans?.length));spanNames=X(()=>this.page()?.spanNames??[]);stats=X(()=>this.range()?rk(this.picked()):[...this.page()?.components??[]].sort((e,t)=>t.ms-e.ms));scope=X(()=>{let e=this.range()?this.picked():[];return e.length?e.length===1?`cycle ${e[0].id}`:`cycles ${e[0].id} to ${e.at(-1).id}`:`the recording`});slowest=X(()=>this.stats().slice(0,lj));busiest=X(()=>[...this.stats()].sort((e,t)=>t.checks-e.checks).slice(0,lj));latest=X(()=>this.cycles().slice(-30).reverse());capNotes=X(()=>{let e=this.page()?.droppedClasses??0,t=this.page()?.droppedHosts??0,n=[];return e>0&&n.push(`${e} more component ${e===1?`class was`:`classes were`} checked than a recording keeps, so ${e===1?`it is`:`they are`} left out of these totals.`),t>0&&n.push(`${t} component ${t===1?`instance was`:`instances were`} checked past the 2000 a recording counts, so ${t===1?`its tree row shows`:`their tree rows show`} no check count.`),n});status=X(()=>{if(this.message())return this.message();let e=this.cycles().length;return this.imported()?`${e} ${e===1?`cycle`:`cycles`} imported.`:this.recording()?`Recording. ${e} ${e===1?`cycle`:`cycles`} so far.`:e?`${e} ${e===1?`cycle`:`cycles`} recorded.`:``});ms(e){return`${e<10?e.toFixed(2):Math.round(e)} ms`}clock(e){return YE(e)}causeText(e){return RO(e)}confirming=T(null);confirmTimer;constructor(){E(()=>{let e=this.confirming();e!==null&&this.livePage()?.recording===!0===e&&Z(()=>this.confirmed(e))}),x(Cs).onDestroy(()=>clearTimeout(this.confirmTimer))}confirmed(e){clearTimeout(this.confirmTimer),this.confirming.set(null),this.message.set(``);let t=this.livePage()?.cycles.length??0;this.announce(e?`Recording started.`:`Recording stopped. ${t} ${t===1?`cycle`:`cycles`} recorded.`)}unconfirmed(e){let t=`The page did not confirm that the recording ${e?`started`:`stopped`}. The tab may be in the background, closed or reloading.`;this.message.set(t),this.announce(t)}async toggle(){let e=!this.recording();clearTimeout(this.confirmTimer),this.confirming.set(null),await this.send({on:e},e?`Starting…`:`Stopping…`,()=>``,`request-change-detection-record`,{quiet:!0,keepPending:!0})&&(this.confirming.set(e),this.confirmTimer=setTimeout(()=>{this.confirming()===e&&this.unconfirmed(e)},cj))}showImport(e){this.message.set(``),this.range.set(null),this.imported.set(e);let t=e.page.cycles.length;this.announce(`Imported ${e.fileName}: ${t} ${t===1?`cycle`:`cycles`}. Showing the imported recording.`)}closeImport(){this.imported.set(null),this.range.set(null),this.announce(`Showing the live recording.`)}async clear(){this.range.set(null),await this.send({clear:!0},``,()=>`Cleared the recorded cycles.`)}async setView(e,t){let n=this.views();this.views.set({...n,[e]:t});let r={flash:t?`Flash checks on.`:`Flash checks off.`,track:t?`Performance track on. Record in the Chrome Performance panel to see it.`:`Performance track off.`,angularProfiling:`Angular profiling on. It stays on until the page reloads.`}[e];await this.send({[e]:t},``,()=>r,`request-change-detection-options`)||this.views.set(n)}async send(e,t,n,r=`request-change-detection-record`,{quiet:i=!1,keepPending:a=!1}={}){this.message.set(t);try{if(!this.rpc())throw Error(`no client`);return await mT(this.rpc(),r,{pageId:this.pageId(),...e}),a||this.message.set(``),i||this.announce(n()),!0}catch{let e=`Could not reach the page.`;return this.message.set(e),this.announce(e),!1}}announce(e){this.announcement.update(t=>t===e?`${e} `:e)}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-cd-recording`]],inputs:{livePage:[1,`page`,`livePage`],pageId:[1,`pageId`],rpc:[1,`rpc`],native:[1,`native`]},outputs:{showComponent:`showComponent`},decls:23,vars:13,consts:[[`aria-labelledby`,`cd-heading`,1,`cd`],[1,`cd-head`],[`id`,`cd-heading`],[3,`imported`,`page`,`maxCycles`],[1,`status`],[`role`,`status`,1,`sr-only`],[1,`imported`],[1,`hint`],[`what`,`cycles`,`limit`,`cdCycles`,3,`dropped`,`max`],[1,`note`],[1,`empty`],[`type`,`button`,3,`click`,`disabled`],[`aria-hidden`,`true`,1,`dot`],[`type`,`button`],[`type`,`button`,3,`click`],[1,`badge`],[1,`mono`],[`capability`,`profiler`,`missing`,``,`compact`,``,3,`page`],[`role`,`group`,`aria-labelledby`,`cd-views-label`,1,`views`],[`id`,`cd-views-label`,1,`views-label`],[`type`,`button`,1,`view`,3,`click`,`disabled`],[`capability`,`angularProfiling`,`missing`,``,`compact`,``,3,`page`],[3,`rangeChange`,`cycles`,`slowMs`,`range`],[3,`pick`,`cycles`,`names`,`scope`],[1,`spans-note`],[3,`pick`,`stats`,`scope`],[1,`cd-grid`],[`scope`,`col`],[`scope`,`col`,1,`num`],[`aria-label`,`Latest change detection cycles, newest first`,1,`cycles`],[3,`page`],[`type`,`button`,1,`name-link`,3,`click`],[1,`num`],[`colspan`,`4`],[1,`when`],[1,`trigger`],[1,`timing`],[1,`top`]],template:function(e,t){if(e&1&&(F(0,`section`,0)(1,`div`,1)(2,`h2`,2),K(3,`Change detection`),I(),A(4,FA,4,5),F(5,`app-cd-transfer`,3),H(`imported`,function(e){return t.showImport(e)}),I(),F(6,`p`,4),K(7),I(),F(8,`p`,5),K(9),I()(),A(10,IA,7,1,`p`,6),F(11,`p`,7),K(12,` Records each change detection cycle with Angular's profiler: how long it took, how many components it checked, what started it and which checks changed nothing. Tree rows show how often each instance was checked. Times come from a development build. While it records, the page also wraps Angular's scheduler, adds a signal write hook and watches DOM updates; all of it stops with the recording. `),A(13,LA,1,0)(14,RA,1,0),I(),A(15,VA,2,1),A(16,WA,16,7),L(17,`app-limit-note`,8),M(18,GA,2,1,`p`,9,ng),A(20,JA,9,10),A(21,oj,46,6)(22,sj,2,0,`p`,10),I()),e&2){let e;D(4),j(t.imported()?-1:4),D(),P(`page`,t.page())(`maxCycles`,t.maxCycles()),D(2),q(t.status()),D(2),q(t.announcement()),D(),j((e=t.imported())?10:-1,e),D(3),j(t.native()?13:14),D(2),j(t.page()?.supported===!1?15:-1),D(),j(!t.imported()&&!t.native()?16:-1),D(),P(`dropped`,t.page()?.dropped??0)(`max`,t.maxCycles()),D(),N(t.capNotes()),D(2),j(t.cycles().length?20:-1),D(),j(t.page()?.components?.length?21:t.recording()?22:-1)}},dependencies:[yD,iO,vA,Ak,xA,Kk,sA,MA],styles:[`[_nghost-%COMP%] { display: block; margin-top: 16px; } @@ -1946,7 +1946,7 @@ td.mono[_ngcontent-%COMP%] { .trigger[_ngcontent-%COMP%] .mono[_ngcontent-%COMP%], .top[_ngcontent-%COMP%] .mono[_ngcontent-%COMP%] { overflow-wrap: anywhere; -}`]})};function fj(e){return Object.fromEntries(e.map(e=>[e.name,e.value??null]))}function pj(e){return e.map(e=>({name:e.name,listened:!!e.listened}))}function mj(e){let t={component:e.name,tag:e.tag,hostPath:e.path};e.selector&&(t.selector=e.selector),e.source&&(t.source=e.source),e.changeDetection&&(t.changeDetection=e.changeDetection),e.encapsulation&&(t.encapsulation=e.encapsulation),t.inputs=fj(e.inputs),t.outputs=pj(e.outputs),t.properties=fj(e.properties??[]),e.listeners.length&&(t.listeners=e.listeners),e.directives.length&&(t.directives=e.directives.map(e=>({name:e.name,inputs:fj(e.inputs),outputs:pj(e.outputs)}))),t.injected=e.dependencies.map(e=>({token:e.token,providedBy:e.providedBy?e.providedByName??`an injector`:null}));try{return JSON.stringify(t,null,2)}catch{return JSON.stringify({component:e.name,tag:e.tag,hostPath:e.path})}}function hj(e){return e.selector||e.path}var gj=1e3;function _j(e,t){let n=[];for(let[r,i]of t){let t=e.get(r);t!==void 0&&t!==i&&n.push(r)}return n}function vj(e){try{return JSON.stringify(e)??`undefined`}catch{return String(e)}}var yj=class{ms;changed=T(new Set);owner=null;last=new Map;timers=new Map;constructor(e=gj){this.ms=e}update(e,t){let n=new Map([...t].map(([e,t])=>[e,vj(t)]));if(e!==this.owner){this.clear(),this.owner=e,this.last=n;return}let r=_j(this.last,n);if(this.last=n,r.length){this.changed.update(e=>new Set([...e,...r]));for(let e of r)clearTimeout(this.timers.get(e)),this.timers.set(e,setTimeout(()=>{this.timers.delete(e),this.changed.update(t=>{let n=new Set(t);return n.delete(e),n})},this.ms))}}clear(){for(let e of this.timers.values())clearTimeout(e);this.timers.clear(),this.changed().size&&this.changed.set(new Set)}};function bj(e,t,n=0){return e===`directive`?`directive:${n}:${t}`:`${e}:${t}`}var xj=[`*`];function Sj(e,t){e&1&&K(0),e&2&&q(W(2).label())}function Cj(e,t){e&1&&jg(0,0,null,Sj,1,1)}function wj(e,t){if(e&1&&(F(0,`span`,4),K(1),I()),e&2){let e=W(2);D(),q(e.message())}}function Tj(e,t){if(e&1){let e=B();F(0,`button`,2),H(`click`,function(){return S(e),C(W().open())}),gg(1,3),I(),A(2,wj,2,1,`span`,4)}if(e&2){let e=W(),t=Fg(1);P(`title`,`Open `+e.label()+` in your editor`),k(`aria-label`,`Open `+e.label()+` in your editor`),D(),P(`ngTemplateOutlet`,t),D(),j(e.message()?2:-1)}}function Ej(e,t){if(e&1&&(F(0,`span`,1),gg(1,3),I()),e&2){let e=W(),t=Fg(1);P(`title`,e.label()),D(),P(`ngTemplateOutlet`,t)}}var Dj=class e{source=T(T(null));client=X(()=>this.source()());available=X(()=>{let e=this.client();return!!e&&!_T(e)});use(e){this.source.set(e)}async open(e,t){if(!this.available())return{ok:!1,error:`No server is connected.`};try{let n=await hT(this.client(),`open-in-editor`,{file:e,...t?{line:t}:{}});return n?.ok?{ok:!0}:{ok:!1,error:n?.error??`The server did not open it.`}}catch{return{ok:!1,error:`The server did not open it.`}}}static ɵfac=function(t){return new(t||e)};static ɵprov=kl({token:e,factory:e.ɵfac})};function Oj(e,t){return t?`${e}:${t}`:e}var kj=class e{editor=x(Dj);file=$.required();line=$(void 0);label=X(()=>Oj(this.file(),this.line()));message=T(``);async open(){this.message.set(``);let e=await this.editor.open(this.file(),this.line()??void 0);e.ok||this.message.set(`Not opened: ${e.error}`)}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-source-link`]],inputs:{file:[1,`file`],line:[1,`line`]},ngContentSelectors:xj,decls:4,vars:1,consts:[[`text`,``],[1,`source-text`,3,`title`],[`type`,`button`,1,`source-link`,3,`click`,`title`],[3,`ngTemplateOutlet`],[`role`,`alert`,1,`message`]],template:function(e,t){e&1&&(Ag(),Mh(0,Cj,2,0,`ng-template`,null,0,nv),A(2,Tj,3,4)(3,Ej,2,2,`span`,1)),e&2&&(D(2),j(t.editor.available()?2:3))},dependencies:[Qv],styles:[`[_nghost-%COMP%] { +}`]})};function dj(e){return Object.fromEntries(e.map(e=>[e.name,e.value??null]))}function fj(e){return e.map(e=>({name:e.name,listened:!!e.listened}))}function pj(e){let t={component:e.name,tag:e.tag,hostPath:e.path};e.selector&&(t.selector=e.selector),e.source&&(t.source=e.source),e.changeDetection&&(t.changeDetection=e.changeDetection),e.encapsulation&&(t.encapsulation=e.encapsulation),t.inputs=dj(e.inputs),t.outputs=fj(e.outputs),t.properties=dj(e.properties??[]),e.listeners.length&&(t.listeners=e.listeners),e.directives.length&&(t.directives=e.directives.map(e=>({name:e.name,inputs:dj(e.inputs),outputs:fj(e.outputs)}))),t.injected=e.dependencies.map(e=>({token:e.token,providedBy:e.providedBy?e.providedByName??`an injector`:null}));try{return JSON.stringify(t,null,2)}catch{return JSON.stringify({component:e.name,tag:e.tag,hostPath:e.path})}}function mj(e){return e.selector||e.path}var hj=1e3;function gj(e,t){let n=[];for(let[r,i]of t){let t=e.get(r);t!==void 0&&t!==i&&n.push(r)}return n}function _j(e){try{return JSON.stringify(e)??`undefined`}catch{return String(e)}}var vj=class{ms;changed=T(new Set);owner=null;last=new Map;timers=new Map;constructor(e=hj){this.ms=e}update(e,t){let n=new Map([...t].map(([e,t])=>[e,_j(t)]));if(e!==this.owner){this.clear(),this.owner=e,this.last=n;return}let r=gj(this.last,n);if(this.last=n,r.length){this.changed.update(e=>new Set([...e,...r]));for(let e of r)clearTimeout(this.timers.get(e)),this.timers.set(e,setTimeout(()=>{this.timers.delete(e),this.changed.update(t=>{let n=new Set(t);return n.delete(e),n})},this.ms))}}clear(){for(let e of this.timers.values())clearTimeout(e);this.timers.clear(),this.changed().size&&this.changed.set(new Set)}};function yj(e,t,n=0){return e===`directive`?`directive:${n}:${t}`:`${e}:${t}`}var bj=[`*`];function xj(e,t){e&1&&K(0),e&2&&q(W(2).label())}function Sj(e,t){e&1&&Mg(0,0,null,xj,1,1)}function Cj(e,t){if(e&1&&(F(0,`span`,4),K(1),I()),e&2){let e=W(2);D(),q(e.message())}}function wj(e,t){if(e&1){let e=B();F(0,`button`,2),H(`click`,function(){return S(e),C(W().open())}),_g(1,3),I(),A(2,Cj,2,1,`span`,4)}if(e&2){let e=W(),t=Ig(1);P(`title`,`Open `+e.label()+` in your editor`),k(`aria-label`,`Open `+e.label()+` in your editor`),D(),P(`ngTemplateOutlet`,t),D(),j(e.message()?2:-1)}}function Tj(e,t){if(e&1&&(F(0,`span`,1),_g(1,3),I()),e&2){let e=W(),t=Ig(1);P(`title`,e.label()),D(),P(`ngTemplateOutlet`,t)}}var Ej=class e{source=T(T(null));client=X(()=>this.source()());available=X(()=>{let e=this.client();return!!e&&!gT(e)});use(e){this.source.set(e)}async open(e,t){if(!this.available())return{ok:!1,error:`No server is connected.`};try{let n=await mT(this.client(),`open-in-editor`,{file:e,...t?{line:t}:{}});return n?.ok?{ok:!0}:{ok:!1,error:n?.error??`The server did not open it.`}}catch{return{ok:!1,error:`The server did not open it.`}}}static ɵfac=function(t){return new(t||e)};static ɵprov=Al({token:e,factory:e.ɵfac})};function Dj(e,t){return t?`${e}:${t}`:e}var Oj=class e{editor=x(Ej);file=$.required();line=$(void 0);label=X(()=>Dj(this.file(),this.line()));message=T(``);async open(){this.message.set(``);let e=await this.editor.open(this.file(),this.line()??void 0);e.ok||this.message.set(`Not opened: ${e.error}`)}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-source-link`]],inputs:{file:[1,`file`],line:[1,`line`]},ngContentSelectors:bj,decls:4,vars:1,consts:[[`text`,``],[1,`source-text`,3,`title`],[`type`,`button`,1,`source-link`,3,`click`,`title`],[3,`ngTemplateOutlet`],[`role`,`alert`,1,`message`]],template:function(e,t){e&1&&(jg(),Nh(0,Sj,2,0,`ng-template`,null,0,rv),A(2,wj,3,4)(3,Tj,2,2,`span`,1)),e&2&&(D(2),j(t.editor.available()?2:3))},dependencies:[$v],styles:[`[_nghost-%COMP%] { display: inline; min-width: 0; } @@ -1981,7 +1981,7 @@ td.mono[_ngcontent-%COMP%] { color: var(--%NS%danger-text); font-family: var(--%NS%font-sans); font-size: 0.92em; -}`]})},Aj=[`field`],jj=[`editButton`],Mj=[`valueBox`];function Nj(e,t){if(e&1){let e=B();R(0,`div`,5)(1,`label`,6),K(2),z(),R(3,`input`,7,0),U(`input`,function(t){return S(e),C(W().draft.set(t.target.value))})(`keydown.enter`,function(t){S(e);let n=W();return t.preventDefault(),C(n.apply())})(`keydown.escape`,function(t){S(e);let n=W();return t.preventDefault(),t.stopPropagation(),C(n.cancel())}),z(),R(5,`button`,8),U(`click`,function(){return S(e),C(W().apply())}),K(6,`Apply`),z(),R(7,`button`,9),U(`click`,function(){return S(e),C(W().cancel())}),K(8,`Cancel`),z()(),R(9,`p`,10),K(10),z()}if(e&2){let e=W();D(),V(`htmlFor`,e.fieldId),D(),J(`New value of `,e.prop().name,`, as JSON`),D(),V(`id`,e.fieldId)(`value`,e.draft())(`readOnly`,e.busy()),k(`aria-busy`,e.busy()?`true`:null)(`aria-invalid`,e.error()?`true`:null)(`aria-describedby`,e.hintId+(e.error()?` `+e.errorId:``)),D(2),V(`disabled`,e.busy()),D(4),V(`id`,e.hintId),D(),J(` JSON, such as "text", 42, true or `,e.objectSample,`. Enter applies, Escape cancels. `)}}function Pj(e,t){if(e&1&&(R(0,`pre`,null,1),K(2),Q_(3,`json`),z()),e&2){let e=W(2);k(`tabindex`,e.scrollable()?0:null)(`role`,e.scrollable()?`region`:null)(`aria-label`,e.scrollable()?`Value of `+e.prop().name:null),D(2),q($_(3,4,e.prop().value))}}function Fj(e,t){if(e&1){let e=B();R(0,`button`,14,2),U(`click`,function(){return S(e),C(W(2).start())}),K(2,` Edit `),z()}if(e&2){let e=W(2);V(`disabled`,e.busy()),k(`aria-label`,`Edit `+e.prop().name)}}function Ij(e,t){if(e&1&&(R(0,`p`,13),K(1),z()),e&2){let e=W(2);D(),q(e.prop().locked)}}function Lj(e,t){if(e&1&&(R(0,`div`,11),A(1,Pj,4,6,`pre`),A(2,Fj,3,2,`button`,12),z(),A(3,Ij,2,1,`p`,13)),e&2){let e=W();D(),j(e.bare()?-1:1),D(),j(e.editable()?2:-1),D(),j(e.writes()&&e.prop().locked?3:-1)}}function Rj(e,t){if(e&1&&(R(0,`p`,3),K(1),z()),e&2){let e=W();V(`id`,e.errorId),D(),q(e.error())}}var zj=0;function Bj(e){let t=e.trim();if(!t)return{error:`Type a JSON value, such as "text", 42, true, null or [1, 2].`};try{return{value:JSON.parse(t)}}catch{return{error:`Not valid JSON. Put text in double quotes, such as "Paris".`}}}var Vj=class e{prop=$.required();componentId=$.required();pageId=$(null);rpc=$(null);writes=$(!1);bare=$(!1);readDraft=$(null);fieldId=`prop-edit-${++zj}`;hintId=`${this.fieldId}-hint`;errorId=`${this.fieldId}-error`;objectSample=`{"a": 1}`;editing=T(!1);draft=T(``);busy=T(!1);error=T(``);done=T(``);editable=X(()=>this.writes()&&!!this.prop().edit&&!!this.pageId()&&!!this.rpc());field=gv(`field`);editButton=gv(`editButton`);valueBox=gv(`valueBox`);injector=x(bs);scrollable=T(!1);constructor(){Cv(()=>{this.prop();let e=this.valueBox()?.nativeElement;this.scrollable.set(!!e&&e.scrollHeight>e.clientHeight+1)})}async start(){let e=this.prop().value;this.error.set(``),this.done.set(``);let t=this.readDraft();if(t){this.busy.set(!0);let n=await t();if(this.busy.set(!1),n.error!==void 0){this.error.set(n.error);return}e=n.value}this.draft.set(e===void 0?``:JSON.stringify(e)),this.editing.set(!0),cd(()=>{let e=this.field()?.nativeElement;e?.focus(),e?.select()},{injector:this.injector})}cancel(){this.editing()&&(this.editing.set(!1),this.busy.set(!1),this.error.set(``),this.focusEdit())}async apply(){if(this.busy())return;let e=Bj(this.draft());if(`error`in e){this.error.set(e.error);return}let t=this.prop(),n=this.rpc(),r=this.pageId();if(!n||!r||!t.edit)return;this.busy.set(!0),this.error.set(``);let i;try{i=await n.scope(`pangular`).rpc.call(`request-component-edit`,{pageId:r,request:{id:this.componentId(),path:t.prop,value:e.value,kind:t.edit}})??{}}catch{i={error:`The devtools server did not answer. Try again.`}}this.busy.set(!1),this.editing()&&(i.ok?(this.editing.set(!1),this.done.set(`Set ${t.name}.`),this.focusEdit()):(this.error.set(i.error??`The page did not write it.`),this.field()?.nativeElement.focus()))}focusEdit(){cd(()=>this.editButton()?.nativeElement.focus(),{injector:this.injector})}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-prop-value`]],viewQuery:function(e,t){e&1&&Ng(t.field,Aj,5)(t.editButton,jj,5)(t.valueBox,Mj,5),e&2&&Pg(3)},inputs:{prop:[1,`prop`],componentId:[1,`componentId`],pageId:[1,`pageId`],rpc:[1,`rpc`],writes:[1,`writes`],bare:[1,`bare`],readDraft:[1,`readDraft`]},decls:5,vars:3,consts:[[`field`,``],[`valueBox`,``],[`editButton`,``],[`role`,`alert`,1,`error`,3,`id`],[`role`,`status`,1,`sr-only`],[1,`editor`],[1,`sr-only`,3,`for`],[`type`,`text`,`autocomplete`,`off`,`spellcheck`,`false`,1,`field`,`mono`,3,`input`,`keydown.enter`,`keydown.escape`,`id`,`value`,`readOnly`],[`type`,`button`,1,`primary`,3,`click`,`disabled`],[`type`,`button`,3,`click`],[1,`hint`,3,`id`],[1,`view`],[`type`,`button`,1,`edit`,3,`disabled`],[1,`locked`],[`type`,`button`,1,`edit`,3,`click`,`disabled`]],template:function(e,t){e&1&&(A(0,Nj,11,11)(1,Lj,4,3),A(2,Rj,2,2,`p`,3),R(3,`p`,4),K(4),z()),e&2&&(j(+!t.editing()),D(2),j(t.error()?2:-1),D(2),q(t.done()))},dependencies:[ey],styles:[`[_nghost-%COMP%] { +}`]})},kj=[`field`],Aj=[`editButton`],jj=[`valueBox`];function Mj(e,t){if(e&1){let e=B();R(0,`div`,5)(1,`label`,6),K(2),z(),R(3,`input`,7,0),U(`input`,function(t){return S(e),C(W().draft.set(t.target.value))})(`keydown.enter`,function(t){S(e);let n=W();return t.preventDefault(),C(n.apply())})(`keydown.escape`,function(t){S(e);let n=W();return t.preventDefault(),t.stopPropagation(),C(n.cancel())}),z(),R(5,`button`,8),U(`click`,function(){return S(e),C(W().apply())}),K(6,`Apply`),z(),R(7,`button`,9),U(`click`,function(){return S(e),C(W().cancel())}),K(8,`Cancel`),z()(),R(9,`p`,10),K(10),z()}if(e&2){let e=W();D(),V(`htmlFor`,e.fieldId),D(),J(`New value of `,e.prop().name,`, as JSON`),D(),V(`id`,e.fieldId)(`value`,e.draft())(`readOnly`,e.busy()),k(`aria-busy`,e.busy()?`true`:null)(`aria-invalid`,e.error()?`true`:null)(`aria-describedby`,e.hintId+(e.error()?` `+e.errorId:``)),D(2),V(`disabled`,e.busy()),D(4),V(`id`,e.hintId),D(),J(` JSON, such as "text", 42, true or `,e.objectSample,`. Enter applies, Escape cancels. `)}}function Nj(e,t){if(e&1&&(R(0,`pre`,null,1),K(2),$_(3,`json`),z()),e&2){let e=W(2);k(`tabindex`,e.scrollable()?0:null)(`role`,e.scrollable()?`region`:null)(`aria-label`,e.scrollable()?`Value of `+e.prop().name:null),D(2),q(ev(3,4,e.prop().value))}}function Pj(e,t){if(e&1){let e=B();R(0,`button`,14,2),U(`click`,function(){return S(e),C(W(2).start())}),K(2,` Edit `),z()}if(e&2){let e=W(2);V(`disabled`,e.busy()),k(`aria-label`,`Edit `+e.prop().name)}}function Fj(e,t){if(e&1&&(R(0,`p`,13),K(1),z()),e&2){let e=W(2);D(),q(e.prop().locked)}}function Ij(e,t){if(e&1&&(R(0,`div`,11),A(1,Nj,4,6,`pre`),A(2,Pj,3,2,`button`,12),z(),A(3,Fj,2,1,`p`,13)),e&2){let e=W();D(),j(e.bare()?-1:1),D(),j(e.editable()?2:-1),D(),j(e.writes()&&e.prop().locked?3:-1)}}function Lj(e,t){if(e&1&&(R(0,`p`,3),K(1),z()),e&2){let e=W();V(`id`,e.errorId),D(),q(e.error())}}var Rj=0;function zj(e){let t=e.trim();if(!t)return{error:`Type a JSON value, such as "text", 42, true, null or [1, 2].`};try{return{value:JSON.parse(t)}}catch{return{error:`Not valid JSON. Put text in double quotes, such as "Paris".`}}}var Bj=class e{prop=$.required();componentId=$.required();pageId=$(null);rpc=$(null);writes=$(!1);bare=$(!1);readDraft=$(null);fieldId=`prop-edit-${++Rj}`;hintId=`${this.fieldId}-hint`;errorId=`${this.fieldId}-error`;objectSample=`{"a": 1}`;editing=T(!1);draft=T(``);busy=T(!1);error=T(``);done=T(``);editable=X(()=>this.writes()&&!!this.prop().edit&&!!this.pageId()&&!!this.rpc());field=_v(`field`);editButton=_v(`editButton`);valueBox=_v(`valueBox`);injector=x(xs);scrollable=T(!1);constructor(){wv(()=>{this.prop();let e=this.valueBox()?.nativeElement;this.scrollable.set(!!e&&e.scrollHeight>e.clientHeight+1)})}async start(){let e=this.prop().value;this.error.set(``),this.done.set(``);let t=this.readDraft();if(t){this.busy.set(!0);let n=await t();if(this.busy.set(!1),n.error!==void 0){this.error.set(n.error);return}e=n.value}this.draft.set(e===void 0?``:JSON.stringify(e)),this.editing.set(!0),ld(()=>{let e=this.field()?.nativeElement;e?.focus(),e?.select()},{injector:this.injector})}cancel(){this.editing()&&(this.editing.set(!1),this.busy.set(!1),this.error.set(``),this.focusEdit())}async apply(){if(this.busy())return;let e=zj(this.draft());if(`error`in e){this.error.set(e.error);return}let t=this.prop(),n=this.rpc(),r=this.pageId();if(!n||!r||!t.edit)return;this.busy.set(!0),this.error.set(``);let i;try{i=await n.scope(`pangular`).rpc.call(`request-component-edit`,{pageId:r,request:{id:this.componentId(),path:t.prop,value:e.value,kind:t.edit}})??{}}catch{i={error:`The devtools server did not answer. Try again.`}}this.busy.set(!1),this.editing()&&(i.ok?(this.editing.set(!1),this.done.set(`Set ${t.name}.`),this.focusEdit()):(this.error.set(i.error??`The page did not write it.`),this.field()?.nativeElement.focus()))}focusEdit(){ld(()=>this.editButton()?.nativeElement.focus(),{injector:this.injector})}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-prop-value`]],viewQuery:function(e,t){e&1&&Pg(t.field,kj,5)(t.editButton,Aj,5)(t.valueBox,jj,5),e&2&&Fg(3)},inputs:{prop:[1,`prop`],componentId:[1,`componentId`],pageId:[1,`pageId`],rpc:[1,`rpc`],writes:[1,`writes`],bare:[1,`bare`],readDraft:[1,`readDraft`]},decls:5,vars:3,consts:[[`field`,``],[`valueBox`,``],[`editButton`,``],[`role`,`alert`,1,`error`,3,`id`],[`role`,`status`,1,`sr-only`],[1,`editor`],[1,`sr-only`,3,`for`],[`type`,`text`,`autocomplete`,`off`,`spellcheck`,`false`,1,`field`,`mono`,3,`input`,`keydown.enter`,`keydown.escape`,`id`,`value`,`readOnly`],[`type`,`button`,1,`primary`,3,`click`,`disabled`],[`type`,`button`,3,`click`],[1,`hint`,3,`id`],[1,`view`],[`type`,`button`,1,`edit`,3,`disabled`],[1,`locked`],[`type`,`button`,1,`edit`,3,`click`,`disabled`]],template:function(e,t){e&1&&(A(0,Mj,11,11)(1,Ij,4,3),A(2,Lj,2,2,`p`,3),R(3,`p`,4),K(4),z()),e&2&&(j(+!t.editing()),D(2),j(t.error()?2:-1),D(2),q(t.done()))},dependencies:[ty],styles:[`[_nghost-%COMP%] { display: block; min-width: 0; } @@ -2104,7 +2104,7 @@ button.edit[_ngcontent-%COMP%] { .error[_ngcontent-%COMP%] { color: var(--%NS%danger-text); -}`]})},Hj=1e3,Uj={depth:5,limit:100},Wj=`[redacted]`;function Gj(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function Kj(e){return Gj(e)&&typeof e.$more==`number`&&Object.keys(e).length===1}function qj(e){return Gj(e)&&typeof e.$collapsed==`string`&&typeof e.size==`number`&&Object.keys(e).length===2}function Jj(e){return e===`Array`?`array`:e===`Map`?`map`:e===`Set`?`set`:`object`}function Yj(e){return e.$type===`Map`&&Array.isArray(e.entries)}function Xj(e){return e.$type===`Set`&&Array.isArray(e.values)}function Zj(e){return Object.keys(e).filter(e=>e!==`$type`&&e!==`$more`)}function Qj(e){if(!e||typeof e!=`object`)return null;if(qj(e))return e.size<=0?null:{kind:Jj(e.$collapsed),type:e.$collapsed,size:e.size,collapsed:!0};if(Kj(e))return null;if(Array.isArray(e)){let t=e.at(-1),n=Kj(t)?t.$more:0,r=e.length-+!!n+n;return r?{kind:`array`,type:`Array`,size:r,collapsed:!1}:null}let t=e;if(Yj(t)||Xj(t)){let e=typeof t.size==`number`?t.size:0,n=Yj(t)?`map`:`set`;return e?{kind:n,type:n===`map`?`Map`:`Set`,size:e,collapsed:!1}:null}let n=typeof t.$more==`number`?t.$more:0,r=Zj(t).length+n,i=typeof t.$type==`string`?t.$type:`Object`;return r?{kind:`object`,type:i,size:r,collapsed:!1}:null}function $j(e){if(typeof e==`string`)return JSON.stringify(e);let t=Qj(e);if(t)return nM(t);try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function eM(e){let t=Qj(e);if(!t||t.collapsed)return{children:[],more:0};if(Array.isArray(e)){let n=(Kj(e.at(-1))?e.slice(0,-1):e).map((e,t)=>({key:String(t),label:String(t),value:e}));return{children:n,more:t.size-n.length}}let n=e;if(t.kind===`map`){let e=n.entries.map((e,t)=>{let[n,r]=Array.isArray(e)?e:[void 0,e];return{key:String(t),label:$j(n),value:r}});return{children:e,more:Math.max(0,t.size-e.length)}}if(t.kind===`set`){let e=n.values.map((e,t)=>({key:String(t),label:String(t),value:e}));return{children:e,more:Math.max(0,t.size-e.length)}}return{children:Zj(n).map(e=>({key:e,label:e,value:n[e]})),more:typeof n.$more==`number`?n.$more:0}}function tM(e,t,n){return`${e} ${e===1?t:n}`}function nM(e){let t={array:tM(e.size,`item`,`items`),object:tM(e.size,`key`,`keys`),map:tM(e.size,`entry`,`entries`),set:tM(e.size,`value`,`values`)}[e.kind];return`${e.type} (${t})`}function rM(e,t){return JSON.stringify(t===void 0?e:[t,...e])}function iM(e,t){return e.map((e,n)=>n===0?e:(t?t[n-1]!==`object`:/^\d+$/.test(e))?`[${e}]`:`.${e}`).join(``)}function aM(e){return e.every(e=>e&&e===e.trim()&&!/[.[\]]/.test(e))?e.join(`.`):null}var oM=/^\[(Getter|Unreadable|Circular|Truncated|Function\b.*|Promise)\]$/;function sM(e){return e===null||typeof e==`boolean`?!0:typeof e==`number`?Number.isFinite(e):typeof e==`string`&&e!==Wj&&!oM.test(e)&&!e.endsWith(`…`)}function cM(e,t){return!e||t.kind===`map`||t.kind===`set`||e===`signal`&&t.kind===`object`&&t.type!==`Object`?null:e}function lM(e,t,n,r,i=500){let a=[],o=r.trim().toLowerCase();if(!o)return a;let s=new Set,c=(e,t)=>{let r=rM(e);if(!(s.has(r)||a.length>=i)){s.add(r);for(let r of eM(t).children){let t=[...e,r.key];if(r.label.toLowerCase().includes(o)&&a.push(t),!Qj(r.value))continue;let i=n(t)??(Qj(r.value)?.collapsed?void 0:r.value);i!==void 0&&c(t,i)}}};return c(e,n(e)??t),a}var uM=(e,t)=>t.id;function dM(e,t){if(e&1){let e=B();F(0,`button`,2),H(`click`,function(){S(e);let t=W().$implicit;return C(W(3).toggle(t))}),w(),F(1,`svg`,3),L(2,`path`,4),I(),fs(),F(3,`span`,14),K(4),I(),F(5,`span`,5),K(6),I()()}if(e&2){let e=W().$implicit;k(`aria-expanded`,e.open)(`aria-label`,e.label+`: `+e.text),D(4),J(``,e.label,`:`),D(2),q(e.text)}}function fM(e,t){if(e&1&&L(0,`app-prop-value`,15),e&2){let e=W(5);P(`prop`,t)(`componentId`,e.componentId())(`pageId`,e.pageId())(`rpc`,e.rpc())(`writes`,e.writes())}}function pM(e,t){if(e&1&&(F(0,`span`,16),K(1),I()),e&2){let e=W(2).$implicit;D(),q(e.text)}}function mM(e,t){if(e&1&&(F(0,`span`,14),K(1),I(),A(2,fM,1,5,`app-prop-value`,15)(3,pM,2,1,`span`,16)),e&2){let e,t=W().$implicit;D(),J(``,t.label,`:`),D(),j((e=t.edit)?2:3,e)}}function hM(e,t){if(e&1){let e=B();F(0,`button`,17),H(`click`,function(){S(e);let t=W().$implicit;return C(W(3).more(t))}),K(1),F(2,`span`,18),K(3),I()()}if(e&2){let e=W().$implicit,t=W(3);D(),J(` Show `,t.step(e),` more `),D(2),J(`(`,e.more,` not listed)`)}}function gM(e,t){e&1&&(F(0,`span`,12),K(1,`Reading from the page…`),I())}function _M(e,t){if(e&1&&(F(0,`span`,13),K(1),I()),e&2){let e=W().$implicit;D(),q(e.text)}}function vM(e,t){if(e&1&&(F(0,`li`,9),A(1,dM,7,4,`button`,10)(2,mM,4,2)(3,hM,4,2,`button`,11)(4,gM,2,0,`span`,12)(5,_M,2,1,`span`,13),I()),e&2){let e,n=t.$implicit;n_(`padding-left`,n.depth*14,`px`),D(),j((e=n.kind)===`node`?1:e===`leaf`?2:e===`more`?3:e===`loading`?4:e===`error`?5:-1)}}function yM(e,t){if(e&1&&(F(0,`ul`,7),M(1,vM,6,3,`li`,8,uM),I()),e&2){let e=W(2);P(`id`,e.listId),k(`aria-label`,e.prop().name+` entries`),D(),N(e.rows())}}function bM(e,t){if(e&1){let e=B();F(0,`div`,1)(1,`button`,2),H(`click`,function(){return S(e),C(W().toggleRoot())}),w(),F(2,`svg`,3),L(3,`path`,4),I(),fs(),F(4,`span`,5),K(5),I()(),L(6,`app-prop-value`,6),I(),A(7,yM,3,2,`ul`,7)}if(e&2){let e=t,n=W();D(),k(`aria-expanded`,n.rootOpen())(`aria-controls`,n.rootOpen()?n.listId:null)(`aria-label`,n.prop().name+`: `+n.summaryOf(e)),D(4),q(n.summaryOf(e)),D(),P(`bare`,!0)(`prop`,n.prop())(`componentId`,n.componentId())(`pageId`,n.pageId())(`rpc`,n.rpc())(`writes`,n.writes())(`readDraft`,n.readWhole),D(),j(n.rootOpen()?7:-1)}}function xM(e,t){if(e&1&&L(0,`app-prop-value`,0),e&2){let e=W();P(`prop`,e.prop())(`componentId`,e.componentId())(`pageId`,e.pageId())(`rpc`,e.rpc())(`writes`,e.writes())}}var SM=0;function CM(e){if(e===void 0)return`undefined`;try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function wM(e){if(Array.isArray(e))return e.every(wM);if(e&&typeof e==`object`){let t=e;return![`$collapsed`,`$more`,`$type`].some(e=>Object.hasOwn(t,e))&&Object.values(t).every(wM)}return sM(e)}var TM=class e{prop=$.required();store=$.required();componentId=$.required();pageId=$(null);rpc=$(null);writes=$(!1);directive=$(void 0);query=$(``);listId=`value-tree-${++SM}`;host=x(Ml);pendingMore=null;constructor(){Cv(()=>{let e=this.rows(),t=this.pendingMore;if(!t)return;let n=e.findIndex(e=>(e.kind===`leaf`||e.kind===`node`)&&!t.has(e.id));if(n<0)return;this.pendingMore=null;let r=document.activeElement;r&&r!==document.body&&r.isConnected||this.focusNear(n)})}rootPath=X(()=>[this.prop().prop]);rootValue=X(()=>this.store().level(this.rootPath(),this.directive())??this.prop().value);root=X(()=>Qj(this.rootValue()));needle=X(()=>this.query().trim().toLowerCase());matches=X(()=>{let e=this.needle(),t=this.prop();if(!e||[t.name,t.prop].some(t=>t.toLowerCase().includes(e)))return null;let n=this.store(),r=this.directive();return lM(this.rootPath(),this.rootValue(),e=>n.level(e,r),e)});rootOpen=X(()=>!!this.matches()?.length||this.store().isOpen(this.rootPath(),this.directive()));rows=X(()=>{let e=this.root();if(!e)return[];let t=this.store(),n=this.directive(),r=this.matches(),i=new Set,a=new Set;for(let e of r??[]){a.add(rM(e));for(let t=2;t<=e.length;t++)i.add(rM(e.slice(0,t)))}let o=this.prop(),s=this.writes()&&n===void 0,c=[],l=(e,o,d,f,p,m)=>{let{children:ee,more:h}=eM(e);for(let e of ee){let ee=[...o,e.key],h=rM(ee);if(r&&!m&&!i.has(h))continue;let g=Qj(e.value),te=rM(ee,n);if(!g){let t=p&&sM(e.value)?aM(ee):null;c.push({id:te,kind:`leaf`,depth:f,path:ee,label:e.label,text:CM(e.value),edit:s&&t&&p?{name:iM(ee,[...d]),prop:t,value:e.value,edit:p}:void 0});continue}let ne=!!r&&!m&&i.has(h)&&!a.has(h)||t.isOpen(ee,n);if(c.push({id:te,kind:`node`,depth:f,path:ee,label:e.label,text:nM(g),container:g,open:ne}),!ne)continue;let re=t.level(ee,n)??(g.collapsed?void 0:e.value),ie=[...d,g.kind];re===void 0?t.errors().has(te)?c.push({...u(ee,f+1,`error`),text:t.errors().get(te)}):c.push(u(ee,f+1,`loading`)):l(re,ee,ie,f+1,cM(p,g),m||a.has(h))}h>0&&(!r||m)&&c.push({...u(o,f,`more`),more:h,listed:ee.length})},u=(e,t,r)=>({id:`${rM(e,n)}:${r}`,kind:r,depth:t,path:e,label:``,text:``});return l(this.rootValue(),this.rootPath(),[e.kind],0,s?cM(o.editInside??null,e):null,!r),c});readWhole=async()=>{let e=await this.store().read(this.rootPath(),Uj.depth,Uj.limit);return e.ok?wM(e.value)?{value:e.value}:{error:`Too large to edit as a whole. Open it to edit the values inside.`}:{error:e.error??`The page did not read it.`}};summaryOf(e){return nM(e)}toggleRoot(){this.pendingMore=null,this.store().toggle(this.rootPath(),this.directive(),!1)}toggle(e){this.pendingMore=null,this.store().toggle(e.path,this.directive(),!!e.container?.collapsed)}more(e){this.pendingMore=new Set(this.rows().map(e=>e.id)),this.store().more(e.path,this.directive(),e.listed??0)}focusNear(e){let t=this.host.nativeElement,n=Array.from(t.querySelectorAll(`#${this.listId} > li`)),r=e=>e?.querySelector(`button:not([disabled]), input, textarea, [tabindex="0"]`);(n.slice(e).map(r).find(Boolean)??n.slice(0,e).reverse().map(r).find(Boolean)??t.querySelector(`.root > .toggle`))?.focus()}step(e){return Math.min(100,e.more??0)}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-value-tree`]],inputs:{prop:[1,`prop`],store:[1,`store`],componentId:[1,`componentId`],pageId:[1,`pageId`],rpc:[1,`rpc`],writes:[1,`writes`],directive:[1,`directive`],query:[1,`query`]},decls:2,vars:1,consts:[[3,`prop`,`componentId`,`pageId`,`rpc`,`writes`],[1,`root`],[`type`,`button`,1,`toggle`,3,`click`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`chevron`],[`d`,`m9 6 6 6-6 6`],[1,`summary`,`mono`],[1,`whole`,3,`bare`,`prop`,`componentId`,`pageId`,`rpc`,`writes`,`readDraft`],[1,`entries`,3,`id`],[1,`entry`,3,`padding-left`],[1,`entry`],[`type`,`button`,1,`toggle`],[`type`,`button`,1,`more`],[`role`,`status`,1,`muted`],[`role`,`alert`,1,`error`],[1,`key`,`mono`],[1,`leaf-edit`,3,`prop`,`componentId`,`pageId`,`rpc`,`writes`],[1,`leaf`,`mono`],[`type`,`button`,1,`more`,3,`click`],[1,`muted`]],template:function(e,t){if(e&1&&A(0,bM,8,12)(1,xM,1,5,`app-prop-value`,0),e&2){let e;j((e=t.root())?0:1,e)}},dependencies:[Vj],styles:[`[_nghost-%COMP%] { +}`]})},Vj=1e3,Hj={depth:5,limit:100},Uj=`[redacted]`;function Wj(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function Gj(e){return Wj(e)&&typeof e.$more==`number`&&Object.keys(e).length===1}function Kj(e){return Wj(e)&&typeof e.$collapsed==`string`&&typeof e.size==`number`&&Object.keys(e).length===2}function qj(e){return e===`Array`?`array`:e===`Map`?`map`:e===`Set`?`set`:`object`}function Jj(e){return e.$type===`Map`&&Array.isArray(e.entries)}function Yj(e){return e.$type===`Set`&&Array.isArray(e.values)}function Xj(e){return Object.keys(e).filter(e=>e!==`$type`&&e!==`$more`)}function Zj(e){if(!e||typeof e!=`object`)return null;if(Kj(e))return e.size<=0?null:{kind:qj(e.$collapsed),type:e.$collapsed,size:e.size,collapsed:!0};if(Gj(e))return null;if(Array.isArray(e)){let t=e.at(-1),n=Gj(t)?t.$more:0,r=e.length-+!!n+n;return r?{kind:`array`,type:`Array`,size:r,collapsed:!1}:null}let t=e;if(Jj(t)||Yj(t)){let e=typeof t.size==`number`?t.size:0,n=Jj(t)?`map`:`set`;return e?{kind:n,type:n===`map`?`Map`:`Set`,size:e,collapsed:!1}:null}let n=typeof t.$more==`number`?t.$more:0,r=Xj(t).length+n,i=typeof t.$type==`string`?t.$type:`Object`;return r?{kind:`object`,type:i,size:r,collapsed:!1}:null}function Qj(e){if(typeof e==`string`)return JSON.stringify(e);let t=Zj(e);if(t)return tM(t);try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function $j(e){let t=Zj(e);if(!t||t.collapsed)return{children:[],more:0};if(Array.isArray(e)){let n=(Gj(e.at(-1))?e.slice(0,-1):e).map((e,t)=>({key:String(t),label:String(t),value:e}));return{children:n,more:t.size-n.length}}let n=e;if(t.kind===`map`){let e=n.entries.map((e,t)=>{let[n,r]=Array.isArray(e)?e:[void 0,e];return{key:String(t),label:Qj(n),value:r}});return{children:e,more:Math.max(0,t.size-e.length)}}if(t.kind===`set`){let e=n.values.map((e,t)=>({key:String(t),label:String(t),value:e}));return{children:e,more:Math.max(0,t.size-e.length)}}return{children:Xj(n).map(e=>({key:e,label:e,value:n[e]})),more:typeof n.$more==`number`?n.$more:0}}function eM(e,t,n){return`${e} ${e===1?t:n}`}function tM(e){let t={array:eM(e.size,`item`,`items`),object:eM(e.size,`key`,`keys`),map:eM(e.size,`entry`,`entries`),set:eM(e.size,`value`,`values`)}[e.kind];return`${e.type} (${t})`}function nM(e,t){return JSON.stringify(t===void 0?e:[t,...e])}function rM(e,t){return e.map((e,n)=>n===0?e:(t?t[n-1]!==`object`:/^\d+$/.test(e))?`[${e}]`:`.${e}`).join(``)}function iM(e){return e.every(e=>e&&e===e.trim()&&!/[.[\]]/.test(e))?e.join(`.`):null}var aM=/^\[(Getter|Unreadable|Circular|Truncated|Function\b.*|Promise)\]$/;function oM(e){return e===null||typeof e==`boolean`?!0:typeof e==`number`?Number.isFinite(e):typeof e==`string`&&e!==Uj&&!aM.test(e)&&!e.endsWith(`…`)}function sM(e,t){return!e||t.kind===`map`||t.kind===`set`||e===`signal`&&t.kind===`object`&&t.type!==`Object`?null:e}function cM(e,t,n,r,i=500){let a=[],o=r.trim().toLowerCase();if(!o)return a;let s=new Set,c=(e,t)=>{let r=nM(e);if(!(s.has(r)||a.length>=i)){s.add(r);for(let r of $j(t).children){let t=[...e,r.key];if(r.label.toLowerCase().includes(o)&&a.push(t),!Zj(r.value))continue;let i=n(t)??(Zj(r.value)?.collapsed?void 0:r.value);i!==void 0&&c(t,i)}}};return c(e,n(e)??t),a}var lM=(e,t)=>t.id;function uM(e,t){if(e&1){let e=B();F(0,`button`,2),H(`click`,function(){S(e);let t=W().$implicit;return C(W(3).toggle(t))}),w(),F(1,`svg`,3),L(2,`path`,4),I(),ps(),F(3,`span`,14),K(4),I(),F(5,`span`,5),K(6),I()()}if(e&2){let e=W().$implicit;k(`aria-expanded`,e.open)(`aria-label`,e.label+`: `+e.text),D(4),J(``,e.label,`:`),D(2),q(e.text)}}function dM(e,t){if(e&1&&L(0,`app-prop-value`,15),e&2){let e=W(5);P(`prop`,t)(`componentId`,e.componentId())(`pageId`,e.pageId())(`rpc`,e.rpc())(`writes`,e.writes())}}function fM(e,t){if(e&1&&(F(0,`span`,16),K(1),I()),e&2){let e=W(2).$implicit;D(),q(e.text)}}function pM(e,t){if(e&1&&(F(0,`span`,14),K(1),I(),A(2,dM,1,5,`app-prop-value`,15)(3,fM,2,1,`span`,16)),e&2){let e,t=W().$implicit;D(),J(``,t.label,`:`),D(),j((e=t.edit)?2:3,e)}}function mM(e,t){if(e&1){let e=B();F(0,`button`,17),H(`click`,function(){S(e);let t=W().$implicit;return C(W(3).more(t))}),K(1),F(2,`span`,18),K(3),I()()}if(e&2){let e=W().$implicit,t=W(3);D(),J(` Show `,t.step(e),` more `),D(2),J(`(`,e.more,` not listed)`)}}function hM(e,t){e&1&&(F(0,`span`,12),K(1,`Reading from the page…`),I())}function gM(e,t){if(e&1&&(F(0,`span`,13),K(1),I()),e&2){let e=W().$implicit;D(),q(e.text)}}function _M(e,t){if(e&1&&(F(0,`li`,9),A(1,uM,7,4,`button`,10)(2,pM,4,2)(3,mM,4,2,`button`,11)(4,hM,2,0,`span`,12)(5,gM,2,1,`span`,13),I()),e&2){let e,n=t.$implicit;r_(`padding-left`,n.depth*14,`px`),D(),j((e=n.kind)===`node`?1:e===`leaf`?2:e===`more`?3:e===`loading`?4:e===`error`?5:-1)}}function vM(e,t){if(e&1&&(F(0,`ul`,7),M(1,_M,6,3,`li`,8,lM),I()),e&2){let e=W(2);P(`id`,e.listId),k(`aria-label`,e.prop().name+` entries`),D(),N(e.rows())}}function yM(e,t){if(e&1){let e=B();F(0,`div`,1)(1,`button`,2),H(`click`,function(){return S(e),C(W().toggleRoot())}),w(),F(2,`svg`,3),L(3,`path`,4),I(),ps(),F(4,`span`,5),K(5),I()(),L(6,`app-prop-value`,6),I(),A(7,vM,3,2,`ul`,7)}if(e&2){let e=t,n=W();D(),k(`aria-expanded`,n.rootOpen())(`aria-controls`,n.rootOpen()?n.listId:null)(`aria-label`,n.prop().name+`: `+n.summaryOf(e)),D(4),q(n.summaryOf(e)),D(),P(`bare`,!0)(`prop`,n.prop())(`componentId`,n.componentId())(`pageId`,n.pageId())(`rpc`,n.rpc())(`writes`,n.writes())(`readDraft`,n.readWhole),D(),j(n.rootOpen()?7:-1)}}function bM(e,t){if(e&1&&L(0,`app-prop-value`,0),e&2){let e=W();P(`prop`,e.prop())(`componentId`,e.componentId())(`pageId`,e.pageId())(`rpc`,e.rpc())(`writes`,e.writes())}}var xM=0;function SM(e){if(e===void 0)return`undefined`;try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function CM(e){if(Array.isArray(e))return e.every(CM);if(e&&typeof e==`object`){let t=e;return![`$collapsed`,`$more`,`$type`].some(e=>Object.hasOwn(t,e))&&Object.values(t).every(CM)}return oM(e)}var wM=class e{prop=$.required();store=$.required();componentId=$.required();pageId=$(null);rpc=$(null);writes=$(!1);directive=$(void 0);query=$(``);listId=`value-tree-${++xM}`;host=x(Nl);pendingMore=null;constructor(){wv(()=>{let e=this.rows(),t=this.pendingMore;if(!t)return;let n=e.findIndex(e=>(e.kind===`leaf`||e.kind===`node`)&&!t.has(e.id));if(n<0)return;this.pendingMore=null;let r=document.activeElement;r&&r!==document.body&&r.isConnected||this.focusNear(n)})}rootPath=X(()=>[this.prop().prop]);rootValue=X(()=>this.store().level(this.rootPath(),this.directive())??this.prop().value);root=X(()=>Zj(this.rootValue()));needle=X(()=>this.query().trim().toLowerCase());matches=X(()=>{let e=this.needle(),t=this.prop();if(!e||[t.name,t.prop].some(t=>t.toLowerCase().includes(e)))return null;let n=this.store(),r=this.directive();return cM(this.rootPath(),this.rootValue(),e=>n.level(e,r),e)});rootOpen=X(()=>!!this.matches()?.length||this.store().isOpen(this.rootPath(),this.directive()));rows=X(()=>{let e=this.root();if(!e)return[];let t=this.store(),n=this.directive(),r=this.matches(),i=new Set,a=new Set;for(let e of r??[]){a.add(nM(e));for(let t=2;t<=e.length;t++)i.add(nM(e.slice(0,t)))}let o=this.prop(),s=this.writes()&&n===void 0,c=[],l=(e,o,d,f,p,m)=>{let{children:ee,more:h}=$j(e);for(let e of ee){let ee=[...o,e.key],h=nM(ee);if(r&&!m&&!i.has(h))continue;let g=Zj(e.value),te=nM(ee,n);if(!g){let t=p&&oM(e.value)?iM(ee):null;c.push({id:te,kind:`leaf`,depth:f,path:ee,label:e.label,text:SM(e.value),edit:s&&t&&p?{name:rM(ee,[...d]),prop:t,value:e.value,edit:p}:void 0});continue}let ne=!!r&&!m&&i.has(h)&&!a.has(h)||t.isOpen(ee,n);if(c.push({id:te,kind:`node`,depth:f,path:ee,label:e.label,text:tM(g),container:g,open:ne}),!ne)continue;let re=t.level(ee,n)??(g.collapsed?void 0:e.value),ie=[...d,g.kind];re===void 0?t.errors().has(te)?c.push({...u(ee,f+1,`error`),text:t.errors().get(te)}):c.push(u(ee,f+1,`loading`)):l(re,ee,ie,f+1,sM(p,g),m||a.has(h))}h>0&&(!r||m)&&c.push({...u(o,f,`more`),more:h,listed:ee.length})},u=(e,t,r)=>({id:`${nM(e,n)}:${r}`,kind:r,depth:t,path:e,label:``,text:``});return l(this.rootValue(),this.rootPath(),[e.kind],0,s?sM(o.editInside??null,e):null,!r),c});readWhole=async()=>{let e=await this.store().read(this.rootPath(),Hj.depth,Hj.limit);return e.ok?CM(e.value)?{value:e.value}:{error:`Too large to edit as a whole. Open it to edit the values inside.`}:{error:e.error??`The page did not read it.`}};summaryOf(e){return tM(e)}toggleRoot(){this.pendingMore=null,this.store().toggle(this.rootPath(),this.directive(),!1)}toggle(e){this.pendingMore=null,this.store().toggle(e.path,this.directive(),!!e.container?.collapsed)}more(e){this.pendingMore=new Set(this.rows().map(e=>e.id)),this.store().more(e.path,this.directive(),e.listed??0)}focusNear(e){let t=this.host.nativeElement,n=Array.from(t.querySelectorAll(`#${this.listId} > li`)),r=e=>e?.querySelector(`button:not([disabled]), input, textarea, [tabindex="0"]`);(n.slice(e).map(r).find(Boolean)??n.slice(0,e).reverse().map(r).find(Boolean)??t.querySelector(`.root > .toggle`))?.focus()}step(e){return Math.min(100,e.more??0)}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-value-tree`]],inputs:{prop:[1,`prop`],store:[1,`store`],componentId:[1,`componentId`],pageId:[1,`pageId`],rpc:[1,`rpc`],writes:[1,`writes`],directive:[1,`directive`],query:[1,`query`]},decls:2,vars:1,consts:[[3,`prop`,`componentId`,`pageId`,`rpc`,`writes`],[1,`root`],[`type`,`button`,1,`toggle`,3,`click`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`chevron`],[`d`,`m9 6 6 6-6 6`],[1,`summary`,`mono`],[1,`whole`,3,`bare`,`prop`,`componentId`,`pageId`,`rpc`,`writes`,`readDraft`],[1,`entries`,3,`id`],[1,`entry`,3,`padding-left`],[1,`entry`],[`type`,`button`,1,`toggle`],[`type`,`button`,1,`more`],[`role`,`status`,1,`muted`],[`role`,`alert`,1,`error`],[1,`key`,`mono`],[1,`leaf-edit`,3,`prop`,`componentId`,`pageId`,`rpc`,`writes`],[1,`leaf`,`mono`],[`type`,`button`,1,`more`,3,`click`],[1,`muted`]],template:function(e,t){if(e&1&&A(0,yM,8,12)(1,bM,1,5,`app-prop-value`,0),e&2){let e;j((e=t.root())?0:1,e)}},dependencies:[Bj],styles:[`[_nghost-%COMP%] { display: block; min-width: 0; } @@ -2226,7 +2226,7 @@ button.edit[_ngcontent-%COMP%] { .more[_ngcontent-%COMP%] { transition: none; } -}`]})};function EM(e,t){return e.length>t.length&&e.startsWith(`${t.slice(0,-1)},`)}var DM=class{sender;target={rpc:null,pageId:null,componentId:null};fetched=T(new Map);pushed=T({});open=T(new Set);loading=T(new Set);errors=T(new Map);limits=new Map;generation=0;constructor(e){this.sender=e}follow(e,t){let n=e.componentId===this.target.componentId&&e.pageId===this.target.pageId;this.target=e,n||(this.generation++,this.fetched.set(new Map),this.open.set(new Set),this.loading.set(new Set),this.errors.set(new Map),this.limits.clear()),this.pushed.set(t??{})}level(e,t){let n=rM(e,t),r=this.pushed();return Object.hasOwn(r,n)?r[n]:this.fetched().get(n)}isOpen(e,t){return this.open().has(rM(e,t))}toggle(e,t,n){let r=rM(e,t),i=new Set(this.open());if(i.has(r)){for(let e of i)(e===r||EM(e,r))&&i.delete(e);this.open.set(i),this.send({path:e,directive:t,forget:!0});return}i.add(r),this.open.set(i),n&&this.load(e,t,this.limits.get(r)??30)}more(e,t,n){let r=rM(e,t),i=Math.min(Hj,Math.max(n,this.limits.get(r)??0)+100);this.limits.set(r,i),this.load(e,t,i)}async read(e,t,n){return this.send({path:e,depth:t,limit:n})}async load(e,t,n){let r=rM(e,t),i=this.generation;this.loading.update(e=>new Set(e).add(r));let a=await this.send({path:e,directive:t,limit:n,watch:!0});i===this.generation&&(this.loading.update(e=>{let t=new Set(e);return t.delete(r),t}),this.errors.update(e=>{let t=new Map(e);return a.ok?t.delete(r):t.set(r,a.error??`The page did not read it.`),t}),a.ok&&this.fetched.update(e=>new Map(e).set(r,a.value)))}async send(e){if(this.sender){if(e.forget)return{ok:!0};let{directive:t,watch:n,...r}=e;try{return await this.sender(r)}catch{return{error:`The devtools server did not answer. Try again.`}}}let{rpc:t,pageId:n,componentId:r}=this.target;if(!t||!n||!r)return{error:`No live page to read from.`};let{directive:i,...a}=e;try{return await t.scope(`pangular`).rpc.call(`request-component-value`,{pageId:n,request:{id:r,...a,...i===void 0?{}:{directive:i}}})??{}}catch{return{error:`The devtools server did not answer. Try again.`}}}};function OM(e,t){if(e&1&&(R(0,`span`,1),K(1),z()),e&2){let e=W(2);D(),J(`: `,e.label())}}function kM(e,t){if(e&1&&(R(0,`span`,1),K(1),z()),e&2){let e=W(3);D(),J(`: `,e.label())}}function AM(e,t){if(e&1){let e=B();R(0,`button`,4),U(`click`,function(){return S(e),C(W(2).store(`log`))}),K(1,` Log to console `),A(2,kM,2,1,`span`,1),z()}if(e&2){let e=W(2);V(`disabled`,e.busy()||!e.rpc()||!e.pageId()),D(2),j(e.label()?2:-1)}}function jM(e,t){if(e&1){let e=B();R(0,`button`,0),U(`click`,function(){return S(e),C(W().store())}),K(1,` Store as global `),A(2,OM,2,1,`span`,1),z(),A(3,AM,3,2,`button`,2),R(4,`span`,3),K(5),z()}if(e&2){let e=W();V(`disabled`,e.busy()||!e.rpc()||!e.pageId()),D(2),j(e.label()?2:-1),D(),j(e.canLog()?3:-1),D(2),q(e.message())}}var MM=class e{rpc=$(null);pageId=$(null);target=$.required();label=$(``);canLog=$(!1);staticReport=X(()=>_T(this.rpc()));busy=T(!1);message=T(``);async store(e=`store`){let t=this.rpc(),n=this.pageId();if(t&&n){this.busy.set(!0),this.message.set(``);try{let r=await t.scope(`pangular`).rpc.call(`request-console-global`,{pageId:n,target:this.target(),...e===`log`?{mode:e}:{}}),i=e===`log`?r?.ok?`Logged in the page console.`:`Not logged.`:r?.ok&&r.name?`Stored as ${r.name}.`:`Not stored.`;this.message.set(r?.message||i)}catch{this.message.set(`Could not reach the page.`)}finally{this.busy.set(!1)}}}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-store-global`]],inputs:{rpc:[1,`rpc`],pageId:[1,`pageId`],target:[1,`target`],label:[1,`label`],canLog:[1,`canLog`]},decls:1,vars:1,consts:[[`type`,`button`,1,`store`,3,`click`,`disabled`],[1,`sr-only`],[`type`,`button`,1,`store`,`log`,3,`disabled`],[`role`,`status`,1,`status`],[`type`,`button`,1,`store`,`log`,3,`click`,`disabled`]],template:function(e,t){e&1&&A(0,jM,6,4),e&2&&j(t.staticReport()?-1:0)},styles:[`[_nghost-%COMP%] { +}`]})};function TM(e,t){return e.length>t.length&&e.startsWith(`${t.slice(0,-1)},`)}var EM=class{sender;target={rpc:null,pageId:null,componentId:null};fetched=T(new Map);pushed=T({});open=T(new Set);loading=T(new Set);errors=T(new Map);limits=new Map;generation=0;constructor(e){this.sender=e}follow(e,t){let n=e.componentId===this.target.componentId&&e.pageId===this.target.pageId;this.target=e,n||(this.generation++,this.fetched.set(new Map),this.open.set(new Set),this.loading.set(new Set),this.errors.set(new Map),this.limits.clear()),this.pushed.set(t??{})}level(e,t){let n=nM(e,t),r=this.pushed();return Object.hasOwn(r,n)?r[n]:this.fetched().get(n)}isOpen(e,t){return this.open().has(nM(e,t))}toggle(e,t,n){let r=nM(e,t),i=new Set(this.open());if(i.has(r)){for(let e of i)(e===r||TM(e,r))&&i.delete(e);this.open.set(i),this.send({path:e,directive:t,forget:!0});return}i.add(r),this.open.set(i),n&&this.load(e,t,this.limits.get(r)??30)}more(e,t,n){let r=nM(e,t),i=Math.min(Vj,Math.max(n,this.limits.get(r)??0)+100);this.limits.set(r,i),this.load(e,t,i)}async read(e,t,n){return this.send({path:e,depth:t,limit:n})}async load(e,t,n){let r=nM(e,t),i=this.generation;this.loading.update(e=>new Set(e).add(r));let a=await this.send({path:e,directive:t,limit:n,watch:!0});i===this.generation&&(this.loading.update(e=>{let t=new Set(e);return t.delete(r),t}),this.errors.update(e=>{let t=new Map(e);return a.ok?t.delete(r):t.set(r,a.error??`The page did not read it.`),t}),a.ok&&this.fetched.update(e=>new Map(e).set(r,a.value)))}async send(e){if(this.sender){if(e.forget)return{ok:!0};let{directive:t,watch:n,...r}=e;try{return await this.sender(r)}catch{return{error:`The devtools server did not answer. Try again.`}}}let{rpc:t,pageId:n,componentId:r}=this.target;if(!t||!n||!r)return{error:`No live page to read from.`};let{directive:i,...a}=e;try{return await t.scope(`pangular`).rpc.call(`request-component-value`,{pageId:n,request:{id:r,...a,...i===void 0?{}:{directive:i}}})??{}}catch{return{error:`The devtools server did not answer. Try again.`}}}};function DM(e,t){if(e&1&&(R(0,`span`,1),K(1),z()),e&2){let e=W(2);D(),J(`: `,e.label())}}function OM(e,t){if(e&1&&(R(0,`span`,1),K(1),z()),e&2){let e=W(3);D(),J(`: `,e.label())}}function kM(e,t){if(e&1){let e=B();R(0,`button`,4),U(`click`,function(){return S(e),C(W(2).store(`log`))}),K(1,` Log to console `),A(2,OM,2,1,`span`,1),z()}if(e&2){let e=W(2);V(`disabled`,e.busy()||!e.rpc()||!e.pageId()),D(2),j(e.label()?2:-1)}}function AM(e,t){if(e&1){let e=B();R(0,`button`,0),U(`click`,function(){return S(e),C(W().store())}),K(1,` Store as global `),A(2,DM,2,1,`span`,1),z(),A(3,kM,3,2,`button`,2),R(4,`span`,3),K(5),z()}if(e&2){let e=W();V(`disabled`,e.busy()||!e.rpc()||!e.pageId()),D(2),j(e.label()?2:-1),D(),j(e.canLog()?3:-1),D(2),q(e.message())}}var jM=class e{rpc=$(null);pageId=$(null);target=$.required();label=$(``);canLog=$(!1);staticReport=X(()=>gT(this.rpc()));busy=T(!1);message=T(``);async store(e=`store`){let t=this.rpc(),n=this.pageId();if(t&&n){this.busy.set(!0),this.message.set(``);try{let r=await t.scope(`pangular`).rpc.call(`request-console-global`,{pageId:n,target:this.target(),...e===`log`?{mode:e}:{}}),i=e===`log`?r?.ok?`Logged in the page console.`:`Not logged.`:r?.ok&&r.name?`Stored as ${r.name}.`:`Not stored.`;this.message.set(r?.message||i)}catch{this.message.set(`Could not reach the page.`)}finally{this.busy.set(!1)}}}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-store-global`]],inputs:{rpc:[1,`rpc`],pageId:[1,`pageId`],target:[1,`target`],label:[1,`label`],canLog:[1,`canLog`]},decls:1,vars:1,consts:[[`type`,`button`,1,`store`,3,`click`,`disabled`],[1,`sr-only`],[`type`,`button`,1,`store`,`log`,3,`disabled`],[`role`,`status`,1,`status`],[`type`,`button`,1,`store`,`log`,3,`click`,`disabled`]],template:function(e,t){e&1&&A(0,AM,6,4),e&2&&j(t.staticReport()?-1:0)},styles:[`[_nghost-%COMP%] { display: inline-flex; flex-wrap: wrap; align-items: center; @@ -2275,7 +2275,7 @@ button.edit[_ngcontent-%COMP%] { .status[_ngcontent-%COMP%]:empty { display: none; -}`]})},NM=(e,t)=>t.block.id,PM=(e,t)=>t.kind,FM=(e,t)=>t.id;function IM(e,t){if(e&1&&K(0),e&2){let e=W().$implicit;J(` `,e.label,` `)}}function LM(e,t){if(e&1&&(K(0),R(1,`span`,18),K(2),z()),e&2){let e=W().$implicit;J(` `,e.kind,` `),D(2),J(``,e.seconds,`s`)}}function RM(e,t){if(e&1&&(R(0,`span`,9),A(1,IM,1,1)(2,LM,3,2),z()),e&2){let e=t.$implicit;r_(`note-`+e.kind),k(`title`,e.text),D(),j(e.seconds===void 0?1:2)}}function zM(e,t){if(e&1&&(R(0,`span`,9),K(1),z()),e&2){let e=W().$implicit;k(`title`,e.block.hydratedAt===void 0?`The block hydrated before the devtools attached to the page.`:null),D(),q(e.hydrated)}}function BM(e,t){e&1&&(R(0,`span`,9),K(1,`@error block`),z())}function VM(e,t){if(e&1&&(R(0,`span`,10),K(1),z()),e&2){let e=W().$implicit;D(),q(e.timings)}}function HM(e,t){e&1&&(R(0,`span`,11),K(1,`mismatch`),z())}function UM(e,t){if(e&1&&(R(0,`dt`),K(1,`Template of`),z(),R(2,`dd`,19),K(3),z()),e&2){let e=t;D(3),Y(``,e.name,` <`,e.tag,`>`)}}function WM(e,t){if(e&1&&(R(0,`dt`),K(1,`In this state since`),z(),R(2,`dd`),K(3),z()),e&2){let e=W(2).$implicit,t=W(2);D(3),q(t.clock(e.block.since))}}function GM(e,t){if(e&1&&(R(0,`dt`),K(1,`Hydrated`),z(),R(2,`dd`),K(3),z()),e&2){let e=W(2).$implicit,t=W(2);D(3),J(` `,e.block.hydratedAt===void 0?`Before the devtools attached`:t.clock(e.block.hydratedAt),` `)}}function KM(e,t){if(e&1&&(R(0,`span`,23),K(1),z()),e&2){let e=W().$implicit;D(),q(e.hydration)}}function qM(e,t){if(e&1&&(R(0,`li`)(1,`span`,22),K(2),z(),R(3,`span`,19),K(4),z(),A(5,KM,2,1,`span`,23),z()),e&2){let e=t.$implicit,n=W(5);D(2),q(n.clock(e.at)),D(2),q(e.state),D(),j(e.hydration===`not-configured`?-1:5)}}function JM(e,t){if(e&1&&(R(0,`h3`,20),K(1,`Transitions`),z(),R(2,`ol`,21),M(3,qM,6,3,`li`,null,eg),z()),e&2){let e=W(2).$implicit;D(3),N(e.block.transitions)}}function YM(e,t){if(e&1){let e=B();R(0,`li`)(1,`button`,25),U(`click`,function(){let t=S(e).$implicit;return C(W(5).showNode.emit(t.id))}),K(2),R(3,`span`,19),K(4),z()()()}if(e&2){let e=t.$implicit;D(2),J(` Show `,e.name,` `),D(2),J(`<`,e.tag,`>`)}}function XM(e,t){if(e&1&&(R(0,`h3`,20),K(1,`Hydration mismatches`),z(),R(2,`ul`,24),M(3,YM,5,2,`li`,null,FM),z()),e&2){let e=W(2).$implicit;D(3),N(e.mismatches)}}function ZM(e,t){if(e&1&&(R(0,`div`,17)(1,`dl`)(2,`dt`),K(3,`Block`),z(),R(4,`dd`,19),K(5),z(),A(6,UM,4,2),A(7,WM,4,1),A(8,GM,4,1),R(9,`dt`),K(10,`Root elements`),z(),R(11,`dd`),K(12),z(),R(13,`dt`),K(14,`Triggers`),z(),R(15,`dd`,19),K(16),z()(),A(17,JM,5,0),A(18,XM,5,0),z()),e&2){let e,t=W().$implicit;V(`id`,`defer-detail-`+t.block.id),D(5),q(t.block.id),D(),j((e=t.block.owner)?6:-1,e),D(),j(t.block.since?7:-1),D(),j(t.block.hydration===`hydrated`?8:-1),D(4),q(t.block.rootIds.length||`None rendered`),D(4),q(t.block.triggers.join(`, `)||`None`),D(),j(t.block.transitions?.length?17:-1),D(),j(t.mismatches.length?18:-1)}}function QM(e,t){if(e&1){let e=B();R(0,`li`,4)(1,`button`,5),U(`click`,function(){let t=S(e).$implicit;return C(W(2).showOwner.emit(t.block))})(`focus`,function(){let t=S(e).$implicit;return C(W(2).highlight.emit(t.block))})(`blur`,function(){return S(e),C(W(2).highlight.emit(null))})(`mouseenter`,function(){let t=S(e).$implicit;return C(W(2).highlight.emit(t.block))})(`mouseleave`,function(){return S(e),C(W(2).highlight.emit(null))}),R(2,`span`,6),K(3),z(),R(4,`span`,7),K(5),z(),M(6,RM,3,4,`span`,8,PM),A(8,zM,2,2,`span`,9),A(9,BM,2,0,`span`,9),A(10,VM,2,1,`span`,10),A(11,HM,2,0,`span`,11),R(12,`span`,12),K(13),z()(),R(14,`button`,13),U(`click`,function(){let t=S(e).$implicit;return C(W(2).toggle(t.block.id))}),w(),R(15,`svg`,14),fg(16,`path`,15),z(),fs(),R(17,`span`,16),K(18),z()(),A(19,ZM,19,9,`div`,17),z()}if(e&2){let e=t.$implicit,n=W(2);D(),k(`aria-disabled`,e.block.owner?null:`true`),D(2),q(e.block.owner?.name??`Unknown component`),D(),r_(`defer-state-`+e.block.state),D(),q(e.block.state),D(),N(e.notes),D(2),j(e.hydrated?8:-1),D(),j(e.block.hasErrorBlock?9:-1),D(),j(e.timings?10:-1),D(),j(e.mismatches.length?11:-1),D(2),q(e.block.triggers.join(`, `)||`no triggers`),D(),k(`aria-expanded`,n.isOpen(e.block.id))(`aria-controls`,n.isOpen(e.block.id)?`defer-detail-`+e.block.id:null),D(4),J(`Details of the block in `,e.block.owner?.name??`an unknown component`),D(),j(n.isOpen(e.block.id)?19:-1)}}function $M(e,t){if(e&1&&(R(0,`section`,0)(1,`h2`,1),K(2,` Defer blocks `),R(3,`span`,2),K(4),z()(),R(5,`ul`,3),M(6,QM,20,14,`li`,4,NM),z()()),e&2){let e=W();D(4),Y(``,e.rows().length,``,e.truncated()?`+`:``),D(2),N(e.rows())}}function eN(e){return e<1e3?`${e}ms`:`${Number((e/1e3).toFixed(2))}s`}function tN(e){let t=[],n=e.placeholder?.minimumTime;n!=null&&t.push(`placeholder min ${eN(n)}`);let r=[e.loading?.afterTime==null?``:`after ${eN(e.loading.afterTime)}`,e.loading?.minimumTime==null?``:`min ${eN(e.loading.minimumTime)}`].filter(Boolean);return r.length&&t.push(`loading ${r.join(`, `)}`),t.join(` · `)}var nN=class e{blocks=$([]);truncated=$(!1);clockOffset=$(0);showOwner=lv();mismatches=$([]);showNode=lv();open=T(new Set);highlight=lv();now=T(Date.now());waiting=X(()=>this.blocks().some(e=>!!e.since&&(e.state===`placeholder`||e.state===`initial`)));rows=X(()=>{let e=this.now()-this.clockOffset();return this.blocks().map(t=>({block:t,notes:oT({...t,since:t.since||e},e),timings:tN(t),mismatches:this.mismatches().filter(e=>t.rootIds.includes(e.id)),hydrated:t.hydration===`hydrated`?rT(t):``}))});isOpen(e){return this.open().has(e)}toggle(e){this.open.update(t=>{let n=new Set(t);return n.delete(e)||n.add(e),n})}clock(e){return XE(e)}constructor(){let e,t=()=>{clearInterval(e),e=void 0};E(()=>{if(!this.waiting())return t();e===void 0&&(this.now.set(Date.now()),e=setInterval(()=>this.now.set(Date.now()),1e3))}),x(Ss).onDestroy(t)}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-defer-blocks`]],inputs:{blocks:[1,`blocks`],truncated:[1,`truncated`],clockOffset:[1,`clockOffset`],mismatches:[1,`mismatches`]},outputs:{showOwner:`showOwner`,showNode:`showNode`,highlight:`highlight`},decls:1,vars:1,consts:[[`aria-labelledby`,`ct-defer-title`,1,`defer`],[`id`,`ct-defer-title`,1,`defer-title`],[1,`pill`],[1,`defer-list`],[1,`defer-item`],[`type`,`button`,1,`defer-row`,3,`click`,`focus`,`blur`,`mouseenter`,`mouseleave`],[1,`name`,`mono`],[1,`defer-state`],[1,`flag`,3,`class`],[1,`flag`],[1,`timings`],[1,`flag`,`note-failed`],[1,`triggers`,`mono`],[`type`,`button`,1,`defer-toggle`,3,`click`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`],[`d`,`m9 6 6 6-6 6`],[1,`sr-only`],[1,`defer-detail`,3,`id`],[`aria-hidden`,`true`],[1,`mono`],[1,`detail-label`],[1,`transitions`],[1,`when`],[1,`muted`],[1,`mismatch-links`],[`type`,`button`,3,`click`]],template:function(e,t){e&1&&A(0,$M,8,2,`section`,0),e&2&&j(t.rows().length?0:-1)},styles:[`[_nghost-%COMP%] { +}`]})},MM=(e,t)=>t.block.id,NM=(e,t)=>t.kind,PM=(e,t)=>t.id;function FM(e,t){if(e&1&&K(0),e&2){let e=W().$implicit;J(` `,e.label,` `)}}function IM(e,t){if(e&1&&(K(0),R(1,`span`,18),K(2),z()),e&2){let e=W().$implicit;J(` `,e.kind,` `),D(2),J(``,e.seconds,`s`)}}function LM(e,t){if(e&1&&(R(0,`span`,9),A(1,FM,1,1)(2,IM,3,2),z()),e&2){let e=t.$implicit;i_(`note-`+e.kind),k(`title`,e.text),D(),j(e.seconds===void 0?1:2)}}function RM(e,t){if(e&1&&(R(0,`span`,9),K(1),z()),e&2){let e=W().$implicit;k(`title`,e.block.hydratedAt===void 0?`The block hydrated before the devtools attached to the page.`:null),D(),q(e.hydrated)}}function zM(e,t){e&1&&(R(0,`span`,9),K(1,`@error block`),z())}function BM(e,t){if(e&1&&(R(0,`span`,10),K(1),z()),e&2){let e=W().$implicit;D(),q(e.timings)}}function VM(e,t){e&1&&(R(0,`span`,11),K(1,`mismatch`),z())}function HM(e,t){if(e&1&&(R(0,`dt`),K(1,`Template of`),z(),R(2,`dd`,19),K(3),z()),e&2){let e=t;D(3),Y(``,e.name,` <`,e.tag,`>`)}}function UM(e,t){if(e&1&&(R(0,`dt`),K(1,`In this state since`),z(),R(2,`dd`),K(3),z()),e&2){let e=W(2).$implicit,t=W(2);D(3),q(t.clock(e.block.since))}}function WM(e,t){if(e&1&&(R(0,`dt`),K(1,`Hydrated`),z(),R(2,`dd`),K(3),z()),e&2){let e=W(2).$implicit,t=W(2);D(3),J(` `,e.block.hydratedAt===void 0?`Before the devtools attached`:t.clock(e.block.hydratedAt),` `)}}function GM(e,t){if(e&1&&(R(0,`span`,23),K(1),z()),e&2){let e=W().$implicit;D(),q(e.hydration)}}function KM(e,t){if(e&1&&(R(0,`li`)(1,`span`,22),K(2),z(),R(3,`span`,19),K(4),z(),A(5,GM,2,1,`span`,23),z()),e&2){let e=t.$implicit,n=W(5);D(2),q(n.clock(e.at)),D(2),q(e.state),D(),j(e.hydration===`not-configured`?-1:5)}}function qM(e,t){if(e&1&&(R(0,`h3`,20),K(1,`Transitions`),z(),R(2,`ol`,21),M(3,KM,6,3,`li`,null,tg),z()),e&2){let e=W(2).$implicit;D(3),N(e.block.transitions)}}function JM(e,t){if(e&1){let e=B();R(0,`li`)(1,`button`,25),U(`click`,function(){let t=S(e).$implicit;return C(W(5).showNode.emit(t.id))}),K(2),R(3,`span`,19),K(4),z()()()}if(e&2){let e=t.$implicit;D(2),J(` Show `,e.name,` `),D(2),J(`<`,e.tag,`>`)}}function YM(e,t){if(e&1&&(R(0,`h3`,20),K(1,`Hydration mismatches`),z(),R(2,`ul`,24),M(3,JM,5,2,`li`,null,PM),z()),e&2){let e=W(2).$implicit;D(3),N(e.mismatches)}}function XM(e,t){if(e&1&&(R(0,`div`,17)(1,`dl`)(2,`dt`),K(3,`Block`),z(),R(4,`dd`,19),K(5),z(),A(6,HM,4,2),A(7,UM,4,1),A(8,WM,4,1),R(9,`dt`),K(10,`Root elements`),z(),R(11,`dd`),K(12),z(),R(13,`dt`),K(14,`Triggers`),z(),R(15,`dd`,19),K(16),z()(),A(17,qM,5,0),A(18,YM,5,0),z()),e&2){let e,t=W().$implicit;V(`id`,`defer-detail-`+t.block.id),D(5),q(t.block.id),D(),j((e=t.block.owner)?6:-1,e),D(),j(t.block.since?7:-1),D(),j(t.block.hydration===`hydrated`?8:-1),D(4),q(t.block.rootIds.length||`None rendered`),D(4),q(t.block.triggers.join(`, `)||`None`),D(),j(t.block.transitions?.length?17:-1),D(),j(t.mismatches.length?18:-1)}}function ZM(e,t){if(e&1){let e=B();R(0,`li`,4)(1,`button`,5),U(`click`,function(){let t=S(e).$implicit;return C(W(2).showOwner.emit(t.block))})(`focus`,function(){let t=S(e).$implicit;return C(W(2).highlight.emit(t.block))})(`blur`,function(){return S(e),C(W(2).highlight.emit(null))})(`mouseenter`,function(){let t=S(e).$implicit;return C(W(2).highlight.emit(t.block))})(`mouseleave`,function(){return S(e),C(W(2).highlight.emit(null))}),R(2,`span`,6),K(3),z(),R(4,`span`,7),K(5),z(),M(6,LM,3,4,`span`,8,NM),A(8,RM,2,2,`span`,9),A(9,zM,2,0,`span`,9),A(10,BM,2,1,`span`,10),A(11,VM,2,0,`span`,11),R(12,`span`,12),K(13),z()(),R(14,`button`,13),U(`click`,function(){let t=S(e).$implicit;return C(W(2).toggle(t.block.id))}),w(),R(15,`svg`,14),pg(16,`path`,15),z(),ps(),R(17,`span`,16),K(18),z()(),A(19,XM,19,9,`div`,17),z()}if(e&2){let e=t.$implicit,n=W(2);D(),k(`aria-disabled`,e.block.owner?null:`true`),D(2),q(e.block.owner?.name??`Unknown component`),D(),i_(`defer-state-`+e.block.state),D(),q(e.block.state),D(),N(e.notes),D(2),j(e.hydrated?8:-1),D(),j(e.block.hasErrorBlock?9:-1),D(),j(e.timings?10:-1),D(),j(e.mismatches.length?11:-1),D(2),q(e.block.triggers.join(`, `)||`no triggers`),D(),k(`aria-expanded`,n.isOpen(e.block.id))(`aria-controls`,n.isOpen(e.block.id)?`defer-detail-`+e.block.id:null),D(4),J(`Details of the block in `,e.block.owner?.name??`an unknown component`),D(),j(n.isOpen(e.block.id)?19:-1)}}function QM(e,t){if(e&1&&(R(0,`section`,0)(1,`h2`,1),K(2,` Defer blocks `),R(3,`span`,2),K(4),z()(),R(5,`ul`,3),M(6,ZM,20,14,`li`,4,MM),z()()),e&2){let e=W();D(4),Y(``,e.rows().length,``,e.truncated()?`+`:``),D(2),N(e.rows())}}function $M(e){return e<1e3?`${e}ms`:`${Number((e/1e3).toFixed(2))}s`}function eN(e){let t=[],n=e.placeholder?.minimumTime;n!=null&&t.push(`placeholder min ${$M(n)}`);let r=[e.loading?.afterTime==null?``:`after ${$M(e.loading.afterTime)}`,e.loading?.minimumTime==null?``:`min ${$M(e.loading.minimumTime)}`].filter(Boolean);return r.length&&t.push(`loading ${r.join(`, `)}`),t.join(` · `)}var tN=class e{blocks=$([]);truncated=$(!1);clockOffset=$(0);showOwner=uv();mismatches=$([]);showNode=uv();open=T(new Set);highlight=uv();now=T(Date.now());waiting=X(()=>this.blocks().some(e=>!!e.since&&(e.state===`placeholder`||e.state===`initial`)));rows=X(()=>{let e=this.now()-this.clockOffset();return this.blocks().map(t=>({block:t,notes:aT({...t,since:t.since||e},e),timings:eN(t),mismatches:this.mismatches().filter(e=>t.rootIds.includes(e.id)),hydrated:t.hydration===`hydrated`?nT(t):``}))});isOpen(e){return this.open().has(e)}toggle(e){this.open.update(t=>{let n=new Set(t);return n.delete(e)||n.add(e),n})}clock(e){return YE(e)}constructor(){let e,t=()=>{clearInterval(e),e=void 0};E(()=>{if(!this.waiting())return t();e===void 0&&(this.now.set(Date.now()),e=setInterval(()=>this.now.set(Date.now()),1e3))}),x(Cs).onDestroy(t)}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-defer-blocks`]],inputs:{blocks:[1,`blocks`],truncated:[1,`truncated`],clockOffset:[1,`clockOffset`],mismatches:[1,`mismatches`]},outputs:{showOwner:`showOwner`,showNode:`showNode`,highlight:`highlight`},decls:1,vars:1,consts:[[`aria-labelledby`,`ct-defer-title`,1,`defer`],[`id`,`ct-defer-title`,1,`defer-title`],[1,`pill`],[1,`defer-list`],[1,`defer-item`],[`type`,`button`,1,`defer-row`,3,`click`,`focus`,`blur`,`mouseenter`,`mouseleave`],[1,`name`,`mono`],[1,`defer-state`],[1,`flag`,3,`class`],[1,`flag`],[1,`timings`],[1,`flag`,`note-failed`],[1,`triggers`,`mono`],[`type`,`button`,1,`defer-toggle`,3,`click`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`],[`d`,`m9 6 6 6-6 6`],[1,`sr-only`],[1,`defer-detail`,3,`id`],[`aria-hidden`,`true`],[1,`mono`],[1,`detail-label`],[1,`transitions`],[1,`when`],[1,`muted`],[1,`mismatch-links`],[`type`,`button`,3,`click`]],template:function(e,t){e&1&&A(0,QM,8,2,`section`,0),e&2&&j(t.rows().length?0:-1)},styles:[`[_nghost-%COMP%] { display: block; } @@ -2513,7 +2513,7 @@ button.edit[_ngcontent-%COMP%] { min-width: 0; text-overflow: ellipsis; white-space: nowrap; -}`]})},rN=(e,t)=>t.id;function iN(e,t){if(e&1&&(F(0,`p`,4),K(1),I()),e&2){let e=W(2);D(),J(`The page has more @for blocks than the `,e.length,` listed.`)}}function aN(e,t){e&1&&(F(0,`span`,9),K(1,`@empty showing`),I())}function oN(e,t){e&1&&(F(0,`span`,10),K(1,`@empty`),I())}function sN(e,t){e&1&&(F(0,`span`,10),K(1,`renders nothing`),I())}function cN(e,t){if(e&1){let e=B();F(0,`li`)(1,`button`,6),H(`click`,function(){let t=S(e).$implicit;return C(W(3).showOwner.emit(t))})(`focus`,function(){let t=S(e).$implicit,n=W(3);return C(n.highlight.emit(n.target(t)))})(`blur`,function(){return S(e),C(W(3).highlight.emit(null))})(`mouseenter`,function(){let t=S(e).$implicit,n=W(3);return C(n.highlight.emit(n.target(t)))})(`mouseleave`,function(){return S(e),C(W(3).highlight.emit(null))}),F(2,`span`,7),K(3),I(),F(4,`span`,8),K(5),I(),A(6,aN,2,0,`span`,9)(7,oN,2,0,`span`,10)(8,sN,2,0,`span`,10),F(9,`span`,11),K(10),I()()()}if(e&2){let e=t.$implicit,n=W(3);D(),k(`aria-disabled`,e.owner?null:`true`),D(2),q(e.owner?.name??`Unknown component`),D(2),Y(` `,e.count,` `,e.count===1?`item`:`items`,` `),D(),j(e.showingEmpty?6:e.hasEmptyBlock?7:e.count===0?8:-1),D(4),q(n.trackLabel(e))}}function lN(e,t){if(e&1&&(F(0,`section`,1)(1,`h2`,2),K(2,` @for blocks `),F(3,`span`,3),K(4),I()(),A(5,iN,2,1,`p`,4),F(6,`ul`,5),M(7,cN,11,6,`li`,null,rN),I()()),e&2){let e=W(),t=W();D(4),q(t.truncated()?e.length+`+`:e.length),D(),j(t.truncated()?5:-1),D(2),N(e)}}function uN(e,t){e&1&&A(0,lN,9,2,`section`,1),e&2&&j(t.length?0:-1)}function dN(e,t){e&1&&L(0,`app-angular-unavailable`,0),e&2&&P(`page`,W().angular())}var fN={$index:`track $index`,item:`track item`,function:`track expression`},pN=class e{blocks=$(void 0);truncated=$(!1);supported=$(null);angular=$(null);showOwner=lv();highlight=lv();target(e){return e.rootIds[0]??e.owner?.id??null}trackLabel(e){return e.track?fN[e.track]:`track unknown`}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-for-blocks`]],inputs:{blocks:[1,`blocks`],truncated:[1,`truncated`],supported:[1,`supported`],angular:[1,`angular`]},outputs:{showOwner:`showOwner`,highlight:`highlight`},decls:2,vars:1,consts:[[`capability`,`forBlocks`,`missing`,``,`compact`,``,1,`for`,3,`page`],[`aria-labelledby`,`ct-for-title`,1,`for`],[`id`,`ct-for-title`,1,`for-title`],[1,`pill`],[1,`note`],[1,`for-list`],[`type`,`button`,1,`for-row`,3,`click`,`focus`,`blur`,`mouseenter`,`mouseleave`],[1,`name`,`mono`],[1,`count`],[1,`flag`,`empty`],[1,`flag`],[1,`track`,`mono`]],template:function(e,t){if(e&1&&A(0,uN,1,1)(1,dN,1,1,`app-angular-unavailable`,0),e&2){let e;j((e=t.blocks())?0:t.supported()===!1?1:-1,e)}},dependencies:[bD],styles:[`[_nghost-%COMP%] { +}`]})},nN=(e,t)=>t.id;function rN(e,t){if(e&1&&(F(0,`p`,4),K(1),I()),e&2){let e=W(2);D(),J(`The page has more @for blocks than the `,e.length,` listed.`)}}function iN(e,t){e&1&&(F(0,`span`,9),K(1,`@empty showing`),I())}function aN(e,t){e&1&&(F(0,`span`,10),K(1,`@empty`),I())}function oN(e,t){e&1&&(F(0,`span`,10),K(1,`renders nothing`),I())}function sN(e,t){if(e&1){let e=B();F(0,`li`)(1,`button`,6),H(`click`,function(){let t=S(e).$implicit;return C(W(3).showOwner.emit(t))})(`focus`,function(){let t=S(e).$implicit,n=W(3);return C(n.highlight.emit(n.target(t)))})(`blur`,function(){return S(e),C(W(3).highlight.emit(null))})(`mouseenter`,function(){let t=S(e).$implicit,n=W(3);return C(n.highlight.emit(n.target(t)))})(`mouseleave`,function(){return S(e),C(W(3).highlight.emit(null))}),F(2,`span`,7),K(3),I(),F(4,`span`,8),K(5),I(),A(6,iN,2,0,`span`,9)(7,aN,2,0,`span`,10)(8,oN,2,0,`span`,10),F(9,`span`,11),K(10),I()()()}if(e&2){let e=t.$implicit,n=W(3);D(),k(`aria-disabled`,e.owner?null:`true`),D(2),q(e.owner?.name??`Unknown component`),D(2),Y(` `,e.count,` `,e.count===1?`item`:`items`,` `),D(),j(e.showingEmpty?6:e.hasEmptyBlock?7:e.count===0?8:-1),D(4),q(n.trackLabel(e))}}function cN(e,t){if(e&1&&(F(0,`section`,1)(1,`h2`,2),K(2,` @for blocks `),F(3,`span`,3),K(4),I()(),A(5,rN,2,1,`p`,4),F(6,`ul`,5),M(7,sN,11,6,`li`,null,nN),I()()),e&2){let e=W(),t=W();D(4),q(t.truncated()?e.length+`+`:e.length),D(),j(t.truncated()?5:-1),D(2),N(e)}}function lN(e,t){e&1&&A(0,cN,9,2,`section`,1),e&2&&j(t.length?0:-1)}function uN(e,t){e&1&&L(0,`app-angular-unavailable`,0),e&2&&P(`page`,W().angular())}var dN={$index:`track $index`,item:`track item`,function:`track expression`},fN=class e{blocks=$(void 0);truncated=$(!1);supported=$(null);angular=$(null);showOwner=uv();highlight=uv();target(e){return e.rootIds[0]??e.owner?.id??null}trackLabel(e){return e.track?dN[e.track]:`track unknown`}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-for-blocks`]],inputs:{blocks:[1,`blocks`],truncated:[1,`truncated`],supported:[1,`supported`],angular:[1,`angular`]},outputs:{showOwner:`showOwner`,highlight:`highlight`},decls:2,vars:1,consts:[[`capability`,`forBlocks`,`missing`,``,`compact`,``,1,`for`,3,`page`],[`aria-labelledby`,`ct-for-title`,1,`for`],[`id`,`ct-for-title`,1,`for-title`],[1,`pill`],[1,`note`],[1,`for-list`],[`type`,`button`,1,`for-row`,3,`click`,`focus`,`blur`,`mouseenter`,`mouseleave`],[1,`name`,`mono`],[1,`count`],[1,`flag`,`empty`],[1,`flag`],[1,`track`,`mono`]],template:function(e,t){if(e&1&&A(0,lN,1,1)(1,uN,1,1,`app-angular-unavailable`,0),e&2){let e;j((e=t.blocks())?0:t.supported()===!1?1:-1,e)}},dependencies:[yD],styles:[`[_nghost-%COMP%] { display: block; } @@ -2631,7 +2631,7 @@ button.edit[_ngcontent-%COMP%] { min-width: 0; text-overflow: ellipsis; white-space: nowrap; -}`]})},mN=(e,t)=>t.id;function hN(e,t){if(e&1&&(F(0,`p`,11),K(1),I(),F(2,`h3`,7),K(3,`Still retained`),I(),F(4,`p`,6),K(5,` In a development build, Angular's DI debug data keeps every destroyed component in memory, so Pangular can't tell a leak from that. Check retainers in the Chrome DevTools Memory panel: take a heap snapshot after a few navigations, search for the class and look for a retainer other than Angular's DI debug records. Open subscriptions after destroy are still tracked below. `),I()),e&2){let e=W(),t=W();D(),q(t.plural(e.navigations,`navigation`))}}function gN(e,t){e&1&&(F(0,`p`,6),K(1,` This page cannot track destroyed components. It needs WeakRef, FinalizationRegistry and the Angular debug API of a development build. `),I())}function _N(e,t){if(e&1&&(F(0,`span`,18),K(1),I()),e&2){let e=W().$implicit,t=W(4);D(),q(t.plural(e.subscriptions,`open subscription`))}}function vN(e,t){if(e&1&&(F(0,`li`,13)(1,`span`,14),K(2),I(),F(3,`span`,15),K(4),I(),F(5,`span`,16),K(6),I(),F(7,`span`,17),K(8),I(),A(9,_N,2,1,`span`,18),I()),e&2){let e=t.$implicit,n=W(4);D(2),q(e.name),D(2),q(e.route||`/`),D(2),J(``,n.plural(e.navigations,`navigation`),` ago`),D(2),q(n.ageOf(e)),D(),j(e.subscriptions?9:-1)}}function yN(e,t){if(e&1&&(F(0,`p`,6),K(1),I(),F(2,`ul`,12),M(3,vN,10,5,`li`,13,mN),I()),e&2){let e=W(3);D(),Y(` Destroyed, yet still in memory after at least `,e.minNavigations,` navigations and `,e.minSeconds,` seconds. Take a heap snapshot, search for the class and read its retainers. `),D(2),N(e.retained().slice(0,e.shown))}}function bN(e,t){e&1&&(F(0,`p`,6),K(1,`No destroyed component is still in memory after a few navigations.`),I())}function xN(e,t){if(e&1&&(F(0,`p`,6),K(1),F(2,`span`,19),K(3),I(),K(4,`. Navigate a few times to see whether they stay. `),I()),e&2){let e=W(3);D(),J(` `,e.plural(e.recent().length,`instance`),` destroyed recently and not collected yet: `),D(2),q(e.names(e.recent()))}}function SN(e,t){if(e&1&&(A(0,gN,2,0,`p`,6),F(1,`p`,11),K(2),I(),F(3,`h3`,7),K(4,` Still retained `),F(5,`span`,8),K(6),I()(),A(7,yN,5,2)(8,bN,2,0,`p`,6),A(9,xN,5,2,`p`,6)),e&2){let e=W(),t=W();j(e.support.retention?-1:0),D(2),O_(` `,t.plural(e.navigations,`navigation`),` · `,t.retained().length,` still retained · `,t.plural(e.totals.collected,`instance`),` collected `),D(4),q(t.retained().length),D(),j(t.retained().length?7:8),D(2),j(t.recent().length?9:-1)}}function CN(e,t){if(e&1&&(F(0,`p`,6),K(1,` Off the page but not destroyed (detached views, such as a route reuse cache): `),F(2,`span`,19),K(3),I(),K(4,`. `),I()),e&2){let e=W(2);D(3),q(e.names(e.detached()))}}function wN(e,t){if(e&1&&(F(0,`span`,8),K(1),I()),e&2){let e=W();D(),q(e.subscriptions.length)}}function TN(e,t){if(e&1&&(F(0,`span`,15),K(1),I()),e&2){let e=W().$implicit;D(),q(e.source)}}function EN(e,t){if(e&1&&(F(0,`li`,13)(1,`span`,14),K(2),I(),F(3,`span`,16),K(4),I(),F(5,`span`,18),K(6),I(),A(7,TN,2,1,`span`,15),I()),e&2){let e=t.$implicit;D(2),q(e.name),D(2),J(``,e.count,` open`),D(2),J(` `,e.reason===`instance-destroyed`?`instance destroyed`:`no instance left`,` `),D(),j(e.source?7:-1)}}function DN(e,t){if(e&1&&(F(0,`p`,6),K(1,` Still open although the component that made them is gone. Tear them down with takeUntilDestroyed(), DestroyRef.onDestroy or the async pipe. `),I(),F(2,`ul`,12),M(3,EN,8,4,`li`,13,eg),I()),e&2){let e=W(2),t=W();D(3),N(e.subscriptions.slice(0,t.shown))}}function ON(e,t){e&1&&(F(0,`p`,6),K(1,`No subscription is still open after its component went away.`),I())}function kN(e,t){e&1&&(F(0,`p`,6),K(1,` Subscriptions are tied to component classes only; Angular 20 profiler hooks tie them to instances. `),I())}function AN(e,t){if(e&1&&(A(0,DN,5,0)(1,ON,2,0,`p`,6),A(2,kN,2,0,`p`,6)),e&2){let e=W();j(+!e.subscriptions.length),D(2),j(e.support.instances?-1:2)}}function jN(e,t){e&1&&(F(0,`p`,9),K(1,` Tracking could not start: the page has no RxJS the overlay can load. `),I())}function MN(e,t){e&1&&(F(0,`p`,6),K(1,` Off. Track subscriptions wraps Observable.prototype.subscribe on the page to record which component makes each subscription, until you stop it. Subscriptions made before you start are not seen, so reload or navigate again after starting. `),I())}function NN(e,t){e&1&&L(0,`app-angular-unavailable`,10),e&2&&P(`page`,W(2).angular())}function PN(e,t){if(e&1&&(F(0,`span`,16),K(1),I()),e&2){let e=W().$implicit,t=W(3);D(),q(t.plural(e.subscriptions,`subscription`))}}function FN(e,t){if(e&1){let e=B();F(0,`li`)(1,`button`,20),H(`click`,function(){let t=S(e).$implicit;return C(W(3).showComponent.emit(t.id))})(`focus`,function(){let t=S(e).$implicit;return C(W(3).highlight.emit(t.id))})(`blur`,function(){return S(e),C(W(3).highlight.emit(null))})(`mouseenter`,function(){let t=S(e).$implicit;return C(W(3).highlight.emit(t.id))})(`mouseleave`,function(){return S(e),C(W(3).highlight.emit(null))}),F(2,`span`,14),K(3),I(),F(4,`span`,16),K(5),I(),A(6,PN,2,1,`span`,16),I()()}if(e&2){let e=t.$implicit,n=W(2),r=W();D(3),q(e.name),D(2),q(r.effectsText(e)),D(),j(n.support.subscriptions===`on`?6:-1)}}function IN(e,t){e&1&&(F(0,`p`,6),K(1,` Angular files a component's effects under the template its host sits in, so effects of components side by side in one template show as shared. `),I())}function LN(e,t){if(e&1&&(F(0,`ul`,12),M(1,FN,7,3,`li`,null,mN),I(),A(3,IN,2,0,`p`,6)),e&2){let e=W(),t=W();D(),N(e.components.slice(0,t.shown)),D(2),j(e.components.some(t.hasShared)?3:-1)}}function RN(e,t){e&1&&(F(0,`p`,6),K(1,`No component on the page has a live effect or a tracked subscription.`),I())}function zN(e,t){if(e&1&&(A(0,hN,6,1)(1,SN,10,7),A(2,CN,5,1,`p`,6),F(3,`h3`,7),K(4,` Open subscriptions after destroy `),A(5,wN,2,1,`span`,8),I(),A(6,AN,3,2)(7,jN,2,0,`p`,9)(8,MN,2,0,`p`,6),F(9,`h3`,7),K(10,` Live effects and subscriptions `),F(11,`span`,8),K(12),I()(),A(13,NN,1,1,`app-angular-unavailable`,10),A(14,LN,4,1)(15,RN,2,0,`p`,6)),e&2){let e,n=t,r=W();j(n.support.retention===`dev-di-debug`?0:1),D(2),j(r.detached().length?2:-1),D(3),j(n.support.subscriptions===`on`?5:-1),D(),j((e=n.support.subscriptions)===`on`?6:e===`unavailable`?7:8),D(6),q(n.components.length),D(),j(n.support.effects?-1:13),D(),j(n.components.length?14:15)}}function BN(e,t){e&1&&(F(0,`p`,6),K(1,`No leak data from this page yet. It comes with the next report.`),I())}var VN=20;function HN(e){let t=Math.max(0,Math.round(e/1e3));if(t<120)return`${t} s`;let n=Math.round(t/60);return n<120?`${n} min`:`${Math.round(n/60)} h`}var UN=(e,t,n=`${t}s`)=>`${e} ${e===1?t:n}`,WN=class e{report=$(null);pageId=$(null);rpc=$(null);angular=$(null);now=$(()=>Date.now());showComponent=lv();highlight=lv();shown=VN;minNavigations=2;minSeconds=uw/1e3;plural=UN;busy=T(!1);announcement=T(``);tracking=X(()=>this.report()?.support.subscriptions===`on`);split=X(()=>{let e=this.report(),t=[],n=[],r=[];if(!e)return{retained:t,recent:n,detached:r};let i=e.support.retention===`dev-di-debug`;for(let a of e.destroyed)if(a.detached)r.push(a);else if(i)continue;else this.isRetained(e,a)?t.push(a):n.push(a);return{retained:t,recent:n,detached:r}});retained=X(()=>this.split().retained);recent=X(()=>this.split().recent);detached=X(()=>this.split().detached);ageMs(e,t){return Math.max(0,this.now()()-e.reportedAt+(e.at-t.destroyedAt))}isRetained(e,t){return t.navigations>=2&&this.ageMs(e,t)>=1e4}ageOf(e){let t=this.report();return t?`${HN(this.ageMs(t,e))} old`:``}names(e){let t=[...new Set(e.map(e=>e.name))];return t.length>6?`${t.slice(0,6).join(`, `)} and more`:t.join(`, `)}hasShared(e){return!!e.sharedEffects}effectsText(e){let t=UN(e.effects,`effect`);return e.sharedEffects?`${t}, ${e.sharedEffects} shared`:t}async toggle(){let e=this.pageId();if(!e||this.busy())return;let t=!this.tracking();this.busy.set(!0);try{await hT(this.rpc(),`request-leak-tracking`,{pageId:e,on:t}),this.announcement.set(t?`Tracking subscriptions. Reload or navigate to see subscriptions made at start.`:`Stopped tracking subscriptions.`)}catch{this.announcement.set(`Could not reach the page. Try again.`)}finally{this.busy.set(!1)}}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-leaks-section`]],inputs:{report:[1,`report`],pageId:[1,`pageId`],rpc:[1,`rpc`],angular:[1,`angular`],now:[1,`now`]},outputs:{showComponent:`showComponent`,highlight:`highlight`},decls:12,vars:5,consts:[[`aria-labelledby`,`ct-leaks-title`,1,`leaks`],[1,`head`],[`id`,`ct-leaks-title`],[`type`,`button`,1,`track`,3,`click`,`disabled`],[`role`,`status`,1,`sr-only`],[1,`hint`],[1,`note`],[1,`sub`],[1,`pill`],[`role`,`status`,1,`note`],[`capability`,`signalGraph`,`missing`,``,`compact`,``,3,`page`],[1,`stats`],[1,`rows`],[1,`row`],[1,`name`,`mono`],[1,`meta`,`mono`],[1,`count`],[1,`meta`],[1,`flag`,`warn`],[1,`mono`],[`type`,`button`,1,`row`,`live`,3,`click`,`focus`,`blur`,`mouseenter`,`mouseleave`]],template:function(e,t){if(e&1&&(F(0,`section`,0)(1,`div`,1)(2,`h2`,2),K(3,`Leaks`),I(),F(4,`button`,3),H(`click`,function(){return t.toggle()}),K(5,` Track subscriptions `),I(),F(6,`p`,4),K(7),I()(),F(8,`p`,5),K(9,` Components that left the page but are still in memory, and the live effects and RxJS subscriptions of each component. The browser collects garbage when it decides, so a retained instance is a hint: check what holds it in the Chrome DevTools Memory panel. `),I(),A(10,zN,16,7)(11,BN,2,0,`p`,6),I()),e&2){let e;D(4),P(`disabled`,!t.pageId()||!t.report()),k(`aria-pressed`,t.tracking())(`aria-disabled`,t.busy()||null),D(3),q(t.announcement()),D(3),j((e=t.report())?10:11,e)}},dependencies:[bD],styles:[`[_nghost-%COMP%] { +}`]})},pN=(e,t)=>t.id;function mN(e,t){if(e&1&&(F(0,`p`,11),K(1),I(),F(2,`h3`,7),K(3,`Still retained`),I(),F(4,`p`,6),K(5,` In a development build, Angular's DI debug data keeps every destroyed component in memory, so Pangular can't tell a leak from that. Check retainers in the Chrome DevTools Memory panel: take a heap snapshot after a few navigations, search for the class and look for a retainer other than Angular's DI debug records. Open subscriptions after destroy are still tracked below. `),I()),e&2){let e=W(),t=W();D(),q(t.plural(e.navigations,`navigation`))}}function hN(e,t){e&1&&(F(0,`p`,6),K(1,` This page cannot track destroyed components. It needs WeakRef, FinalizationRegistry and the Angular debug API of a development build. `),I())}function gN(e,t){if(e&1&&(F(0,`span`,18),K(1),I()),e&2){let e=W().$implicit,t=W(4);D(),q(t.plural(e.subscriptions,`open subscription`))}}function _N(e,t){if(e&1&&(F(0,`li`,13)(1,`span`,14),K(2),I(),F(3,`span`,15),K(4),I(),F(5,`span`,16),K(6),I(),F(7,`span`,17),K(8),I(),A(9,gN,2,1,`span`,18),I()),e&2){let e=t.$implicit,n=W(4);D(2),q(e.name),D(2),q(e.route||`/`),D(2),J(``,n.plural(e.navigations,`navigation`),` ago`),D(2),q(n.ageOf(e)),D(),j(e.subscriptions?9:-1)}}function vN(e,t){if(e&1&&(F(0,`p`,6),K(1),I(),F(2,`ul`,12),M(3,_N,10,5,`li`,13,pN),I()),e&2){let e=W(3);D(),Y(` Destroyed, yet still in memory after at least `,e.minNavigations,` navigations and `,e.minSeconds,` seconds. Take a heap snapshot, search for the class and read its retainers. `),D(2),N(e.retained().slice(0,e.shown))}}function yN(e,t){e&1&&(F(0,`p`,6),K(1,`No destroyed component is still in memory after a few navigations.`),I())}function bN(e,t){if(e&1&&(F(0,`p`,6),K(1),F(2,`span`,19),K(3),I(),K(4,`. Navigate a few times to see whether they stay. `),I()),e&2){let e=W(3);D(),J(` `,e.plural(e.recent().length,`instance`),` destroyed recently and not collected yet: `),D(2),q(e.names(e.recent()))}}function xN(e,t){if(e&1&&(A(0,hN,2,0,`p`,6),F(1,`p`,11),K(2),I(),F(3,`h3`,7),K(4,` Still retained `),F(5,`span`,8),K(6),I()(),A(7,vN,5,2)(8,yN,2,0,`p`,6),A(9,bN,5,2,`p`,6)),e&2){let e=W(),t=W();j(e.support.retention?-1:0),D(2),k_(` `,t.plural(e.navigations,`navigation`),` · `,t.retained().length,` still retained · `,t.plural(e.totals.collected,`instance`),` collected `),D(4),q(t.retained().length),D(),j(t.retained().length?7:8),D(2),j(t.recent().length?9:-1)}}function SN(e,t){if(e&1&&(F(0,`p`,6),K(1,` Off the page but not destroyed (detached views, such as a route reuse cache): `),F(2,`span`,19),K(3),I(),K(4,`. `),I()),e&2){let e=W(2);D(3),q(e.names(e.detached()))}}function CN(e,t){if(e&1&&(F(0,`span`,8),K(1),I()),e&2){let e=W();D(),q(e.subscriptions.length)}}function wN(e,t){if(e&1&&(F(0,`span`,15),K(1),I()),e&2){let e=W().$implicit;D(),q(e.source)}}function TN(e,t){if(e&1&&(F(0,`li`,13)(1,`span`,14),K(2),I(),F(3,`span`,16),K(4),I(),F(5,`span`,18),K(6),I(),A(7,wN,2,1,`span`,15),I()),e&2){let e=t.$implicit;D(2),q(e.name),D(2),J(``,e.count,` open`),D(2),J(` `,e.reason===`instance-destroyed`?`instance destroyed`:`no instance left`,` `),D(),j(e.source?7:-1)}}function EN(e,t){if(e&1&&(F(0,`p`,6),K(1,` Still open although the component that made them is gone. Tear them down with takeUntilDestroyed(), DestroyRef.onDestroy or the async pipe. `),I(),F(2,`ul`,12),M(3,TN,8,4,`li`,13,tg),I()),e&2){let e=W(2),t=W();D(3),N(e.subscriptions.slice(0,t.shown))}}function DN(e,t){e&1&&(F(0,`p`,6),K(1,`No subscription is still open after its component went away.`),I())}function ON(e,t){e&1&&(F(0,`p`,6),K(1,` Subscriptions are tied to component classes only; Angular 20 profiler hooks tie them to instances. `),I())}function kN(e,t){if(e&1&&(A(0,EN,5,0)(1,DN,2,0,`p`,6),A(2,ON,2,0,`p`,6)),e&2){let e=W();j(+!e.subscriptions.length),D(2),j(e.support.instances?-1:2)}}function AN(e,t){e&1&&(F(0,`p`,9),K(1,` Tracking could not start: the page has no RxJS the overlay can load. `),I())}function jN(e,t){e&1&&(F(0,`p`,6),K(1,` Off. Track subscriptions wraps Observable.prototype.subscribe on the page to record which component makes each subscription, until you stop it. Subscriptions made before you start are not seen, so reload or navigate again after starting. `),I())}function MN(e,t){e&1&&L(0,`app-angular-unavailable`,10),e&2&&P(`page`,W(2).angular())}function NN(e,t){if(e&1&&(F(0,`span`,16),K(1),I()),e&2){let e=W().$implicit,t=W(3);D(),q(t.plural(e.subscriptions,`subscription`))}}function PN(e,t){if(e&1){let e=B();F(0,`li`)(1,`button`,20),H(`click`,function(){let t=S(e).$implicit;return C(W(3).showComponent.emit(t.id))})(`focus`,function(){let t=S(e).$implicit;return C(W(3).highlight.emit(t.id))})(`blur`,function(){return S(e),C(W(3).highlight.emit(null))})(`mouseenter`,function(){let t=S(e).$implicit;return C(W(3).highlight.emit(t.id))})(`mouseleave`,function(){return S(e),C(W(3).highlight.emit(null))}),F(2,`span`,14),K(3),I(),F(4,`span`,16),K(5),I(),A(6,NN,2,1,`span`,16),I()()}if(e&2){let e=t.$implicit,n=W(2),r=W();D(3),q(e.name),D(2),q(r.effectsText(e)),D(),j(n.support.subscriptions===`on`?6:-1)}}function FN(e,t){e&1&&(F(0,`p`,6),K(1,` Angular files a component's effects under the template its host sits in, so effects of components side by side in one template show as shared. `),I())}function IN(e,t){if(e&1&&(F(0,`ul`,12),M(1,PN,7,3,`li`,null,pN),I(),A(3,FN,2,0,`p`,6)),e&2){let e=W(),t=W();D(),N(e.components.slice(0,t.shown)),D(2),j(e.components.some(t.hasShared)?3:-1)}}function LN(e,t){e&1&&(F(0,`p`,6),K(1,`No component on the page has a live effect or a tracked subscription.`),I())}function RN(e,t){if(e&1&&(A(0,mN,6,1)(1,xN,10,7),A(2,SN,5,1,`p`,6),F(3,`h3`,7),K(4,` Open subscriptions after destroy `),A(5,CN,2,1,`span`,8),I(),A(6,kN,3,2)(7,AN,2,0,`p`,9)(8,jN,2,0,`p`,6),F(9,`h3`,7),K(10,` Live effects and subscriptions `),F(11,`span`,8),K(12),I()(),A(13,MN,1,1,`app-angular-unavailable`,10),A(14,IN,4,1)(15,LN,2,0,`p`,6)),e&2){let e,n=t,r=W();j(n.support.retention===`dev-di-debug`?0:1),D(2),j(r.detached().length?2:-1),D(3),j(n.support.subscriptions===`on`?5:-1),D(),j((e=n.support.subscriptions)===`on`?6:e===`unavailable`?7:8),D(6),q(n.components.length),D(),j(n.support.effects?-1:13),D(),j(n.components.length?14:15)}}function zN(e,t){e&1&&(F(0,`p`,6),K(1,`No leak data from this page yet. It comes with the next report.`),I())}var BN=20;function VN(e){let t=Math.max(0,Math.round(e/1e3));if(t<120)return`${t} s`;let n=Math.round(t/60);return n<120?`${n} min`:`${Math.round(n/60)} h`}var HN=(e,t,n=`${t}s`)=>`${e} ${e===1?t:n}`,UN=class e{report=$(null);pageId=$(null);rpc=$(null);angular=$(null);now=$(()=>Date.now());showComponent=uv();highlight=uv();shown=BN;minNavigations=2;minSeconds=lw/1e3;plural=HN;busy=T(!1);announcement=T(``);tracking=X(()=>this.report()?.support.subscriptions===`on`);split=X(()=>{let e=this.report(),t=[],n=[],r=[];if(!e)return{retained:t,recent:n,detached:r};let i=e.support.retention===`dev-di-debug`;for(let a of e.destroyed)if(a.detached)r.push(a);else if(i)continue;else this.isRetained(e,a)?t.push(a):n.push(a);return{retained:t,recent:n,detached:r}});retained=X(()=>this.split().retained);recent=X(()=>this.split().recent);detached=X(()=>this.split().detached);ageMs(e,t){return Math.max(0,this.now()()-e.reportedAt+(e.at-t.destroyedAt))}isRetained(e,t){return t.navigations>=2&&this.ageMs(e,t)>=1e4}ageOf(e){let t=this.report();return t?`${VN(this.ageMs(t,e))} old`:``}names(e){let t=[...new Set(e.map(e=>e.name))];return t.length>6?`${t.slice(0,6).join(`, `)} and more`:t.join(`, `)}hasShared(e){return!!e.sharedEffects}effectsText(e){let t=HN(e.effects,`effect`);return e.sharedEffects?`${t}, ${e.sharedEffects} shared`:t}async toggle(){let e=this.pageId();if(!e||this.busy())return;let t=!this.tracking();this.busy.set(!0);try{await mT(this.rpc(),`request-leak-tracking`,{pageId:e,on:t}),this.announcement.set(t?`Tracking subscriptions. Reload or navigate to see subscriptions made at start.`:`Stopped tracking subscriptions.`)}catch{this.announcement.set(`Could not reach the page. Try again.`)}finally{this.busy.set(!1)}}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-leaks-section`]],inputs:{report:[1,`report`],pageId:[1,`pageId`],rpc:[1,`rpc`],angular:[1,`angular`],now:[1,`now`]},outputs:{showComponent:`showComponent`,highlight:`highlight`},decls:12,vars:5,consts:[[`aria-labelledby`,`ct-leaks-title`,1,`leaks`],[1,`head`],[`id`,`ct-leaks-title`],[`type`,`button`,1,`track`,3,`click`,`disabled`],[`role`,`status`,1,`sr-only`],[1,`hint`],[1,`note`],[1,`sub`],[1,`pill`],[`role`,`status`,1,`note`],[`capability`,`signalGraph`,`missing`,``,`compact`,``,3,`page`],[1,`stats`],[1,`rows`],[1,`row`],[1,`name`,`mono`],[1,`meta`,`mono`],[1,`count`],[1,`meta`],[1,`flag`,`warn`],[1,`mono`],[`type`,`button`,1,`row`,`live`,3,`click`,`focus`,`blur`,`mouseenter`,`mouseleave`]],template:function(e,t){if(e&1&&(F(0,`section`,0)(1,`div`,1)(2,`h2`,2),K(3,`Leaks`),I(),F(4,`button`,3),H(`click`,function(){return t.toggle()}),K(5,` Track subscriptions `),I(),F(6,`p`,4),K(7),I()(),F(8,`p`,5),K(9,` Components that left the page but are still in memory, and the live effects and RxJS subscriptions of each component. The browser collects garbage when it decides, so a retained instance is a hint: check what holds it in the Chrome DevTools Memory panel. `),I(),A(10,RN,16,7)(11,zN,2,0,`p`,6),I()),e&2){let e;D(4),P(`disabled`,!t.pageId()||!t.report()),k(`aria-pressed`,t.tracking())(`aria-disabled`,t.busy()||null),D(3),q(t.announcement()),D(3),j((e=t.report())?10:11,e)}},dependencies:[yD],styles:[`[_nghost-%COMP%] { display: block; } @@ -2787,7 +2787,7 @@ h2[_ngcontent-%COMP%] { border-color: color-mix(in srgb, var(--%NS%warn) 30%, transparent); background: color-mix(in srgb, var(--%NS%warn) 12%, transparent); color: var(--%NS%warn-text); -}`]})},GN=12,KN=900;function qN(e){for(let t=e.parentElement;t;t=t.parentElement){let e=getComputedStyle(t);if(/(auto|scroll|overlay)/.test(e.overflowY))return t}return null}var JN=class{options;injector=x(bs);visibleTop=T(0);viewport=T(KN);rowHeight;host=null;scroller=null;detach=null;enabled;range;padTop;padBottom;constructor(e){this.options=e,this.rowHeight=T(e.estimate);let t=e.min??300;this.enabled=X(()=>e.count()>t),this.range=X(()=>{let t=e.count();if(!this.enabled())return{start:0,end:t};let n=this.rowHeight(),r=this.viewport(),i=Math.max(0,Math.min(this.visibleTop(),t*n-r)),a=Math.max(0,Math.min(t-1,Math.floor(i/n)-GN));return{start:a,end:Math.min(t,Math.max(a,Math.ceil((i+r)/n)+GN))}}),this.padTop=X(()=>this.enabled()?this.range().start*this.rowHeight():0),this.padBottom=X(()=>this.enabled()?(e.count()-this.range().end)*this.rowHeight():0),E(()=>{e.count(),cd(()=>this.update(),{injector:this.injector})}),x(Ss).onDestroy(()=>this.detach?.())}get count(){return this.options.count()}rendered(e){let{start:t,end:n}=this.range();return e>=t&&ethis.update();n.addEventListener(`scroll`,r,{passive:!0}),window.addEventListener(`resize`,r),this.detach=()=>{n.removeEventListener(`scroll`,r),window.removeEventListener(`resize`,r)},this.update()}update(){let e=this.host;if(e){if(this.scroller===e)this.place(e.scrollTop,e.clientHeight);else{let t=this.scroller?this.scroller.getBoundingClientRect().top:0,n=this.scroller?this.scroller.clientHeight:window.innerHeight;this.place(t-e.getBoundingClientRect().top,n)}this.options.fixed||this.measure()}}place(e,t){this.visibleTop.set(e),this.viewport.set(t>0?t:KN)}measure(){let e=this.host?.querySelectorAll(`[data-vindex]`);if(!e||e.length<2)return;let t=e[0].getBoundingClientRect(),n=(e[e.length-1].getBoundingClientRect().bottom-t.top)/e.length;n>4&&Math.abs(n-this.rowHeight())>1&&this.rowHeight.set(n)}reveal(e,t){if(this.enabled()&&!this.rendered(e)){let t=e*this.rowHeight(),n=this.viewport(),r=Math.max(0,t-n/2);if(this.place(r,n),this.host&&this.scroller===this.host)this.host.scrollTop=r;else if(this.host){let e=this.scroller?this.scroller.getBoundingClientRect().top:0,t=this.host.getBoundingClientRect().top-e+r;this.scroller?this.scroller.scrollTop+=t:window.scrollBy(0,t)}}t&&cd(t,{injector:this.injector})}};function YN(e){let t=e.ownerDocument.defaultView;if(!t)return null;for(let n=e.parentElement;n&&n!==e.ownerDocument.documentElement&&n!==e.ownerDocument.body;n=n.parentElement)if(/(auto|scroll|overlay)/.test(t.getComputedStyle(n).overflowY))return n;return null}var XN=e=>{let t=parseFloat(e);return Number.isFinite(t)?t:0};function ZN(e,t=8){let n=e.ownerDocument.defaultView;if(!n)return e.offsetHeight+t;let r=YN(e),i=r?n.getComputedStyle(r):null,a=i?XN(i.paddingTop):0,o=i?XN(i.scrollPaddingTop):0,s=XN(n.getComputedStyle(e).top);return Math.max(0,Math.ceil(a+s+e.offsetHeight+t-o))}function QN(e,t,n=8){let r=YN(e),i=t.getBoundingClientRect().bottom+n-e.getBoundingClientRect().top;i<=0||(r?r.scrollTop-=i:e.ownerDocument.defaultView?.scrollBy(0,-i))}var $N=[`input`];function eP(e,t){if(e&1){let e=B();R(0,`button`,9),U(`click`,function(){return S(e),C(W().save())}),w(),R(1,`svg`,10),fg(2,`path`,11),z(),fs(),R(3,`span`,12),K(4,`Save`),z()()}e&2&&k(`aria-label`,`Save filter `+W().query())}function tP(e,t){if(e&1){let e=B();R(0,`li`,14)(1,`button`,15),U(`click`,function(){let t=S(e).$implicit;return C(W(2).apply(t))}),K(2),z(),R(3,`button`,16),U(`click`,function(){let t=S(e).$implicit;return C(W(2).remove(t))}),w(),R(4,`svg`,10),fg(5,`path`,17),z()()()}if(e&2){let e=t.$implicit,n=W(2);G(`active`,e===n.query()),D(),k(`aria-pressed`,e===n.query())(`title`,e),D(),J(` `,e,` `),D(),k(`aria-label`,`Remove saved filter `+e)}}function nP(e,t){if(e&1&&(R(0,`ul`,7),M(1,tP,6,6,`li`,13,tg),z()),e&2){let e=W();D(),N(e.saved())}}function rP(e,t){if(e&1&&(R(0,`span`,8),K(1),z()),e&2){let e=W();D(),q(e.announcement())}}var iP=`pangular-pref:filters`,aP=200;function oP(e){try{let t=localStorage.getItem(`${iP}:${e}`),n=t?JSON.parse(t):[];if(!Array.isArray(n))return[];let r=n.filter(e=>typeof e==`string`&&!!e.trim()&&e.length<=aP);return[...new Set(r)].slice(-8)}catch{return[]}}function sP(e,t){try{t.length?localStorage.setItem(`${iP}:${e}`,JSON.stringify(t)):localStorage.removeItem(`${iP}:${e}`)}catch{}}var cP=class e{value=mv(``);label=$(`Filter`);placeholder=$(`Filter`);inputId=$(null);describedBy=$(null);saveKey=$(null);input=gv.required(`input`);host=x(Ml);injector=x(bs);announcement=T(``);query=X(()=>this.value().trim());saved=Q(()=>{let e=this.saveKey();return e?oP(e):[]});canSave=X(()=>{let e=this.query();return!!this.saveKey()&&!!e&&e.length<=aP&&!this.saved().includes(e)&&this.saved().length<8});focus(){this.input().nativeElement.focus()}clear(e){this.value()&&(e.preventDefault(),e.stopPropagation(),this.value.set(``))}save(){let e=this.saveKey(),t=this.query();if(!e||!this.canSave())return;let n=[...this.saved(),t];this.saved.set(n),sP(e,n),this.say(`Filter ${t} saved.`),this.focusAfterRender(`.chip:last-child .apply`)}apply(e){this.value.set(this.query()===e?``:e)}remove(e){let t=this.saveKey();if(!t)return;let n=this.saved().indexOf(e),r=this.saved().filter(t=>t!==e);if(this.saved.set(r),sP(t,r),this.say(`Saved filter ${e} removed.`),!r.length){this.focus();return}let i=Math.min(n,r.length-1)+1;this.focusAfterRender(`.chip:nth-child(${i}) .apply`)}focusAfterRender(e){cd(()=>{let t=this.host.nativeElement.querySelector(e);t?t.focus():this.focus()},{injector:this.injector})}say(e){this.announcement.update(t=>t===e?`${e} `:e)}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-search-field`]],viewQuery:function(e,t){e&1&&Ng(t.input,$N,5),e&2&&Pg()},inputs:{value:[1,`value`],label:[1,`label`],placeholder:[1,`placeholder`],inputId:[1,`inputId`],describedBy:[1,`describedBy`],saveKey:[1,`saveKey`]},outputs:{value:`valueChange`},decls:9,vars:8,consts:[[`input`,``],[1,`box`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`icon`],[`cx`,`11`,`cy`,`11`,`r`,`7`],[`d`,`m20 20-3.5-3.5`],[`type`,`search`,`autocomplete`,`off`,`spellcheck`,`false`,3,`input`,`keydown.escape`,`placeholder`,`value`],[`type`,`button`,1,`save`],[`aria-label`,`Saved filters`,1,`chips`],[`role`,`status`,1,`sr-only`],[`type`,`button`,1,`save`,3,`click`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`],[`d`,`M6 4h12v16l-6-4-6 4z`],[1,`save-text`],[1,`chip`,3,`active`],[1,`chip`],[`type`,`button`,1,`apply`,3,`click`],[`type`,`button`,1,`remove`,3,`click`],[`d`,`M7 7l10 10M17 7 7 17`]],template:function(e,t){e&1&&(R(0,`div`,1),w(),R(1,`svg`,2),fg(2,`circle`,3)(3,`path`,4),z(),fs(),R(4,`input`,5,0),U(`input`,function(e){return t.value.set(e.target.value)})(`keydown.escape`,function(e){return t.clear(e)}),z()(),A(6,eP,5,1,`button`,6),A(7,nP,3,0,`ul`,7),A(8,rP,2,1,`span`,8)),e&2&&(D(4),V(`placeholder`,t.placeholder())(`value`,t.value()),k(`id`,t.inputId())(`aria-label`,t.label())(`aria-describedby`,t.describedBy()),D(2),j(t.canSave()?6:-1),D(),j(t.saveKey()&&t.saved().length?7:-1),D(),j(t.saveKey()?8:-1))},styles:[`[_nghost-%COMP%] { +}`]})},WN=12,GN=900;function KN(e){for(let t=e.parentElement;t;t=t.parentElement){let e=getComputedStyle(t);if(/(auto|scroll|overlay)/.test(e.overflowY))return t}return null}var qN=class{options;injector=x(xs);visibleTop=T(0);viewport=T(GN);rowHeight;host=null;scroller=null;detach=null;enabled;range;padTop;padBottom;constructor(e){this.options=e,this.rowHeight=T(e.estimate);let t=e.min??300;this.enabled=X(()=>e.count()>t),this.range=X(()=>{let t=e.count();if(!this.enabled())return{start:0,end:t};let n=this.rowHeight(),r=this.viewport(),i=Math.max(0,Math.min(this.visibleTop(),t*n-r)),a=Math.max(0,Math.min(t-1,Math.floor(i/n)-WN));return{start:a,end:Math.min(t,Math.max(a,Math.ceil((i+r)/n)+WN))}}),this.padTop=X(()=>this.enabled()?this.range().start*this.rowHeight():0),this.padBottom=X(()=>this.enabled()?(e.count()-this.range().end)*this.rowHeight():0),E(()=>{e.count(),ld(()=>this.update(),{injector:this.injector})}),x(Cs).onDestroy(()=>this.detach?.())}get count(){return this.options.count()}rendered(e){let{start:t,end:n}=this.range();return e>=t&&ethis.update();n.addEventListener(`scroll`,r,{passive:!0}),window.addEventListener(`resize`,r),this.detach=()=>{n.removeEventListener(`scroll`,r),window.removeEventListener(`resize`,r)},this.update()}update(){let e=this.host;if(e){if(this.scroller===e)this.place(e.scrollTop,e.clientHeight);else{let t=this.scroller?this.scroller.getBoundingClientRect().top:0,n=this.scroller?this.scroller.clientHeight:window.innerHeight;this.place(t-e.getBoundingClientRect().top,n)}this.options.fixed||this.measure()}}place(e,t){this.visibleTop.set(e),this.viewport.set(t>0?t:GN)}measure(){let e=this.host?.querySelectorAll(`[data-vindex]`);if(!e||e.length<2)return;let t=e[0].getBoundingClientRect(),n=(e[e.length-1].getBoundingClientRect().bottom-t.top)/e.length;n>4&&Math.abs(n-this.rowHeight())>1&&this.rowHeight.set(n)}reveal(e,t){if(this.enabled()&&!this.rendered(e)){let t=e*this.rowHeight(),n=this.viewport(),r=Math.max(0,t-n/2);if(this.place(r,n),this.host&&this.scroller===this.host)this.host.scrollTop=r;else if(this.host){let e=this.scroller?this.scroller.getBoundingClientRect().top:0,t=this.host.getBoundingClientRect().top-e+r;this.scroller?this.scroller.scrollTop+=t:window.scrollBy(0,t)}}t&&ld(t,{injector:this.injector})}};function JN(e){let t=e.ownerDocument.defaultView;if(!t)return null;for(let n=e.parentElement;n&&n!==e.ownerDocument.documentElement&&n!==e.ownerDocument.body;n=n.parentElement)if(/(auto|scroll|overlay)/.test(t.getComputedStyle(n).overflowY))return n;return null}var YN=e=>{let t=parseFloat(e);return Number.isFinite(t)?t:0};function XN(e,t=8){let n=e.ownerDocument.defaultView;if(!n)return e.offsetHeight+t;let r=JN(e),i=r?n.getComputedStyle(r):null,a=i?YN(i.paddingTop):0,o=i?YN(i.scrollPaddingTop):0,s=YN(n.getComputedStyle(e).top);return Math.max(0,Math.ceil(a+s+e.offsetHeight+t-o))}function ZN(e,t,n=8){let r=JN(e),i=t.getBoundingClientRect().bottom+n-e.getBoundingClientRect().top;i<=0||(r?r.scrollTop-=i:e.ownerDocument.defaultView?.scrollBy(0,-i))}var QN=[`input`];function $N(e,t){if(e&1){let e=B();R(0,`button`,9),U(`click`,function(){return S(e),C(W().save())}),w(),R(1,`svg`,10),pg(2,`path`,11),z(),ps(),R(3,`span`,12),K(4,`Save`),z()()}e&2&&k(`aria-label`,`Save filter `+W().query())}function eP(e,t){if(e&1){let e=B();R(0,`li`,14)(1,`button`,15),U(`click`,function(){let t=S(e).$implicit;return C(W(2).apply(t))}),K(2),z(),R(3,`button`,16),U(`click`,function(){let t=S(e).$implicit;return C(W(2).remove(t))}),w(),R(4,`svg`,10),pg(5,`path`,17),z()()()}if(e&2){let e=t.$implicit,n=W(2);G(`active`,e===n.query()),D(),k(`aria-pressed`,e===n.query())(`title`,e),D(),J(` `,e,` `),D(),k(`aria-label`,`Remove saved filter `+e)}}function tP(e,t){if(e&1&&(R(0,`ul`,7),M(1,eP,6,6,`li`,13,ng),z()),e&2){let e=W();D(),N(e.saved())}}function nP(e,t){if(e&1&&(R(0,`span`,8),K(1),z()),e&2){let e=W();D(),q(e.announcement())}}var rP=`pangular-pref:filters`,iP=200;function aP(e){try{let t=localStorage.getItem(`${rP}:${e}`),n=t?JSON.parse(t):[];if(!Array.isArray(n))return[];let r=n.filter(e=>typeof e==`string`&&!!e.trim()&&e.length<=iP);return[...new Set(r)].slice(-8)}catch{return[]}}function oP(e,t){try{t.length?localStorage.setItem(`${rP}:${e}`,JSON.stringify(t)):localStorage.removeItem(`${rP}:${e}`)}catch{}}var sP=class e{value=hv(``);label=$(`Filter`);placeholder=$(`Filter`);inputId=$(null);describedBy=$(null);saveKey=$(null);input=_v.required(`input`);host=x(Nl);injector=x(xs);announcement=T(``);query=X(()=>this.value().trim());saved=Q(()=>{let e=this.saveKey();return e?aP(e):[]});canSave=X(()=>{let e=this.query();return!!this.saveKey()&&!!e&&e.length<=iP&&!this.saved().includes(e)&&this.saved().length<8});focus(){this.input().nativeElement.focus()}clear(e){this.value()&&(e.preventDefault(),e.stopPropagation(),this.value.set(``))}save(){let e=this.saveKey(),t=this.query();if(!e||!this.canSave())return;let n=[...this.saved(),t];this.saved.set(n),oP(e,n),this.say(`Filter ${t} saved.`),this.focusAfterRender(`.chip:last-child .apply`)}apply(e){this.value.set(this.query()===e?``:e)}remove(e){let t=this.saveKey();if(!t)return;let n=this.saved().indexOf(e),r=this.saved().filter(t=>t!==e);if(this.saved.set(r),oP(t,r),this.say(`Saved filter ${e} removed.`),!r.length){this.focus();return}let i=Math.min(n,r.length-1)+1;this.focusAfterRender(`.chip:nth-child(${i}) .apply`)}focusAfterRender(e){ld(()=>{let t=this.host.nativeElement.querySelector(e);t?t.focus():this.focus()},{injector:this.injector})}say(e){this.announcement.update(t=>t===e?`${e} `:e)}static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-search-field`]],viewQuery:function(e,t){e&1&&Pg(t.input,QN,5),e&2&&Fg()},inputs:{value:[1,`value`],label:[1,`label`],placeholder:[1,`placeholder`],inputId:[1,`inputId`],describedBy:[1,`describedBy`],saveKey:[1,`saveKey`]},outputs:{value:`valueChange`},decls:9,vars:8,consts:[[`input`,``],[1,`box`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`icon`],[`cx`,`11`,`cy`,`11`,`r`,`7`],[`d`,`m20 20-3.5-3.5`],[`type`,`search`,`autocomplete`,`off`,`spellcheck`,`false`,3,`input`,`keydown.escape`,`placeholder`,`value`],[`type`,`button`,1,`save`],[`aria-label`,`Saved filters`,1,`chips`],[`role`,`status`,1,`sr-only`],[`type`,`button`,1,`save`,3,`click`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`],[`d`,`M6 4h12v16l-6-4-6 4z`],[1,`save-text`],[1,`chip`,3,`active`],[1,`chip`],[`type`,`button`,1,`apply`,3,`click`],[`type`,`button`,1,`remove`,3,`click`],[`d`,`M7 7l10 10M17 7 7 17`]],template:function(e,t){e&1&&(R(0,`div`,1),w(),R(1,`svg`,2),pg(2,`circle`,3)(3,`path`,4),z(),ps(),R(4,`input`,5,0),U(`input`,function(e){return t.value.set(e.target.value)})(`keydown.escape`,function(e){return t.clear(e)}),z()(),A(6,$N,5,1,`button`,6),A(7,tP,3,0,`ul`,7),A(8,nP,2,1,`span`,8)),e&2&&(D(4),V(`placeholder`,t.placeholder())(`value`,t.value()),k(`id`,t.inputId())(`aria-label`,t.label())(`aria-describedby`,t.describedBy()),D(2),j(t.canSave()?6:-1),D(),j(t.saveKey()&&t.saved().length?7:-1),D(),j(t.saveKey()?8:-1))},styles:[`[_nghost-%COMP%] { display: flex; flex: 1 1 220px; flex-wrap: wrap; @@ -2955,7 +2955,7 @@ input[_ngcontent-%COMP%]:focus { .save[_ngcontent-%COMP%] { transition: none; } -}`]})},lP=[`[redacted]`,`[email]`],uP=2e4;function dP(e){let t=0;for(let n of lP)for(let r=e.indexOf(n);r>=0;r=e.indexOf(n,r+n.length))t++;return t}function fP(e,t=uP){let n=0,r=t,i=new Set,a=[e];for(;a.length;){let e=a.pop();if(typeof e==`string`){if(--r<0)return{count:n,capped:!0};n+=dP(e);continue}if(typeof e==`object`&&e&&!i.has(e)){if(i.add(e),Array.isArray(e)){for(let t of e)a.push(t);continue}for(let[t,i]of Object.entries(e)){if(--r<0)return{count:n,capped:!0};n+=dP(t),a.push(i)}}}return{count:n,capped:!1}}function pP(e,t){if(e&1&&(R(0,`p`,0),K(1),R(2,`span`,1),K(3),z()()),e&2){let e=W();D(),O_(` `,e.result().capped?`At least `:``,``,e.result().count,` `,e.result().count===1?`value`:`values`,` masked `),D(2),q(e.why())}}var mP=class e{value=$(void 0);why=$(`by redaction (secret names, tokens and emails).`);result=X(()=>fP(this.value()));static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-redaction-count`]],inputs:{value:[1,`value`],why:[1,`why`]},decls:1,vars:1,consts:[[`data-redaction-count`,``,1,`count`],[1,`why`]],template:function(e,t){e&1&&A(0,pP,4,4,`p`,0),e&2&&j(t.result().count>0?0:-1)},styles:[`[_nghost-%COMP%] { +}`]})},cP=[`[redacted]`,`[email]`],lP=2e4;function uP(e){let t=0;for(let n of cP)for(let r=e.indexOf(n);r>=0;r=e.indexOf(n,r+n.length))t++;return t}function dP(e,t=lP){let n=0,r=t,i=new Set,a=[e];for(;a.length;){let e=a.pop();if(typeof e==`string`){if(--r<0)return{count:n,capped:!0};n+=uP(e);continue}if(typeof e==`object`&&e&&!i.has(e)){if(i.add(e),Array.isArray(e)){for(let t of e)a.push(t);continue}for(let[t,i]of Object.entries(e)){if(--r<0)return{count:n,capped:!0};n+=uP(t),a.push(i)}}}return{count:n,capped:!1}}function fP(e,t){if(e&1&&(R(0,`p`,0),K(1),R(2,`span`,1),K(3),z()()),e&2){let e=W();D(),k_(` `,e.result().capped?`At least `:``,``,e.result().count,` `,e.result().count===1?`value`:`values`,` masked `),D(2),q(e.why())}}var pP=class e{value=$(void 0);why=$(`by redaction (secret names, tokens and emails).`);result=X(()=>dP(this.value()));static ɵfac=function(t){return new(t||e)};static ɵcmp=O({type:e,selectors:[[`app-redaction-count`]],inputs:{value:[1,`value`],why:[1,`why`]},decls:1,vars:1,consts:[[`data-redaction-count`,``,1,`count`],[1,`why`]],template:function(e,t){e&1&&A(0,fP,4,4,`p`,0),e&2&&j(t.result().count>0?0:-1)},styles:[`[_nghost-%COMP%] { display: block; } @@ -2969,7 +2969,7 @@ input[_ngcontent-%COMP%]:focus { .why[_ngcontent-%COMP%] { color: var(--%NS%text-2); -}`]})},hP=[`filterInput`],gP=[`treeEl`],_P=[`propFilterInput`],vP=()=>[],yP=e=>({$implicit:e}),bP=e=>({kind:`component`,id:e}),xP=(e,t)=>t.row.node.id,SP=(e,t)=>t.outlet+t.route,CP=(e,t)=>t+e;function wP(e,t){return this.sourceKey(t)}var TP=(e,t)=>t.formId,EP=(e,t)=>t.name+t.index,DP=(e,t)=>t.name,OP=(e,t)=>t.id,kP=(e,t)=>t.token+e;function AP(e,t){if(e&1){let e=B();F(0,`span`,38),K(1,`Page`),I(),F(2,`app-select`,39),H(`valueChange`,function(t){return S(e),C(W(2).selectPage(t))}),I()}if(e&2){let e=W(2);D(2),P(`options`,e.pageOptions())(`value`,e.page()?.pageId??null)}}function jP(e,t){if(e&1){let e=B();F(0,`button`,40),H(`click`,function(){return S(e),C(W(2).toggleDirectiveHosts())}),w(),F(1,`svg`,12),L(2,`path`,41)(3,`path`,42),I(),fs(),F(4,`span`,15),K(5,`Directive hosts`),I()()}e&2&&k(`aria-pressed`,W(2).showDirectiveHosts())}function MP(e,t){if(e&1&&(F(0,`p`,22),K(1),I()),e&2){let e=W(2);D(),q(e.pickMessage())}}function NP(e,t){if(e&1&&(F(0,`p`,23),K(1),I()),e&2){let e=W(2);D(),q(e.truncationText())}}function PP(e,t){e&1&&(F(0,`p`,44),K(1,`The filter only searches the components the tree lists.`),I())}function FP(e,t){e&1&&(F(0,`p`,44),K(1,`Directive hosts are hidden, so they are not searched.`),I())}function IP(e,t){if(e&1){let e=B();F(0,`div`,27)(1,`p`,43),K(2),I(),A(3,PP,2,0,`p`,44),A(4,FP,2,0,`p`,44),F(5,`button`,45),H(`click`,function(){return S(e),C(W(2).clearFilter())}),K(6,`Clear filters`),I()()}if(e&2){let e=W(2);D(2),J(`No components match “`,e.filter().trim(),`”`),D(),j(e.page().truncated?3:-1),D(),j(!e.showDirectiveHosts()&&e.page().directiveHostCount?4:-1)}}function LP(e,t){if(e&1&&(F(0,`p`,28),K(1),I()),e&2){let e=W(2);D(),J(` `,e.rows().length,` rows. Rows render as you scroll, so the browser's find only sees the ones near view; the filter above searches them all. `)}}function RP(e,t){if(e&1){let e=B();F(0,`span`,53),H(`click`,function(t){S(e),W();let n=L_(0);return C(W(2).toggle(n.node.id,t))}),w(),F(1,`svg`,54),L(2,`path`,55),I()()}e&2&&(W(),G(`open`,L_(0).expanded))}function zP(e,t){e&1&&L(0,`span`,48)}function BP(e,t){if(e&1&&(F(0,`span`,56),K(1),I(),F(2,`span`,57),K(3),I(),F(4,`span`,26),K(5,`directive host`),I()),e&2){W();let e=L_(0),t=W(2);D(),J(`<`,e.node.tag,`>`),D(),k(`title`,e.node.directives?.join(`, `)),D(),q(t.hostLabel(e.node))}}function VP(e,t){if(e&1&&(F(0,`span`,58),K(1),I(),F(2,`span`,59),K(3),I()),e&2){W();let e=L_(0);k(`title`,e.node.name),D(),q(e.node.name),D(),k(`title`,`<`+e.node.tag+`>`),D(),J(`<`,e.node.tag,`>`)}}function HP(e,t){if(e&1&&(F(0,`span`)(1,`span`,26),K(2,`Hydration: `),I(),K(3),I()),e&2){let e=t,n=W(3);r_(`hyd hyd-`+e),D(3),q(n.hydrationText(e))}}function UP(e,t){if(e&1&&(F(0,`span`,50),K(1),I()),e&2){let e=t.$implicit;D(),q(e.route||`/`)}}function WP(e,t){if(e&1&&(F(0,`span`,51),K(1),F(2,`span`,26),K(3),I()()),e&2){let e=t;D(),J(` `,e),D(2),J(` `,e===1?`check`:`checks`,` while recording`)}}function GP(e,t){if(e&1&&(F(0,`span`,52),K(1),F(2,`span`,26),K(3),I()()),e&2){W();let e=L_(0);k(`title`,e.node.directives.join(`, `)),D(),J(` +`,e.node.directives.length,` `),D(2),J(` `,e.node.directives.length===1?`directive`:`directives`,` `)}}function KP(e,t){if(e&1){let e=B();F_(0),F(1,`div`,46),H(`click`,function(){S(e);let t=L_(0);return C(W(2).select(t.node.id))})(`focus`,function(t){S(e);let n=L_(0),r=W(2);return r.focusId.set(n.node.id),r.highlight(n.node.id),C(r.showNameTip(t))})(`blur`,function(){S(e);let t=W(2);return t.highlight(null),C(t.nameTip.set(null))})(`keydown.escape`,function(){return S(e),C(W(2).nameTip.set(null))})(`mouseenter`,function(){S(e);let t=L_(0);return C(W(2).highlight(t.node.id))})(`mouseleave`,function(){return S(e),C(W(2).highlight(null))}),A(2,RP,3,2,`span`,47)(3,zP,1,0,`span`,48),A(4,BP,6,3)(5,VP,4,4),A(6,HP,4,3,`span`,49),M(7,UP,2,1,`span`,50,SP),A(9,WP,4,2,`span`,51),A(10,GP,4,3,`span`,52),I()}if(e&2){let e,n,r=t.$implicit,i=W(2),a=I_(r.row);D(),n_(`--%NS%depth`,a.depth),G(`selected`,i.selectedId()===a.node.id)(`dir-host`,a.node.kind===`directive`),k(`aria-level`,a.depth+1)(`aria-setsize`,a.setsize)(`aria-posinset`,a.posinset)(`aria-expanded`,a.hasChildren?a.expanded:null)(`aria-selected`,i.selectedId()===a.node.id)(`tabindex`,i.tabStop()===a.node.id?0:-1)(`data-vindex`,r.index)(`data-id`,a.node.id),D(),j(a.hasChildren?2:3),D(2),j(a.node.kind===`directive`?4:5),D(2),j((e=a.node.hydration)?6:-1,e),D(),N(i.routedById().get(a.node.id)??K_(20,vP)),D(2),j((n=i.cdHosts()[a.node.id])?9:-1,n),D(),j(a.node.kind!==`directive`&&a.node.directives?.length?10:-1)}}function qP(e,t){if(e&1&&(F(0,`div`,60),K(1),I()),e&2){let e=t;n_(`top`,e.top,`px`),D(),J(` `,e.text,` `)}}function JP(e,t){if(e&1&&(F(0,`li`,68),K(1),gg(2,71),I()),e&2){let e=t.$implicit;W(3);let n=Fg(3);D(),J(` `,e,` `),D(),P(`ngTemplateOutlet`,n)(`ngTemplateOutletContext`,q_(3,yP,e))}}function YP(e,t){if(e&1){let e=B();F(0,`div`,70)(1,`button`,45),H(`click`,function(){let t=S(e);return C(W(3).reveal(t.id,!0))}),K(2),I()()}e&2&&(D(2),J(` Show `,t.name,` `))}function XP(e,t){if(e&1&&(F(0,`section`,32)(1,`header`,61)(2,`span`,62),K(3,`directive host`),I(),F(4,`h2`,63),K(5),I(),F(6,`span`,64),K(7),I()(),F(8,`div`,65)(9,`h3`),K(10,` Directives `),F(11,`span`,66),K(12),I()(),F(13,`ul`,67),M(14,JP,3,5,`li`,68,CP),I()(),F(16,`div`,65)(17,`p`,69),K(18,` This element hosts directives but no component. Their inputs are bound in the template of the component that renders it. `),I(),A(19,YP,3,1,`div`,70),I()()),e&2){let e,n=t,r=W(2);D(5),J(`<`,n.tag,`>`),D(2),q(r.hostLabel(n)),D(5),q(n.directives?.length??0),D(2),N(n.directives??K_(4,vP)),D(5),j((e=r.ownerOf(n.id))?19:-1,e)}}function ZP(e,t){if(e&1&&(F(0,`p`,72),L(1,`app-source-link`,76),I()),e&2){let e=t;D(),P(`file`,e.file)(`line`,e.line)}}function QP(e,t){if(e&1&&(F(0,`p`,77)(1,`span`,79),K(2,`Likely`),I(),F(3,`span`,26),K(4,`, matched by class name: `),I(),L(5,`app-source-link`,76),I()),e&2){W();let e=L_(0);P(`title`,W(3).guessTitle),D(5),P(`file`,e[0].file)(`line`,e[0].line)}}function $P(e,t){if(e&1&&(F(0,`li`),L(1,`app-source-link`,76),I()),e&2){let e=t.$implicit;D(),P(`file`,e.file)(`line`,e.line)}}function eF(e,t){if(e&1&&(F(0,`div`,78)(1,`p`,80)(2,`span`,79),K(3,`Not certain`),I(),K(4),I(),F(5,`ul`,81),M(6,$P,2,2,`li`,null,wP,!0),I()()),e&2){W();let e=L_(0),t=W(),n=W(2);P(`title`,n.guessTitle),D(4),Y(` `,e.length,` source files define `,n.bareName(t.name),`: `),D(2),N(e)}}function tF(e,t){if(e&1&&(F_(0),A(1,QP,6,3,`p`,77)(2,eF,8,3,`div`,78)),e&2){let e=W(),t=I_(W(2).sourceCandidates(e));D(),j(t.length===1?1:t.length>1?2:-1)}}function nF(e,t){if(e&1){let e=B();F(0,`div`,82)(1,`button`,45),H(`click`,function(){S(e);let t=W();return C(W(2).revealInElements(t))}),K(2,`Reveal in Elements`),I(),F(3,`button`,45),H(`click`,function(){S(e);let t=W();return C(W(2).openSource(t))}),K(4,`Open source`),I()(),F(5,`p`,83),K(6),I()}if(e&2){let e=W(3);D(6),q(e.actionMessage())}}function rF(e,t){if(e&1){let e=B();F(0,`button`,85),H(`click`,function(){let t=S(e).$implicit;return C(W(5).showForm.emit(t.formId))}),K(1),I()}if(e&2){let e=t.$implicit;D(),J(` Show `,e.label,` in Forms `)}}function iF(e,t){if(e&1&&(F(0,`div`,73),M(1,rF,2,1,`button`,84,TP),I()),e&2){let e=W(),t=W(3);D(),N(t.formsIn(e.file))}}function aF(e,t){e&1&&A(0,iF,3,0,`div`,73),e&2&&j(W(3).formsIn(t.file).length?0:-1)}function oF(e,t){if(e&1){let e=B();F(0,`button`,45),H(`click`,function(){S(e);let t=W(2);return C(W(2).openInjector(t))}),K(1,` Show in Injectors `),F(2,`span`,26),K(3),I()()}if(e&2){let e=W(2);D(3),J(`: `,e.name)}}function sF(e,t){if(e&1){let e=B();F(0,`button`,45),H(`click`,function(){S(e);let t=W(2);return C(W(2).openSignals(t))}),K(1,` Show in Signals `),F(2,`span`,26),K(3),I()()}if(e&2){let e=W(2);D(3),J(`: `,e.name)}}function cF(e,t){if(e&1&&(F(0,`div`,73),A(1,oF,4,1,`button`,86),A(2,sF,4,1,`button`,86),I()),e&2){let e=W(3);D(),j(e.canShowInjector()?1:-1),D(),j(e.canShowSignals()?2:-1)}}function lF(e,t){if(e&1){let e=B();F(0,`div`,87)(1,`button`,45),H(`click`,function(){let t=S(e);return C(W(3).copyJson(t))}),K(2,`Copy as JSON`),I(),F(3,`button`,45),H(`click`,function(){let t=S(e);return C(W(3).copyHostPath(t))}),K(4,`Copy host path`),I()(),F(5,`p`,83),K(6),I()}if(e&2){let e=W(3);D(6),q(e.copyMessage())}}function uF(e,t){if(e&1&&L(0,`app-store-global`,74),e&2){let e=W(),t=W(2);P(`rpc`,t.rpc())(`pageId`,t.page()?.pageId)(`target`,q_(4,bP,e.id))(`label`,e.name)}}function dF(e,t){if(e&1&&(F(0,`dt`),K(1,`Routed`),I(),F(2,`dd`,89),K(3),I()),e&2){let e=t.$implicit;D(3),Y(``,e.route||`/`,` in outlet `,e.outlet)}}function fF(e,t){if(e&1&&(F(0,`span`,8),K(1),I()),e&2){let e=W(4);D(),Y(``,e.shownValues()?.count??0,` of `,e.valueTotal())}}function pF(e,t){if(e&1){let e=B();F(0,`div`,95)(1,`p`,43),K(2),I(),F(3,`p`,44),K(4,` The filter searches names, and the nested keys of values you opened. `),I(),F(5,`button`,45),H(`click`,function(){return S(e),C(W(5).clearPropFilter())}),K(6,`Clear filters`),I()()}if(e&2){let e=W(5);D(2),J(` No inputs, outputs or properties match “`,e.propFilter().trim(),`” `)}}function mF(e,t){if(e&1&&(F(0,`span`,100),K(1),I()),e&2){let e=W().$implicit;D(),J(`(`,e.prop,`)`)}}function hF(e,t){if(e&1&&(F(0,`li`,98)(1,`span`,99),K(2),A(3,mF,2,1,`span`,100),I(),L(4,`app-value-tree`,101),I()),e&2){let e=t.$implicit,n=W(4),r=W(3);G(`changed`,r.flashed(`input`,e.name)),D(2),J(` `,e.name,` `),D(),j(e.prop===e.name?-1:3),D(),P(`prop`,e)(`store`,r.values)(`query`,r.propFilter())(`componentId`,n.id)(`pageId`,r.page()?.pageId??null)(`rpc`,r.rpc())(`writes`,r.canEdit())}}function gF(e,t){if(e&1&&(F(0,`ul`,96),M(1,hF,5,11,`li`,97,DP),I()),e&2){let e=W(2);D(),N(e.inputs)}}function _F(e,t){e&1&&(F(0,`p`,69),K(1,`No inputs.`),I())}function vF(e,t){if(e&1&&(F(0,`div`,65)(1,`h3`),K(2,` Inputs `),F(3,`span`,66),K(4),I()(),A(5,gF,3,0,`ul`,96)(6,_F,2,0,`p`,69),I()),e&2){let e=W();D(4),q(e.inputs.length),D(),j(e.inputs.length?5:6)}}function yF(e,t){if(e&1&&(F(0,`li`,103)(1,`span`,89),K(2),I(),F(3,`span`,104),K(4),I()()),e&2){let e=t.$implicit;G(`on`,e.listened),D(2),q(e.name),D(2),q(e.listened?`listened`:`no listener`)}}function bF(e,t){if(e&1&&(F(0,`ul`,67),M(1,yF,5,4,`li`,102,DP),I()),e&2){let e=W(2);D(),N(e.outputs)}}function xF(e,t){e&1&&(F(0,`p`,69),K(1,`No outputs.`),I())}function SF(e,t){if(e&1&&(F(0,`div`,65)(1,`h3`),K(2,` Outputs `),F(3,`span`,66),K(4),I()(),A(5,bF,3,0,`ul`,67)(6,xF,2,0,`p`,69),I()),e&2){let e=W();D(4),q(e.outputs.length),D(),j(e.outputs.length?5:6)}}function CF(e,t){if(e&1&&(F(0,`span`,105),K(1),I()),e&2){let e=W().$implicit;D(),q(e.kind)}}function wF(e,t){if(e&1){let e=B();F(0,`button`,107),H(`click`,function(){S(e);let t=W().$implicit,n=W(5);return C(W(2).openSignals(n,t.prop))}),K(1,` Show in Signals`),F(2,`span`,26),K(3),I()()}if(e&2){let e=W().$implicit;D(3),J(`: `,e.name)}}function TF(e,t){if(e&1&&(F(0,`li`,98)(1,`span`,99),K(2),A(3,CF,2,1,`span`,105),A(4,wF,4,1,`button`,106),I(),L(5,`app-value-tree`,101),I()),e&2){let e=t.$implicit,n=W(4),r=W(3);G(`changed`,r.flashed(`property`,e.name)),D(2),J(` `,e.name,` `),D(),j(e.kind?3:-1),D(),j(e.kind===`signal`&&r.canShowSignals()&&!r.staticReport()?4:-1),D(),P(`prop`,e)(`store`,r.values)(`query`,r.propFilter())(`componentId`,n.id)(`pageId`,r.page()?.pageId??null)(`rpc`,r.rpc())(`writes`,r.canEdit())}}function EF(e,t){if(e&1&&(F(0,`ul`,96),M(1,TF,6,12,`li`,97,DP),I()),e&2){let e=W(2);D(),N(e.properties)}}function DF(e,t){e&1&&(F(0,`p`,69),K(1,`No other properties.`),I())}function OF(e,t){if(e&1&&(F(0,`div`,65)(1,`h3`),K(2,` Properties `),F(3,`span`,66),K(4),I()(),A(5,EF,3,0,`ul`,96)(6,DF,2,0,`p`,69),I()),e&2){let e=W();D(4),q(e.properties.length),D(),j(e.properties.length?5:6)}}function kF(e,t){if(e&1&&(F(0,`li`,68),K(1),I()),e&2){let e=t.$implicit;D(),q(e)}}function AF(e,t){if(e&1&&(F(0,`div`,65)(1,`h3`),K(2,` DOM listeners `),F(3,`span`,66),K(4),I()(),F(5,`ul`,67),M(6,kF,2,1,`li`,68,tg),I()()),e&2){let e=W(2);D(4),q(e.listeners.length),D(2),N(e.listeners)}}function jF(e,t){if(e&1&&(F(0,`li`,103)(1,`span`,89),K(2),I(),F(3,`span`,104),K(4),I()()),e&2){let e=t.$implicit;D(2),q(e.state),D(2),q(e.triggers.join(`, `)||`no triggers`)}}function MF(e,t){if(e&1&&(F(0,`div`,65)(1,`h3`),K(2,` Defer blocks `),F(3,`span`,66),K(4),I()(),F(5,`ul`,67),M(6,jF,5,2,`li`,103,OP),I()()),e&2){let e=W(5);D(4),q(e.ownedDeferBlocks().length),D(2),N(e.ownedDeferBlocks())}}function NF(e,t){if(e&1&&(F(0,`li`,98)(1,`span`,99),K(2),I(),L(3,`app-value-tree`,109),I()),e&2){let e=t.$implicit,n=W(2).$implicit,r=W(2),i=W(3);G(`changed`,i.flashed(`directive`,e.name,n.index)),D(2),q(e.name),D(),P(`prop`,e)(`store`,i.values)(`query`,i.propFilter())(`directive`,n.index)(`componentId`,r.id)(`pageId`,i.page()?.pageId??null)(`rpc`,i.rpc())}}function PF(e,t){if(e&1&&(F(0,`ul`,96),M(1,NF,4,10,`li`,97,DP),I()),e&2){let e=W().$implicit;D(),N(e.inputs)}}function FF(e,t){if(e&1&&(F(0,`li`,103)(1,`span`,89),K(2),I(),F(3,`span`,104),K(4),I()()),e&2){let e=t.$implicit;G(`on`,e.listened),D(2),q(e.name),D(2),q(e.listened?`listened`:`no listener`)}}function IF(e,t){if(e&1&&(F(0,`ul`,67),M(1,FF,5,4,`li`,102,DP),I()),e&2){let e=W().$implicit;D(),N(e.outputs)}}function LF(e,t){e&1&&(F(0,`p`,69),K(1,`No inputs or outputs.`),I())}function RF(e,t){if(e&1&&(F(0,`div`,65)(1,`h3`)(2,`span`,89),K(3),I(),F(4,`span`,105),K(5,`directive on host`),I()(),F(6,`p`,108),gg(7,71),I(),A(8,PF,3,0,`ul`,96),A(9,IF,3,0,`ul`,67),A(10,LF,2,0,`p`,69),I()),e&2){let e=t.$implicit;W(5);let n=Fg(3);D(3),q(e.name),D(4),P(`ngTemplateOutlet`,n)(`ngTemplateOutletContext`,q_(6,yP,e.name)),D(),j(e.inputs.length?8:-1),D(),j(e.outputs.length?9:-1),D(),j(!e.inputs.length&&!e.outputs.length?10:-1)}}function zF(e,t){if(e&1&&(L(0,`app-redaction-count`,94),A(1,pF,7,1,`div`,95),A(2,vF,7,2,`div`,65),A(3,SF,7,2,`div`,65),A(4,OF,7,2,`div`,65),A(5,AF,8,1,`div`,65),A(6,MF,8,1,`div`,65),M(7,RF,11,8,`div`,65,EP)),e&2){let e=t,n=W(),r=W(3);P(`value`,e),D(),j(r.propQuery()&&!e.count?1:-1),D(),j(!r.propQuery()||e.inputs.length?2:-1),D(),j(!r.propQuery()||e.outputs.length?3:-1),D(),j(!r.propQuery()||e.properties.length?4:-1),D(),j(!r.propQuery()&&n.listeners.length?5:-1),D(),j(!r.propQuery()&&r.ownedDeferBlocks().length?6:-1),D(),N(e.directives)}}function BF(e,t){if(e&1&&(F(0,`span`,105),K(1),I()),e&2){let e=t.$implicit;D(),q(e)}}function VF(e,t){if(e&1&&(F(0,`span`,112),K(1,`from `),F(2,`span`,89),K(3),I()()),e&2){let e=W().$implicit;D(3),q(e.providedByName??`an injector`)}}function HF(e,t){e&1&&(F(0,`span`,113),K(1,`not provided`),I())}function UF(e,t){if(e&1&&(F(0,`li`,110)(1,`span`,111),K(2),I(),M(3,BF,2,1,`span`,105,tg),A(5,VF,4,1,`span`,112)(6,HF,2,0,`span`,113),I()),e&2){let e=t.$implicit;D(2),q(e.token),D(),N(e.flags),D(2),j(e.providedBy?5:6)}}function WF(e,t){if(e&1&&(F(0,`ul`,92),M(1,UF,7,2,`li`,110,kP),I()),e&2){let e=W();D(),N(e.dependencies)}}function GF(e,t){e&1&&(F(0,`p`,69),K(1,`Nothing is injected through the constructor or inject().`),I())}function KF(e,t){if(e&1){let e=B();F(0,`app-component-pipes`,114),H(`showPipe`,function(t){return S(e),C(W(4).showPipe.emit(t))}),I()}if(e&2){let e=W(2),t=W(2);P(`rpc`,t.rpc())(`pageId`,t.page()?.pageId)(`component`,t.bareName(e.name))(`canShowPipes`,!t.staticReport())}}function qF(e,t){if(e&1){let e=B();F(0,`dl`,88)(1,`dt`),K(2,`Change detection`),I(),F(3,`dd`),K(4),I(),F(5,`dt`),K(6,`Encapsulation`),I(),F(7,`dd`),K(8),I(),F(9,`dt`),K(10,`Host path`),I(),F(11,`dd`,89),K(12),I(),M(13,dF,4,2,null,null,SP),I(),F(15,`div`,90)(16,`app-search-field`,91,3),N_(`valueChange`,function(t){S(e);let n=W(3);return M_(n.propFilter,t)||(n.propFilter=t),C(t)}),I(),A(18,fF,2,2,`span`,8),F(19,`p`,21),K(20),I()(),A(21,zF,9,7),F(22,`div`,65)(23,`h3`),K(24,` Injected `),F(25,`span`,66),K(26),I()(),A(27,WF,3,0,`ul`,92)(28,GF,2,0,`p`,69),I(),A(29,KF,1,4,`app-component-pipes`,93)}if(e&2){let e,n=t,r=W(),i=W(2);D(4),q(n.changeDetection??`Unknown`),D(4),q(n.encapsulation??`Unknown`),D(4),q(n.path),D(),N(i.routedById().get(r.id)??K_(10,vP)),D(3),j_(`value`,i.propFilter),D(2),j(i.propQuery()?18:-1),D(2),q(i.propFilterStatus()),D(),j((e=i.shownValues())?21:-1,e),D(5),q(n.dependencies.length),D(),j(n.dependencies.length?27:28),D(2),j(i.canShowPipes()?29:-1)}}function JF(e,t){e&1&&(F(0,`div`,75),L(1,`span`,115),F(2,`p`,44),K(3,`Reading live values from the page…`),I()())}function YF(e,t){if(e&1&&(F(0,`section`,32)(1,`header`,61)(2,`span`,62),K(3,`component`),I(),F(4,`h2`,63),K(5),I(),F(6,`span`,64),K(7),I(),A(8,ZP,2,2,`p`,72)(9,tF,3,2),A(10,nF,7,1),A(11,aF,1,1),A(12,cF,3,2,`div`,73),A(13,lF,7,1),A(14,uF,1,6,`app-store-global`,74),I(),A(15,qF,30,11)(16,JF,4,0,`div`,75),I()),e&2){let e,n,r,i,a=t,o=W(2);D(5),q(a.name),D(2),J(`<`,a.tag,`>`),D(),j((e=o.detail()?.source)?8:9,e),D(2),j(o.devtoolsActions()?10:-1),D(),j((n=o.sourceFor(a))?11:-1,n),D(),j((o.canShowInjector()||o.canShowSignals())&&!o.staticReport()?12:-1),D(),j((r=o.detail())?13:-1,r),D(),j(!o.staticReport()&&!o.native()?14:-1),D(),j((i=o.detail())?15:16,i)}}function XF(e,t){e&1&&(F(0,`p`,43),K(1,`The selected component was destroyed`),I(),F(2,`p`,44)(3,`span`,89),K(4),I(),K(5,` is no longer on the page. Select another component to see its live values. `),I()),e&2&&(D(4),q(t))}function ZF(e,t){e&1&&(F(0,`p`,44),K(1,` Select a component to see its live inputs, properties, outputs, change detection and injected services. `),I())}function QF(e,t){if(e&1&&(F(0,`div`,33),A(1,XF,6,1)(2,ZF,2,0,`p`,44),I()),e&2){let e,t=W(2);D(),j((e=t.destroyed())?1:2,e)}}function $F(e,t){e&1&&L(0,`app-angular-unavailable`,35),e&2&&P(`page`,W(2).angularPage())}function eI(e,t){if(e&1){let e=B();F(0,`app-hydration-section`,116),H(`overlay`,function(t){return S(e),C(W(2).setHydrationOverlay(t))})(`showNode`,function(t){return S(e),C(W(2).revealNode(t))})(`highlight`,function(t){return S(e),C(W(2).highlight(t))}),I()}e&2&&P(`report`,W(2).page()?.hydration)}function tI(e,t){if(e&1){let e=B();F(0,`app-cd-recording`,117),H(`showComponent`,function(t){return S(e),C(W(2).showCdComponent(t))}),I(),F(1,`app-leaks-section`,118),H(`showComponent`,function(t){return S(e),C(W(2).showLeakComponent(t))})(`highlight`,function(t){return S(e),C(W(2).highlight(t))}),I()}if(e&2){let e=W(2);P(`page`,e.cdPage())(`pageId`,e.page().pageId)(`rpc`,e.rpc())(`native`,e.native()),D(),P(`report`,e.leaksPage())(`pageId`,e.page().pageId)(`rpc`,e.rpc())(`angular`,e.angularPage())}}function nI(e,t){if(e&1){let e=B();F(0,`p`,4),K(1,` Every component instance on the page, in the order Angular rendered them. Hover a row to highlight its host in the page, and select it to read its live inputs, properties, outputs and injected services. `),I(),F(2,`div`,5)(3,`app-search-field`,6,1),H(`valueChange`,function(t){return S(e),C(W().setFilter(t))}),I(),F(5,`span`,7),K(6,` Type plain text, a tag such as