From 89c985b51a215bcf3ad34e420e0f2d670bcc7117 Mon Sep 17 00:00:00 2001 From: erKam Date: Sat, 7 Nov 2026 16:25:30 +0000 Subject: [PATCH 1/9] feat(components): add copy actions, value flash, defer loading and cd reload Close the decided feature items of the components follow-ups: - Copy as JSON and Copy host path in the detail header. The JSON holds the values the page already serialized and masked, and the page now sends a CSS selector for the host. - A changed input or property gets an outline that fades over one second, and Show in Signals opens the Signals tab on the component's graph (#tab=signals&id=), selecting a signal property's node. - The detail lists the defer blocks of the selected component. - A defer block that hydrated before the overlay attached shows "hydrated before inspection" in the panel and the defer-blocks tool. - A change detection recording resumes after a reload of the tab, through a sessionStorage flag per pageId. - The load-defer-block action tool loads one @defer block as if its trigger fired, behind actions.components. Refs #366 --- .../component-detail-actions.test.ts | 216 +++++++++++++++++ .../__tests__/component-tree-defer.test.ts | 33 +++ app/src/__tests__/shell-deep-link.test.ts | 14 +- app/src/__tests__/signal-focus.test.ts | 81 +++++++ app/src/app.ts | 25 +- app/src/pages/cd-recording.ts | 3 + app/src/pages/component-copy.ts | 78 ++++++ app/src/pages/component-tree.ts | 162 ++++++++++++- app/src/pages/component-value-flash.ts | 79 ++++++ app/src/pages/defer-blocks-section.ts | 23 +- app/src/pages/signal-inspector.ts | 35 ++- app/src/types/signal-focus.types.ts | 11 + apps/docs/src/content/agents/mcp-server.md | 3 +- apps/docs/src/content/agents/tools.md | 46 +++- .../content/getting-started/configuration.md | 14 +- .../content/getting-started/popup-and-hub.md | 1 + .../docs/src/content/inspectors/components.md | 18 +- apps/docs/src/content/inspectors/signals.md | 1 + packages/devtools/CHANGELOG.md | 6 +- .../skills/pangular-inspector/SKILL.md | 2 +- .../__tests__/action-tool-refusals.test.ts | 1 + .../devtools/src/__tests__/cd-live.test.ts | 2 + .../src/__tests__/cd-record-reload.test.ts | 89 +++++++ .../src/__tests__/component-tree.test.ts | 11 + .../devtools/src/__tests__/config.test.ts | 3 + .../src/__tests__/defer-blocks.test.ts | 28 ++- .../src/__tests__/defer-load-tool.test.ts | 146 +++++++++++ .../devtools/src/__tests__/defer-load.test.ts | 176 ++++++++++++++ .../fixtures/agent-metadata-derived.json | 6 +- .../src/__tests__/panel-shell.test.ts | 9 +- packages/devtools/src/cd-overlay.ts | 46 +++- packages/devtools/src/component-tree.ts | 2 + packages/devtools/src/config.ts | 25 ++ packages/devtools/src/defer-blocks.ts | 8 + packages/devtools/src/defer-load.ts | 228 ++++++++++++++++++ packages/devtools/src/devframe.ts | 24 ++ packages/devtools/src/overlay.ts | 13 +- packages/devtools/src/rpc/component-tools.ts | 13 +- packages/devtools/src/rpc/defer-loads.ts | 178 ++++++++++++++ packages/devtools/src/types.ts | 5 + scripts/e2e-mcp.mjs | 16 ++ scripts/e2e-security.mjs | 1 + 42 files changed, 1832 insertions(+), 49 deletions(-) create mode 100644 app/src/__tests__/component-detail-actions.test.ts create mode 100644 app/src/__tests__/signal-focus.test.ts create mode 100644 app/src/pages/component-copy.ts create mode 100644 app/src/pages/component-value-flash.ts create mode 100644 app/src/types/signal-focus.types.ts create mode 100644 packages/devtools/src/__tests__/cd-record-reload.test.ts create mode 100644 packages/devtools/src/__tests__/defer-load-tool.test.ts create mode 100644 packages/devtools/src/__tests__/defer-load.test.ts create mode 100644 packages/devtools/src/defer-load.ts create mode 100644 packages/devtools/src/rpc/defer-loads.ts diff --git a/app/src/__tests__/component-detail-actions.test.ts b/app/src/__tests__/component-detail-actions.test.ts new file mode 100644 index 00000000..519f36ac --- /dev/null +++ b/app/src/__tests__/component-detail-actions.test.ts @@ -0,0 +1,216 @@ +import { TestBed, type ComponentFixture } from '@angular/core/testing'; +import type { DevframeRpcClient } from 'devframe/client'; +import { afterEach, describe, expect, it, vi } from 'vitest'; +import { ComponentTree } from '../pages/component-tree'; +import { componentJson, hostPathText } from '../pages/component-copy'; +import { ValueFlash, changedKeys } from '../pages/component-value-flash'; +import type { SignalFocus } from '../types/signal-focus.types'; + +function detail(count: number) { + return { + id: 'c1', + name: 'Cart', + tag: 'app-cart', + path: 'app-root > app-cart', + selector: 'body:nth-child(2) > app-root:nth-child(1) > app-cart:nth-child(1)', + inputs: [{ name: 'title', prop: 'title', value: 'Basket' }], + outputs: [{ name: 'checkout', prop: 'checkout', listened: true }], + properties: [ + { name: 'count', prop: 'count', value: count, kind: 'signal' }, + { name: 'token', prop: 'token', value: '[redacted]' }, + ], + listeners: [], + directives: [], + dependencies: [ + { from: 'c1', token: 'CartStore', flags: [], providedBy: 'r', providedByName: 'Root' }, + ], + }; +} + +function page(count: number) { + return { + pageId: 'p1', + roots: [{ id: 'c1', name: 'Cart', tag: 'app-cart', children: [] }], + count: 1, + detail: detail(count), + reportedAt: 1000, + deferBlocks: [ + { + id: 'd1', + owner: { id: 'c1', name: 'Cart', tag: 'app-cart' }, + state: 'placeholder', + hydration: 'not-configured', + triggers: ['on viewport'], + rootIds: [], + }, + ], + }; +} + +function client() { + const listeners: ((value: unknown) => void)[] = []; + let value: unknown = { pages: { p1: page(1) } }; + const rpc = { + call: () => Promise.resolve([]), + callEvent: () => Promise.resolve(), + sharedState: (name: string) => + Promise.resolve({ + value: () => (name === 'component-tree' ? value : null), + on: (_event: string, listener: (value: unknown) => void) => { + if (name === 'component-tree') listeners.push(listener); + return () => {}; + }, + }), + }; + const push = (next: unknown) => { + value = next; + for (const listener of listeners) listener(next); + }; + const rpcClient = { connectionMeta: {}, scope: () => ({ rpc }) } as unknown as DevframeRpcClient; + return { rpcClient, push }; +} + +async function settle(fixture: ComponentFixture) { + for (let i = 0; i < 3; i++) { + await new Promise((resolve) => setTimeout(resolve)); + await fixture.whenStable(); + } +} + +async function selected() { + const fixture = TestBed.createComponent(ComponentTree); + const { rpcClient, push } = client(); + fixture.componentRef.setInput('rpc', rpcClient); + fixture.componentRef.setInput('canShowSignals', true); + await settle(fixture); + fixture.componentInstance.selectedId.set('c1'); + await settle(fixture); + return { fixture, push, el: fixture.nativeElement as HTMLElement }; +} + +function button(el: HTMLElement, text: string): HTMLButtonElement { + const found = Array.from(el.querySelectorAll('button')).find((b) => + b.textContent?.replace(/\s+/g, ' ').trim().startsWith(text), + ); + if (!found) throw new Error(`no button ${text}`); + return found; +} + +describe('component detail actions', () => { + afterEach(() => { + document.body.innerHTML = ''; + vi.restoreAllMocks(); + vi.useRealTimers(); + }); + + it('copies the detail as JSON and the host selector', async () => { + const writeText = vi.fn((_text: string) => Promise.resolve()); + Object.defineProperty(navigator, 'clipboard', { value: { writeText }, configurable: true }); + const { fixture, el } = await selected(); + button(el, 'Copy as JSON').click(); + await settle(fixture); + const json = JSON.parse(writeText.mock.calls[0]![0]); + expect(json).toMatchObject({ + component: 'Cart', + hostPath: 'app-root > app-cart', + inputs: { title: 'Basket' }, + outputs: [{ name: 'checkout', listened: true }], + properties: { count: 1, token: '[redacted]' }, + injected: [{ token: 'CartStore', providedBy: 'Root' }], + }); + expect(el.textContent).toContain('Copied Cart as JSON.'); + button(el, 'Copy host path').click(); + await settle(fixture); + expect(writeText).toHaveBeenLastCalledWith(detail(1).selector); + expect(el.textContent).toContain('Copied the host selector.'); + }); + + it('says so when the clipboard refuses', async () => { + Object.defineProperty(navigator, 'clipboard', { + value: { writeText: () => Promise.reject(new Error('denied')) }, + configurable: true, + }); + const { fixture, el } = await selected(); + button(el, 'Copy host path').click(); + await settle(fixture); + expect(el.textContent).toContain('The clipboard is not available here.'); + }); + + it('outlines a value that changed in the last push', async () => { + const { fixture, push, el } = await selected(); + const rows = () => Array.from(el.querySelectorAll('.prop.changed')).map((r) => r.textContent); + expect(rows()).toEqual([]); + push({ pages: { p1: page(2) } }); + await settle(fixture); + expect(rows()).toHaveLength(1); + expect(rows()[0]).toContain('count'); + }); + + it('opens a signal property in the Signals tab', async () => { + const { fixture, el } = await selected(); + const opened: SignalFocus[] = []; + fixture.componentInstance.showSignals.subscribe((focus) => opened.push(focus)); + const link = el.querySelector('.signal-link')!; + expect(link.textContent).toContain('Show in Signals'); + link.click(); + button(el, 'Show in Signals').click(); + expect(opened).toEqual([ + { componentId: 'c1', pageId: 'p1', key: 'count' }, + { componentId: 'c1', pageId: 'p1' }, + ]); + }); + + it("lists the component's own defer blocks", async () => { + const { el } = await selected(); + const heading = Array.from(el.querySelectorAll('.detail h3')).find((h) => + h.textContent?.includes('Defer blocks'), + ); + expect(heading?.parentElement?.textContent).toContain('on viewport'); + }); +}); + +describe('component copy text', () => { + it('falls back to the component path without a selector', () => { + expect(hostPathText({ path: 'Page > Label' })).toBe('Page > Label'); + expect(hostPathText({ path: 'a > b', selector: 'a > b:nth-child(2)' })).toBe( + 'a > b:nth-child(2)', + ); + }); + + it('keeps the masked values the page sent', () => { + const text = componentJson({ ...detail(1), selector: undefined }); + expect(JSON.parse(text).properties.token).toBe('[redacted]'); + expect(JSON.parse(text).selector).toBeUndefined(); + }); +}); + +describe('ValueFlash', () => { + it('flashes changed keys for a second, and starts over for another component', () => { + vi.useFakeTimers(); + const flash = new ValueFlash(); + flash.update('p1|c1', new Map([['input:a', 1]])); + flash.update('p1|c1', new Map([['input:a', 2]])); + expect([...flash.changed()]).toEqual(['input:a']); + vi.advanceTimersByTime(999); + expect(flash.changed().size).toBe(1); + vi.advanceTimersByTime(1); + expect(flash.changed().size).toBe(0); + flash.update('p1|c2', new Map([['input:a', 3]])); + expect(flash.changed().size).toBe(0); + }); + + it('does not count a new or a removed key as a change', () => { + expect( + changedKeys( + new Map([ + ['a', '1'], + ['b', '2'], + ]), + new Map([ + ['a', '1'], + ['c', '3'], + ]), + ), + ).toEqual([]); + }); +}); diff --git a/app/src/__tests__/component-tree-defer.test.ts b/app/src/__tests__/component-tree-defer.test.ts index 3e3b2871..8c457b5c 100644 --- a/app/src/__tests__/component-tree-defer.test.ts +++ b/app/src/__tests__/component-tree-defer.test.ts @@ -58,6 +58,39 @@ describe('defer blocks', () => { expect(badge.classList.contains('defer-state-complete')).toBe(true); }); + it('says when a block hydrated before the devtools attached', async () => { + const fixture = TestBed.createComponent(ComponentTree); + const block = (id: string, hydratedAt?: number) => ({ + id, + state: 'complete', + hydration: 'hydrated', + triggers: ['hydrate on interaction'], + rootIds: [], + ...(hydratedAt ? { hydratedAt } : {}), + }); + const page = { + pageId: 'p1', + roots: [{ id: 'c1', name: 'App', tag: 'app-root', children: [] }], + count: 1, + detail: null, + reportedAt: 1000, + deferBlocks: [block('d1'), block('d2', 900)], + }; + fixture.componentRef.setInput('rpc', client({ p1: page })); + for (let i = 0; i < 3; i++) { + await new Promise((resolve) => setTimeout(resolve)); + await fixture.whenStable(); + } + const flags = Array.from( + (fixture.nativeElement as HTMLElement).querySelectorAll('.defer-row'), + ).map((row) => + Array.from(row.querySelectorAll('.flag')).map((flag) => flag.textContent?.trim()), + ); + expect(flags[0]).toContain('hydrated before inspection'); + expect(flags[1]).toContain('hydrated'); + expect(flags[1]).not.toContain('hydrated before inspection'); + }); + it('keeps a row without an owner focusable, marked aria-disabled', async () => { const fixture = TestBed.createComponent(ComponentTree); const page = { diff --git a/app/src/__tests__/shell-deep-link.test.ts b/app/src/__tests__/shell-deep-link.test.ts index 6d588d53..bb2431ca 100644 --- a/app/src/__tests__/shell-deep-link.test.ts +++ b/app/src/__tests__/shell-deep-link.test.ts @@ -81,9 +81,21 @@ describe('deep links', () => { fixture.destroy(); }); + it('selects the signal graph of the component a signals link names', async () => { + const { fixture, app } = await boot('#tab=signals&id=c3&page=p1'); + expect(app.tab()).toBe('signals'); + expect(app.signalFocus()).toEqual({ componentId: 'c3', pageId: 'p1' }); + fixture.destroy(); + }); + it('opens a tab without an item, and ignores an unknown tab', async () => { - let booted = await boot('#tab=signals&id=3'); + let booted = await boot('#tab=dashboard&id=3'); + expect(booted.app.tab()).toBe('dashboard'); + booted.fixture.destroy(); + TestBed.resetTestingModule(); + booted = await boot('#tab=signals'); expect(booted.app.tab()).toBe('signals'); + expect(booted.app.signalFocus()).toBeNull(); booted.fixture.destroy(); TestBed.resetTestingModule(); booted = await boot('#tab=nope&id=3'); diff --git a/app/src/__tests__/signal-focus.test.ts b/app/src/__tests__/signal-focus.test.ts new file mode 100644 index 00000000..5c800e38 --- /dev/null +++ b/app/src/__tests__/signal-focus.test.ts @@ -0,0 +1,81 @@ +import { TestBed, type ComponentFixture } from '@angular/core/testing'; +import type { DevframeRpcClient } from 'devframe/client'; +import { afterEach, describe, expect, it } from 'vitest'; +import { SignalInspector } from '../pages/signal-inspector'; + +const graphOf = (componentId: string) => ({ + pageId: 'p1', + component: { id: componentId, name: 'Cart', tag: 'app-cart', path: 'app-cart' }, + nodes: [ + { + id: '1', + kind: 'signal', + label: 'count', + epoch: 1, + value: 1, + locator: { id: componentId, key: 'count' }, + }, + { id: '2', kind: 'computed', label: 'doubled', epoch: 1, value: 2 }, + ], + edges: [{ consumer: 1, producer: 0 }], +}); + +function fakeClient() { + const calls: { name: string; args: unknown }[] = []; + const listeners: ((value: unknown) => void)[] = []; + let state: unknown = { graph: graphOf('c0'), pages: { p1: graphOf('c0') } }; + const rpc = { + call: (name: string, args: unknown) => { + calls.push({ name, args }); + return Promise.resolve([]); + }, + sharedState: (name: string) => + Promise.resolve({ + value: () => (name === 'signal-graph' ? state : {}), + on: (_event: string, listener: (value: unknown) => void) => { + if (name === 'signal-graph') listeners.push(listener); + return () => {}; + }, + }), + }; + const push = (next: unknown) => { + state = next; + for (const listener of listeners) listener(next); + }; + const client = { connectionMeta: {}, scope: () => ({ rpc }) } as unknown as DevframeRpcClient; + return { client, calls, push }; +} + +async function settle(fixture: ComponentFixture) { + for (let i = 0; i < 3; i++) { + await new Promise((resolve) => setTimeout(resolve)); + await fixture.whenStable(); + } +} + +afterEach(() => { + document.body.innerHTML = ''; +}); + +describe('SignalInspector focus', () => { + it('asks the page for the focused component and selects the signal once its graph arrives', async () => { + const fixture = TestBed.createComponent(SignalInspector); + const { client, calls, push } = fakeClient(); + fixture.componentRef.setInput('rpc', client); + document.body.append(fixture.nativeElement); + await settle(fixture); + + fixture.componentRef.setInput('focus', { componentId: 'c1', pageId: 'p1', key: 'count' }); + await settle(fixture); + expect(calls).toContainEqual({ + name: 'select-signal-target', + args: { pageId: 'p1', id: 'c1' }, + }); + // The graph of another component does not select anything. + expect(fixture.componentInstance.selectedId()).toBeNull(); + + push({ graph: graphOf('c1'), pages: { p1: graphOf('c1') } }); + await settle(fixture); + expect(fixture.componentInstance.selectedId()).toBe('1'); + }); +}); diff --git a/app/src/app.ts b/app/src/app.ts index b4cb2f1c..f0c69047 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 { SignalFocus } from './types/signal-focus.types'; import { AnalogInspector } from './pages/analog-inspector'; import { NetworkInspector } from './pages/network-inspector'; import { ComingSoon, type ComingSoonInfo } from './pages/coming-soon'; @@ -544,17 +545,19 @@ function readView(): View | null { [focus]="componentFocus()" [command]="componentCommand()" [canShowInjector]="config().inspectors.injectors" + [canShowSignals]="config().inspectors.signals" (focusHandled)="componentFocus.set(null)" (commandHandled)="componentCommand.set(null)" (showForm)="showForm($event)" (showInjector)="showInjector($event)" + (showSignals)="showSignals($event)" /> } @case ('routes') { } @case ('signals') { - + } @case ('injectors') { null, }); + // Belongs to the Signals tab that received it, like `componentFocus`. + readonly signalFocus = linkedSignal({ + source: this.tab, + computation: () => null, + }); + + /** + * Opens the Signals tab on a component's graph, through the same deep link + * a `#tab=signals&id=` hash opens, then selects the signal `key` names. + */ + showSignals(focus: SignalFocus) { + if (!this.config().inspectors.signals) return; + const page = focus.pageId ? { page: focus.pageId } : {}; + if (!this.openLink({ tab: 'signals', id: focus.componentId, ...page })) return; + this.signalFocus.set(focus); + } + showInjector(focus: InjectorFocus) { if (!this.config().inspectors.injectors) return; this.switchTab('injectors'); diff --git a/app/src/pages/cd-recording.ts b/app/src/pages/cd-recording.ts index 5015753a..a8cd25bb 100644 --- a/app/src/pages/cd-recording.ts +++ b/app/src/pages/cd-recording.ts @@ -94,6 +94,9 @@ const SHOWN_CYCLES = 30; of it stops with the recording. @if (native()) { An app on a device has no DOM, so checks that changed nothing are not counted there. + } @else { + 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. }

@if (page()?.supported === false) { diff --git a/app/src/pages/component-copy.ts b/app/src/pages/component-copy.ts new file mode 100644 index 00000000..9894baa0 --- /dev/null +++ b/app/src/pages/component-copy.ts @@ -0,0 +1,78 @@ +/** The fields of a component detail the copy actions read. */ +export interface CopyProp { + name: string; + value?: unknown; + listened?: boolean; + kind?: string; +} + +export interface CopyDetail { + name: string; + tag: string; + path: string; + selector?: string; + source?: { file: string; line: number }; + changeDetection?: string; + encapsulation?: string; + inputs: CopyProp[]; + outputs: CopyProp[]; + properties?: CopyProp[]; + listeners: string[]; + directives: { name: string; inputs: CopyProp[]; outputs: CopyProp[] }[]; + dependencies: { token: string; providedByName?: string; providedBy: string | null }[]; +} + +function valuesOf(props: readonly CopyProp[]): Record { + return Object.fromEntries(props.map((p) => [p.name, p.value ?? null])); +} + +function outputsOf(props: readonly CopyProp[]): { name: string; listened: boolean }[] { + return props.map((p) => ({ name: p.name, listened: !!p.listened })); +} + +/** + * The selected component as JSON for "Copy as JSON". It holds only what the + * panel already has: the page serialized and masked every value before it + * sent it (`serialize` and the redaction settings), so the copy carries the + * same `[redacted]` markers and cut levels as the detail on screen. + */ +export function componentJson(detail: CopyDetail): string { + const out: Record = { + component: detail.name, + tag: detail.tag, + hostPath: detail.path, + }; + if (detail.selector) out['selector'] = detail.selector; + if (detail.source) out['source'] = detail.source; + if (detail.changeDetection) out['changeDetection'] = detail.changeDetection; + if (detail.encapsulation) out['encapsulation'] = detail.encapsulation; + out['inputs'] = valuesOf(detail.inputs); + out['outputs'] = outputsOf(detail.outputs); + out['properties'] = valuesOf(detail.properties ?? []); + if (detail.listeners.length) out['listeners'] = detail.listeners; + if (detail.directives.length) { + out['directives'] = detail.directives.map((dir) => ({ + name: dir.name, + inputs: valuesOf(dir.inputs), + outputs: outputsOf(dir.outputs), + })); + } + out['injected'] = detail.dependencies.map((dep) => ({ + token: dep.token, + providedBy: dep.providedBy ? (dep.providedByName ?? 'an injector') : null, + })); + try { + return JSON.stringify(out, null, 2); + } catch { + return JSON.stringify({ component: detail.name, tag: detail.tag, hostPath: detail.path }); + } +} + +/** + * The text "Copy host path" copies: a CSS selector that finds the host with + * `document.querySelector`, or the component path (`app-root > app-list`) + * from a page that sends no selector, such as an app on a device. + */ +export function hostPathText(detail: Pick): string { + return detail.selector || detail.path; +} diff --git a/app/src/pages/component-tree.ts b/app/src/pages/component-tree.ts index 45436be8..77830219 100644 --- a/app/src/pages/component-tree.ts +++ b/app/src/pages/component-tree.ts @@ -44,6 +44,9 @@ 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 { SignalFocus } from '../types/signal-focus.types'; +import { componentJson, hostPathText } from './component-copy'; +import { ValueFlash, flashKey } from './component-value-flash'; import { SourceLink } from '../ui/source-link'; import { actionAllowed } from '../devtools-config'; import { ValueTree } from './component-value-tree'; @@ -103,6 +106,8 @@ interface Detail { name: string; tag: string; path: string; + /** A CSS selector that finds the host with `querySelector`, from a browser page. */ + selector?: string; source?: SourceLocation; changeDetection?: string; encapsulation?: string; @@ -524,13 +529,28 @@ function storedDirectiveHosts(): boolean { } } - @if (canShowInjector() && !staticReport()) { + @if ((canShowInjector() || canShowSignals()) && !staticReport()) {
- + @if (canShowInjector()) { + + } + @if (canShowSignals()) { + + } +
+ } + @if (detail(); as d) { +
+ +
+

{{ copyMessage() }}

} @if (!staticReport() && !native()) { @for (p of v.inputs; track p.name) { -
  • +
  • {{ p.name }} @if (p.prop !== p.name) { @@ -657,12 +677,21 @@ function storedDirectiveHosts(): boolean { @if (v.properties.length) {
      @for (p of v.properties; track p.name) { -
    • +
    • {{ p.name }} @if (p.kind) { {{ p.kind }} } + @if (p.kind === 'signal' && canShowSignals() && !staticReport()) { + + } } + @if (!propQuery() && ownedDeferBlocks().length) { +
      +

      + Defer blocks {{ ownedDeferBlocks().length }} +

      +
        + @for (block of ownedDeferBlocks(); track block.id) { +
      • + {{ block.state }} + {{ + block.triggers.join(', ') || 'no triggers' + }} +
      • + } +
      +
      + } + @for (dir of v.directives; track dir.name + dir.index) {

      @@ -704,7 +751,10 @@ function storedDirectiveHosts(): boolean { @if (dir.inputs.length) {
        @for (p of dir.inputs; track p.name) { -
      • +
      • {{ p.name }} (); + /** Whether the Signals tab is on, so "Show in Signals" can open it. */ + readonly canShowSignals = input(false); + readonly showSignals = output(); readonly filter = signal(''); readonly loading = signal(false); @@ -1788,6 +1872,13 @@ export class ComponentTree { source: this.selectedId, computation: () => '', }); + /** What the last copy did, for the selected component only. */ + readonly copyMessage = linkedSignal({ + source: this.selectedId, + computation: () => '', + }); + /** Values of the selected component that changed in the last push, outlined for a second. */ + private readonly flash = new ValueFlash(); readonly collapsed = signal>(new Set()); /** Elements that host directives but no component show as rows; this viewer can hide them. */ readonly showDirectiveHosts = signal(storedDirectiveHosts()); @@ -1904,6 +1995,11 @@ export class ComponentTree { ); readonly deferBlocks = computed(() => this.page()?.deferBlocks ?? []); + /** The defer blocks in the selected component's template. */ + readonly ownedDeferBlocks = computed(() => { + const id = this.selectedId(); + return id ? this.deferBlocks().filter((block) => block.owner?.id === id) : []; + }); readonly countLabel = computed(() => countText( @@ -2118,6 +2214,18 @@ export class ComponentTree { if (this.picking() && shown !== this.pickPageId) this.dropPick(); }); }); + effect(() => { + const detail = this.detail(); + const owner = detail ? `${this.page()?.pageId ?? ''}|${detail.id}` : null; + const values = new Map(); + for (const p of detail?.inputs ?? []) values.set(flashKey('input', p.name), p.value); + for (const p of detail?.properties ?? []) values.set(flashKey('property', p.name), p.value); + detail?.directives.forEach((dir, index) => { + for (const p of dir.inputs) values.set(flashKey('directive', p.name, index), p.value); + }); + untracked(() => this.flash.update(owner, values)); + }); + this.destroyRef.onDestroy(() => this.flash.clear()); effect(() => { const client = this.rpc(); if (!client) return; @@ -2284,6 +2392,44 @@ export class ComponentTree { ); } + /** Whether a value of the detail changed in the last push, so it shows an outline. */ + flashed(section: 'input' | 'property' | 'directive', name: string, index?: number): boolean { + return this.flash.changed().has(flashKey(section, name, index)); + } + + /** Opens the Signals tab on this component's graph, with the signal in `key` selected. */ + openSignals(node: LiveNode, key?: string) { + const pageId = this.page()?.pageId; + this.showSignals.emit({ + componentId: node.id, + ...(pageId ? { pageId } : {}), + ...(key ? { key } : {}), + }); + } + + /** Copies only what the panel holds, which the page serialized and masked already. */ + async copyJson(detail: Detail) { + await this.copy(detail.id, componentJson(detail), `Copied ${detail.name} as JSON.`); + } + + async copyHostPath(detail: Detail) { + await this.copy( + detail.id, + hostPathText(detail), + detail.selector ? 'Copied the host selector.' : 'Copied the host path.', + ); + } + + private async copy(id: string, text: string, done: string) { + let message = done; + try { + await navigator.clipboard.writeText(text); + } catch { + message = 'The clipboard is not available here.'; + } + if (this.selectedId() === id) this.copyMessage.set(message); + } + /** Opens the Injectors tab on this component's element injector. */ openInjector(node: LiveNode) { const pageId = this.page()?.pageId; diff --git a/app/src/pages/component-value-flash.ts b/app/src/pages/component-value-flash.ts new file mode 100644 index 00000000..0031cdf2 --- /dev/null +++ b/app/src/pages/component-value-flash.ts @@ -0,0 +1,79 @@ +import { signal } from '@angular/core'; + +/** How long a changed value keeps its outline, in ms. */ +export const FLASH_MS = 1000; + +/** The keys whose text differs between two reads; a key that is new or gone is not a change. */ +export function changedKeys( + before: ReadonlyMap, + after: ReadonlyMap, +): string[] { + const changed: string[] = []; + for (const [key, text] of after) { + const old = before.get(key); + if (old !== undefined && old !== text) changed.push(key); + } + return changed; +} + +function textOf(value: unknown): string { + try { + return JSON.stringify(value) ?? 'undefined'; + } catch { + return String(value); + } +} + +/** + * Which values of the selected component changed in the last push. Each one + * stays in `changed` for {@link FLASH_MS}, so the detail can outline it. A + * new component, or a new page, starts over without flashing anything. + */ +export class ValueFlash { + readonly changed = signal>(new Set()); + private owner: string | null = null; + private last = new Map(); + private readonly timers = new Map>(); + + constructor(private readonly ms = FLASH_MS) {} + + /** Reads the values of `owner` (a page and component id) as `key -> value`. */ + update(owner: string | null, values: ReadonlyMap) { + const texts = new Map([...values].map(([key, value]) => [key, textOf(value)])); + if (owner !== this.owner) { + this.clear(); + this.owner = owner; + this.last = texts; + return; + } + const changed = changedKeys(this.last, texts); + this.last = texts; + if (!changed.length) return; + this.changed.update((set) => new Set([...set, ...changed])); + for (const key of changed) { + clearTimeout(this.timers.get(key)); + this.timers.set( + key, + setTimeout(() => { + this.timers.delete(key); + this.changed.update((set) => { + const next = new Set(set); + next.delete(key); + return next; + }); + }, this.ms), + ); + } + } + + clear() { + for (const timer of this.timers.values()) clearTimeout(timer); + this.timers.clear(); + if (this.changed().size) this.changed.set(new Set()); + } +} + +/** The key of one value in the detail: `input:name`, `property:name`, `directive:0:name`. */ +export function flashKey(section: 'input' | 'property' | 'directive', name: string, index = 0) { + return section === 'directive' ? `directive:${index}:${name}` : `${section}:${name}`; +} diff --git a/app/src/pages/defer-blocks-section.ts b/app/src/pages/defer-blocks-section.ts index 77b84b75..3417fbcb 100644 --- a/app/src/pages/defer-blocks-section.ts +++ b/app/src/pages/defer-blocks-section.ts @@ -8,7 +8,11 @@ import { output, signal, } from '@angular/core'; -import { deferNotes, type DeferNote } from '@pangular-inspector/devtools/internal/config'; +import { + deferHydrationLabel, + deferNotes, + type DeferNote, +} from '@pangular-inspector/devtools/internal/config'; export interface DeferBlock { id: string; @@ -20,6 +24,8 @@ export interface DeferBlock { rootIds: string[]; /** Page clock, ms since epoch, when the state or hydration state last changed. */ since?: number; + /** Page clock, ms since epoch, when the overlay saw the block hydrate. */ + hydratedAt?: number; hasErrorBlock?: boolean; /** Times from `@loading (after …; minimum …)`, in ms. */ loading?: { minimumTime: number | null; afterTime: number | null }; @@ -31,6 +37,8 @@ interface Row { block: DeferBlock; notes: DeferNote[]; timings: string; + /** `hydrated`, or `hydrated before inspection` when the overlay attached later. */ + hydrated: string; } /** `500ms`, `1s`, `1.5s`. */ @@ -95,8 +103,16 @@ export function deferTimings(block: DeferBlock): string { } } - @if (row.block.hydration === 'hydrated') { - hydrated + @if (row.hydrated) { + {{ row.hydrated }} } @if (row.block.hasErrorBlock) { @error block @@ -249,6 +265,7 @@ export class DeferBlocksSection { // A block without a time (an older page) gets no age notes. notes: deferNotes({ ...block, since: block.since || pageNow }, pageNow), timings: deferTimings(block), + hydrated: block.hydration === 'hydrated' ? deferHydrationLabel(block) : '', })); }); diff --git a/app/src/pages/signal-inspector.ts b/app/src/pages/signal-inspector.ts index ceec0df2..5fa07614 100644 --- a/app/src/pages/signal-inspector.ts +++ b/app/src/pages/signal-inspector.ts @@ -26,6 +26,7 @@ import { RovingList } from '../ui/roving-list'; import { Select, type SelectOption } from '../ui/select'; import { SourceLink } from '../ui/source-link'; import type { GraphLink } from './signal-graph-layout'; +import type { SignalFocus } from '../types/signal-focus.types'; import { SignalGraphView } from './signal-graph-view'; interface SignalNode { @@ -1699,6 +1700,10 @@ const KIND_TOKENS: Record = { }) export class SignalInspector { rpc = input(null); + /** A component to show, from a deep link or the Components tab's "Show in Signals". */ + readonly focus = input(null); + /** The signal to select once the focused component's graph arrives. */ + private readonly focusedSignal = signal<{ componentId: string; key: string } | null>(null); private readonly destroyRef = inject(DestroyRef); private readonly host = inject>(ElementRef); @@ -2061,6 +2066,23 @@ export class SignalInspector { void this.loadSignalGraph(client); void this.loadSourceSignals(client); }); + effect(() => { + const focus = this.focus(); + if (focus) untracked(() => this.showComponent(focus)); + }); + // Selects the focused signal once the graph of its component is in. + effect(() => { + const wanted = this.focusedSignal(); + const graph = this.graph(); + if (!wanted || graph?.component?.id !== wanted.componentId) return; + const node = graph.nodes.find( + (n) => n.locator?.id === wanted.componentId && n.locator.key === wanted.key, + ); + untracked(() => { + this.focusedSignal.set(null); + if (node) this.jumpTo(node); + }); + }); this.destroyRef.onDestroy(() => { for (const cleanup of this.cleanups.splice(0)) cleanup(); }); @@ -2133,9 +2155,18 @@ export class SignalInspector { this.announcement.set(`Showing the signal graph of ${label}.`); } - pickComponent(value: string | null) { + /** Shows the graph of the component a focus names, on its page when it names one. */ + private showComponent(focus: SignalFocus) { + if (focus.pageId && !this.pageId && this.graphPages()[focus.pageId]) { + this.chosenPageId.set(focus.pageId); + } + this.focusedSignal.set(focus.key ? { componentId: focus.componentId, key: focus.key } : null); + this.pickComponent(focus.componentId, this.pageId ?? focus.pageId); + } + + pickComponent(value: string | null, forPage?: string) { const picked = value && value !== FOLLOW ? value : null; - const pageId = this.targetPageId() ?? undefined; + const pageId = forPage ?? this.targetPageId() ?? undefined; this.pickedByPage.update((all) => { const next = { ...all }; if (picked) next[pageId ?? ''] = picked; diff --git a/app/src/types/signal-focus.types.ts b/app/src/types/signal-focus.types.ts new file mode 100644 index 00000000..23d6e306 --- /dev/null +++ b/app/src/types/signal-focus.types.ts @@ -0,0 +1,11 @@ +/** + * A component whose signal graph the Signals tab should show, named by its id + * in the Components tab. `pageId` names the page it belongs to; without it the + * tab looks on the page it already shows. `key` is a property of the component + * that holds a signal, whose node the tab selects once the graph arrives. + */ +export interface SignalFocus { + componentId: string; + pageId?: string; + key?: string; +} diff --git a/apps/docs/src/content/agents/mcp-server.md b/apps/docs/src/content/agents/mcp-server.md index 38ca19af..5889b107 100644 --- a/apps/docs/src/content/agents/mcp-server.md +++ b/apps/docs/src/content/agents/mcp-server.md @@ -275,7 +275,7 @@ Every tool answers with one plain text block, the answer as written: markdown fo ### Read and action tools -Each tool has a safety tier: `read`, `action` or `destructive`. The server marks `read` tools as read-only for your client, and `destructive` tools as destructive. Twenty-one tools act on the app, so the server does not mark them read-only: +Each tool has a safety tier: `read`, `action` or `destructive`. The server marks `read` tools as read-only for your client, and `destructive` tools as destructive. Twenty-two tools act on the app, so the server does not mark them read-only: | Tool | Tier | Reference | | ------------------------- | ------------- | ----------------------------------------------------------------------------- | @@ -293,6 +293,7 @@ Each tool has a safety tier: `read`, `action` or `destructive`. The server marks | `remove-ssr-override` | `action` | [TransferState and SSR overrides](./tools.md#transferstate-and-ssr-overrides) | | `set-component-property` | `action` | [Edit a component](./tools.md#edit-a-component) | | `set-signal` | `action` | [Edit a component](./tools.md#edit-a-component) | +| `load-defer-block` | `action` | [load-defer-block](./tools.md#load-defer-block) | | `watch-signal` | `action` | [watch-signal](./tools.md#watch-signal) | | `record-pipes` | `action` | [Record pipe calls](./tools.md#record-pipe-calls) | | `track-subscriptions` | `action` | [Track subscriptions](./tools.md#track-subscriptions) | diff --git a/apps/docs/src/content/agents/tools.md b/apps/docs/src/content/agents/tools.md index c4d2fb14..03a3cbd7 100644 --- a/apps/docs/src/content/agents/tools.md +++ b/apps/docs/src/content/agents/tools.md @@ -131,11 +131,11 @@ Each section is also cut at 4,000 characters. When the answer reaches `maxChars` Gives the user a link that opens the panel on one tab with one item selected, and switches the panels that are open to it. Reads: page. Use it to point the user at what you found. -| Argument | Required | What it is | -| -------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `tab` | Yes | The tab: `dashboard`, `timeline`, `audit`, `components`, `routes`, `signals`, `injectors`, `store`, `queries`, `forms`, `pipes`, `network` (SSR & HTTP), `errors`, `analog`, `capacitor` or `plugins`. Only tabs that are on count. | -| `id` | No | The item to select: a component id on `components`, the id of the component whose element injector to show on `injectors`, a form id on `forms`. Other tabs ignore it. | -| `page` | No | The page the item belongs to, from `list-pages`. | +| Argument | Required | What it is | +| -------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `tab` | Yes | The tab: `dashboard`, `timeline`, `audit`, `components`, `routes`, `signals`, `injectors`, `store`, `queries`, `forms`, `pipes`, `network` (SSR & HTTP), `errors`, `analog`, `capacitor` or `plugins`. Only tabs that are on count. | +| `id` | No | The item to select: a component id on `components`, the id of the component whose element injector to show on `injectors`, the id of the component whose signal graph to show on `signals`, a form id on `forms`. Other tabs ignore it. | +| `page` | No | The page the item belongs to, from `list-pages`. | The answer is a full URL, such as `http://localhost:4200/__devframes/pangular/#tab=components&id=12&page=k3x9`, when the hub serves the panel and a page has reported its address. Otherwise it is the hash to add to the panel's address. Each panel that is open and not in a background tab opens the link at once. The tool is `read`: it changes what the panel shows, not the app. See [Deep links](../getting-started/popup-and-hub.md#deep-links). @@ -170,14 +170,14 @@ Without `url`, `navigation` holds as soon as no navigation is in progress, which Every tool has one of three safety tiers. The server sends the tier to your client as the tool's read-only and destructive hints. -| Tier | What the tool can do | Tools | -| ------------- | ------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `read` | Reads your source, the page or the server. `highlight` only shows and selects a component. | Every other tool, and every resource | -| `action` | Changes the running page, the server's fault rules and SSR overrides, or what the page records. A reload or the next call undoes it. | `navigate`, `probe-route`, `record-guards`, `ngrx-dispatch`, `ngrx-restore`, `tanstack-run-query`, `run-form-action`, `fill-form`, `set-http-rule`, `remove-http-rule`, `set-ssr-override`, `remove-ssr-override`, `set-component-property`, `set-signal`, `watch-signal`, `record-pipes`, `track-subscriptions`, `record-change-detection` and `audit` | -| `destructive` | Can lose data: it erases recordings, or sends writes to your own API routes. | `clear-recordings` and `analog-run-api` | +| Tier | What the tool can do | Tools | +| ------------- | ------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `read` | Reads your source, the page or the server. `highlight` only shows and selects a component. | Every other tool, and every resource | +| `action` | Changes the running page, the server's fault rules and SSR overrides, or what the page records. A reload or the next call undoes it. | `navigate`, `probe-route`, `record-guards`, `ngrx-dispatch`, `ngrx-restore`, `tanstack-run-query`, `run-form-action`, `fill-form`, `set-http-rule`, `remove-http-rule`, `set-ssr-override`, `remove-ssr-override`, `set-component-property`, `set-signal`, `load-defer-block`, `watch-signal`, `record-pipes`, `track-subscriptions`, `record-change-detection` and `audit` | +| `destructive` | Can lose data: it erases recordings, or sends writes to your own API routes. | `clear-recordings` and `analog-run-api` | - The twenty-one action and destructive tools act on the app. Your client can ask you before it runs them. + The twenty-two action and destructive tools act on the app. Your client can ask you before it runs them. When the hub is mounted, each finished call of an `action` or `destructive` tool posts an `Agent ran ` message to the hub, so you can see what the agent changed. `record-change-detection` posts only when it starts, stops or clears a recording, or turns a live view on or off, and `audit` only when it runs axe. See [Messages and badges](../getting-started/popup-and-hub.md#messages-and-badges). @@ -263,8 +263,30 @@ It takes only `page`. Without a development build, the page has no util to read defer blocks, and the answer says so. +A block that hydrated before the devtools attached to the page shows `hydrated before inspection` in the **Hydration** column, because the page never saw it hydrate. + Each page lists at most 50 blocks in the table and 50 under **Needs attention**, with a note on how many more are not shown. The whole answer stops at 20,000 characters. If several tabs report, pass `page` to read one. The **Defer blocks** list on the [Components](../inspectors/components.md#defer-blocks) page has every block the page reported. A page reports its first 500 blocks. When it has more, the answer says so. +### load-defer-block Action + +Makes one `@defer` block fetch its dependencies and show its main content now, as if its trigger fired, in development only. Use it to check deferred content without scrolling, hovering or waiting. Reads: page. + +| Argument | Required | Value | +| -------- | -------- | -------------------------------------------------------------------------- | +| `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. + +It refuses, and loads nothing, when: + +- the block already shows its main content +- the block is server HTML waiting for [incremental hydration](https://angular.dev/guide/incremental-hydration) (`dehydrated` or `hydrate never`), since a load would skip its hydrate trigger +- the page's Angular does not export the internals a load needs (`ɵgetDeferBlocks`, `ɵtriggerResourceLoading` and `ɵrenderDeferBlockState`) +- no page reports a block with that id, or several tabs do and `page` is missing + +A reload of the page undoes it. Set [`actions.components`](../getting-started/configuration.md#actions) to `false` to drop the tool. + ### for-blocks The `@for` blocks of each page: the component that holds each one, its item count, what its `track` expression tracks by and whether it has an `@empty` block and shows it. A block with no items and no `@empty` block gets a note that it renders nothing. Reads: page. @@ -339,7 +361,7 @@ Starts, stops or clears a change detection recording, and turns the live views o | `track` | no | `true` writes each component check, lifecycle hook and output listener to a **Pangular** track in the Chrome Performance panel. `false` turns it off. | | `angularProfiling` | no | `true` calls `ng.enableProfiling()` for Angular's own Performance panel track. It stays on until the page reloads, so `false` is refused. | -Pass `record`, a view or both. Without `page`, `record` goes to every connected page (`stop` only to the pages that record). `record` waits up to 3 seconds for each page to confirm and names the pages that did; when none does, or no page is connected, it refuses with `isError`. Call it with `record: "start"`, use the app, then call `change-detection`. +Pass `record`, a view or both. A recording keeps running when the tab reloads, until `stop`; the cycles from before the reload are gone. Without `page`, `record` goes to every connected page (`stop` only to the pages that record). `record` waits up to 3 seconds for each page to confirm and names the pages that did; when none does, or no page is connected, it refuses with `isError`. Call it with `record: "start"`, use the app, then call `change-detection`. `flash`, `track` and `angularProfiling` go to the page in `page`, or to every connected page. An [Angular Native](../getting-started/angular-native.md) or [NativeScript](../getting-started/nativescript.md) app has no live views. The tool says there is no DOM when `page` names such an app, or when `page` is left out and every page that reports is one. `record` works on these apps as on a browser page. They are the **Live views** toggles of the panel; see [Watch checks live](../inspectors/components.md#watch-checks-live). With `agent.readOnly` the tool is not registered, so start the recording from the panel. diff --git a/apps/docs/src/content/getting-started/configuration.md b/apps/docs/src/content/getting-started/configuration.md index b9ce5f84..b86bbb57 100644 --- a/apps/docs/src/content/getting-started/configuration.md +++ b/apps/docs/src/content/getting-started/configuration.md @@ -137,12 +137,12 @@ interface PangularConfig { ### Inspectors and agent tools -| Option | Default | What it does | -| -------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `inspectors.` | `true` | `false` removes the inspector: no tab or dock, no page collector, no RPC functions, and no agent tools or resources. Its actions are blocked too. | -| `agent.readOnly` | `false` | `true` keeps only the agent tools in the `read` [safety tier](../agents/tools.md#action-tools). It drops every `action` and `destructive` tool in the [tier table](../agents/tools.md#action-tools): `run-form-action`, `fill-form`, `navigate`, `ngrx-dispatch`, `ngrx-restore`, `tanstack-run-query`, `set-http-rule`, `remove-http-rule`, `set-ssr-override`, `remove-ssr-override`, `set-component-property`, `set-signal`, `watch-signal`, `record-pipes`, `track-subscriptions`, `record-change-detection`, `probe-route`, `record-guards`, `analog-run-api` and `clear-recordings`. `audit` stays without its `axe` argument. | -| `agent.tools.` | `true` | `false` hides one inspector's agent tools and resources, and its [shared-state keys](../agents/resources.md#shared-state) over HTTP MCP. The tab stays. | -| `agent.browserTools` | `false` | `true` registers the `read` agent tools on the page for [browser agents](../agents/browser-agents.md) (WebMCP and Chrome DevTools for agents). Off by default, because any script on the development page could then call them. This is where the **Browser agent tools** switch in [Settings](./settings.md#browser-agents) starts. The switch changes it for every page until the dev server restarts. | +| Option | Default | What it does | +| -------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `inspectors.` | `true` | `false` removes the inspector: no tab or dock, no page collector, no RPC functions, and no agent tools or resources. Its actions are blocked too. | +| `agent.readOnly` | `false` | `true` keeps only the agent tools in the `read` [safety tier](../agents/tools.md#action-tools). It drops every `action` and `destructive` tool in the [tier table](../agents/tools.md#action-tools): `run-form-action`, `fill-form`, `navigate`, `ngrx-dispatch`, `ngrx-restore`, `tanstack-run-query`, `set-http-rule`, `remove-http-rule`, `set-ssr-override`, `remove-ssr-override`, `set-component-property`, `set-signal`, `load-defer-block`, `watch-signal`, `record-pipes`, `track-subscriptions`, `record-change-detection`, `probe-route`, `record-guards`, `analog-run-api` and `clear-recordings`. `audit` stays without its `axe` argument. | +| `agent.tools.` | `true` | `false` hides one inspector's agent tools and resources, and its [shared-state keys](../agents/resources.md#shared-state) over HTTP MCP. The tab stays. | +| `agent.browserTools` | `false` | `true` registers the `read` agent tools on the page for [browser agents](../agents/browser-agents.md) (WebMCP and Chrome DevTools for agents). Off by default, because any script on the development page could then call them. This is where the **Browser agent tools** switch in [Settings](./settings.md#browser-agents) starts. The switch changes it for every page until the dev server restarts. | `agent.tools` has the same keys as `inspectors`. An inspector that is off has no agent tools, whatever `agent.tools` says. @@ -159,7 +159,7 @@ Actions are the writes that the panel and agents make to your app or the server. | `actions.ngrx` | `true` | Restoring NgRx state from the change log and dispatching `@ngrx/store` actions. Drops the `ngrx-dispatch` and `ngrx-restore` agent tools. | | `actions.http` | `true` | Editing fault injection rules and SSR overrides, and clearing the HTTP timeline. Drops the `set-http-rule`, `remove-http-rule`, `set-ssr-override` and `remove-ssr-override` agent tools and HTTP clearing in `clear-recordings`. | | `actions.analog` | `true` | The Analog request playground and clearing server calls. Drops the `analog-run-api` agent tool and Analog clearing in `clear-recordings`. | -| `actions.components` | `true` | Editing component inputs, properties and writable signals from the **Components** tab, and **Restore** in the **Signals** value history. Drops the `set-component-property` and `set-signal` agent tools. | +| `actions.components` | `true` | Editing component inputs, properties and writable signals from the **Components** tab, and **Restore** in the **Signals** value history. Drops the `set-component-property`, `set-signal` and `load-defer-block` agent tools. | | `actions.tanstackQuery` | `true` | Invalidating and refetching a query from the **Queries** tab. Drops the `tanstack-run-query` agent tool. | | `actions.plugins` | `true` | Every plugin's page actions, from the **Plugins** tab and from its tools. Drops the plugin tools that are not `read`. | | `actions` | `true` | All of the above. | diff --git a/apps/docs/src/content/getting-started/popup-and-hub.md b/apps/docs/src/content/getting-started/popup-and-hub.md index 14d60caa..bc624b3c 100644 --- a/apps/docs/src/content/getting-started/popup-and-hub.md +++ b/apps/docs/src/content/getting-started/popup-and-hub.md @@ -239,6 +239,7 @@ A link can also select an item on its tab, on one page: `#tab=&id=&page | ---------- | ---------------------------------------------------------- | | Components | A component instance, by its id in the component tree | | Injectors | The element injector of a component, by the component's id | +| Signals | The signal graph of a component, by the component's id | | Forms | A form, by its id | On other tabs, `id` is ignored and the link opens the tab. `page` is the page id from `list-pages`. Without it, the tab looks on the page it shows. If the item is not on the page, the tab says so. The [`open-in-panel`](../agents/tools.md#open-in-panel) agent tool builds these links and switches the panels that are open to them. diff --git a/apps/docs/src/content/inspectors/components.md b/apps/docs/src/content/inspectors/components.md index cb478584..5521829e 100644 --- a/apps/docs/src/content/inspectors/components.md +++ b/apps/docs/src/content/inspectors/components.md @@ -79,6 +79,15 @@ When a form exists in the same source file, a **Show … in Forms** button opens **Show in Injectors** opens the [Injectors tab](./injectors.md#links-to-the-components-tab) with the element injector of the selected instance selected and scrolled into view. The button appears when the Injectors inspector is on. +**Show in Signals** opens the [Signals tab](./signals.md) on the signal graph of the selected instance, through the same `#tab=signals&id=` deep link an agent's `open-in-panel` gives. A signal in **Properties** has its own **Show in Signals** button, which also selects that signal's node once the graph arrives. The buttons appear when the Signals inspector is on. + +Two buttons copy the selected instance to the clipboard: + +| Button | What it copies | +| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Copy as JSON** | The class name, host tag, host path and selector, source, change detection, encapsulation, inputs, outputs, properties, DOM listeners, host directives and injected tokens. Values are the ones the panel shows, so secrets stay `[redacted]` and long values stay cut. | +| **Copy host path** | A CSS selector that finds the host element with `document.querySelector`. A page without a DOM, such as an app on a device, sends no selector, so the button copies the host path from **Facts** instead. | + **Store as global** stores the selected instance in the page console as `temp1`, then `temp2` and so on, and shows the name it used, for example **Stored as temp1.** See [Console handles](#console-handles). ### Facts @@ -101,6 +110,10 @@ A fact shows **Unknown** when Angular does not report it. **Properties** lists the component's other own fields: plain fields, state objects, signals and resources. It leaves out inputs, outputs, methods and injected services. Signals show their current value and a **signal** flag. A field that holds a `resource()` or `httpResource()` shows its status, value and error, with a **resource** flag. +When an input, property or directive input changes between two refreshes, its row gets an outline that fades over one second. With reduced motion, the outline shows for one second without fading. Selecting another instance starts over, so nothing flashes on the first read. + +When the component's template holds `@defer` blocks, a **Defer blocks** block lists each one with its state and triggers. The [Defer blocks](#defer-blocks) list below the tree has the full rows. + ### Nested values An input or property that holds an object, array, `Map` or `Set` shows a toggle with its type and size, such as **Object (3 keys)** or **Array (45 items)**. The page sends only the first level of each value. Open the toggle to see it. @@ -141,7 +154,7 @@ Set [`actions.components`](../getting-started/configuration.md#actions) to `fals ### Defer blocks -When the page renders `@defer` blocks, a **Defer blocks** list follows the tree. Each row shows the component whose template holds the block, its state (`placeholder`, `loading`, `complete` or `error`) and its triggers. With [incremental hydration](https://angular.dev/guide/incremental-hydration), a row also shows `dehydrated` or `hydrated`, and a **hydrate never** flag marks a block that stays as server HTML. +When the page renders `@defer` blocks, a **Defer blocks** list follows the tree. Each row shows the component whose template holds the block, its state (`placeholder`, `loading`, `complete` or `error`) and its triggers. With [incremental hydration](https://angular.dev/guide/incremental-hydration), a row also shows `dehydrated` or `hydrated`, and a **hydrate never** flag marks a block that stays as server HTML. A block that hydrated before the devtools attached to the page shows **hydrated before inspection**, because no one saw when it hydrated. A row also carries the notes the [`defer-blocks`](../agents/tools.md#defer-blocks) tool prints. Hover a note to read it in full. @@ -191,6 +204,8 @@ The list needs Angular 22.0 or later in a development build. On an older Angular Below the tree and the defer blocks, the **Change detection** section records change detection cycles with Angular's profiler. Click **Record**, use the app, then click **Stop recording**. A check is a component whose template Angular ran. A clean OnPush component that Angular only walked past is not a check, and neither is the second pass that development builds run to catch `ExpressionChangedAfterItHasBeenChecked` errors. The flash overlay and the Performance panel track count the same way. **Clear** empties the recording. Each new recording starts empty, but a start sent while the page records, such as an agent's `record-change-detection` call with `record: "start"`, keeps the cycles recorded so far. **Record** and **Stop recording** wait up to 3 seconds for the page to report the recording on or off before they announce it. If no report comes, the status says the page did not confirm, and the button keeps the state the page last reported. +A recording keeps running when the tab reloads, so it catches the next start of the app. The page remembers it in `sessionStorage` for its page id, which a reload keeps, so another tab does not start recording. The cycles from before the reload are gone with the old page. **Stop recording** ends it for the reloads that follow too. An app on a device does not resume a recording. + - **Cycles**: a bar chart with one bar per recorded cycle, its height the cycle's duration. A line marks the 16.6 ms frame budget (one frame at 60 frames per second). A cycle over the budget has a striped bar, a triangle under it, and says "over budget" in its tooltip and in the table. Hover or focus a bar to see the cycle number, duration, output trigger, checks and its three slowest components. - **Spans in the picked cycles**: when the page reports timed spans, a flame graph of the picked cycles. Time runs left to right, cycle after cycle with the idle time between them left out, and a span nested in another sits one row lower. Each span is a component check (solid), a lifecycle hook (stripes), an `afterRender` callback (dots) or the output listener that triggered the cycle (lines, drawn before the cycle's start), with a key under the graph. Hover or focus a span to read its total and self time. The arrow keys move along a row, **Up** goes to the enclosing span and **Down** to the first nested one. **Enter** or a click on a component, hook or output selects that component in the tree. **Show the spans as a table** lists the same spans. The graph shows at most 30 cycles; pick a smaller range when more are picked. - **Self time by component**: a treemap of each component class's self time in the picked cycles, largest first. The recording has no parent links between components, so the cells are not nested. Click a cell, or press **Enter** on it, to select an instance of that class in the tree (the one checked most often). @@ -467,6 +482,7 @@ Press Escape in the filter box to clear it. When the filter matches nothing, **C | `pangular:inspect-component` | tool | Selects one instance and returns its live detail: inputs, outputs, properties, listeners, directives and injected services. With `path`, reads one nested value instead, with `depth` and `limit`. | | `pangular:list-components` | tool | Returns the live tree of one page as an indented outline with routed, directive host and hydration markers. Takes a `filter` with the search syntax, a `depth` and `directiveHosts`. | | `pangular:defer-blocks` | tool | Lists the `@defer` blocks of each page, and flags blocks that failed, blocks stuck on their placeholder and blocks still dehydrated. | +| `pangular:load-defer-block` | tool | Makes one `@defer` block fetch its dependencies and show its main content, as if its trigger fired. Leaves dehydrated server HTML alone. An action. | | `pangular:for-blocks` | tool | Lists the `@for` blocks of each page with their item count, track kind and `@empty` block. | | `pangular:scan-templates` | tool | Lints component templates in source with the project's Angular template parser: parse errors, `@for` tracking objects by `$index`, `` without `alt`, `(click)` without a key handler, `*ngIf`-style directives and `ngClass` or `ngStyle`. | | `pangular:hydration` | tool | Returns the hydration status of each page rendered on the server, and turns the outline on the page on or off. Turning the outline on or off is an action. | diff --git a/apps/docs/src/content/inspectors/signals.md b/apps/docs/src/content/inspectors/signals.md index 4e398fa5..b0c64141 100644 --- a/apps/docs/src/content/inspectors/signals.md +++ b/apps/docs/src/content/inspectors/signals.md @@ -29,6 +29,7 @@ The **Graph of** picker at the top selects whose graph you see. It appears when - **Root services** shows the effects registered on the root injector, such as an `effect()` in a `providedIn: 'root'` service, and the signals they read. - **Route: path** entries show the effects registered on the injector of a route with `providers`, on the active route chain. A route with an empty `path` is named by the path of its parent routes, such as **Route: review**, or **Route: /** at the top. Other environment injectors on that chain, such as the one of a lazy `loadChildren`, show as **Environment**. - Pick any live component to pin the graph to it. The picker numbers duplicates, for example `#2`. +- **Show in Signals** in the [Components tab](./components.md#detail-header) pins the graph to the selected instance the same way. From a signal property, it also selects that signal's node. A `#tab=signals&id=&page=` [deep link](../getting-started/popup-and-hub.md#link-to-an-item) does the same. - Without a routed component, the tab shows the first component that has signals, among the first 50 on the page. A line under the picker names the component, its host path, and why it was chosen: **picked**, **rendered by the router** or **first component with signals**. For an injector, it names the injector. diff --git a/packages/devtools/CHANGELOG.md b/packages/devtools/CHANGELOG.md index 034683a0..cd70ea56 100644 --- a/packages/devtools/CHANGELOG.md +++ b/packages/devtools/CHANGELOG.md @@ -141,7 +141,9 @@ What remains: `/config` exports `DEFAULT_POPUP_HOTKEY`, `PANGULAR_ACTIONS`, `PAN #### Inspectors - **Components:** edit inputs, properties and writable signals; `@for` blocks; directive hosts; hydration status per component with an outline on the page; nested values on demand; console handles; expand all and collapse all. -- **Change detection:** a per-cycle chart, a flame graph, hook timing, export and import of recordings, flash checks on the page, a Pangular track in the Chrome Performance panel, an Angular profiling toggle, and what triggered each check, with wasted checks, OnPush hints and components that need zone.js. +- **Components:** **Copy as JSON** (the redacted values the panel shows) and **Copy host path** (a CSS selector for `document.querySelector`) in the detail header; an outline that fades over one second on a value that changed since the last refresh; **Show in Signals** for the component and for each signal property, also as a `#tab=signals&id=` deep link and through `open-in-panel`; and the `@defer` blocks of the selected component's template. +- **Defer blocks:** a block that hydrated before the devtools attached shows **hydrated before inspection** in the panel and in the `defer-blocks` tool. +- **Change detection:** a recording that keeps running when the tab reloads (until **Stop recording**), a per-cycle chart, a flame graph, hook timing, export and import of recordings, flash checks on the page, a Pangular track in the Chrome Performance panel, an Angular profiling toggle, and what triggered each check, with wasted checks, OnPush hints and components that need zone.js. - **Leaks:** live subscriptions and effects per component, and components that stay alive after they are destroyed. - **Signals:** the live signal graph drawn, watched signals, and links from components to injectors. - **Injectors:** a page picker, a created provider's value, startup timing and the slowest providers. @@ -159,7 +161,7 @@ What remains: `/config` exports `DEFAULT_POPUP_HOTKEY`, `PANGULAR_ACTIONS`, `PAN #### Agents and MCP -- 98 agent tools. New tools include `audit`, `snapshot`, `wait-for`, `scan-templates` (#415), `list-errors`, `explain-error`, `list-console`, `find-leaks`, `diagnose-change-detection` (#395), `set-component-property`, `set-signal`, `track-subscriptions`, `watch-signal`, `hydration`, `screenshot-component`, `open-in-panel`, `startup-timing`, `read-provider-value`, `record-change-detection`, `probe-route`, `record-guards`, the TanStack Query, Capacitor, plugin and NgRx session tools, and tools for HTTP fault rules and SSR overrides. +- 99 agent tools. New tools include `audit`, `snapshot`, `wait-for`, `scan-templates` (#415), `list-errors`, `explain-error`, `list-console`, `find-leaks`, `diagnose-change-detection` (#395), `set-component-property`, `set-signal`, `load-defer-block` (loads one `@defer` block as if its trigger fired, behind `actions.components`), `track-subscriptions`, `watch-signal`, `hydration`, `screenshot-component`, `open-in-panel`, `startup-timing`, `read-provider-value`, `record-change-detection`, `probe-route`, `record-guards`, the TanStack Query, Capacitor, plugin and NgRx session tools, and tools for HTTP fault rules and SSR overrides. - One naming scheme for tools and arguments, and plain markdown answers. See **Agent tools renamed**. - Tool titles, inspector tags and safety tiers (`action` and `destructive`). - Every answer names the page it read, and one rule picks the default page for every tool. diff --git a/packages/devtools/skills/pangular-inspector/SKILL.md b/packages/devtools/skills/pangular-inspector/SKILL.md index 5941b70b..a3c621c6 100644 --- a/packages/devtools/skills/pangular-inspector/SKILL.md +++ b/packages/devtools/skills/pangular-inspector/SKILL.md @@ -45,7 +45,7 @@ Live state is also available as MCP resources, such as `pangular:component-tree` ## Safety -- Tools are `read`, `action` or `destructive`, sent as the MCP read-only and destructive hints. `read` tools only read. Action tools change the running page or the server (`navigate`, `probe-route`, `run-form-action`, `fill-form`, `set-component-property`, `set-signal`, `ngrx-dispatch`, `set-http-rule`, `set-ssr-override`). A reload does not undo what they cause: a submitted form, a dispatched action or a mocked response can reach the app's backend and stay there. +- Tools are `read`, `action` or `destructive`, sent as the MCP read-only and destructive hints. `read` tools only read. Action tools change the running page or the server (`navigate`, `probe-route`, `run-form-action`, `fill-form`, `set-component-property`, `set-signal`, `load-defer-block`, `ngrx-dispatch`, `set-http-rule`, `set-ssr-override`). A reload does not undo what they cause: a submitted form, a dispatched action or a mocked response can reach the app's backend and stay there. - Ask the user before an action that can commit app data: `run-form-action` with `submit`, `reset` or `restore`, `fill-form` with `submit`, `ngrx-dispatch`, `set-component-property` or `set-signal` on state the app saves, `set-http-rule` and `set-ssr-override`. `clear-recordings` and `analog-run-api` can lose data: ask first too. - A tool that is missing was turned off in the project's devtools config (`inspectors`, `agent.tools`, `agent.readOnly` or `actions`). Don't work around it; tell the user. - Values that look secret, JWTs and bearer tokens come back masked. Don't ask the user to unmask them unless they need to. diff --git a/packages/devtools/src/__tests__/action-tool-refusals.test.ts b/packages/devtools/src/__tests__/action-tool-refusals.test.ts index a7452e12..762912a3 100644 --- a/packages/devtools/src/__tests__/action-tool-refusals.test.ts +++ b/packages/devtools/src/__tests__/action-tool-refusals.test.ts @@ -51,6 +51,7 @@ const NOTHING_DONE: Record[]> = { { component: 'Card', property: 'count', value: 1 }, { component: 'Card', property: 'count', value: 1, page: 'gone' }, ], + 'load-defer-block': [{ block: 'd1' }, { block: 'd1', page: 'gone' }, { block: '' }], 'track-subscriptions': [ { action: 'start' }, { action: 'stop' }, diff --git a/packages/devtools/src/__tests__/cd-live.test.ts b/packages/devtools/src/__tests__/cd-live.test.ts index c8c1f950..5156acfe 100644 --- a/packages/devtools/src/__tests__/cd-live.test.ts +++ b/packages/devtools/src/__tests__/cd-live.test.ts @@ -191,6 +191,8 @@ describe('change detection views through the page overlay', () => { const had = Object.getOwnPropertyDescriptor(console, 'timeStamp'); beforeEach(() => { Object.defineProperty(console, 'timeStamp', { value: vi.fn(), configurable: true }); + // A recording a test started would otherwise resume in the next one (same pageId). + sessionStorage.clear(); }); afterEach(() => { vi.restoreAllMocks(); diff --git a/packages/devtools/src/__tests__/cd-record-reload.test.ts b/packages/devtools/src/__tests__/cd-record-reload.test.ts new file mode 100644 index 00000000..73df6b68 --- /dev/null +++ b/packages/devtools/src/__tests__/cd-record-reload.test.ts @@ -0,0 +1,89 @@ +// @vitest-environment jsdom +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; +import { attachChangeDetection, recordingWasOn, rememberRecording } from '../cd-overlay.ts'; + +function fakeRpc() { + const handlers = new Map unknown>(); + const my = { + rpc: { + call: async () => undefined, + register: (def: { name: string; handler: (...args: unknown[]) => unknown }) => + handlers.set(def.name, def.handler), + }, + }; + return { my, handlers }; +} + +const ng = { ɵsetProfiler: () => () => {}, getHostElement: () => null }; + +describe('change detection recording across a reload', () => { + beforeEach(() => { + sessionStorage.clear(); + document.body.innerHTML = ''; + }); + + afterEach(() => { + sessionStorage.clear(); + document.body.innerHTML = ''; + }); + + it('starts recording again when the same page loads with the flag set', () => { + const first = fakeRpc(); + const before = attachChangeDetection(first.my, 'p1', () => ng, 50); + first.handlers.get('change-detection-record')!({ pageId: 'p1', on: true }); + expect(before.recording).toBe(true); + expect(recordingWasOn('p1')).toBe(true); + // The old page goes away; leaving on teardown must not forget the choice. + before.stop(); + expect(recordingWasOn('p1')).toBe(true); + + const after = attachChangeDetection(fakeRpc().my, 'p1', () => ng, 50); + expect(after.recording).toBe(true); + after.stop(); + }); + + it('keeps the flag per page, so another tab does not start recording', () => { + rememberRecording('p1', true); + const other = attachChangeDetection(fakeRpc().my, 'p2', () => ng, 50); + expect(other.recording).toBe(false); + other.stop(); + }); + + it('forgets the flag when the user stops recording', () => { + const { my, handlers } = fakeRpc(); + const cd = attachChangeDetection(my, 'p1', () => ng, 50); + handlers.get('change-detection-record')!({ pageId: 'p1', on: true }); + handlers.get('change-detection-record')!({ pageId: 'p1', on: false }); + expect(recordingWasOn('p1')).toBe(false); + expect(attachChangeDetection(fakeRpc().my, 'p1', () => ng, 50).recording).toBe(false); + cd.stop(); + }); + + it('records without the flag when session storage throws', () => { + const blocked = { + getItem: () => { + throw new Error('blocked'); + }, + setItem: () => { + throw new Error('blocked'); + }, + removeItem: () => { + throw new Error('blocked'); + }, + } as unknown as Storage; + expect(() => rememberRecording('p1', true, blocked)).not.toThrow(); + expect(recordingWasOn('p1', blocked)).toBe(false); + }); + + it('remembers nothing on a platform without a DOM', () => { + const { my, handlers } = fakeRpc(); + const cd = attachChangeDetection(my, 'p1', () => ng, 50, undefined, undefined, { + profilerGate: () => ({ major: 22 }), + roots: () => [], + hostId: () => null, + }); + handlers.get('change-detection-record')!({ pageId: 'p1', on: true }); + expect(recordingWasOn('p1')).toBe(false); + cd.stop(); + }); +}); diff --git a/packages/devtools/src/__tests__/component-tree.test.ts b/packages/devtools/src/__tests__/component-tree.test.ts index 3b27a942..230eb4d6 100644 --- a/packages/devtools/src/__tests__/component-tree.test.ts +++ b/packages/devtools/src/__tests__/component-tree.test.ts @@ -415,6 +415,17 @@ describe('componentDetail', () => { }); expect(componentDetail(ng, card)!.inputs.map((i) => i.name)).toEqual(['title']); }); + + it('sends a selector that finds the host again', () => { + document.body.innerHTML = `
        `; + const second = document.querySelectorAll('app-card')[1]!; + const { ng } = fakeNg(new Map([[second, new Card()]]), { + getDirectiveMetadata: () => ({ inputs: {}, outputs: {} }), + }); + const selector = componentDetail(ng, second)!.selector!; + expect(selector).toContain('app-card:nth-child(2)'); + expect(document.querySelector(selector)).toBe(second); + }); }); describe('component properties', () => { diff --git a/packages/devtools/src/__tests__/config.test.ts b/packages/devtools/src/__tests__/config.test.ts index 7f116a16..8897adb4 100644 --- a/packages/devtools/src/__tests__/config.test.ts +++ b/packages/devtools/src/__tests__/config.test.ts @@ -312,6 +312,7 @@ describe('agent tool and RPC registration', () => { 'remove-http-rule', 'remove-ssr-override', 'ngrx-restore', + 'load-defer-block', 'set-component-property', 'set-http-rule', 'set-signal', @@ -436,6 +437,7 @@ describe('agent tool and RPC registration', () => { 'remove-http-rule', 'remove-ssr-override', 'ngrx-restore', + 'load-defer-block', 'set-component-property', 'set-http-rule', 'set-signal', @@ -472,6 +474,7 @@ describe('agent tool and RPC registration', () => { const components = await boot({ actions: { components: false } }); expect(components.actionTools).not.toContain('set-component-property'); expect(components.actionTools).not.toContain('set-signal'); + expect(components.actionTools).not.toContain('load-defer-block'); expect(components.tools).toContain('inspect-component'); const queries = await boot({ actions: { tanstackQuery: false } }); expect(queries.actionTools).not.toContain('tanstack-run-query'); diff --git a/packages/devtools/src/__tests__/defer-blocks.test.ts b/packages/devtools/src/__tests__/defer-blocks.test.ts index bf72d6e9..62ce7426 100644 --- a/packages/devtools/src/__tests__/defer-blocks.test.ts +++ b/packages/devtools/src/__tests__/defer-blocks.test.ts @@ -1,6 +1,6 @@ // @vitest-environment jsdom import { afterEach, describe, expect, it } from 'vitest'; -import { deferNotes } from '../config.ts'; +import { deferHydrationLabel, deferNotes } from '../config.ts'; import { MAX_DEFER_BLOCKS, createDeferTracker, type DeferDebugNg } from '../defer-blocks.ts'; import { elementById } from '../element-id.ts'; import { DEFER_ROWS, deferBlocksText, toComponentPage } from '../rpc/component-tools.ts'; @@ -162,6 +162,8 @@ describe('createDeferTracker', () => { expect(second.map((b) => b.id)).toEqual(first.map((b) => b.id)); expect(second[0].since).toBe(1000); expect(second[1]).toMatchObject({ hydration: 'hydrated', since: 5000, hydratedAt: 5000 }); + expect(tracker.find(second[1].id)).toEqual({ host: lazy, block: second[1] }); + expect(tracker.find('nope')).toBeUndefined(); }); it('flags hydrate never blocks and falls back to ɵgetDeferBlocks', () => { @@ -327,6 +329,30 @@ describe('deferBlocksText', () => { expect(text).toContain('`d8` in TripReviews (`c2`): on its placeholder for 29s'); }); + it('says when a block hydrated before the overlay attached', () => { + const text = deferBlocksText( + [ + report([ + info({ id: 'd1', hydration: 'hydrated' }), + info({ id: 'd2', hydration: 'hydrated', hydratedAt: 5000 }), + ]), + ], + 30_000, + ); + expect(text).toMatch(/\| `d1` .*\| complete \| hydrated before inspection \|/); + expect(text).toMatch(/\| `d2` .*\| complete \| hydrated \|/); + expect(text).toContain('"hydrated before inspection" means'); + expect(deferBlocksText([report([info({ id: 'd3' })])], 30_000)).not.toContain( + 'before inspection', + ); + }); + + it('labels hydration the same way for the panel and the tool', () => { + expect(deferHydrationLabel({ hydration: 'hydrated' })).toBe('hydrated before inspection'); + expect(deferHydrationLabel({ hydration: 'hydrated', hydratedAt: 1 })).toBe('hydrated'); + expect(deferHydrationLabel({ hydration: 'dehydrated' })).toBe('dehydrated'); + }); + it('ages blocks on the page clock, not the server clock', () => { const hour = 3_600_000; const serverNow = 1_700_000_000_000; diff --git a/packages/devtools/src/__tests__/defer-load-tool.test.ts b/packages/devtools/src/__tests__/defer-load-tool.test.ts new file mode 100644 index 00000000..a79ea75a --- /dev/null +++ b/packages/devtools/src/__tests__/defer-load-tool.test.ts @@ -0,0 +1,146 @@ +import { createHostContext } from 'devframe/node'; +import { describe, expect, it, vi } from 'vitest'; +import pangular, { createPangular } from '../devframe.ts'; +import type { PangularConfig } from '../config.ts'; +import { agentSafety, resolvePangularConfig } from '../config.ts'; +import { UNTRUSTED } from '../rpc/forms-tools.ts'; +import { answerText } from './tool-answer.ts'; + +async function boot(config?: PangularConfig) { + const host = { + mountStatic: () => {}, + resolveOrigin: () => 'http://localhost', + getStorageDir: () => '', + }; + const ctx = await createHostContext({ cwd: process.cwd(), mode: 'dev', host: host as never }); + await (config ? createPangular(config) : pangular).setup(ctx as never); + const push = (name: string, payload: unknown) => + ctx.rpc.invokeLocal(`pangular:${name}` as never, ...([payload] as never)); + const call = async (tool: string, args: Record) => + await answerText(ctx.agent.invoke(`pangular:${tool}`, args)); + const tools = () => ctx.agent.list().tools.map((tool) => tool.id); + return { ctx, push, call, tools }; +} + +const tree = (pageId: string, blocks: string[] = ['d1']) => ({ + pageId, + url: `/${pageId}`, + count: 1, + detail: null, + roots: [{ id: `${pageId}-root`, name: 'App', tag: 'app-root', children: [] }], + deferBlocks: blocks.map((id) => ({ + id, + owner: { id: `${pageId}-root`, name: 'App', tag: 'app-root' }, + state: 'placeholder', + hydration: 'not-configured', + triggers: ['on viewport'], + hasErrorBlock: false, + rootIds: [], + since: 1, + })), +}); + +type Load = { requestId: string; pageId: string; id: string }; + +/** Answers every defer-load broadcast the way the page would. */ +function answerLoads( + ctx: Awaited>['ctx'], + push: Awaited>['push'], + result: (message: Load) => unknown, +) { + const sent: Load[] = []; + vi.spyOn(ctx.rpc, 'broadcast').mockImplementation((async (options: { + method: string; + args: [Load]; + }) => { + if (!options.method.endsWith('defer-load')) return; + const message = options.args[0]; + sent.push(message); + setTimeout( + () => + void push('defer-load-result', { + requestId: message.requestId, + pageId: message.pageId, + result: result(message), + }), + 5, + ); + }) as never); + return sent; +} + +describe('load-defer-block', () => { + it('is an action tool of the components inspector', () => { + expect(agentSafety('pangular:load-defer-block', resolvePangularConfig())).toBe('action'); + }); + + it('sends the load to the page that has the block and reports the new state', async () => { + const { ctx, push, call } = await boot(); + await push('push-component-tree', tree('p1')); + await push('push-component-tree', tree('p2', ['d7'])); + const sent = answerLoads(ctx, push, () => ({ ok: true, state: 'complete' })); + const text = await call('load-defer-block', { block: 'd7' }); + expect(sent).toEqual([{ requestId: expect.any(String), pageId: 'p2', id: 'd7' }]); + expect(text.startsWith(UNTRUSTED)).toBe(true); + expect(text).toContain('Loaded defer block `d7` in App on page `p2`'); + }); + + it('passes the page refusal on, and says when the load fell back to @error', async () => { + const { ctx, push, call } = await boot(); + await push('push-component-tree', tree('p1')); + answerLoads(ctx, push, () => ({ error: 'The block is server HTML.' })); + expect(await call('load-defer-block', { block: 'd1' })).toContain( + 'Defer block `d1` in App on page `p1` was not loaded. The block is server HTML.', + ); + vi.restoreAllMocks(); + answerLoads(ctx, push, () => ({ ok: true, state: 'error' })); + expect(await call('load-defer-block', { block: 'd1' })).toContain('shows its @error block'); + }); + + 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')); + await push('push-component-tree', tree('p2')); + const sent = answerLoads(ctx, push, () => ({ ok: true, state: 'complete' })); + expect(await call('load-defer-block', { block: 'd1' })).toContain('pass one of these ids'); + expect(await call('load-defer-block', { block: 'd9' })).toContain('No defer block `d9`'); + expect(sent).toEqual([]); + await call('load-defer-block', { block: 'd1', page: 'p1' }); + expect(sent.map((s) => s.pageId)).toEqual(['p1']); + }); + + it('ignores a result from another page', async () => { + const { ctx, push, call } = await boot(); + await push('push-component-tree', tree('p1')); + vi.useFakeTimers(); + try { + vi.spyOn(ctx.rpc, 'broadcast').mockImplementation((async (options: { + method: string; + args: [Load]; + }) => { + if (!options.method.endsWith('defer-load')) return; + void push('defer-load-result', { + requestId: options.args[0].requestId, + pageId: 'p2', + result: { ok: true }, + }); + }) as never); + const answer = call('load-defer-block', { block: 'd1' }); + await vi.advanceTimersByTimeAsync(16_000); + expect(await answer).toContain('No page answered'); + } finally { + vi.useRealTimers(); + } + }); + + it('is left out when actions.components is off or agents are read only', async () => { + for (const config of [ + { actions: { components: false } }, + { agent: { readOnly: true } }, + { inspectors: { components: false } }, + ] satisfies PangularConfig[]) { + const { tools } = await boot(config); + expect(tools(), JSON.stringify(config)).not.toContain('pangular:load-defer-block'); + } + }); +}); diff --git a/packages/devtools/src/__tests__/defer-load.test.ts b/packages/devtools/src/__tests__/defer-load.test.ts new file mode 100644 index 00000000..0e9a48bb --- /dev/null +++ b/packages/devtools/src/__tests__/defer-load.test.ts @@ -0,0 +1,176 @@ +// @vitest-environment jsdom +import { describe, expect, it, vi } from 'vitest'; +import { + angularDeferInternals, + loadDeferBlock, + registerDeferLoad, + type DeferInternals, +} from '../defer-load.ts'; +import type { DeferBlockInfo } from '../types.ts'; + +const info = (overrides: Partial = {}): DeferBlockInfo => ({ + id: 'd1', + state: 'placeholder', + hydration: 'not-configured', + triggers: ['on viewport'], + hasErrorBlock: false, + rootIds: [], + since: 0, + ...overrides, +}); + +/** + * A root view with one block in it, and a second block inside the views the + * first one rendered, shaped the way `ɵgetDeferBlocks` lists them. + */ +function app(options: { failed?: boolean; errorBlock?: boolean } = {}) { + const root = document.createElement('app-root'); + const outerAnchor = document.createComment('container'); + const innerAnchor = document.createComment('container'); + const innerView: unknown[] = ['inner view']; + const outer = { + lContainer: [outerAnchor, 0, 0, 0, 0, 0, 0, outerAnchor, 0, 0, innerView], + lView: ['root view'], + tNode: { index: 20 }, + tDetails: { loadingState: 2, errorTmplIndex: null }, + }; + const inner = { + lContainer: [innerAnchor, 0, 0, 0, 0, 0, 0, innerAnchor, 0, 0], + lView: innerView, + tNode: { index: 30 }, + tDetails: { loadingState: 0, errorTmplIndex: options.errorBlock ? 5 : null }, + }; + const rootView = ['root view']; + const rendered: { state: number; tNode: unknown; skip?: boolean }[] = []; + const internals: DeferInternals = { + getDeferBlocks: (lView, out) => { + if (lView === rootView) out.push(outer); + if (lView === innerView) out.push(inner); + }, + triggerResourceLoading: async (tDetails) => { + (tDetails as { loadingState: number }).loadingState = options.failed ? 3 : 2; + }, + renderDeferBlockState: (state, tNode, _container, skip) => + void rendered.push({ state, tNode, skip }), + }; + const component = {}; + const ng = { + getInjector: (el: Element) => (el === root ? { _lView: rootView, _tNode: {} } : null), + getComponent: (el: Element) => (el === root ? component : null), + applyChanges: vi.fn(), + }; + return { root, outerAnchor, innerAnchor, inner, internals, ng, rendered, component }; +} + +describe('loadDeferBlock', () => { + it('loads a nested block found through the views its parent rendered', async () => { + const { root, innerAnchor, inner, internals, ng, rendered, component } = app(); + const result = await loadDeferBlock(ng, internals, { host: innerAnchor, block: info() }, [ + root, + ]); + expect(result).toEqual({ ok: true, state: 'complete' }); + expect(rendered).toEqual([{ state: 2, tNode: inner.tNode, skip: true }]); + expect(ng.applyChanges).toHaveBeenCalledWith(component); + }); + + 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() }, [ + root, + ]); + expect(result).toEqual({ ok: true, state: 'error' }); + expect(rendered.map((r) => r.state)).toEqual([3]); + }); + + it('renders nothing when the dependencies fail and there is no @error block', async () => { + const { root, innerAnchor, internals, ng, rendered } = app({ failed: true }); + const result = await loadDeferBlock(ng, internals, { host: innerAnchor, block: info() }, [ + root, + ]); + expect(result.error).toMatch(/no @error block/); + expect(rendered).toEqual([]); + }); + + it('leaves loaded, dehydrated and unknown blocks alone', async () => { + const { root, outerAnchor, internals, ng, rendered } = app(); + const run = (block: DeferBlockInfo | undefined) => + loadDeferBlock(ng, internals, block && { host: outerAnchor, block }, [root]); + expect(await run(info({ state: 'complete' }))).toEqual({ + ok: true, + state: 'complete', + already: true, + }); + expect((await run(info({ hydration: 'dehydrated' }))).error).toMatch(/incremental hydration/); + expect((await run(info({ hydrateNever: true }))).error).toMatch(/incremental hydration/); + expect((await run(undefined)).error).toMatch(/pangular:defer-blocks/); + expect(rendered).toEqual([]); + }); + + it('says so when the build has no internals or no anchor', async () => { + const { root, outerAnchor, internals, ng } = app(); + expect( + (await loadDeferBlock(ng, null, { host: outerAnchor, block: info() }, [root])).error, + ).toMatch(/ɵtriggerResourceLoading/); + expect( + (await loadDeferBlock(ng, internals, { host: {}, block: info() }, [root])).error, + ).toMatch(/no anchor/); + const stray = document.createComment('container'); + expect( + (await loadDeferBlock(ng, internals, { host: stray, block: info() }, [root])).error, + ).toMatch(/could not be found/); + }); + + it('reads the internals from a core module only when all three are there', () => { + const fn = () => {}; + expect( + angularDeferInternals({ + ɵgetDeferBlocks: fn, + ɵtriggerResourceLoading: fn, + ɵrenderDeferBlockState: fn, + }), + ).not.toBeNull(); + expect(angularDeferInternals({ ɵgetDeferBlocks: fn })).toBeNull(); + }); +}); + +describe('registerDeferLoad', () => { + function rpc() { + const handlers = new Map unknown>(); + const calls: { name: string; message: unknown }[] = []; + return { + handlers, + calls, + call: async (name: string, message: unknown) => void calls.push({ name, message }), + register: (def: { name: string; handler: (message: never) => unknown }) => + handlers.set(def.name, def.handler as (message: unknown) => unknown), + }; + } + + it('answers for its own page and refuses when actions are off', async () => { + const on = rpc(); + const loaded = vi.fn(); + registerDeferLoad(on, 'p1', { + allowed: true, + load: async (id) => ({ ok: true, state: id === 'd1' ? 'complete' : 'error' }), + loaded, + }); + on.handlers.get('defer-load')!({ requestId: 'l1', pageId: 'p2', id: 'd1' }); + on.handlers.get('defer-load')!({ requestId: 'l2', pageId: 'p1', id: 'd1' }); + await vi.waitFor(() => expect(on.calls).toHaveLength(1)); + expect(on.calls[0]).toEqual({ + name: 'defer-load-result', + message: { requestId: 'l2', pageId: 'p1', result: { ok: true, state: 'complete' } }, + }); + expect(loaded).toHaveBeenCalledOnce(); + + const off = rpc(); + const load = vi.fn(); + registerDeferLoad(off, 'p1', { allowed: false, load }); + off.handlers.get('defer-load')!({ requestId: 'l3', pageId: 'p1', id: 'd1' }); + await vi.waitFor(() => expect(off.calls).toHaveLength(1)); + expect((off.calls[0].message as { result: { error?: string } }).result.error).toMatch( + /actions/, + ); + expect(load).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/devtools/src/__tests__/fixtures/agent-metadata-derived.json b/packages/devtools/src/__tests__/fixtures/agent-metadata-derived.json index 1b7f3b6f..beaf5a54 100644 --- a/packages/devtools/src/__tests__/fixtures/agent-metadata-derived.json +++ b/packages/devtools/src/__tests__/fixtures/agent-metadata-derived.json @@ -45,6 +45,7 @@ "list-routes": "router", "list-ssr-overrides": "http", "list-ssr-requests": "http", + "load-defer-block": "components", "navigate": "router", "ngrx-dispatch": "ngrx", "ngrx-export-session": "ngrx", @@ -101,7 +102,7 @@ "set-ssr-override" ], "analog": ["analog-run-api", "clear-recordings"], - "components": ["set-component-property", "set-signal"], + "components": ["load-defer-block", "set-component-property", "set-signal"], "tanstackQuery": ["tanstack-run-query"], "plugins": [] }, @@ -111,6 +112,7 @@ "audit": "action", "clear-recordings": "destructive", "fill-form": "action", + "load-defer-block": "action", "navigate": "action", "ngrx-dispatch": "action", "ngrx-restore": "action", @@ -180,6 +182,7 @@ "list-routes", "list-ssr-overrides", "list-ssr-requests", + "load-defer-block", "navigate", "ngrx-dispatch", "ngrx-export-session", @@ -273,6 +276,7 @@ "list-routes": ["router"], "list-ssr-overrides": ["http"], "list-ssr-requests": ["http"], + "load-defer-block": ["components"], "navigate": ["router"], "ngrx-dispatch": ["ngrx"], "ngrx-export-session": ["ngrx"], diff --git a/packages/devtools/src/__tests__/panel-shell.test.ts b/packages/devtools/src/__tests__/panel-shell.test.ts index e64f2e77..05291521 100644 --- a/packages/devtools/src/__tests__/panel-shell.test.ts +++ b/packages/devtools/src/__tests__/panel-shell.test.ts @@ -204,10 +204,13 @@ describe('open-in-panel', () => { }); it('gives the hash when the panel address is unknown', () => { - const result = openInPanel({ tab: 'signals', id: '3' }, { config, pages: [] }); - expect(result.link).toEqual({ tab: 'signals' }); - expect(result.markdown).toContain('Panel hash: `#tab=signals`'); + const result = openInPanel({ tab: 'pipes', id: '3' }, { config, pages: [] }); + expect(result.link).toEqual({ tab: 'pipes' }); + expect(result.markdown).toContain('Panel hash: `#tab=pipes`'); expect(result.markdown).toContain('has no item selection'); + const signals = openInPanel({ tab: 'signals', id: 'c3' }, { config, pages: [] }); + expect(signals.link).toEqual({ tab: 'signals', id: 'c3' }); + expect(signals.markdown).toContain("It selects a component's signal graph"); }); it('refuses an unknown tab or one whose inspector is off', () => { diff --git a/packages/devtools/src/cd-overlay.ts b/packages/devtools/src/cd-overlay.ts index 43d065a5..c61a9ecc 100644 --- a/packages/devtools/src/cd-overlay.ts +++ b/packages/devtools/src/cd-overlay.ts @@ -41,9 +41,44 @@ export interface CdPlatform { hostId: (host: unknown) => string | null; } +const RECORDING_KEY = 'pangular:cd-recording:'; + +/** The tab's session storage, or null where there is none or it is blocked. */ +function sessionStore(): Storage | null { + try { + return typeof sessionStorage === 'undefined' ? null : sessionStorage; + } catch { + return null; + } +} + +/** Whether a recording was on for `pageId` when this tab last unloaded. */ +export function recordingWasOn(pageId: string, store = sessionStore()): boolean { + try { + return store?.getItem(RECORDING_KEY + pageId) === '1'; + } catch { + return false; + } +} + +/** + * Remembers for this tab whether a recording is on, so a reload, which keeps + * the `pageId`, starts recording again. A blocked store only loses that. + */ +export function rememberRecording(pageId: string, on: boolean, store = sessionStore()): void { + try { + if (on) store?.setItem(RECORDING_KEY + pageId, '1'); + else store?.removeItem(RECORDING_KEY + pageId); + } catch { + // Storage full or blocked: the recording runs, it just won't resume after a reload. + } +} + /** * Records change detection cycles while the panel or an agent turns recording - * on, and reports them. It does nothing until then. + * on, and reports them. It does nothing until then. In a browser, a recording + * that was on when the tab reloaded starts again (`sessionStorage` per + * `pageId`); the cycles before the reload are gone with the old page. */ export function attachChangeDetection( my: RpcScope, @@ -163,7 +198,11 @@ export function attachChangeDetection( jsonSerializable: true, handler: (message: { pageId?: unknown; on?: unknown; clear?: unknown } | null) => { if (typeof message?.pageId === 'string' && message.pageId !== pageId) return; - if (typeof message?.on === 'boolean') setRecording(message.on); + if (typeof message?.on === 'boolean') { + setRecording(message.on); + // Only the user's choice is remembered, so leaving the page on teardown keeps it. + if (!platform) rememberRecording(pageId, message.on); + } if (message?.clear === true) { recorder.clear(); diagnosis.clear(); @@ -172,6 +211,9 @@ export function attachChangeDetection( }, }); + // Angular may not have started yet; `push` attaches once it has. + if (!platform && recordingWasOn(pageId)) setRecording(true); + my.rpc.register({ name: 'change-detection-options', type: 'event', diff --git a/packages/devtools/src/component-tree.ts b/packages/devtools/src/component-tree.ts index db6262e3..cc144333 100644 --- a/packages/devtools/src/component-tree.ts +++ b/packages/devtools/src/component-tree.ts @@ -325,6 +325,8 @@ export function componentDetail( dependencies: [], }; markEditable(ng, instance, detail); + const selector = read(() => hosts.selector?.(el) ?? null, null); + if (selector) detail.selector = selector; const source = componentSource(instance); if (source) detail.source = source; const cd = meta?.changeDetection; diff --git a/packages/devtools/src/config.ts b/packages/devtools/src/config.ts index 277ad62e..29168143 100644 --- a/packages/devtools/src/config.ts +++ b/packages/devtools/src/config.ts @@ -425,6 +425,7 @@ export function enabledPanelTabs(config: ResolvedPangularConfig): (typeof PANEL_ export const PANEL_LINK_ITEMS: Partial> = { 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', }; @@ -1022,6 +1023,13 @@ export const AGENT_ENTRIES: Readonly> = { 'inspect-component': { kind: 'tool', inspectors: ['components'], page: true }, 'list-components': { kind: 'tool', inspectors: ['components'], page: true }, 'defer-blocks': { kind: 'tool', inspectors: ['components'], page: true }, + 'load-defer-block': { + kind: 'tool', + inspectors: ['components'], + safety: 'action', + actions: ['components'], + page: true, + }, 'for-blocks': { kind: 'tool', inspectors: ['components'], page: true }, hydration: { kind: 'tool', inspectors: ['components'], page: true }, 'change-detection': { kind: 'tool', inspectors: ['components'], page: true }, @@ -1395,6 +1403,7 @@ export const RPC_INSPECTOR: Record = { 'component-screenshot-result': 'components', 'request-component-edit': 'components', 'component-edit-result': 'components', + 'defer-load-result': 'components', 'request-hydration-overlay': 'components', 'request-component-value': 'components', 'component-value-result': 'components', @@ -2301,6 +2310,22 @@ export interface DeferNoteBlock { triggers: string[]; /** Page clock, ms since epoch, when the state or hydration state last changed. */ since: number; + /** Page clock, ms since epoch, when the overlay saw the block hydrate. */ + hydratedAt?: number; +} + +/** + * The hydration state of a block as the panel and the defer-blocks tool word + * it. A block that is `hydrated` without a `hydratedAt` hydrated before the + * overlay attached, so no one saw it happen. + */ +export function deferHydrationLabel( + block: Pick, +): string { + if (block.hydration === 'hydrated' && block.hydratedAt === undefined) { + return 'hydrated before inspection'; + } + return block.hydration; } export interface DeferNote { diff --git a/packages/devtools/src/defer-blocks.ts b/packages/devtools/src/defer-blocks.ts index 36e127a2..ac2a320d 100644 --- a/packages/devtools/src/defer-blocks.ts +++ b/packages/devtools/src/defer-blocks.ts @@ -71,6 +71,8 @@ export function createDeferTracker(now: () => number = Date.now) { const lastHosts = new WeakMap(); let nextId = 0; let truncated = false; + // The blocks of the last collection by id, for a load the agent asks for. + let lastById = new Map(); const positionKey = (root: Element, index: number) => { let keys = byPosition.get(root); @@ -110,6 +112,10 @@ export function createDeferTracker(now: () => number = Date.now) { get truncated() { return truncated; }, + /** A block of the last `collect` and the host it is known by, or undefined. */ + find(id: string): { host: object; block: DeferBlockInfo } | undefined { + return lastById.get(id); + }, /** Every defer block on the page, or `undefined` when Angular exposes no util for them. */ collect( ng: DeferDebugNg | undefined, @@ -117,6 +123,7 @@ export function createDeferTracker(now: () => number = Date.now) { blocksOf?: (root: Element) => unknown[], ): DeferBlockInfo[] | undefined { truncated = false; + lastById = new Map(); const util = ng?.ɵgetControlFlowBlocks ?? ng?.ɵgetDeferBlocks; if (!ng || typeof util !== 'function') return undefined; const hosts = new Set(); @@ -189,6 +196,7 @@ export function createDeferTracker(now: () => number = Date.now) { } if (record.hydratedAt !== undefined) block.hydratedAt = record.hydratedAt; out.push(block); + lastById.set(block.id, { host, block }); } lastHosts.set(root, order); } diff --git a/packages/devtools/src/defer-load.ts b/packages/devtools/src/defer-load.ts new file mode 100644 index 00000000..819674d2 --- /dev/null +++ b/packages/devtools/src/defer-load.ts @@ -0,0 +1,228 @@ +import * as angularCore from '@angular/core'; +import { actionBlockedMessage } from './config.ts'; +import type { DeferBlockInfo } from './types.ts'; + +/** + * Loads one `@defer` block on request of the `load-defer-block` agent tool + * (dev only, behind `actions.components`). The collector never does this on + * its own. It uses the same Angular internals as `DeferBlockFixture.render` + * in `@angular/core/testing`: `ɵtriggerResourceLoading` fetches the block's + * dependencies, `ɵrenderDeferBlockState` swaps in the main content (or the + * `@error` block when the load failed), and `ng.applyChanges` runs change + * detection so the new view renders. + */ + +/** One block as `ɵgetDeferBlocks(lView, out)` lists it. */ +interface DeferBlockDetails { + lContainer: unknown[]; + lView: unknown[]; + tNode: unknown; + tDetails: { loadingState?: number; errorTmplIndex?: number | null }; +} + +/** The Angular internals a force-load needs, all private exports of `@angular/core`. */ +export interface DeferInternals { + getDeferBlocks(lView: unknown[], out: DeferBlockDetails[]): void; + triggerResourceLoading(tDetails: unknown, lView: unknown[], tNode: unknown): Promise; + renderDeferBlockState( + state: number, + tNode: unknown, + lContainer: unknown[], + skipTimerScheduling?: boolean, + ): void; +} + +export interface DeferLoadNg { + getInjector?(el: Element): unknown; + getComponent?(el: Element): unknown; + applyChanges?(component: unknown): void; +} + +export interface DeferLoadResult { + ok?: true; + /** The block's state after the load: `complete`, or `error` when its dependencies failed. */ + state?: string; + /** The block already showed its main content, so nothing was loaded. */ + already?: true; + error?: string; +} + +/** Where a block sits in the tracker's last collection. */ +export interface DeferBlockRef { + /** The anchor comment of the block, or a plain key for a block without one. */ + host: object; + block: DeferBlockInfo; +} + +// `DeferBlockState` and `DeferDependenciesLoadingState` in `@angular/core`. +const COMPLETE = 2; +const ERROR = 3; +const LOAD_FAILED = 3; +// Slots of an LContainer: the host node and the anchor comment, and where its views start. +const HOST = 0; +const NATIVE = 7; +const CONTAINER_HEADER_OFFSET = 10; +/** Stops a walk over a broken view tree. */ +const MAX_BLOCKS = 5000; + +/** The internals from the app's own `@angular/core`, or null when this build has none. */ +export function angularDeferInternals(core: object = angularCore): DeferInternals | null { + const pick = (name: string) => { + const fn = Reflect.get(core, name) as unknown; + return typeof fn === 'function' ? fn : null; + }; + const getDeferBlocks = pick('ɵgetDeferBlocks'); + const triggerResourceLoading = pick('ɵtriggerResourceLoading'); + const renderDeferBlockState = pick('ɵrenderDeferBlockState'); + if (!getDeferBlocks || !triggerResourceLoading || !renderDeferBlockState) return null; + return { + getDeferBlocks: getDeferBlocks as DeferInternals['getDeferBlocks'], + triggerResourceLoading: triggerResourceLoading as DeferInternals['triggerResourceLoading'], + renderDeferBlockState: renderDeferBlockState as DeferInternals['renderDeferBlockState'], + }; +} + +/** The view an Angular root element was created in, from its node injector. */ +function rootView(ng: DeferLoadNg, root: Element): unknown[] | null { + try { + const injector = ng.getInjector?.(root) as { _lView?: unknown } | null | undefined; + return Array.isArray(injector?._lView) ? injector._lView : null; + } catch { + return null; + } +} + +/** + * Finds the block whose container is anchored on `host`. `ɵgetDeferBlocks` + * stops at each defer block it lists, so the walk goes on into the views a + * block rendered, as `DeferBlockFixture.getDeferBlocks` does. + */ +function findBlock( + internals: DeferInternals, + views: unknown[][], + host: object, +): DeferBlockDetails | null { + const queue = [...views]; + let seen = 0; + while (queue.length && seen < MAX_BLOCKS) { + const found: DeferBlockDetails[] = []; + internals.getDeferBlocks(queue.shift()!, found); + for (const block of found) { + seen++; + const container = block.lContainer; + if (container?.[HOST] === host || container?.[NATIVE] === host) return block; + const inner = container?.[CONTAINER_HEADER_OFFSET]; + if (Array.isArray(inner)) queue.push(inner); + } + } + return null; +} + +/** Loads the block `ref` names; see the module comment. */ +export async function loadDeferBlock( + ng: DeferLoadNg | undefined, + internals: DeferInternals | null, + ref: DeferBlockRef | undefined, + roots: Element[], +): Promise { + if (!ref) { + return { + error: 'No defer block has that id on this page. List them with pangular:defer-blocks.', + }; + } + const { block, host } = ref; + if (block.state === 'complete') return { ok: true, state: 'complete', already: true }; + if (block.hydrateNever || block.hydration === 'dehydrated') { + return { + error: + 'The block is server HTML waiting for incremental hydration. Loading it here would skip its hydrate trigger, so it was left alone. Trigger its hydrate condition in the app instead.', + }; + } + if (!ng?.getInjector) { + return { + error: 'This page has no Angular debug API (`ng.getInjector`). It needs a development build.', + }; + } + if (!internals) { + return { + error: + "This page's Angular does not export the defer internals a load needs (`ɵgetDeferBlocks`, `ɵtriggerResourceLoading`, `ɵrenderDeferBlockState`).", + }; + } + if (typeof Node === 'undefined' || !(host instanceof Node)) { + return { + error: + 'Angular gives this block no anchor node yet, so its view cannot be found. Try again once the page renders it.', + }; + } + const views = roots.map((root) => rootView(ng, root)).filter((view) => view !== null); + const found = findBlock(internals, views, host); + if (!found) return { error: "The block's view could not be found from the app's roots." }; + await internals.triggerResourceLoading(found.tDetails, found.lView, found.tNode); + const failed = found.tDetails.loadingState === LOAD_FAILED; + if (failed && (found.tDetails.errorTmplIndex ?? null) === null) { + return { + error: "The block's dependencies failed to load, and it has no @error block to show.", + }; + } + internals.renderDeferBlockState(failed ? ERROR : COMPLETE, found.tNode, found.lContainer, true); + for (const root of roots) { + try { + const component = ng.getComponent?.(root); + if (component) ng.applyChanges?.(component); + } catch { + // A root that is gone; the next tick of the app renders the block all the same. + } + } + return { ok: true, state: failed ? 'error' : 'complete' }; +} + +interface LoadRpc { + call(name: string, ...args: unknown[]): Promise; + register(definition: { + name: string; + type: 'event'; + jsonSerializable: boolean; + handler: (message: never) => unknown; + }): void; +} + +export interface DeferLoadOptions { + /** `actions.components` from the config the server published. */ + allowed: boolean; + /** Loads the block with this id, after a fresh read of the page's blocks. */ + load: (id: string) => Promise; + /** Runs after a load, so the next push carries the new state. */ + loaded?: () => void; +} + +/** + * Answers the server's `defer-load` events for this page with + * `defer-load-result`. The server checks the action gate first; the page + * checks it again, so a server started with writes off never gets one through. + */ +export function registerDeferLoad(rpc: LoadRpc, pageId: string, options: DeferLoadOptions): void { + rpc.register({ + name: 'defer-load', + type: 'event', + jsonSerializable: true, + handler: (message: { requestId?: unknown; pageId?: unknown; id?: unknown } | null) => { + if (!message || typeof message.requestId !== 'string' || message.pageId !== pageId) return; + const requestId = message.requestId; + const id = message.id; + const run = async (): Promise => { + if (!options.allowed) return { error: actionBlockedMessage('components') }; + if (typeof id !== 'string' || !id) return { error: 'Pass the id of a defer block.' }; + try { + return await options.load(id); + } catch (error) { + return { error: String((error as Error)?.message ?? error).slice(0, 500) }; + } + }; + void run().then((result) => { + void rpc.call('defer-load-result', { requestId, pageId, result }).catch(() => {}); + if (result.ok && !result.already) options.loaded?.(); + }); + }, + }); +} diff --git a/packages/devtools/src/devframe.ts b/packages/devtools/src/devframe.ts index b42bb213..39cbaf68 100644 --- a/packages/devtools/src/devframe.ts +++ b/packages/devtools/src/devframe.ts @@ -113,6 +113,7 @@ import { } from './rpc/component-tools.ts'; import { LIST_COMPONENTS_DESCRIPTION, listComponentsText } from './rpc/component-outline.ts'; import { inspectComponentText } from './rpc/component-detail-text.ts'; +import { createDeferLoads } from './rpc/defer-loads.ts'; import { createComponentEdits } from './rpc/component-edits.ts'; import { createSignalRestores } from './rpc/signal-restores.ts'; import { createComponentValues, valueResultText } from './rpc/component-values.ts'; @@ -2239,6 +2240,29 @@ const pangular = defineDevframe({ }); for (const tool of componentEdits.tools) agent.registerTool(tool); + // Loads one @defer block when an agent asks: same gate and owner check as the writes above. + const deferLoads = createDeferLoads({ + config, + pages: () => componentPages.values(), + broadcast: (method, message) => { + const pageId = (message as { pageId?: unknown } | null)?.pageId; + void (my.rpc.broadcast as (options: OwnerBroadcast) => Promise)({ + method, + args: [message], + optional: true, + filter: owners.deliversTo(typeof pageId === 'string' ? pageId : undefined), + }); + }, + answersFor, + }); + register({ + name: 'defer-load-result', + type: 'action', + jsonSerializable: true, + handler: deferLoads.answer, + }); + agent.registerTool(deferLoads.tool); + // Nested levels of component values: the panel opens them, inspect-component reads them. const componentValues = createComponentValues({ pages: () => componentPages.values(), diff --git a/packages/devtools/src/overlay.ts b/packages/devtools/src/overlay.ts index ff069f9e..6e382e84 100644 --- a/packages/devtools/src/overlay.ts +++ b/packages/devtools/src/overlay.ts @@ -111,7 +111,8 @@ import { claimPageOnServer, newPageId, newPageKey } from './page-id.ts'; import { createDeltaChannel } from './delta-channel.ts'; import { COMPONENT_TREE_SHAPE, INJECTOR_TREE_SHAPE } from './push-delta.ts'; import { createDomDirty } from './dom-dirty.ts'; -import { domTree } from './host-tree.ts'; +import { angularRoots, domTree } from './host-tree.ts'; +import { angularDeferInternals, loadDeferBlock, registerDeferLoad } from './defer-load.ts'; import { LEASED_PUSH_MS, createPageLease, throttle } from './page-lease.ts'; import { setTimeoutOutside } from './outside-angular.ts'; import { createPageHeartbeat, keepaliveAfter } from './page-heartbeat.ts'; @@ -1016,6 +1017,16 @@ async function startOverlay( allowed: devtoolsConfig.actions.components, edited: () => void pushTree(true).catch(() => {}), }); + registerDeferLoad(my.rpc, pageId, { + allowed: devtoolsConfig.actions.components, + load: (id) => { + const ng = getNg(); + // A fresh read, so the load acts on the block as it is now. + deferTracker.collect(ng, document, controlFlowReader(ng)); + return loadDeferBlock(ng, angularDeferInternals(), deferTracker.find(id), angularRoots()); + }, + loaded: () => void pushTree(true).catch(() => {}), + }); // Loaded on the first capture, so pages that never take one don't pay for it. my.rpc.register({ name: 'component-screenshot', diff --git a/packages/devtools/src/rpc/component-tools.ts b/packages/devtools/src/rpc/component-tools.ts index 3fb3c2cf..df9b8116 100644 --- a/packages/devtools/src/rpc/component-tools.ts +++ b/packages/devtools/src/rpc/component-tools.ts @@ -1,4 +1,4 @@ -import { deferNotes, type AngularPageInfo } from '../config.ts'; +import { deferHydrationLabel, deferNotes, type AngularPageInfo } from '../config.ts'; import { unsupportedToolText } from './angular-pages.ts'; import { MAX_DEFER_BLOCKS } from '../defer-blocks.ts'; import { MAX_FOR_BLOCKS } from '../for-blocks.ts'; @@ -244,11 +244,19 @@ export function deferBlocksText( `- \`${block.id}\` in ${owner}: ${notes.join(', ')}. Triggers: ${block.triggers.join(', ') || 'none'}${block.hasErrorBlock ? '' : '. It has no @error block'}.`, ); } - return `| \`${block.id}\` | ${cell(owner)} | ${block.state} | ${block.hydration} | ${cell(block.triggers.join(', ') || 'none')} | ${cell(notes.join(', '))} |`; + return `| \`${block.id}\` | ${cell(owner)} | ${block.state} | ${deferHydrationLabel(block)} | ${cell(block.triggers.join(', ') || 'none')} | ${cell(notes.join(', '))} |`; }); const more = (hidden: number, what: string) => hidden > 0 ? ['', `${hidden} more ${what} not shown.${narrow}`] : []; const hiddenRows = rows.length - DEFER_ROWS; + const early = page.deferBlocks.some( + (block) => deferHydrationLabel(block) === 'hydrated before inspection', + ) + ? [ + '', + '"hydrated before inspection" means the block hydrated before the devtools attached to the page, so when it hydrated is not known.', + ] + : []; const count = page.deferTruncated ? `more than ${MAX_DEFER_BLOCKS} defer blocks. Only the first ${MAX_DEFER_BLOCKS} are collected, so blocks past them are not listed or counted here.` : `${page.deferBlocks.length} defer ${page.deferBlocks.length === 1 ? 'block' : 'blocks'}.`; @@ -259,6 +267,7 @@ export function deferBlocksText( '| --- | --- | --- | --- | --- | --- |', ...rows.slice(0, DEFER_ROWS), ...more(hiddenRows, hiddenRows === 1 ? 'block' : 'blocks'), + ...early, ...(attention.length ? [ '', diff --git a/packages/devtools/src/rpc/defer-loads.ts b/packages/devtools/src/rpc/defer-loads.ts new file mode 100644 index 00000000..3ee9f032 --- /dev/null +++ b/packages/devtools/src/rpc/defer-loads.ts @@ -0,0 +1,178 @@ +import type { DeferLoadResult } from '../defer-load.ts'; +import { actionBlockedMessage, type ResolvedPangularConfig } from '../config.ts'; +import type { ComponentPage, DeferBlockInfo } from '../types.ts'; +import { untrusted } from './forms-tools.ts'; +import { byRecency, choosePageText, pageArgument, unknownPageText } from './pages.ts'; +import { refusal } from './refusal.ts'; + +/** How long a load waits for its page to answer; it fetches the block's chunks first. */ +export const DEFER_LOAD_TIMEOUT_MS = 15_000; + +interface Deps { + config: ResolvedPangularConfig; + /** The pages that report a component tree, with their defer blocks. */ + pages: () => Iterable; + /** Sends an event to the connection that owns the page. */ + broadcast: (method: string, message: unknown) => void; + /** Whether a result for `target` may come from the connection that sent it for `pageId`. */ + answersFor: (target: string, pageId: unknown) => boolean; + timeoutMs?: number; +} + +export interface DeferLoadTool { + id: string; + title: string; + description: string; + inputSchema: Record; + handler: (args: Record) => Promise<{ markdown: string }>; +} + +function withDeferBlocks(pages: Iterable) { + return byRecency(pages).filter((page) => page.deferBlocks?.length); +} + +function toResult(result: unknown): DeferLoadResult { + const r = (result ?? {}) as Record; + if (r['ok'] === true) { + return { + ok: true, + state: r['state'] === 'error' ? 'error' : 'complete', + ...(r['already'] === true ? { already: true as const } : {}), + }; + } + return { + error: typeof r['error'] === 'string' ? r['error'].slice(0, 2000) : 'The page did not load it.', + }; +} + +/** The answer of load-defer-block, as markdown. */ +export function deferLoadText( + result: DeferLoadResult, + block: Pick, + pageId: string, +): string { + const where = `\`${block.id}\`${block.owner ? ` in ${block.owner.name}` : ''} on page \`${pageId}\``; + if (!result.ok) return refusal(untrusted(`Defer block ${where} was not loaded. ${result.error}`)); + if (result.already) { + return untrusted(`Defer block ${where} already shows its main content, so nothing was loaded.`); + } + 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.`, + ); + } + 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.`, + ); +} + +/** + * The `load-defer-block` agent tool: makes one `@defer` block fetch its + * dependencies and show its main content on the page, as if its trigger + * fired. The server sends `defer-load` to the page that owns the block and + * waits for its `defer-load-result`, which only that page's connection can + * settle. Behind `actions.components`, checked here and again on the page. + */ +export function createDeferLoads(deps: Deps) { + const pending = new Map void }>(); + let seq = 0; + + const answer = (message: { requestId?: unknown; pageId?: unknown; result?: unknown } | null) => { + if (typeof message?.requestId !== 'string') return; + const entry = pending.get(message.requestId); + if (entry && deps.answersFor(entry.pageId, message.pageId)) entry.settle(message.result); + }; + + const request = (pageId: string, id: string) => + new Promise((resolve) => { + const requestId = `l${++seq}`; + const timeoutMs = deps.timeoutMs ?? DEFER_LOAD_TIMEOUT_MS; + const timer = setTimeout(() => { + pending.delete(requestId); + resolve({ + error: `No page answered within ${Math.round(timeoutMs / 1000)}s. Is the app open in a browser, and its tab in the foreground?`, + }); + }, timeoutMs); + timer.unref?.(); + pending.set(requestId, { + pageId, + settle: (result) => { + clearTimeout(timer); + pending.delete(requestId); + resolve(toResult(result)); + }, + }); + deps.broadcast('defer-load', { requestId, pageId, id }); + }); + + const tool: DeferLoadTool = { + id: 'pangular:load-defer-block', + title: 'Load a @defer block', + description: + 'Make one live @defer block fetch its dependencies and show its main content now, as if its trigger fired (dev only). `block` is an id from pangular:defer-blocks. Dehydrated server HTML is left alone. Needs actions.components.', + inputSchema: { + type: 'object', + properties: { + block: { + type: 'string', + description: 'Defer block id from pangular:defer-blocks, such as d3.', + }, + page: { + type: 'string', + description: + 'Page id, when more than one tab has that block id (see pangular:list-pages). Required then.', + }, + }, + required: ['block'], + }, + handler: async (args) => { + if (!deps.config.actions.components) { + return { markdown: refusal(actionBlockedMessage('components')) }; + } + const id = typeof args['block'] === 'string' ? args['block'].trim() : ''; + if (!id || id.length > 100) { + return { markdown: refusal('Pass `block`: a defer block id from pangular:defer-blocks.') }; + } + const page = pageArgument(args); + const live = withDeferBlocks(deps.pages()); + if (page && !live.some((entry) => entry.pageId === page)) { + return { markdown: unknownPageText(page, live, 'defer blocks') }; + } + const scope = page ? live.filter((entry) => entry.pageId === page) : live; + const hits = scope.flatMap((entry) => + (entry.deferBlocks ?? []) + .filter((block) => block.id === id) + .map((block) => ({ pageId: entry.pageId, block })), + ); + if (!hits.length) { + return { + markdown: refusal( + live.length + ? `No defer block \`${id}\`${page ? ` on page \`${page}\`` : ''}, so nothing was loaded. Read the ids with pangular:defer-blocks.` + : 'No page reports defer blocks, so nothing was loaded. Open the app in a browser with the devtools connected.', + ), + }; + } + if (hits.length > 1) { + // A load changes the app, so it never picks one of several tabs on its own. + const pages = new Set(hits.map((hit) => hit.pageId)); + return { + markdown: choosePageText( + live.filter((entry) => pages.has(entry.pageId)), + `a defer block \`${id}\``, + ), + }; + } + const [hit] = hits; + const result = await request(hit.pageId, id); + return { markdown: deferLoadText(result, hit.block, hit.pageId) }; + }, + }; + + return { + answer, + tool, + /** Loads waiting for an answer, for tests. */ + pendingCount: () => pending.size, + }; +} diff --git a/packages/devtools/src/types.ts b/packages/devtools/src/types.ts index 5a5ffdf7..9426f6a1 100644 --- a/packages/devtools/src/types.ts +++ b/packages/devtools/src/types.ts @@ -223,6 +223,11 @@ export interface ComponentDetail { name: string; tag: string; path: string; + /** + * A CSS selector that finds the host again with `querySelector`, for the + * panel's "Copy host path". Left out where the host tree has no selectors. + */ + selector?: string; source?: ComponentSource; changeDetection?: string; encapsulation?: string; diff --git a/scripts/e2e-mcp.mjs b/scripts/e2e-mcp.mjs index 5a0dc530..b0e1f3e9 100644 --- a/scripts/e2e-mcp.mjs +++ b/scripts/e2e-mcp.mjs @@ -825,6 +825,7 @@ const ACTION_SCENARIO_TOOLS = new Set([ 'remove-ssr-override', 'set-component-property', 'set-signal', + 'load-defer-block', 'watch-signal', 'record-pipes', 'track-subscriptions', @@ -1642,6 +1643,21 @@ async function runActions(state) { doubledAfter, ); + // load-defer-block + await app.go('/examples/defer'); + await sleep(800); + const deferRow = (await read('defer-blocks', {})).match( + /\| `(d\d+)` \|[^|\n]*\| placeholder \|[^|\n]*\| on interaction \|/, + ); + r = await act('load-defer-block', { block: deferRow?.[1] ?? 'd0' }); + await sleep(800); + write( + 'load-defer-block', + 'the on interaction block shows its content without a click', + (await page.getByText('Rendered after the button was used.').count()) > 0, + r.markdown.slice(0, 300), + ); + // watch-signal const graph = jsonBlock(await read('inspect-signals', { component: 'app-signals-example' })); const countNode = graph?.nodes?.find((node) => node.label === 'count'); diff --git a/scripts/e2e-security.mjs b/scripts/e2e-security.mjs index 77360a86..007d1cdd 100644 --- a/scripts/e2e-security.mjs +++ b/scripts/e2e-security.mjs @@ -1573,6 +1573,7 @@ async function gatingChecks() { 'remove-ssr-override', 'set-component-property', 'set-signal', + 'load-defer-block', 'watch-signal', 'record-pipes', 'track-subscriptions', From 11b88cfcba608f383dfab62324387a4149ec87f1 Mon Sep 17 00:00:00 2001 From: erKam Date: Sat, 7 Nov 2026 16:30:27 +0000 Subject: [PATCH 2/9] feat(components): pick by keyboard and show likely directive sources Picking a component needed a pointer. While a pick runs, the arrow keys now move the page highlight through the components in page order, out to the parent and in to the first child, and Enter picks. The panel sends the keys through request-component-pick-move, and the page takes them itself when it has focus. Directives had no source location at all. Angular attaches no debug location to them, so each directive now shows the file from the source scan with the same class name, marked Likely. Refs #366 --- app/src/__tests__/component-pick-keys.test.ts | 74 +++++++++ .../component-tree-directive-source.test.ts | 87 +++++++++++ app/src/pages/component-tree.ts | 93 +++++++++++- .../docs/src/content/inspectors/components.md | 14 +- packages/devtools/CHANGELOG.md | 1 + .../src/__tests__/component-agent.test.ts | 29 ++++ .../src/__tests__/component-pick.test.ts | 71 +++++++++ packages/devtools/src/component-pick.ts | 140 ++++++++++++++---- packages/devtools/src/config.ts | 1 + packages/devtools/src/devframe.ts | 39 +++++ packages/devtools/src/overlay.ts | 33 ++++- 11 files changed, 547 insertions(+), 35 deletions(-) create mode 100644 app/src/__tests__/component-pick-keys.test.ts create mode 100644 app/src/__tests__/component-tree-directive-source.test.ts diff --git a/app/src/__tests__/component-pick-keys.test.ts b/app/src/__tests__/component-pick-keys.test.ts new file mode 100644 index 00000000..816f97e1 --- /dev/null +++ b/app/src/__tests__/component-pick-keys.test.ts @@ -0,0 +1,74 @@ +import { TestBed, type ComponentFixture } from '@angular/core/testing'; +import type { DevframeRpcClient } from 'devframe/client'; +import { afterEach, describe, expect, it } from 'vitest'; +import { ComponentTree } from '../pages/component-tree'; + +const page = { + pageId: 'p1', + roots: [{ id: 'c1', name: 'App', tag: 'app-root', children: [] }], + count: 1, + detail: null, + reportedAt: 1000, +}; + +function client(calls: { name: string; args: unknown }[]) { + const rpc = { + call: (name: string, args: unknown) => { + calls.push({ name, args }); + if (name === 'request-component-pick') return new Promise(() => {}); + if (name === 'request-component-pick-move') { + return Promise.resolve({ moved: true, id: 'c1', name: 'App', tag: 'app-root' }); + } + return Promise.resolve([]); + }, + callEvent: () => Promise.resolve(), + sharedState: (name: string) => + Promise.resolve({ + value: () => (name === 'component-tree' ? { pages: { p1: page } } : null), + on: () => () => {}, + }), + }; + return { connectionMeta: {}, scope: () => ({ rpc }) } as unknown as DevframeRpcClient; +} + +async function settle(fixture: ComponentFixture) { + for (let i = 0; i < 3; i++) { + await new Promise((resolve) => setTimeout(resolve)); + await fixture.whenStable(); + } +} + +describe('keyboard pick', () => { + afterEach(() => { + document.body.innerHTML = ''; + }); + + it('sends the arrow keys and Enter to the page while picking, and announces the component', async () => { + const calls: { name: string; args: unknown }[] = []; + const fixture = TestBed.createComponent(ComponentTree); + fixture.componentRef.setInput('rpc', client(calls)); + await settle(fixture); + const el = fixture.nativeElement as HTMLElement; + const press = (key: string) => { + const event = new KeyboardEvent('keydown', { key, bubbles: true, cancelable: true }); + el.querySelector('.pick')!.dispatchEvent(event); + return event; + }; + expect(press('ArrowDown').defaultPrevented).toBe(false); + void fixture.componentInstance.pick(); + await settle(fixture); + expect(press('ArrowDown').defaultPrevented).toBe(true); + await settle(fixture); + expect(calls.filter((c) => c.name === 'request-component-pick-move')).toEqual([ + { name: 'request-component-pick-move', args: { pageId: 'p1', key: 'next' } }, + ]); + expect(fixture.componentInstance.announcement()).toBe( + 'App . Press Enter to pick it.', + ); + expect(press('Enter').defaultPrevented).toBe(true); + expect(calls.at(-1)).toEqual({ + name: 'request-component-pick-move', + args: { pageId: 'p1', key: 'pick' }, + }); + }); +}); diff --git a/app/src/__tests__/component-tree-directive-source.test.ts b/app/src/__tests__/component-tree-directive-source.test.ts new file mode 100644 index 00000000..cc651f3c --- /dev/null +++ b/app/src/__tests__/component-tree-directive-source.test.ts @@ -0,0 +1,87 @@ +import { TestBed, type ComponentFixture } from '@angular/core/testing'; +import type { DevframeRpcClient } from 'devframe/client'; +import { afterEach, describe, expect, it } from 'vitest'; +import { ComponentTree } from '../pages/component-tree'; + +const directive = (className: string, file: string) => ({ + selector: '[appTooltip]', + className, + kind: 'directive', + file, + line: 7, + inputs: [], + outputs: [], + isStandalone: true, +}); + +function fakeClient(components: unknown[]): DevframeRpcClient { + const page = { + pageId: 'p1', + roots: [ + { + id: 'c1', + name: 'Card', + tag: 'app-card', + children: [ + { + id: 'h1', + name: 'button', + tag: 'button', + kind: 'directive', + directives: ['Tooltip', 'Ripple'], + children: [], + }, + ], + }, + ], + count: 1, + directiveHostCount: 1, + detail: null, + reportedAt: 1000, + }; + const rpc = { + call: (name: string) => Promise.resolve(name === 'get-components' ? components : []), + callEvent: () => Promise.resolve(), + sharedState: (name: string) => + Promise.resolve({ + value: () => (name === 'component-tree' ? { pages: { p1: page } } : null), + on: () => () => {}, + }), + }; + return { connectionMeta: {}, scope: () => ({ rpc }) } as unknown as DevframeRpcClient; +} + +async function settle(fixture: ComponentFixture) { + for (let i = 0; i < 3; i++) { + await new Promise((resolve) => setTimeout(resolve)); + await fixture.whenStable(); + } +} + +describe('directive sources', () => { + afterEach(() => { + document.body.innerHTML = ''; + }); + + it('marks a directive file found by class name as likely, and names several files', async () => { + const fixture = TestBed.createComponent(ComponentTree); + fixture.componentRef.setInput( + 'rpc', + fakeClient([ + directive('Tooltip', 'src/app/tooltip.directive.ts'), + directive('Ripple', 'src/app/a/ripple.ts'), + directive('Ripple', 'src/app/b/ripple.ts'), + ]), + ); + await settle(fixture); + fixture.componentInstance.select('h1'); + await settle(fixture); + const chips = Array.from( + (fixture.nativeElement as HTMLElement).querySelectorAll('.detail .chip'), + ).map((chip) => chip.textContent?.replace(/\s+/g, ' ').trim()); + expect(chips[0]).toContain('Tooltip'); + expect(chips[0]).toContain('Likely'); + expect(chips[0]).toContain('tooltip.directive.ts'); + expect(chips[1]).toContain('2 source files define Ripple'); + }); +}); diff --git a/app/src/pages/component-tree.ts b/app/src/pages/component-tree.ts index 77830219..afbb5e61 100644 --- a/app/src/pages/component-tree.ts +++ b/app/src/pages/component-tree.ts @@ -14,6 +14,7 @@ import { untracked, viewChild, } from '@angular/core'; +import { NgTemplateOutlet } from '@angular/common'; import type { DevframeRpcClient } from 'devframe/client'; import { ExtensionBridge, type SourceLocation } from '../extension-bridge'; import { hostPageId } from '../page-id'; @@ -201,6 +202,15 @@ export function ancestors(parents: ReadonlyMap, id: string): str return out; } +/** The keys that move a running pick on the page, as the page names them. */ +const PICK_KEY_NAMES: Record = { + ArrowDown: 'next', + ArrowUp: 'previous', + ArrowLeft: 'parent', + ArrowRight: 'child', + Enter: 'pick', +}; + const DIRECTIVE_HOSTS_KEY = 'pangular:components:directive-hosts'; /** Whether this viewer last chose to show directive hosts; shown unless they hid them. */ @@ -215,6 +225,7 @@ function storedDirectiveHosts(): boolean { @Component({ selector: 'app-component-tree', imports: [ + NgTemplateOutlet, Select, CdRecording, SourceLink, @@ -226,7 +237,7 @@ function storedDirectiveHosts(): boolean { LeaksSection, AngularUnavailable, ], - host: { '(keydown.escape)': 'cancelPick()' }, + host: { '(keydown.escape)': 'cancelPick()', '(keydown)': 'pickKey($event)' }, template: ` @if (live()) {

        @@ -461,7 +472,13 @@ function storedDirectiveHosts(): boolean {

          @for (name of host.directives ?? []; track name + $index) { -
        • {{ name }}
        • +
        • + {{ name }} + +
        • }
        @@ -748,6 +765,12 @@ function storedDirectiveHosts(): boolean { {{ dir.name }} directive on host +

        + +

        @if (dir.inputs.length) {
          @for (p of dir.inputs; track p.name) { @@ -1036,6 +1059,21 @@ function storedDirectiveHosts(): boolean {
        } } + + + + @let found = directiveSources(name); + @if (found.length === 1) { + + Likely, matched by class name: + + } @else if (found.length > 1) { + {{ found.length }} source files define {{ bareName(name) }} + } + `, styles: ` @use 'mixins' as m; @@ -1475,6 +1513,18 @@ function storedDirectiveHosts(): boolean { font-size: 12px; overflow-wrap: anywhere; } + .directive-where { + margin: -4px 0 8px; + font-size: 12px; + } + .directive-where:empty { + display: none; + } + .directive-guess { + display: inline-flex; + align-items: center; + font-family: var(--font-sans); + } .likely { display: inline-block; margin-right: 6px; @@ -2479,6 +2529,14 @@ export class ComponentTree { return candidates.length === 1 ? candidates[0] : null; } + /** + * The source scan directives a directive on the page may be, by class name. Angular gives + * directives no debug location, so a match is only likely. + */ + directiveSources(name: string): SourceComponent[] { + return (this.sourceByClass().get(bare(name)) ?? []).filter((c) => c.kind === 'directive'); + } + sourceKey(comp: SourceComponent) { return `${comp.file}#${comp.className}`; } @@ -2565,7 +2623,9 @@ export class ComponentTree { const seq = ++this.pickSeq; this.pickPageId = this.page()?.pageId ?? null; this.picking.set(true); - this.say('Click a component in the app. Press Escape to cancel.'); + this.say( + 'Click a component in the app, or use the arrow keys to move between components and Enter to pick one. Press Escape to cancel.', + ); const result = (await client .scope('pangular') .rpc.call('request-component-pick', { pageId: this.pickPageId ?? undefined }) @@ -2583,6 +2643,33 @@ export class ComponentTree { else this.selectedId.set(result.id); } + /** + * Moves a running pick with the keyboard: down and up go through the components in page + * order, left to the one around, right to the first one inside, and Enter picks. + */ + pickKey(event: KeyboardEvent) { + const key = PICK_KEY_NAMES[event.key]; + if (!this.picking() || !key || event.altKey || event.ctrlKey || event.metaKey) return; + // Enter would press the focused button, which cancels the pick. + event.preventDefault(); + const client = this.rpc(); + if (!client) return; + const seq = this.pickSeq; + void client + .scope('pangular') + .rpc.call('request-component-pick-move', { pageId: this.pickPageId ?? undefined, key }) + .then((answer) => { + const result = answer as { moved?: boolean; name?: string; tag?: string; error?: string }; + if (seq !== this.pickSeq || !this.picking() || key === 'pick') return; + this.say( + result?.moved + ? `${result.name ?? 'Component'} <${result.tag ?? ''}>. Press Enter to pick it.` + : (result?.error ?? 'The page did not move.'), + ); + }) + .catch(() => {}); + } + cancelPick() { const client = this.rpc(); if (!client || !this.picking()) return; diff --git a/apps/docs/src/content/inspectors/components.md b/apps/docs/src/content/inspectors/components.md index 5521829e..75f9c567 100644 --- a/apps/docs/src/content/inspectors/components.md +++ b/apps/docs/src/content/inspectors/components.md @@ -30,7 +30,7 @@ Each row shows the class name and the host tag. Routed components get a chip wit ### Directive hosts -An element that hosts directives but no component is a row too, so you can see where directives such as `routerLink` or `ngModel` sit. The row shows the tag and the attributes from the directive selectors, as **<a> [routerLink]**, in a lighter style than component rows. When a selector has no attribute, the row shows the directive class names instead. Select the row to see its directives and a button that shows the component whose template renders it. A directive host has no inputs or properties of its own in the detail pane. +An element that hosts directives but no component is a row too, so you can see where directives such as `routerLink` or `ngModel` sit. The row shows the tag and the attributes from the directive selectors, as **<a> [routerLink]**, in a lighter style than component rows. When a selector has no attribute, the row shows the directive class names instead. Select the row to see its directives and a button that shows the component whose template renders it. Angular gives directives no source location, so each directive shows the file from the source scan with the same class name, marked **Likely**. When several files define the class, it says how many. A directive host has no inputs or properties of its own in the detail pane. **Directive hosts** in the toolbar hides or shows these rows. The panel remembers the choice in this browser. While they are hidden, their children move up to the nearest shown row, and the filter does not search them. The page lists up to 1000 directive hosts. Past that, the notice names the limit. Directives on an `` or `` are not listed, because the tree walks elements. @@ -379,6 +379,18 @@ On Angular 20 and later, the page reads the tree about 250 ms after Angular runs While picking, presses and clicks in the app don't reach it, so menus and drag handles stay as they are. +You can also pick with the keyboard, from the panel or with focus in the app: + +| Key | What it does | +| ----------- | --------------------------------------------------- | +| Down arrow | Highlights the next component in page order | +| Up arrow | Highlights the previous component | +| Left arrow | Highlights the component around the highlighted one | +| Right arrow | Highlights the first component inside it | +| Enter | Picks the highlighted component | + +The first arrow press starts from the component under the pointer, or from the first component on the page. The page scrolls the highlighted component into view, and the panel announces its name and tag. + Press Escape, in the app or in the panel, or click **Cancel pick** to stop. Picking also stops after 15 seconds. Hold Alt (Option on macOS) while you click to also open the file of the picked component in your editor, at its class line. The tab still selects the component. This needs the debug info of a development build. Without it, the click only picks. diff --git a/packages/devtools/CHANGELOG.md b/packages/devtools/CHANGELOG.md index cd70ea56..afebc4ee 100644 --- a/packages/devtools/CHANGELOG.md +++ b/packages/devtools/CHANGELOG.md @@ -142,6 +142,7 @@ What remains: `/config` exports `DEFAULT_POPUP_HOTKEY`, `PANGULAR_ACTIONS`, `PAN - **Components:** edit inputs, properties and writable signals; `@for` blocks; directive hosts; hydration status per component with an outline on the page; nested values on demand; console handles; expand all and collapse all. - **Components:** **Copy as JSON** (the redacted values the panel shows) and **Copy host path** (a CSS selector for `document.querySelector`) in the detail header; an outline that fades over one second on a value that changed since the last refresh; **Show in Signals** for the component and for each signal property, also as a `#tab=signals&id=` deep link and through `open-in-panel`; and the `@defer` blocks of the selected component's template. +- **Components:** pick a component with the keyboard: the arrow keys move the highlight through the components on the page and Enter picks, from the panel or the page. Directives show a **Likely** source file from the source scan, matched by class name. - **Defer blocks:** a block that hydrated before the devtools attached shows **hydrated before inspection** in the panel and in the `defer-blocks` tool. - **Change detection:** a recording that keeps running when the tab reloads (until **Stop recording**), a per-cycle chart, a flame graph, hook timing, export and import of recordings, flash checks on the page, a Pangular track in the Chrome Performance panel, an Angular profiling toggle, and what triggered each check, with wasted checks, OnPush hints and components that need zone.js. - **Leaks:** live subscriptions and effects per component, and components that stay alive after they are destroyed. diff --git a/packages/devtools/src/__tests__/component-agent.test.ts b/packages/devtools/src/__tests__/component-agent.test.ts index c44433b2..f8b75f29 100644 --- a/packages/devtools/src/__tests__/component-agent.test.ts +++ b/packages/devtools/src/__tests__/component-agent.test.ts @@ -299,6 +299,35 @@ describe('component pick', () => { expect(await selectedId()).toBe('c3'); }); + it('passes a keyboard move to the page and returns what it shows, without selecting it', async () => { + const { ctx, push, selectedId } = await boot(); + await push('push-component-tree', { pageId: 'p1', roots, count: 3, detail: null }); + const sent: Record[] = []; + vi.spyOn(ctx.rpc, 'broadcast').mockImplementation((async (options: Broadcast) => { + if (!options.method.endsWith('component-pick')) return; + sent.push(options.args[0]); + await push('component-pick-result', { + requestId: options.args[0]['requestId'], + pageId: 'p1', + result: { moved: true, id: 'c3', name: 'Card', tag: 'app-card' }, + }); + }) as never); + const before = await selectedId(); + expect(await push('request-component-pick-move', { pageId: 'p1', key: 'next' })).toEqual({ + moved: true, + id: 'c3', + name: 'Card', + tag: 'app-card', + }); + expect(sent).toEqual([{ requestId: expect.any(String), pageId: 'p1', move: 'next' }]); + expect(await selectedId()).toBe(before); + expect(await push('request-component-pick-move', { pageId: 'p1', key: 'jump' })).toEqual({ + moved: false, + error: 'Unknown key.', + }); + expect(sent).toHaveLength(1); + }); + it('passes a cancel to the page and returns its answer', async () => { const { ctx, push } = await boot(); await push('push-component-tree', { pageId: 'p1', roots, count: 3, detail: null }); diff --git a/packages/devtools/src/__tests__/component-pick.test.ts b/packages/devtools/src/__tests__/component-pick.test.ts index 66c5b2c4..0ef83825 100644 --- a/packages/devtools/src/__tests__/component-pick.test.ts +++ b/packages/devtools/src/__tests__/component-pick.test.ts @@ -267,3 +267,74 @@ describe('startComponentPick', () => { }); }); }); + +describe('startComponentPick with the keyboard', () => { + class _List {} + class _Item {} + + function page() { + document.body.innerHTML = ` + +
        + +
        +
        `; + const root = document.querySelector('app-root')!; + const list = document.querySelector('app-list')!; + const [first, second] = Array.from(document.querySelectorAll('app-item')); + const instances = new Map([ + [root, {}], + [list, new _List()], + [first!, new _Item()], + [second!, new _Item()], + ]); + const ng: ComponentDebugNg = { getComponent: (el) => instances.get(el) ?? null }; + const highlight = { show: vi.fn(), clear: vi.fn() }; + const pick = startComponentPick({ getNg: () => ng, highlight, timeoutMs: 5000 }); + return { pick, highlight, root, list, first: first!, second: second! }; + } + + afterEach(() => { + document.body.innerHTML = ''; + }); + + it('moves through components in page order, out and in, and picks with Enter', async () => { + const { pick, highlight, root, list, first, second } = page(); + expect(pick.move('next')).toMatchObject({ moved: true, tag: 'app-root' }); + expect(highlight.show).toHaveBeenLastCalledWith(root, true); + expect(pick.move('child')).toMatchObject({ moved: true, name: 'List' }); + expect(pick.move('child')).toMatchObject({ moved: true, name: 'Item' }); + expect(highlight.show).toHaveBeenLastCalledWith(first, true); + expect(pick.move('next')).toMatchObject({ moved: true, name: 'Item' }); + expect(highlight.show).toHaveBeenLastCalledWith(second, true); + expect(pick.move('next')).toEqual({ moved: false, error: 'This is the last component.' }); + expect(pick.move('parent')).toMatchObject({ moved: true, name: 'List' }); + expect(highlight.show).toHaveBeenLastCalledWith(list, true); + expect(pick.move('pick')).toMatchObject({ moved: true, name: 'List', picked: true }); + expect(await pick.result).toMatchObject({ ok: true, name: 'List', tag: 'app-list' }); + expect(pick.move('next')).toEqual({ moved: false, error: 'No pick is running.' }); + }); + + it('takes the arrow keys and Enter on the page, and keeps them from the app', async () => { + const { pick, first } = page(); + const field = document.querySelector('.field')!; + const press = (key: string) => { + const event = new KeyboardEvent('keydown', { key, bubbles: true, cancelable: true }); + field.dispatchEvent(event); + return event; + }; + expect(press('ArrowDown').defaultPrevented).toBe(true); + press('ArrowRight'); + press('ArrowRight'); + expect(press('a').defaultPrevented).toBe(false); + press('Enter'); + const result = await pick.result; + expect(result.ok && elementById(result.id)).toBe(first); + }); + + it('refuses Enter before anything is shown', () => { + const { pick } = page(); + expect(pick.move('pick')).toEqual({ moved: false, error: 'Move to a component first.' }); + pick.cancel(); + }); +}); diff --git a/packages/devtools/src/component-pick.ts b/packages/devtools/src/component-pick.ts index d475cccc..744973fb 100644 --- a/packages/devtools/src/component-pick.ts +++ b/packages/devtools/src/component-pick.ts @@ -1,6 +1,7 @@ import { componentSource } from './component-source.ts'; -import { componentHostOf, type ComponentDebugNg } from './component-tree.ts'; +import { componentHostOf, componentHosts, type ComponentDebugNg } from './component-tree.ts'; import { elementId } from './element-id.ts'; +import { domTree, parentOf } from './host-tree.ts'; import { className } from './injector-tree.ts'; import { POPUP_ROOT_ID } from './panel-frame.ts'; import type { ComponentSource } from './types.ts'; @@ -20,6 +21,27 @@ export type ComponentPickResult = } | { ok: false; error: string }; +/** + * The keys of a keyboard pick: the next or previous component in page order, + * the component around the shown one, the first one inside it, or picking it. + */ +export const PICK_KEYS = ['next', 'previous', 'parent', 'child', 'pick'] as const; +export type PickKey = (typeof PICK_KEYS)[number]; + +/** What a keyboard move shows now, or why nothing moved. */ +export type PickMoveResult = + | { moved: true; id: string; name: string; tag: string; picked?: true } + | { moved: false; error: string }; + +/** The keys a pick takes when focus is on the page itself. */ +const PAGE_KEYS: Record = { + ArrowDown: 'next', + ArrowUp: 'previous', + ArrowLeft: 'parent', + ArrowRight: 'child', + Enter: 'pick', +}; + const PRESS_EVENTS = ['pointerdown', 'mousedown'] as const; const RELEASE_EVENTS = ['pointerup', 'mouseup'] as const; /** How long after a pick on pointerup its click is still kept from the page. */ @@ -43,7 +65,8 @@ function swallowTrailingClick(doc: Document, ownElement: (target: EventTarget | interface PickOptions { getNg: () => ComponentDebugNg | undefined; - highlight: { show(el: Element): void; clear(): void }; + /** `reveal` scrolls the box into view, for a keyboard move rather than a hover. */ + highlight: { show(el: Element, reveal?: boolean): void; clear(): void }; doc?: Document; timeoutMs?: number; } @@ -53,10 +76,16 @@ interface PickOptions { * component that hosts it. Presses outside the popup do not reach the page. Escape, `cancel()` or the timeout end the pick. The floating * panel fades while picking so it does not cover the page. An Alt+click * marks the result `openInEditor` when the component's source is known. + * + * The keyboard picks too, from the panel through `move` or with the arrow + * keys on the page: down and up go to the next and previous component in + * page order, left to the component around the shown one, right to the + * first one inside it, and Enter picks the shown one. */ export function startComponentPick(options: PickOptions): { result: Promise; cancel: () => void; + move: (key: PickKey) => PickMoveResult; } { const doc = options.doc ?? document; const popup = doc.getElementById(POPUP_ROOT_ID); @@ -71,11 +100,73 @@ export function startComponentPick(options: PickOptions): { }; let finish: (result: ComponentPickResult, fromRelease?: boolean) => void = () => {}; + // Moving between elements inside one shadow root fires no mouseover at the + // document, since both ends retarget to the host, so pointermove also updates + // the box. It is only redrawn when the component under the pointer changes. + let shown: Element | null | undefined; + let done = false; + + const resultFor = (host: Element | null, altKey = false): ComponentPickResult => { + const instance = host ? options.getNg()?.getComponent?.(host) : null; + const ctor = (instance as { constructor?: unknown } | null)?.constructor; + const source = componentSource(instance); + return host + ? { + ok: true, + id: elementId(host), + name: typeof ctor === 'function' ? className(ctor) : 'Anonymous', + tag: host.tagName.toLowerCase(), + ...(source ? { source } : {}), + ...(source && altKey ? { openInEditor: true as const } : {}), + } + : { ok: false, error: 'That element is not inside an Angular component.' }; + }; + + const move = (key: PickKey): PickMoveResult => { + if (done) return { moved: false, error: 'No pick is running.' }; + const ng = options.getNg(); + if (!ng?.getComponent) return { moved: false, error: 'This page has no Angular debug API.' }; + const current = shown ?? null; + if (key === 'pick') { + if (!current) return { moved: false, error: 'Move to a component first.' }; + const picked = resultFor(current); + finish(picked); + return picked.ok + ? { moved: true, id: picked.id, name: picked.name, tag: picked.tag, picked: true } + : { moved: false, error: picked.error }; + } + const hosts = componentHosts(ng, domTree(doc)); + const index = current ? hosts.indexOf(current) : -1; + const around = (host: Element) => { + const parent = parentOf(host); + return parent ? componentHostOf(ng, parent) : null; + }; + let next: Element | null = null; + if (index === -1) next = hosts[0] ?? null; + else if (key === 'next') next = hosts[index + 1] ?? null; + else if (key === 'previous') next = hosts[index - 1] ?? null; + else if (key === 'parent') next = around(hosts[index]!); + else next = hosts.slice(index + 1).find((host) => around(host) === current) ?? null; + if (!next) { + const why = { + next: 'This is the last component.', + previous: 'This is the first component.', + parent: 'This component has no component around it.', + child: 'This component has no component inside it.', + }; + return index === -1 + ? { moved: false, error: 'The page shows no component.' } + : { moved: false, error: why[key] }; + } + shown = next; + options.highlight.show(next, true); + const picked = resultFor(next); + return picked.ok + ? { moved: true, id: picked.id, name: picked.name, tag: picked.tag } + : { moved: false, error: picked.error }; + }; + const result = new Promise((resolve) => { - // Moving between elements inside one shadow root fires no mouseover at the - // document, since both ends retarget to the host, so pointermove also updates - // the box. It is only redrawn when the component under the pointer changes. - let shown: Element | null | undefined; const onHover = (event: Event) => { // An `svg:g` component host is an Element, not an HTMLElement. const next = hostOf(event); @@ -89,24 +180,8 @@ export function startComponentPick(options: PickOptions): { shown = undefined; options.highlight.clear(); }; - const picked = (event: Event): ComponentPickResult => { - const host = hostOf(event); - const instance = host ? options.getNg()?.getComponent?.(host) : null; - const ctor = (instance as { constructor?: unknown } | null)?.constructor; - const source = componentSource(instance); - return host - ? { - ok: true, - id: elementId(host), - name: typeof ctor === 'function' ? className(ctor) : 'Anonymous', - tag: host.tagName.toLowerCase(), - ...(source ? { source } : {}), - ...(source && (event as MouseEvent).altKey === true - ? { openInEditor: true as const } - : {}), - } - : { ok: false, error: 'That element is not inside an Angular component.' }; - }; + const picked = (event: Event): ComponentPickResult => + resultFor(hostOf(event), (event as MouseEvent).altKey === true); // Menus, drag handles and overlays open on pointerdown or mousedown, so every // press outside the popup is kept from the page, not only the click. const swallow = (event: Event) => { @@ -130,9 +205,19 @@ export function startComponentPick(options: PickOptions): { if (swallow(event)) finish(picked(event)); }; const onKey = (event: KeyboardEvent) => { - if (event.key !== 'Escape') return; + if (event.key === 'Escape') { + event.preventDefault(); + finish({ ok: false, error: 'Picking cancelled.' }); + return; + } + const key = PAGE_KEYS[event.key]; + if (!key || ownElement(event.target) || event.altKey || event.ctrlKey || event.metaKey) { + return; + } + // The arrows would scroll the page, and Enter would press what has focus. event.preventDefault(); - finish({ ok: false, error: 'Picking cancelled.' }); + event.stopPropagation(); + move(key); }; const timer = setTimeout( () => finish({ ok: false, error: 'No component was picked.' }), @@ -140,6 +225,7 @@ export function startComponentPick(options: PickOptions): { ); finish = (outcome, fromRelease = false) => { finish = () => {}; + done = true; doc.removeEventListener('click', onClick, true); for (const type of PRESS_EVENTS) doc.removeEventListener(type, onPress, true); for (const type of RELEASE_EVENTS) doc.removeEventListener(type, onRelease, true); @@ -162,5 +248,5 @@ export function startComponentPick(options: PickOptions): { doc.addEventListener('mouseout', onLeave, true); doc.addEventListener('keydown', onKey, true); }); - return { result, cancel: () => finish({ ok: false, error: 'Picking cancelled.' }) }; + return { result, cancel: () => finish({ ok: false, error: 'Picking cancelled.' }), move }; } diff --git a/packages/devtools/src/config.ts b/packages/devtools/src/config.ts index 29168143..8d293294 100644 --- a/packages/devtools/src/config.ts +++ b/packages/devtools/src/config.ts @@ -1398,6 +1398,7 @@ export const RPC_INSPECTOR: Record = { 'select-component': 'components', 'request-component-pick': 'components', 'cancel-component-pick': 'components', + 'request-component-pick-move': 'components', 'component-pick-result': 'components', 'request-page-highlight': 'components', 'component-screenshot-result': 'components', diff --git a/packages/devtools/src/devframe.ts b/packages/devtools/src/devframe.ts index 39cbaf68..db478a84 100644 --- a/packages/devtools/src/devframe.ts +++ b/packages/devtools/src/devframe.ts @@ -114,6 +114,7 @@ import { import { LIST_COMPONENTS_DESCRIPTION, listComponentsText } from './rpc/component-outline.ts'; import { inspectComponentText } from './rpc/component-detail-text.ts'; import { createDeferLoads } from './rpc/defer-loads.ts'; +import { PICK_KEYS } from './component-pick.ts'; import { createComponentEdits } from './rpc/component-edits.ts'; import { createSignalRestores } from './rpc/signal-restores.ts'; import { createComponentValues, valueResultText } from './rpc/component-values.ts'; @@ -2355,6 +2356,44 @@ const pangular = defineDevframe({ }, }); + // A keyboard move of the running pick: the panel sends the key, the page + // answers with the component it shows now on the pick's result channel. + register({ + name: 'request-component-pick-move', + type: 'action', + jsonSerializable: true, + handler: (target: { pageId?: unknown; key?: unknown } | null) => { + const key = PICK_KEYS.find((k) => k === target?.key); + if (!key) return { moved: false, error: 'Unknown key.' }; + const asked = typeof target?.pageId === 'string' ? target.pageId : undefined; + const pageId = asked ?? latestComponentPage(componentPages.values())?.pageId; + if (!pageId || !componentPages.has(pageId)) { + return { moved: false, error: 'No page is connected. Open the app in a browser first.' }; + } + return new Promise>((resolve) => { + const requestId = `pick${++pickSeq}`; + const timer = setTimeout(() => { + pendingPicks.delete(requestId); + resolve({ moved: false, error: 'The page did not answer.' }); + }, 5_000); + timer.unref?.(); + pendingPicks.set(requestId, { + pageId, + settle: (result) => { + clearTimeout(timer); + pendingPicks.delete(requestId); + resolve(result); + }, + }); + void my.rpc.broadcast({ + method: 'component-pick', + args: [{ requestId, pageId, move: key }], + optional: true, + }); + }); + }, + }); + register({ name: 'cancel-component-pick', type: 'action', diff --git a/packages/devtools/src/overlay.ts b/packages/devtools/src/overlay.ts index 6e382e84..e54141e7 100644 --- a/packages/devtools/src/overlay.ts +++ b/packages/devtools/src/overlay.ts @@ -68,7 +68,12 @@ import { componentHostOf, selectedComponentDetail, } from './component-tree.ts'; -import { startComponentPick } from './component-pick.ts'; +import { + PICK_KEYS, + startComponentPick, + type PickKey, + type PickMoveResult, +} from './component-pick.ts'; import { registerComponentEdit } from './component-edit-overlay.ts'; import { registerComponentValues } from './component-values-overlay.ts'; import type { ScreenshotRequest } from './component-screenshot.ts'; @@ -978,23 +983,43 @@ async function startOverlay( }); let cancelComponentPick: (() => void) | null = null; + let moveComponentPick: ((key: PickKey) => PickMoveResult) | null = null; if (on.components) { my.rpc.register({ name: 'component-pick', type: 'event', jsonSerializable: true, - handler: (request: { requestId?: unknown; pageId?: unknown; cancel?: unknown } | null) => { + handler: ( + request: { requestId?: unknown; pageId?: unknown; cancel?: unknown; move?: unknown } | null, + ) => { if (!request || (request.pageId && request.pageId !== pageId)) return; + // A key from the panel moves the running pick; it never starts or cancels one. + if (request.move !== undefined) { + const key = PICK_KEYS.find((k) => k === request.move); + const result: PickMoveResult = !key + ? { moved: false, error: 'Unknown key.' } + : (moveComponentPick?.(key) ?? { moved: false, error: 'No pick is running.' }); + if (typeof request.requestId === 'string') { + void my.rpc + .call('component-pick-result', { requestId: request.requestId, pageId, result }) + .catch(() => {}); + } + return; + } cancelComponentPick?.(); if (request.cancel === true || typeof request.requestId !== 'string') return; const requestId = request.requestId; const pick = startComponentPick({ getNg, - highlight: { show: showHighlight, clear: clearHighlight }, + highlight: { show: (el, reveal) => showHighlight(el, { reveal }), clear: clearHighlight }, }); cancelComponentPick = pick.cancel; + moveComponentPick = pick.move; void pick.result.then((result) => { - if (cancelComponentPick === pick.cancel) cancelComponentPick = null; + if (cancelComponentPick === pick.cancel) { + cancelComponentPick = null; + moveComponentPick = null; + } if (result.ok) { componentTarget = result.id; consoleGlobals.selectComponent(result.id); From 17317014feda6300dd0e84e10dae813a63c98c50 Mon Sep 17 00:00:00 2001 From: erKam Date: Sat, 7 Nov 2026 16:32:57 +0000 Subject: [PATCH 3/9] feat(components): list the most checked components in the cd panel The change-detection agent tool listed the most often checked classes, but the panel only had the slowest ones. Add a Most often checked table with the number of cycles, and make the class names in both tables select the most checked instance in the tree. The rows keep track $index, since two classes can share a name. Refs #366 --- .../__tests__/duplicate-track-keys.test.ts | 42 ++++++++++-- app/src/pages/cd-recording.ts | 65 ++++++++++++++++++- .../docs/src/content/inspectors/components.md | 1 + packages/devtools/CHANGELOG.md | 2 +- 4 files changed, 103 insertions(+), 7 deletions(-) diff --git a/app/src/__tests__/duplicate-track-keys.test.ts b/app/src/__tests__/duplicate-track-keys.test.ts index bc950f37..c5cecdc8 100644 --- a/app/src/__tests__/duplicate-track-keys.test.ts +++ b/app/src/__tests__/duplicate-track-keys.test.ts @@ -61,11 +61,17 @@ describe('lists with repeated keys', () => { await settle(fixture); fixture.componentRef.setInput('page', cdPage([2, 7])); await settle(fixture); - const rows = Array.from( - (fixture.nativeElement as HTMLElement).querySelectorAll('tbody tr'), - (row) => Array.from(row.querySelectorAll('td'), (cell) => cell.textContent?.trim()).join('|'), - ); - expect(rows).toEqual(['ItemComponent|1|7.00 ms|7.00 ms', 'ItemComponent|1|2.00 ms|2.00 ms']); + const rows = (table: number) => + Array.from( + (fixture.nativeElement as HTMLElement) + .querySelectorAll('.cd-grid table') + [table]!.querySelectorAll('tbody tr'), + (row) => + Array.from(row.querySelectorAll('td'), (cell) => cell.textContent?.trim()).join('|'), + ); + expect(rows(0)).toEqual(['ItemComponent|1|7.00 ms|7.00 ms', 'ItemComponent|1|2.00 ms|2.00 ms']); + // The "Most often checked" table lists the same two classes. + expect(rows(1)).toEqual(['ItemComponent|1|1|7.00 ms', 'ItemComponent|1|1|2.00 ms']); expect(logs(spies)).not.toContain('NG0955'); }); @@ -87,3 +93,29 @@ describe('lists with repeated keys', () => { expect(logs(spies)).not.toContain('NG0955'); }); }); + +describe('change detection component tables', () => { + it('lists the most checked classes and selects one from its name', async () => { + const fixture = TestBed.createComponent(CdRecording); + const stat = (name: string, checks: number, ms: number) => ({ + name, + checks, + ms, + maxMs: ms, + cycles: checks, + }); + fixture.componentRef.setInput('page', { + ...cdPage([1, 1]), + components: [stat('Slow', 1, 9), stat('Busy', 12, 1)], + }); + await settle(fixture); + const shown: string[] = []; + fixture.componentInstance.showComponent.subscribe((name) => shown.push(name)); + const tables = (fixture.nativeElement as HTMLElement).querySelectorAll('.cd-grid table'); + const first = (table: Element) => table.querySelector('tbody .name-link')!; + expect(first(tables[0]!).textContent?.trim()).toBe('Slow'); + expect(first(tables[1]!).textContent?.trim()).toBe('Busy'); + (first(tables[1]!) as HTMLButtonElement).click(); + expect(shown).toEqual(['Busy']); + }); +}); diff --git a/app/src/pages/cd-recording.ts b/app/src/pages/cd-recording.ts index a8cd25bb..aad1d2e8 100644 --- a/app/src/pages/cd-recording.ts +++ b/app/src/pages/cd-recording.ts @@ -216,7 +216,11 @@ const SHOWN_CYCLES = 30; @for (c of slowest(); track $index) { - {{ c.name }} + + + {{ c.checks }} {{ ms(c.ms) }} {{ ms(c.maxMs) }} @@ -228,6 +232,41 @@ const SHOWN_CYCLES = 30; } +

        + {{ range() ? 'Most often checked in the picked cycles' : 'Most often checked' }} +

        + + + + + + + + + + + + @for (c of busiest(); track $index) { + + + + + + + } @empty { + + + + } + +
        ComponentChecksCyclesSelf time
        + + {{ c.checks }}{{ c.cycles }}{{ ms(c.ms) }}
        No component checks in the picked cycles.
        +

        + Select a component name to show its most checked instance in the tree. +

        Latest cycles

        @@ -393,6 +432,26 @@ const SHOWN_CYCLES = 30; td.mono { overflow-wrap: anywhere; } + .name-link { + height: auto; + min-height: 0; + padding: 0; + border: 0; + background: none; + color: var(--text-strong); + font: inherit; + text-align: left; + text-decoration: underline; + text-underline-offset: 2px; + cursor: pointer; + } + .name-link:hover { + background: none; + text-decoration-thickness: 2px; + } + .name-link:focus-visible { + @include m.focus-ring(-2px); + } .num { text-align: right; font-variant-numeric: tabular-nums; @@ -509,6 +568,10 @@ export class CdRecording { : `cycles ${picked[0].id} to ${picked.at(-1)!.id}`; }); readonly slowest = computed(() => this.stats().slice(0, SHOWN)); + /** The classes Angular checked most often, as the change-detection tool lists them. */ + readonly busiest = computed(() => + [...this.stats()].sort((a, b) => b.checks - a.checks).slice(0, SHOWN), + ); readonly latest = computed(() => this.cycles().slice(-SHOWN_CYCLES).reverse()); /** Says when the recording checked more classes or instances than it keeps. */ readonly capNotes = computed(() => { diff --git a/apps/docs/src/content/inspectors/components.md b/apps/docs/src/content/inspectors/components.md index 75f9c567..5c132a13 100644 --- a/apps/docs/src/content/inspectors/components.md +++ b/apps/docs/src/content/inspectors/components.md @@ -210,6 +210,7 @@ A recording keeps running when the tab reloads, so it catches the next start of - **Spans in the picked cycles**: when the page reports timed spans, a flame graph of the picked cycles. Time runs left to right, cycle after cycle with the idle time between them left out, and a span nested in another sits one row lower. Each span is a component check (solid), a lifecycle hook (stripes), an `afterRender` callback (dots) or the output listener that triggered the cycle (lines, drawn before the cycle's start), with a key under the graph. Hover or focus a span to read its total and self time. The arrow keys move along a row, **Up** goes to the enclosing span and **Down** to the first nested one. **Enter** or a click on a component, hook or output selects that component in the tree. **Show the spans as a table** lists the same spans. The graph shows at most 30 cycles; pick a smaller range when more are picked. - **Self time by component**: a treemap of each component class's self time in the picked cycles, largest first. The recording has no parent links between components, so the cells are not nested. Click a cell, or press **Enter** on it, to select an instance of that class in the tree (the one checked most often). - **Slowest components**: each component class with its check count, its self time (its own template and hooks, children excluded) and its slowest single check. +- **Most often checked**: the same classes by check count, with the number of cycles that checked them, as the [`change-detection`](../agents/tools.md#change-detection) tool lists them. In both tables, click a class name to select its most checked instance in the tree. - **Latest cycles**, newest first: the start time, the duration, how many components Angular checked, how many sync passes it ran, what started the cycle (see [Why it ran and what it wasted](#why-it-ran-and-what-it-wasted)), how many refreshed checks changed nothing, the time in lifecycle hooks and in `afterRender` callbacks, and the slowest component in it. A recording without causes shows the output listener that ran just before the cycle instead (an output that ended more than 50 ms before the cycle is not counted). - **Lifecycle hooks**: time per class and hook (`ngOnChanges`, `ngOnInit`, `ngDoCheck`, `ngAfterContentChecked`, `ngAfterViewChecked` and the others Angular calls), with call count and slowest call. A hook's time is also part of the self time of the component whose view runs it. - **Output listeners**: time per class and listener, without the time of outputs the listener emitted, with call count and slowest call. diff --git a/packages/devtools/CHANGELOG.md b/packages/devtools/CHANGELOG.md index afebc4ee..08d6ecb5 100644 --- a/packages/devtools/CHANGELOG.md +++ b/packages/devtools/CHANGELOG.md @@ -144,7 +144,7 @@ What remains: `/config` exports `DEFAULT_POPUP_HOTKEY`, `PANGULAR_ACTIONS`, `PAN - **Components:** **Copy as JSON** (the redacted values the panel shows) and **Copy host path** (a CSS selector for `document.querySelector`) in the detail header; an outline that fades over one second on a value that changed since the last refresh; **Show in Signals** for the component and for each signal property, also as a `#tab=signals&id=` deep link and through `open-in-panel`; and the `@defer` blocks of the selected component's template. - **Components:** pick a component with the keyboard: the arrow keys move the highlight through the components on the page and Enter picks, from the panel or the page. Directives show a **Likely** source file from the source scan, matched by class name. - **Defer blocks:** a block that hydrated before the devtools attached shows **hydrated before inspection** in the panel and in the `defer-blocks` tool. -- **Change detection:** a recording that keeps running when the tab reloads (until **Stop recording**), a per-cycle chart, a flame graph, hook timing, export and import of recordings, flash checks on the page, a Pangular track in the Chrome Performance panel, an Angular profiling toggle, and what triggered each check, with wasted checks, OnPush hints and components that need zone.js. +- **Change detection:** a recording that keeps running when the tab reloads (until **Stop recording**), a **Most often checked** table next to **Slowest components** with class names that select an instance, a per-cycle chart, a flame graph, hook timing, export and import of recordings, flash checks on the page, a Pangular track in the Chrome Performance panel, an Angular profiling toggle, and what triggered each check, with wasted checks, OnPush hints and components that need zone.js. - **Leaks:** live subscriptions and effects per component, and components that stay alive after they are destroyed. - **Signals:** the live signal graph drawn, watched signals, and links from components to injectors. - **Injectors:** a page picker, a created provider's value, startup timing and the slowest providers. From 053c6d2fac13a83f8cac715468fe3b340aa9755d Mon Sep 17 00:00:00 2001 From: erKam Date: Sat, 7 Nov 2026 16:36:22 +0000 Subject: [PATCH 4/9] feat(components): open defer block details with transitions and mismatches The Defer blocks list had more data than it showed: the block id, when it entered its state or hydrated, and its root elements. Each row now has a details toggle with these, every trigger, the last six state transitions the overlay saw (sent as transitions on the block), and a link to a hydration mismatch on one of its root elements, which also gets a mismatch badge on the row. Refs #366 --- .../__tests__/component-tree-defer.test.ts | 59 ++++++ app/src/pages/component-tree.ts | 2 + app/src/pages/defer-blocks-section.ts | 186 +++++++++++++++++- apps/docs/src/content/agents/resources.md | 2 +- .../docs/src/content/inspectors/components.md | 4 +- packages/devtools/CHANGELOG.md | 2 +- .../src/__tests__/defer-blocks.test.ts | 58 +++++- packages/devtools/src/defer-blocks.ts | 19 +- .../src/rpc/component-report-guard.ts | 14 ++ packages/devtools/src/types.ts | 5 + 10 files changed, 344 insertions(+), 7 deletions(-) diff --git a/app/src/__tests__/component-tree-defer.test.ts b/app/src/__tests__/component-tree-defer.test.ts index 8c457b5c..a48d95c1 100644 --- a/app/src/__tests__/component-tree-defer.test.ts +++ b/app/src/__tests__/component-tree-defer.test.ts @@ -265,3 +265,62 @@ describe('defer blocks', () => { fixture.destroy(); }); }); + +describe('defer block details', () => { + afterEach(() => { + document.body.innerHTML = ''; + }); + + it('open below the row with the block id, transitions and mismatches inside it', async () => { + const fixture = TestBed.createComponent(ComponentTree); + const page = { + pageId: 'p1', + roots: [{ id: 'c1', name: 'App', tag: 'app-root', children: [] }], + count: 1, + detail: null, + reportedAt: 1000, + hydration: { + hydrated: true, + counts: { hydrated: 1, skipped: 0, mismatched: 1, clientOnly: 0, dehydratedBlocks: 0 }, + mismatches: [{ id: 'e9', name: 'Note', tag: 'app-note' }], + }, + deferBlocks: [ + { + id: 'd4', + owner: { id: 'c1', name: 'App', tag: 'app-root' }, + state: 'complete', + hydration: 'not-configured', + triggers: ['on idle'], + rootIds: ['e9'], + since: 2000, + transitions: [ + { state: 'placeholder', hydration: 'not-configured', at: 1000 }, + { state: 'complete', hydration: 'not-configured', at: 2000 }, + ], + }, + ], + }; + fixture.componentRef.setInput('rpc', client({ p1: page })); + for (let i = 0; i < 3; i++) { + await new Promise((resolve) => setTimeout(resolve)); + await fixture.whenStable(); + } + const el = fixture.nativeElement as HTMLElement; + expect(el.querySelector('.defer-row')!.textContent).toContain('mismatch'); + const toggle = el.querySelector('.defer-toggle')!; + expect(toggle.getAttribute('aria-expanded')).toBe('false'); + expect(el.querySelector('.defer-detail')).toBeNull(); + toggle.click(); + await fixture.whenStable(); + expect(toggle.getAttribute('aria-expanded')).toBe('true'); + const detail = el.querySelector('.defer-detail')!; + expect(toggle.getAttribute('aria-controls')).toBe(detail.id); + expect(detail.textContent).toContain('d4'); + expect(Array.from(detail.querySelectorAll('.transitions .mono'), (s) => s.textContent)).toEqual( + ['placeholder', 'complete'], + ); + const revealed = vi.spyOn(fixture.componentInstance, 'revealNode'); + detail.querySelector('.mismatch-links button')!.click(); + expect(revealed).toHaveBeenCalledWith('e9'); + }); +}); diff --git a/app/src/pages/component-tree.ts b/app/src/pages/component-tree.ts index afbb5e61..c0c865d7 100644 --- a/app/src/pages/component-tree.ts +++ b/app/src/pages/component-tree.ts @@ -869,7 +869,9 @@ function storedDirectiveHosts(): boolean { [blocks]="deferBlocks()" [truncated]="page()?.deferTruncated === true" [clockOffset]="page()?.clockOffset ?? 0" + [mismatches]="page()?.hydration?.mismatches ?? []" (showOwner)="showOwner($event)" + (showNode)="revealNode($event)" (highlight)="$event ? highlightBlock($event) : highlight(null)" /> @if (deferUnavailable()) { diff --git a/app/src/pages/defer-blocks-section.ts b/app/src/pages/defer-blocks-section.ts index 3417fbcb..e3c4e0b4 100644 --- a/app/src/pages/defer-blocks-section.ts +++ b/app/src/pages/defer-blocks-section.ts @@ -13,6 +13,7 @@ import { deferNotes, type DeferNote, } from '@pangular-inspector/devtools/internal/config'; +import { time } from '../format'; export interface DeferBlock { id: string; @@ -26,6 +27,8 @@ export interface DeferBlock { since?: number; /** Page clock, ms since epoch, when the overlay saw the block hydrate. */ hydratedAt?: number; + /** The state changes the overlay saw, oldest first, on the page clock. */ + transitions?: { state: string; hydration: string; at: number }[]; hasErrorBlock?: boolean; /** Times from `@loading (after …; minimum …)`, in ms. */ loading?: { minimumTime: number | null; afterTime: number | null }; @@ -33,8 +36,17 @@ export interface DeferBlock { placeholder?: { minimumTime: number | null }; } +/** A hydration mismatch of the page, as the Hydration section lists it. */ +export interface DeferMismatch { + id: string; + name: string; + tag: string; +} + interface Row { block: DeferBlock; + /** Mismatched components that are root elements of the block. */ + mismatches: DeferMismatch[]; notes: DeferNote[]; timings: string; /** `hydrated`, or `hydrated before inspection` when the overlay attached later. */ @@ -78,7 +90,7 @@ export function deferTimings(block: DeferBlock): string {
          @for (row of rows(); track row.block.id) { -
        • +
        • + + @if (isOpen(row.block.id)) { +
          +
          +
          Block
          +
          {{ row.block.id }}
          + @if (row.block.owner; as owner) { +
          Template of
          +
          {{ owner.name }} <{{ owner.tag }}>
          + } + @if (row.block.since) { +
          In this state since
          +
          {{ clock(row.block.since) }}
          + } + @if (row.block.hydration === 'hydrated') { +
          Hydrated
          +
          + {{ + row.block.hydratedAt === undefined + ? 'Before the devtools attached' + : clock(row.block.hydratedAt) + }} +
          + } +
          Root elements
          +
          {{ row.block.rootIds.length || 'None rendered' }}
          +
          Triggers
          +
          {{ row.block.triggers.join(', ') || 'None' }}
          +
          + @if (row.block.transitions?.length) { +

          Transitions

          +
            + @for (step of row.block.transitions; track $index) { +
          1. + {{ clock(step.at) }} + {{ step.state }} + @if (step.hydration !== 'not-configured') { + {{ step.hydration }} + } +
          2. + } +
          + } + @if (row.mismatches.length) { +

          Hydration mismatches

          + + } +
          + }
        • }
        @@ -167,6 +251,82 @@ export function deferTimings(block: DeferBlock): string { padding: 0; list-style: none; } + .defer-item { + display: grid; + grid-template-columns: minmax(0, 1fr) var(--control-h); + gap: 6px; + } + .defer-toggle { + width: var(--control-h); + padding: 0; + background: var(--surface); + } + .defer-toggle svg { + width: 14px; + height: 14px; + fill: none; + stroke: currentColor; + stroke-width: 2; + transition: transform 150ms var(--ease); + } + .defer-toggle[aria-expanded='true'] svg { + transform: rotate(90deg); + } + @media (prefers-reduced-motion: reduce) { + .defer-toggle svg { + transition: none; + } + } + .defer-toggle:focus-visible { + @include m.focus-ring; + } + .defer-detail { + grid-column: 1 / -1; + padding: 8px 12px; + border: 1px solid var(--border); + border-radius: var(--radius-sm); + background: var(--bg); + font-size: 12px; + } + .defer-detail dl { + display: grid; + grid-template-columns: max-content minmax(0, 1fr); + gap: 4px 12px; + margin: 0; + } + .defer-detail dt { + color: var(--text-2); + } + .defer-detail dd { + min-width: 0; + margin: 0; + color: var(--text); + overflow-wrap: anywhere; + } + .detail-label { + @include m.label; + margin: 10px 0 4px; + } + .transitions, + .mismatch-links { + display: grid; + gap: 4px; + margin: 0; + padding: 0; + list-style: none; + } + .transitions li { + display: flex; + flex-wrap: wrap; + gap: 8px; + } + .when, + .muted { + color: var(--text-2); + } + .mismatch-links button:focus-visible { + @include m.focus-ring; + } .defer-row { justify-content: flex-start; flex-wrap: wrap; @@ -246,6 +406,12 @@ export class DeferBlocksSection { /** The server clock minus the page clock, in ms, so ages are read on the page's clock. */ readonly clockOffset = input(0); readonly showOwner = output(); + /** The hydration mismatches of the page, linked from the blocks they sit in. */ + readonly mismatches = input([]); + /** A mismatched component to select in the tree. */ + readonly showNode = output(); + /** The blocks whose details are open. */ + private readonly open = signal>(new Set()); /** The block to highlight in the app, or `null` to clear it. */ readonly highlight = output(); @@ -265,10 +431,28 @@ export class DeferBlocksSection { // A block without a time (an older page) gets no age notes. notes: deferNotes({ ...block, since: block.since || pageNow }, pageNow), timings: deferTimings(block), + mismatches: this.mismatches().filter((m) => block.rootIds.includes(m.id)), hydrated: block.hydration === 'hydrated' ? deferHydrationLabel(block) : '', })); }); + protected isOpen(id: string): boolean { + return this.open().has(id); + } + + protected toggle(id: string) { + this.open.update((set) => { + const next = new Set(set); + if (!next.delete(id)) next.add(id); + return next; + }); + } + + /** A page clock time, such as `14:02:11`. */ + protected clock(at: number): string { + return time(at); + } + constructor() { let tick: ReturnType | undefined; const stop = () => { diff --git a/apps/docs/src/content/agents/resources.md b/apps/docs/src/content/agents/resources.md index ea37dcfb..124e0153 100644 --- a/apps/docs/src/content/agents/resources.md +++ b/apps/docs/src/content/agents/resources.md @@ -50,7 +50,7 @@ When `component-tree`, `signal-graph` or `ngrx-store` runs past 100,000 characte ### 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). `deferBlocks` lists the page's `@defer` blocks, and is missing when the page has no util to read them. `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. `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. `deferBlocks` lists the page's `@defer` blocks, and is missing when the page has no util to read them. A block's `transitions` lists the state changes the page saw, oldest first, with `state`, `hydration` and `at` on the page's clock, once the block changed while the devtools watched. `nodes` repeats the roots of the most recent page. The instance ids here are what `highlight` and `inspect-component` accept. diff --git a/apps/docs/src/content/inspectors/components.md b/apps/docs/src/content/inspectors/components.md index 5c132a13..1998cfdf 100644 --- a/apps/docs/src/content/inspectors/components.md +++ b/apps/docs/src/content/inspectors/components.md @@ -167,7 +167,9 @@ A row also carries the notes the [`defer-blocks`](../agents/tools.md#defer-block When the block sets times, the row lists them, such as `placeholder min 500ms · loading after 100ms, min 1s`. Ages are counted on the page's clock, so a page on another device with its clock set wrong still shows the right age. The panel counts on from its own clock, so it assumes the panel and the server agree on the time, as they do when both run on one machine. A screen reader reads the badge as **stuck** or **waiting** without the seconds, so the row's name does not change while the age counts up. -Hover or focus a row to highlight the block in the page. A block with several root elements gets one box around all of them. Click it to select the component that holds it. The list is hidden when the page renders no defer blocks, or when its Angular version has no util to read them. +Hover or focus a row to highlight the block in the page. A block with several root elements gets one box around all of them. Click it to select the component that holds it. + +The arrow button next to a row opens the block's details: its id (the one [`load-defer-block`](../agents/tools.md#load-defer-block) takes), the host tag of its component, when it entered its state and when it hydrated, on the page's clock, how many root elements it rendered and every trigger. **Transitions** lists the state changes the page saw, up to the last six, starting from the state it found when the devtools attached. A **mismatch** badge marks a block whose root element is a component with a [hydration mismatch](#hydration), and the details have a button that selects that component. The list is hidden when the page renders no defer blocks, or when its Angular version has no util to read them. The list holds the first 500 blocks of a page. When the page has more, the count reads **500+**. diff --git a/packages/devtools/CHANGELOG.md b/packages/devtools/CHANGELOG.md index 08d6ecb5..fd5851d6 100644 --- a/packages/devtools/CHANGELOG.md +++ b/packages/devtools/CHANGELOG.md @@ -143,7 +143,7 @@ What remains: `/config` exports `DEFAULT_POPUP_HOTKEY`, `PANGULAR_ACTIONS`, `PAN - **Components:** edit inputs, properties and writable signals; `@for` blocks; directive hosts; hydration status per component with an outline on the page; nested values on demand; console handles; expand all and collapse all. - **Components:** **Copy as JSON** (the redacted values the panel shows) and **Copy host path** (a CSS selector for `document.querySelector`) in the detail header; an outline that fades over one second on a value that changed since the last refresh; **Show in Signals** for the component and for each signal property, also as a `#tab=signals&id=` deep link and through `open-in-panel`; and the `@defer` blocks of the selected component's template. - **Components:** pick a component with the keyboard: the arrow keys move the highlight through the components on the page and Enter picks, from the panel or the page. Directives show a **Likely** source file from the source scan, matched by class name. -- **Defer blocks:** a block that hydrated before the devtools attached shows **hydrated before inspection** in the panel and in the `defer-blocks` tool. +- **Defer blocks:** a block that hydrated before the devtools attached shows **hydrated before inspection** in the panel and in the `defer-blocks` tool. Each row opens its details: id, state and hydration times, root elements, triggers, its last state transitions, and a link to a hydration mismatch inside it, marked with a **mismatch** badge. - **Change detection:** a recording that keeps running when the tab reloads (until **Stop recording**), a **Most often checked** table next to **Slowest components** with class names that select an instance, a per-cycle chart, a flame graph, hook timing, export and import of recordings, flash checks on the page, a Pangular track in the Chrome Performance panel, an Angular profiling toggle, and what triggered each check, with wasted checks, OnPush hints and components that need zone.js. - **Leaks:** live subscriptions and effects per component, and components that stay alive after they are destroyed. - **Signals:** the live signal graph drawn, watched signals, and links from components to injectors. diff --git a/packages/devtools/src/__tests__/defer-blocks.test.ts b/packages/devtools/src/__tests__/defer-blocks.test.ts index 62ce7426..63636b4c 100644 --- a/packages/devtools/src/__tests__/defer-blocks.test.ts +++ b/packages/devtools/src/__tests__/defer-blocks.test.ts @@ -1,7 +1,12 @@ // @vitest-environment jsdom import { afterEach, describe, expect, it } from 'vitest'; import { deferHydrationLabel, deferNotes } from '../config.ts'; -import { MAX_DEFER_BLOCKS, createDeferTracker, type DeferDebugNg } from '../defer-blocks.ts'; +import { + MAX_DEFER_BLOCKS, + MAX_DEFER_TRANSITIONS, + createDeferTracker, + type DeferDebugNg, +} from '../defer-blocks.ts'; import { elementById } from '../element-id.ts'; import { DEFER_ROWS, deferBlocksText, toComponentPage } from '../rpc/component-tools.ts'; import { MAX_TOOL_CHARS } from '../rpc/router-tools.ts'; @@ -462,3 +467,54 @@ describe('deferNotes', () => { expect(deferNotes(block, Date.now()).map((note) => note.kind)).toEqual([]); }); }); + +describe('defer block transitions', () => { + it('keeps the state changes the overlay saw, and none for a block that never changed', () => { + const { anchor, lazy, instances } = page(); + let raw: unknown[] = [block({ hostNode: anchor }), block({ hostNode: lazy })]; + const ng: DeferDebugNg = { + getComponent: (el) => instances.get(el) ?? null, + ɵgetControlFlowBlocks: () => raw, + }; + let clock = 1000; + const tracker = createDeferTracker(() => clock); + expect(tracker.collect(ng)![0].transitions).toBeUndefined(); + clock = 2000; + raw = [block({ hostNode: anchor, state: 'loading' }), block({ hostNode: lazy })]; + tracker.collect(ng); + clock = 3000; + raw = [block({ hostNode: anchor, state: 'complete' }), block({ hostNode: lazy })]; + const [loaded, idle] = tracker.collect(ng)!; + expect(loaded.transitions).toEqual([ + { state: 'placeholder', hydration: 'not-configured', at: 1000 }, + { state: 'loading', hydration: 'not-configured', at: 2000 }, + { state: 'complete', hydration: 'not-configured', at: 3000 }, + ]); + expect(idle.transitions).toBeUndefined(); + for (let i = 0; i < 10; i++) { + clock += 1000; + raw = [block({ hostNode: anchor, state: i % 2 ? 'complete' : 'error' })]; + tracker.collect(ng); + } + expect(tracker.collect(ng)![0].transitions).toHaveLength(MAX_DEFER_TRANSITIONS); + }); +}); + +describe('guardDeferBlocks transitions', () => { + it('keeps valid steps only, at most six', async () => { + const { guardDeferBlocks } = await import('../rpc/component-report-guard.ts'); + const steps = [ + { state: 'placeholder', hydration: 'dehydrated', at: 1 }, + { state: 2, at: 2 }, + { state: 'complete', hydration: 'bogus', at: 3 }, + { state: 'complete', at: 'later' }, + ]; + const [out] = guardDeferBlocks([{ id: 'd1', state: 'complete', transitions: steps }]); + expect(out!.transitions).toEqual([ + { state: 'placeholder', hydration: 'dehydrated', at: 1 }, + { state: 'complete', hydration: 'not-configured', at: 3 }, + ]); + const many = Array.from({ length: 9 }, (_, i) => ({ state: 's', at: i })); + expect(guardDeferBlocks([{ id: 'd1', transitions: many }])[0]!.transitions).toHaveLength(6); + }); +}); diff --git a/packages/devtools/src/defer-blocks.ts b/packages/devtools/src/defer-blocks.ts index ac2a320d..6b7d8acf 100644 --- a/packages/devtools/src/defer-blocks.ts +++ b/packages/devtools/src/defer-blocks.ts @@ -23,6 +23,8 @@ interface RawDeferBlock { /** The most defer blocks one collection reports. */ export const MAX_DEFER_BLOCKS = 500; const MAX_ROOT_IDS = 5; +/** The state changes a block keeps, newest last. */ +export const MAX_DEFER_TRANSITIONS = 6; const DEFER_TYPE = 0; const HYDRATION = new Set(['not-configured', 'dehydrated', 'hydrated']); @@ -66,7 +68,11 @@ function timeOf(value: unknown): number | null { */ export function createDeferTracker(now: () => number = Date.now) { const ids = new WeakMap(); - const seen = new WeakMap(); + type Transition = NonNullable[number]; + const seen = new WeakMap< + object, + { key: string; since: number; hydratedAt?: number; transitions: Transition[] } + >(); const byPosition = new WeakMap(); const lastHosts = new WeakMap(); let nextId = 0; @@ -160,10 +166,17 @@ export function createDeferTracker(now: () => number = Date.now) { : []; const key = `${raw.state}|${hydration}`; const previous = seen.get(host); + const changed = !previous || previous.key !== key; const record = { key, - since: previous && previous.key === key ? previous.since : now(), + since: changed ? now() : previous.since, hydratedAt: previous?.hydratedAt, + transitions: changed + ? [ + ...(previous?.transitions ?? []), + { state: raw.state, hydration, at: now() }, + ].slice(-MAX_DEFER_TRANSITIONS) + : previous.transitions, }; if (previous?.key.endsWith('|dehydrated') && hydration === 'hydrated') { record.hydratedAt = now(); @@ -195,6 +208,8 @@ export function createDeferTracker(now: () => number = Date.now) { block.placeholder = { minimumTime: timeOf(raw.placeholderBlock.minimumTime) }; } if (record.hydratedAt !== undefined) block.hydratedAt = record.hydratedAt; + // The first entry is the state the overlay found; only a change is worth sending. + if (record.transitions.length > 1) block.transitions = record.transitions; out.push(block); lastById.set(block.id, { host, block }); } diff --git a/packages/devtools/src/rpc/component-report-guard.ts b/packages/devtools/src/rpc/component-report-guard.ts index cb82d92b..c241238e 100644 --- a/packages/devtools/src/rpc/component-report-guard.ts +++ b/packages/devtools/src/rpc/component-report-guard.ts @@ -135,6 +135,9 @@ export function guardClockOffset(pageNow: unknown, now: number): number | undefi return page !== undefined && page > 0 ? Math.round(now - page) : undefined; } +/** The most state changes kept per defer block, as the overlay sends them. */ +const MAX_GUARDED_TRANSITIONS = 6; + /** The defer blocks that have an `id`, with every field the tools read set to a safe value. */ export function guardDeferBlocks(value: unknown): DeferBlockInfo[] { return records(value) @@ -156,6 +159,17 @@ export function guardDeferBlocks(value: unknown): DeferBlockInfo[] { if (block['hydrateNever'] === true) out.hydrateNever = true; const hydratedAt = finite(block['hydratedAt']); if (hydratedAt !== undefined) out.hydratedAt = hydratedAt; + const transitions = records(block['transitions']) + .slice(-MAX_GUARDED_TRANSITIONS) + .flatMap((step) => { + const at = finite(step['at']); + if (at === undefined || !str(step['state'])) return []; + const hydration = DEFER_HYDRATION.has(step['hydration'] as DeferBlockInfo['hydration']) + ? (step['hydration'] as DeferBlockInfo['hydration']) + : 'not-configured'; + return [{ state: (step['state'] as string).slice(0, 40), hydration, at }]; + }); + if (transitions.length) out.transitions = transitions; const time = (raw: unknown) => finite(raw) ?? null; if (isRecord(block['loading'])) { out.loading = { diff --git a/packages/devtools/src/types.ts b/packages/devtools/src/types.ts index 9426f6a1..df142e0c 100644 --- a/packages/devtools/src/types.ts +++ b/packages/devtools/src/types.ts @@ -262,6 +262,11 @@ export interface DeferBlockInfo { /** Page clock, ms since epoch, when the state or hydration state last changed. */ since: number; hydratedAt?: number; + /** + * The state changes the overlay saw, oldest first, on the page clock: the + * state it found, then each change. Left out until the block changed. + */ + transitions?: { state: string; hydration: DeferBlockInfo['hydration']; at: number }[]; } export interface ForBlockInfo { From 11e45fff464886c0ece0e8770fcaf7ba48eccee1 Mon Sep 17 00:00:00 2001 From: erKam Date: Sat, 7 Nov 2026 16:49:57 +0000 Subject: [PATCH 5/9] test(components): scope the cd table checks and count the new agent tool The change detection section now has two component tables, so the chart test reads the first one, and the tools page states ninety-nine tools now that load-defer-block is registered. --- app/src/__tests__/cd-cycle-chart.test.ts | 4 ++-- apps/docs/src/content/agents/tools.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/__tests__/cd-cycle-chart.test.ts b/app/src/__tests__/cd-cycle-chart.test.ts index 24c6bca2..5713f7c8 100644 --- a/app/src/__tests__/cd-cycle-chart.test.ts +++ b/app/src/__tests__/cd-cycle-chart.test.ts @@ -342,8 +342,8 @@ describe('CdRecording with the chart', () => { await fixture.whenStable(); const host = fixture.nativeElement as HTMLElement; const table = () => - [...host.querySelectorAll('.cd-grid table tbody tr')].map( - (tr) => tr.querySelector('td')!.textContent, + [...host.querySelectorAll('.cd-grid table:first-of-type tbody tr')].map((tr) => + tr.querySelector('td')!.textContent!.trim(), ); expect(host.querySelector('app-cd-cycle-chart')).not.toBeNull(); expect(table()).toEqual(['List', 'Cart']); diff --git a/apps/docs/src/content/agents/tools.md b/apps/docs/src/content/agents/tools.md index 03a3cbd7..6cad5dfe 100644 --- a/apps/docs/src/content/agents/tools.md +++ b/apps/docs/src/content/agents/tools.md @@ -4,7 +4,7 @@ description: Every agent tool the devtools expose, grouped by inspector, with wh --- - Ninety-eight tools, grouped by inspector. Each one answers a question you would otherwise answer by clicking through the panel. + Ninety-nine tools, grouped by inspector. Each one answers a question you would otherwise answer by clicking through the panel. # Tools From 535fa05183ee2958ff61409b670d1e4b33986bdf Mon Sep 17 00:00:00 2001 From: erKam Date: Sat, 7 Nov 2026 16:50:37 +0000 Subject: [PATCH 6/9] build(extension): rebuild the panel bundle --- ...=> browser-agent-rpc-KH4HHvHf-B4GGvz72.js} | 2 +- .../{index-B4D7r6Ti.js => index-BxDM3ey4.js} | 322 +++++++++++++----- extension/ui/index.html | 2 +- 3 files changed, 248 insertions(+), 78 deletions(-) rename extension/ui/assets/{browser-agent-rpc-KH4HHvHf-DtH28z9R.js => browser-agent-rpc-KH4HHvHf-B4GGvz72.js} (95%) rename extension/ui/assets/{index-B4D7r6Ti.js => index-BxDM3ey4.js} (71%) diff --git a/extension/ui/assets/browser-agent-rpc-KH4HHvHf-DtH28z9R.js b/extension/ui/assets/browser-agent-rpc-KH4HHvHf-B4GGvz72.js similarity index 95% rename from extension/ui/assets/browser-agent-rpc-KH4HHvHf-DtH28z9R.js rename to extension/ui/assets/browser-agent-rpc-KH4HHvHf-B4GGvz72.js index 16cfdd41..bd7ced0f 100644 --- a/extension/ui/assets/browser-agent-rpc-KH4HHvHf-DtH28z9R.js +++ b/extension/ui/assets/browser-agent-rpc-KH4HHvHf-B4GGvz72.js @@ -1 +1 @@ -import{t as e}from"./index-B4D7r6Ti.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-BxDM3ey4.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-B4D7r6Ti.js b/extension/ui/assets/index-BxDM3ey4.js similarity index 71% rename from extension/ui/assets/index-B4D7r6Ti.js rename to extension/ui/assets/index-BxDM3ey4.js index 835b0689..e0736bb8 100644 --- a/extension/ui/assets/index-B4D7r6Ti.js +++ b/extension/ui/assets/index-BxDM3ey4.js @@ -3,12 +3,12 @@ \r \v ᠎ - \u2028\u2029   `;`${Kt}`,`${Kt}`;var qt=(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})(qt||{}),Jt=(function(e){return e[e.Plain=0]=`Plain`,e[e.TemplateLiteralPart=1]=`TemplateLiteralPart`,e[e.TemplateLiteralEnd=2]=`TemplateLiteralEnd`,e})(Jt||{});qt.Character,x.StyleMap,x.ClassMap,x.StyleProp,x.ClassProp,x.Attribute,x.Property,x.Attribute,x.Control,x.DomProperty,x.DomProperty,x.Attribute,x.StyleMap,x.ClassMap,x.StyleProp,x.ClassProp,x.Listener,x.TwoWayListener,x.AnimationListener,x.StyleMap,x.ClassMap,x.StyleProp,x.ClassProp,x.Property,x.TwoWayProperty,x.DomProperty,x.Attribute,x.Animation,x.Control,Vt.Idle,b.deferOnIdle,b.deferPrefetchOnIdle,b.deferHydrateOnIdle,Vt.Immediate,b.deferOnImmediate,b.deferPrefetchOnImmediate,b.deferHydrateOnImmediate,Vt.Timer,b.deferOnTimer,b.deferPrefetchOnTimer,b.deferHydrateOnTimer,Vt.Hover,b.deferOnHover,b.deferPrefetchOnHover,b.deferHydrateOnHover,Vt.Interaction,b.deferOnInteraction,b.deferPrefetchOnInteraction,b.deferHydrateOnInteraction,Vt.Viewport,b.deferOnViewport,b.deferPrefetchOnViewport,b.deferHydrateOnViewport,Vt.Never,b.deferHydrateNever,b.deferHydrateNever,b.deferHydrateNever,b.pipeBind1,b.pipeBind2,b.pipeBind3,b.pipeBind4,b.textInterpolate,b.textInterpolate1,b.textInterpolate2,b.textInterpolate3,b.textInterpolate4,b.textInterpolate5,b.textInterpolate6,b.textInterpolate7,b.textInterpolate8,b.textInterpolateV,b.interpolate,b.interpolate1,b.interpolate2,b.interpolate3,b.interpolate4,b.interpolate5,b.interpolate6,b.interpolate7,b.interpolate8,b.interpolateV,b.pureFunction0,b.pureFunction1,b.pureFunction2,b.pureFunction3,b.pureFunction4,b.pureFunction5,b.pureFunction6,b.pureFunction7,b.pureFunction8,b.pureFunctionV,b.resolveWindow,b.resolveDocument,b.resolveBody,nt.HTML,b.sanitizeHtml,nt.RESOURCE_URL,b.sanitizeResourceUrl,nt.SCRIPT,b.sanitizeScript,nt.STYLE,b.sanitizeStyle,nt.URL,b.sanitizeUrl,nt.ATTRIBUTE_NO_BINDING,b.validateAttribute,nt.HTML,b.trustConstantHtml,nt.RESOURCE_URL,b.trustConstantResourceUrl;var Yt=(function(e){return e[e.None=0]=`None`,e[e.ViewContextRead=1]=`ViewContextRead`,e[e.ViewContextWrite=2]=`ViewContextWrite`,e[e.SideEffectful=4]=`SideEffectful`,e})(Yt||{});S.Tmpl,S.Tmpl,S.Both,S.Host,S.Tmpl,S.Tmpl,S.Tmpl,S.Both,S.Both,S.Both,S.Tmpl,S.Both,S.Both,S.Tmpl,S.Both,S.Tmpl,S.Both,S.Both,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Both,S.Both,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Both,S.Both,S.Both,S.Tmpl,S.Tmpl,S.Both,S.Tmpl,S.Tmpl,S.Tmpl,S.Both,S.Both,S.Tmpl,S.Both,S.Both,S.Both,S.Both,S.Both,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Both,S.Tmpl,S.Both,S.Tmpl,S.Both,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Both,S.Both,S.Both,Tt.Property,It.Property,Tt.TwoWay,It.TwoWayProperty,Tt.Attribute,It.Attribute,Tt.Class,It.ClassName,Tt.Style,It.StyleProperty,Tt.LegacyAnimation,It.LegacyAnimation,Tt.Animation,It.Animation;var Xt=`%COMP%`;`${Xt}`,`${Xt}`,class e{static SINGLETON=new e;static veWillInferAnyFor(t){let n=e.SINGLETON;return t instanceof wt?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 Zt=null,Qt=!1,$t=1,en=null,tn=Symbol(`SIGNAL`);function nn(e){let t=Zt;return Zt=e,t}function rn(){return Zt}var an={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 on(e){if(Qt)throw Error(``);if(Zt===null)return;Zt.consumerOnSignalRead(e);let t=Zt.producersTail;if(t!==void 0&&t.producer===e)return;let n,r=Zt.recomputing;if(r&&(n=t===void 0?Zt.producers:t.nextProducer,n!==void 0&&n.producer===e)){Zt.producersTail=n,n.lastReadVersion=e.version,n.knownValidAtEpoch=$t;return}let i=e.consumersTail;if(i!==void 0&&i.consumer===Zt&&(!r||i.knownValidAtEpoch===$t))return;let a=xn(Zt),o={producer:e,consumer:Zt,nextProducer:n,prevConsumer:void 0,knownValidAtEpoch:$t,lastReadVersion:e.version,nextConsumer:void 0};Zt.producersTail=o,t===void 0?Zt.producers=o:t.nextProducer=o,a&&yn(e,o)}function sn(){$t++}function cn(e){if((!xn(e)||e.dirty)&&(e.dirty||e.lastCleanEpoch!==$t)){if(!e.producerMustRecompute(e)&&!_n(e)){fn(e);return}e.producerRecomputeValue(e),fn(e)}}function ln(e){if(e.consumers===void 0)return;let t=Qt;Qt=!0;try{for(let t=e.consumers;t!==void 0;t=t.nextConsumer){let e=t.consumer;e.dirty||dn(e)}}finally{Qt=t}}function un(){return Zt?.consumerAllowSignalWrites!==!1}function dn(e){e.dirty=!0,ln(e),e.consumerMarkedDirty?.(e)}function fn(e){e.dirty=!1,e.lastCleanEpoch=$t}function pn(e){return e&&mn(e),nn(e)}function mn(e){if(e.producersTail?.knownValidAtEpoch===$t){let t=e.producers;for(;t!==void 0;)t.knownValidAtEpoch=null,t=t.nextProducer}e.producersTail=void 0,e.recomputing=!0}function hn(e,t){nn(t),e&&gn(e)}function gn(e){e.recomputing=!1;let t=e.producersTail,n=t===void 0?e.producers:t.nextProducer;if(n!==void 0){if(xn(e))do n=bn(n);while(n!==void 0);t===void 0?e.producers=void 0:t.nextProducer=void 0}}function _n(e){for(let t=e.producers;t!==void 0;t=t.nextProducer){let e=t.producer,n=t.lastReadVersion;if(n!==e.version||(cn(e),n!==e.version))return!0}return!1}function vn(e){if(xn(e)){let t=e.producers;for(;t!==void 0;)t=bn(t)}e.producers=void 0,e.producersTail=void 0,e.consumers=void 0,e.consumersTail=void 0}function yn(e,t){let n=e.consumersTail,r=xn(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)yn(t.producer,t)}function bn(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,!xn(t)){let e=t.producers;for(;e!==void 0;)e=bn(e)}return n}function xn(e){return e.consumerIsAlwaysLive||e.consumers!==void 0}function Sn(e){en?.(e)}function Cn(e,t){return Object.is(e,t)}function wn(e,t){let n=Object.create(On);n.computation=e,t!==void 0&&(n.equal=t);let r=()=>{if(cn(n),on(n),n.value===Dn)throw n.error;return n.value};return r[tn]=n,Sn(n),r}var Tn=Symbol(`UNSET`),En=Symbol(`COMPUTING`),Dn=Symbol(`ERRORED`),On={...an,value:Tn,dirty:!0,error:null,equal:Cn,kind:`computed`,producerMustRecompute(e){return e.value===Tn||e.value===En},producerRecomputeValue(e){if(e.value===En)throw Error(``);let t=e.value;e.value=En;let n=pn(e),r,i=!1;try{r=e.computation(),nn(null),i=t!==Tn&&t!==Dn&&r!==Dn&&e.equal(t,r)}catch(t){r=Dn,e.error=t}finally{hn(e,n)}if(i){e.value=t;return}e.value=r,e.version++}};function kn(){throw Error()}var An=kn;function jn(e){An(e)}function Mn(e){An=e}var Nn=null;function Pn(e,t){let n=Object.create(Rn);n.value=e,t!==void 0&&(n.equal=t);let r=()=>Fn(n);return r[tn]=n,Sn(n),[r,e=>In(n,e),e=>Ln(n,e)]}function Fn(e){return on(e),e.value}function In(e,t){un()||jn(e),e.equal(e.value,t)||(e.value=t,zn(e))}function Ln(e,t){un()||jn(e),In(e,t(e.value))}var Rn={...an,equal:Cn,value:void 0,kind:`signal`};function zn(e){e.version++,sn(),ln(e),Nn?.(e)}var Bn={...an,consumerIsAlwaysLive:!0,consumerAllowSignalWrites:!0,dirty:!0,kind:`effect`};function Vn(e){if(e.dirty=!1,e.version>0&&!_n(e))return;e.version++;let t=pn(e);try{e.cleanup(),e.fn()}finally{hn(e,t)}}var Hn=void 0;function Un(){return Hn}function Wn(e){let t=Hn;return Hn=e,t}var Gn=Symbol(`NotFound`);function Kn(e){return e===Gn||e?.name===`ɵNotFound`}function qn(e,t,n){let r=Object.create(Xn);r.source=e,r.computation=t,n!=null&&(r.equal=n);let i=()=>{if(cn(r),on(r),r.value===Dn)throw r.error;return r.value};return i[tn]=r,Sn(r),i}function Jn(e,t){cn(e),In(e,t),fn(e)}function Yn(e,t){if(cn(e),e.value===Dn)throw e.error;Ln(e,t),fn(e)}var Xn={...an,value:Tn,dirty:!0,error:null,equal:Cn,kind:`linkedSignal`,producerMustRecompute(e){return e.value===Tn||e.value===En},producerRecomputeValue(e){if(e.value===En)throw Error(``);let t=e.value;e.value=En;let n=pn(e),r,i=!1;try{let n=e.source(),a=t!==Tn&&t!==Dn,o=a?{source:e.sourceValue,value:t}:void 0;r=e.computation(n,o),e.sourceValue=n,nn(null),i=a&&r!==Dn&&e.equal(t,r)}catch(t){r=Dn,e.error=t}finally{hn(e,n)}if(i){e.value=t;return}e.value=r,e.version++}};function Zn(e){let t=nn(null);try{return e()}finally{nn(t)}}var Qn=function(e,t){return Qn=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])},Qn(e,t)};function $n(e,t){if(typeof t!=`function`&&t!==null)throw TypeError(`Class extends value `+String(t)+` is not a constructor or null`);Qn(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}function er(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 tr(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 rr(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 ir(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 ar?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 sr(e){if(!Symbol.asyncIterator)throw TypeError(`Symbol.asyncIterator is not defined.`);var t=e[Symbol.asyncIterator],n;return t?t.call(e):(e=typeof nr==`function`?nr(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 cr(e){return typeof e==`function`}function lr(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 ur=lr(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 dr(e,t){if(e){var n=e.indexOf(t);0<=n&&e.splice(n,1)}}var fr=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=nr(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(cr(c))try{c()}catch(e){i=e instanceof ur?e.errors:[e]}var l=this._finalizers;if(l){this._finalizers=null;try{for(var u=nr(l),d=u.next();!d.done;d=u.next()){var f=d.value;try{hr(f)}catch(e){i??=[],e instanceof ur?i=ir(ir([],rr(i)),rr(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 ur(i)}},e.prototype.add=function(t){if(t&&t!==this){if(this.closed)hr(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)&&dr(t,e)},e.prototype.remove=function(t){var n=this._finalizers;n&&dr(n,t),t instanceof e&&t._removeParent(this)},e.EMPTY=(function(){var t=new e;return t.closed=!0,t})(),e}(),pr=fr.EMPTY;function mr(e){return e instanceof fr||e&&`closed`in e&&cr(e.remove)&&cr(e.add)&&cr(e.unsubscribe)}function hr(e){cr(e)?e():e.unsubscribe()}var gr={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1},_r={setTimeout:function(e,t){var n=[...arguments].slice(2),r=_r.delegate;return r?.setTimeout?r.setTimeout.apply(r,ir([e,t],rr(n))):setTimeout.apply(void 0,ir([e,t],rr(n)))},clearTimeout:function(e){return(_r.delegate?.clearTimeout||clearTimeout)(e)},delegate:void 0};function vr(e){_r.setTimeout(function(){var t=gr.onUnhandledError;if(t)t(e);else throw e})}function yr(){}var br=(function(){return Cr(`C`,void 0,void 0)})();function xr(e){return Cr(`E`,void 0,e)}function Sr(e){return Cr(`N`,e,void 0)}function Cr(e,t,n){return{kind:e,value:t,error:n}}var wr=null;function Tr(e){if(gr.useDeprecatedSynchronousErrorHandling){var t=!wr;if(t&&(wr={errorThrown:!1,error:null}),e(),t){var n=wr,r=n.errorThrown,i=n.error;if(wr=null,r)throw i}}else e()}function Er(e){gr.useDeprecatedSynchronousErrorHandling&&wr&&(wr.errorThrown=!0,wr.error=e)}var Dr=function(e){$n(t,e);function t(t){var n=e.call(this)||this;return n.isStopped=!1,t?(n.destination=t,mr(t)&&t.add(n)):n.destination=Fr,n}return t.create=function(e,t,n){return new jr(e,t,n)},t.prototype.next=function(e){this.isStopped?Pr(Sr(e),this):this._next(e)},t.prototype.error=function(e){this.isStopped?Pr(xr(e),this):(this.isStopped=!0,this._error(e))},t.prototype.complete=function(){this.isStopped?Pr(br,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}(fr),Or=Function.prototype.bind;function kr(e,t){return Or.call(e,t)}var Ar=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){Mr(e)}},e.prototype.error=function(e){var t=this.partialObserver;if(t.error)try{t.error(e)}catch(e){Mr(e)}else Mr(e)},e.prototype.complete=function(){var e=this.partialObserver;if(e.complete)try{e.complete()}catch(e){Mr(e)}},e}(),jr=function(e){$n(t,e);function t(t,n,r){var i=e.call(this)||this,a;if(cr(t)||!t)a={next:t??void 0,error:n??void 0,complete:r??void 0};else{var o;i&&gr.useDeprecatedNextContext?(o=Object.create(t),o.unsubscribe=function(){return i.unsubscribe()},a={next:t.next&&kr(t.next,o),error:t.error&&kr(t.error,o),complete:t.complete&&kr(t.complete,o)}):a=t}return i.destination=new Ar(a),i}return t}(Dr);function Mr(e){gr.useDeprecatedSynchronousErrorHandling?Er(e):vr(e)}function Nr(e){throw e}function Pr(e,t){var n=gr.onStoppedNotification;n&&_r.setTimeout(function(){return n(e,t)})}var Fr={closed:!0,next:yr,error:Nr,complete:yr},Ir=(function(){return typeof Symbol==`function`&&Symbol.observable||`@@observable`})();function Lr(e){return e}function Rr(e){return e.length===0?Lr:e.length===1?e[0]:function(t){return e.reduce(function(e,t){return t(e)},t)}}var zr=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=Hr(e)?e:new jr(e,t,n);return Tr(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=Br(t),new t(function(t,r){var i=new jr({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[Ir]=function(){return this},e.prototype.pipe=function(){return Rr([...arguments])(this)},e.prototype.toPromise=function(e){var t=this;return e=Br(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 Br(e){return e??gr.Promise??Promise}function Vr(e){return e&&cr(e.next)&&cr(e.error)&&cr(e.complete)}function Hr(e){return e&&e instanceof Dr||Vr(e)&&mr(e)}function Ur(e){return cr(e?.lift)}function Wr(e){return function(t){if(Ur(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 Gr(e,t,n,r,i){return new Kr(e,t,n,r,i)}var Kr=function(e){$n(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}(Dr),qr=lr(function(e){return function(){e(this),this.name=`ObjectUnsubscribedError`,this.message=`object unsubscribed`}}),Jr=function(e){$n(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 Yr(this,this);return t.operator=e,t},t.prototype._throwIfClosed=function(){if(this.closed)throw new qr},t.prototype.next=function(e){var t=this;Tr(function(){var n,r;if(t._throwIfClosed(),!t.isStopped){t.currentObservers||=Array.from(t.observers);try{for(var i=nr(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;Tr(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;Tr(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?pr:(this.currentObservers=null,a.push(e),new fr(function(){t.currentObservers=null,dr(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 zr;return e.source=this,e},t.create=function(e,t){return new Yr(e,t)},t}(zr),Yr=function(e){$n(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)??pr},t}(Jr),Xr=function(e){$n(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}(Jr);function Zr(e){return e[e.length-1]}function Qr(e){return cr(Zr(e))?e.pop():void 0}var $r=(function(e){return e&&typeof e.length==`number`&&typeof e!=`function`});function ei(e){return cr(e?.then)}function ti(e){return cr(e[Ir])}function ni(e){return Symbol.asyncIterator&&cr(e?.[Symbol.asyncIterator])}function ri(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 ii(){return typeof Symbol!=`function`||!Symbol.iterator?`@@iterator`:Symbol.iterator}var ai=ii();function oi(e){return cr(e?.[ai])}function si(e){return or(this,arguments,function(){var t,n,r,i;return tr(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,ar(t.read())];case 3:return n=a.sent(),r=n.value,i=n.done,i?[4,ar(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,ar(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 ci(e){return cr(e?.getReader)}function li(e){if(e instanceof zr)return e;if(e!=null){if(ti(e))return uee(e);if($r(e))return dee(e);if(ei(e))return fee(e);if(ni(e))return ui(e);if(oi(e))return pee(e);if(ci(e))return mee(e)}throw ri(e)}function uee(e){return new zr(function(t){var n=e[Ir]();if(cr(n.subscribe))return n.subscribe(t);throw TypeError(`Provided object does not correctly implement Symbol.observable`)})}function dee(e){return new zr(function(t){for(var n=0;n=0?n.slice(0,r):n}function Ci(e,t){return e?t?`${e} ${t}`:e:t||``}var wi=bi({__forward_ref__:bi});function Ti(e){return e.__forward_ref__=Ti,e}function Ei(e){return Di(e)?e():e}function Di(e){return typeof e==`function`&&Object.hasOwn(e,wi)&&e.__forward_ref__===Ti}function Oi(e){return{token:e.token,providedIn:e.providedIn||null,factory:e.factory,value:void 0}}function ki(e){return Ai(e,Ni)}function Ai(e,t){return Object.hasOwn(e,t)&&e[t]||null}function ji(e){return(e?.[Ni]??null)||null}function Mi(e){return e&&Object.hasOwn(e,Pi)?e[Pi]:null}var Ni=bi({ɵprov:bi}),Pi=bi({ɵinj:bi}),Fi=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=Oi({token:this,providedIn:t.providedIn||`root`,factory:t.factory}))}get multi(){return this}toString(){return`InjectionToken ${this._desc}`}};function Ii(e){return e&&!!e.ɵproviders}var Li=bi({ɵcmp:bi}),Ri=bi({ɵdir:bi}),zi=bi({ɵpipe:bi}),Bi=bi({ɵfac:bi}),Vi=bi({__NG_ELEMENT_ID__:bi}),Hi=bi({__NG_ENV_ID__:bi});function Ui(e){return Ki(e,`@Component`),e[Li]||null}function Wi(e){return Ki(e,`@Directive`),e[Ri]||null}function Gi(e){return Ki(e,`@Pipe`),e[zi]||null}function Ki(e,t){if(e==null)throw new _i(-919,!1)}function qi(e){return typeof e==`string`?e:e==null?``:String(e)}var Ji=bi({ngErrorCode:bi}),Yi=bi({ngErrorMessage:bi}),Xi=bi({ngTokenPath:bi});function Zi(e,t){return $i(``,-200,t)}function Qi(e,t){throw new _i(-201,!1)}function $i(e,t,n){let r=new _i(t,e);return r[Ji]=t,r[Yi]=e,n&&(r[Xi]=n),r}function ea(e){return e[Ji]}var ta;function na(){return ta}function ra(e){let t=ta;return ta=e,t}function ia(e,t,n){let r=ki(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;Qi(e,``)}var aa=globalThis,oa={},sa=`__NG_DI_FLAG__`,ca=class{injector;constructor(e){this.injector=e}retrieve(e,t){let n=da(t)||0;try{return this.injector.get(e,n&8?null:oa,n)}catch(e){if(Kn(e))return e;throw e}}};function la(e,t=0){let n=Un();if(n===void 0)throw new _i(-203,!1);if(n===null)return ia(e,void 0,t);{let r=fa(t),i=n.retrieve(e,r);if(Kn(i)){if(r.optional)return null;throw i}return i}}function ua(e,t=0){return(na()||la)(Ei(e),t)}function C(e,t){return ua(e,da(t))}function da(e){return e===void 0||typeof e==`number`?e:0|(e.optional&&8)|(e.host&&1)|(e.self&&2)|(e.skipSelf&&4)}function fa(e){return{optional:!!(e&8),host:!!(e&1),self:!!(e&2),skipSelf:!!(e&4)}}function pa(e){let t=[];for(let n=0;nArray.isArray(e)?va(e,t):t(e))}function ya(e,t,n){t>=e.length?e.push(n):e.splice(t,0,n)}function ba(e,t){return t>=e.length-1?e.pop():e.splice(t,1)[0]}function xa(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 Ca(e,t,n){let r=Ta(e,t);return r>=0?e[r|1]=n:(r=~r,Sa(e,r,t,n)),r}function wa(e,t){let n=Ta(e,t);if(n>=0)return e[n|1]}function Ta(e,t){return Ea(e,t,1)}function Ea(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 va(t,e=>{let t=e;Ia(t,a,[],r)&&(i||=[],i.push(t))}),i!==void 0&&Fa(i,a),n}function Fa(e,t){for(let n=0;n{t(e,r)})}}function Ia(e,t,n,r){if(e=Ei(e),!e)return!1;let i=null,a=Mi(e),o=!a&&Ui(e);if(!a&&!o){let t=e.ngModule;if(a=Mi(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)Ia(i,t,n,r)}}else if(a){if(a.imports!=null&&!s){r.add(i);let e;try{va(a.imports,i=>{Ia(i,t,n,r)&&(e||=[],e.push(i))})}finally{}e!==void 0&&Fa(e,t)}if(!s){let e=ha(i)||(()=>new i);t({provide:i,useFactory:e,deps:Oa},i),t({provide:ja,useValue:i,multi:!0},i),t({provide:ka,useValue:()=>ua(i),multi:!0},i)}let o=a.providers;if(o!=null&&!s){let n=e;La(o,e=>{t(e,n)})}}else return!1;return i!==e&&e.providers!==void 0}function La(e,t){for(let n of e)Ii(n)&&(n=n.ɵproviders),Array.isArray(n)?La(n,t):t(n)}var Ra=bi({provide:String,useValue:bi});function za(e){return typeof e==`object`&&!!e&&Ra in e}function Ba(e){return!!(e&&e.useExisting)}function Va(e){return!!(e&&e.useFactory)}function Ha(e){return typeof e==`function`}function Ua(e){return!!e.useClass}var Wa=new Fi(``),Ga={},Ka={},qa=void 0;function Ja(){return qa===void 0&&(qa=new Ma),qa}var Ya=class{},Xa=class extends Ya{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,oo(e,e=>this.processProvider(e)),this.records.set(Aa,no(void 0,this)),r.has(`environment`)&&this.records.set(Ya,no(void 0,this));let i=this.records.get(Wa);i!=null&&typeof i.value==`string`&&this.scopes.add(i.value),this.injectorDefTypes=new Set(this.get(ja,Oa,{self:!0}))}retrieve(e,t){let n=da(t)||0;try{return this.get(e,oa,n)}catch(e){if(Kn(e))return e;throw e}}destroy(){to(this),this._destroyed=!0;let e=nn(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(),nn(e)}}onDestroy(e){return to(this),this._onDestroyHooks.push(e),()=>this.removeOnDestroy(e)}runInContext(e){to(this);let t=Wn(this),n=ra(void 0);try{return e()}finally{Wn(t),ra(n)}}get(e,t=oa,n){if(to(this),Object.hasOwn(e,Hi))return e[Hi](this);let r=da(n),i=Wn(this),a=ra(void 0);try{if(!(r&4)){let t=this.records.get(e);if(t===void 0){let n=ao(e)&&ki(e);t=n&&this.injectableDefInScope(n)?no(Za(e),Ga):null,this.records.set(e,t)}if(t!=null)return this.hydrate(e,t,r)}let n=r&2?Ja():this.parent;return t=r&8&&t===oa?null:t,n.get(e,t)}catch(e){let t=ea(e);throw t===-200||t===-201?new _i(t,null):e}finally{ra(a),Wn(i)}}resolveInjectorInitializers(){let e=nn(null),t=Wn(this),n=ra(void 0);try{let e=this.get(ka,Oa,{self:!0});for(let t of e)t()}finally{Wn(t),ra(n),nn(e)}}toString(){return`R3Injector[...]`}processProvider(e){e=Ei(e);let t=Ha(e)?e:Ei(e&&e.provide),n=$a(e);if(!Ha(e)&&e.multi===!0){let n=this.records.get(t);n||(n=no(void 0,Ga,!0),n.factory=()=>pa(n.multi),this.records.set(t,n)),t=e,n.multi.push(e)}this.records.set(t,n)}hydrate(e,t,n){let r=nn(null);try{if(t.value===Ka)throw Zi(``);return t.value===Ga&&(t.value=Ka,t.value=t.factory(void 0,n)),typeof t.value==`object`&&t.value&&io(t.value)&&this._ngOnDestroyHooks.add(t.value),t.value}finally{nn(r)}}injectableDefInScope(e){if(!e.providedIn)return!1;let t=Ei(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 Za(e){let t=ki(e),n=t===null?ha(e):t.factory;if(n!==null)return n;if(e instanceof Fi)throw new _i(-204,!1);if(e instanceof Function)return Qa(e);throw new _i(-204,!1)}function Qa(e){if(e.length>0)throw new _i(-204,!1);let t=ji(e);return t===null?()=>new e:()=>t.factory(e)}function $a(e){return za(e)?no(void 0,e.useValue):no(eo(e),Ga)}function eo(e,t,n){let r;if(Ha(e)){let t=Ei(e);return ha(t)||Za(t)}if(za(e))r=()=>Ei(e.useValue);else if(Va(e))r=()=>e.useFactory(...pa(e.deps||[]));else if(Ba(e))r=(t,n)=>ua(Ei(e.useExisting),n!==void 0&&n&8?8:void 0);else{let t=Ei(e&&(e.useClass||e.provide));if(ro(e))r=()=>new t(...pa(e.deps));else return ha(t)||Za(t)}return r}function to(e){if(e.destroyed)throw new _i(-205,!1)}function no(e,t,n=!1){return{factory:e,value:t,multi:n?[]:void 0}}function ro(e){return!!e.deps}function io(e){return typeof e==`object`&&!!e&&typeof e.ngOnDestroy==`function`}function ao(e){return typeof e==`function`||typeof e==`object`&&e.ngMetadataName===`InjectionToken`}function oo(e,t){for(let n of e)Array.isArray(n)?oo(n,t):n&&Ii(n)?oo(n.ɵproviders,t):t(n)}function so(e,t){let n;e instanceof Xa?(to(e),n=e):n=new ca(e);let r=Wn(n),i=ra(void 0);try{return t()}finally{Wn(r),ra(i)}}function co(){return na()!==void 0||Un()!=null}var lo=1;function uo(e){return Array.isArray(e)&&typeof e[lo]==`object`}function fo(e){return Array.isArray(e)&&e[lo]===!0}function po(e){return!!(e.flags&4)}function mo(e){return e.componentOffset>-1}function ho(e){return(e.flags&1)==1}function go(e){return!!e.template}function _o(e){return!!(e[2]&512)}function vo(e){return(e[2]&256)==256}var yo=(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})(yo||{}),bo=`math`;function xo(e){for(;Array.isArray(e);)e=e[0];return e}function So(e,t){return xo(t[e])}function Co(e,t){return xo(t[e.index])}function wo(e,t){return e.data[t]}function To(e,t){return e[t]}function Eo(e,t,n,r){n>=e.data.length&&(e.data[n]=null,e.blueprint[n]=null),t[n]=r}function Do(e,t){let n=t[e];return uo(n)?n:n[0]}function Oo(e){return(e[2]&128)==128}function Pee(e){return fo(e[3])}function ko(e,t){return t==null?null:e[t]}function Ao(e){e[17]=0}function jo(e){e[2]&1024||(e[2]|=1024,Oo(e)&&Po(e))}function Fee(e,t){for(;e>0;)t=t[14],e--;return t}function Mo(e){return!!(e[2]&9216||e[24]?.dirty)}function No(e){e[10].changeDetectionScheduler?.notify(8),e[2]&64&&(e[2]|=1024),Mo(e)&&Po(e)}function Po(e){e[10].changeDetectionScheduler?.notify(0);let t=Io(e);for(;t!==null&&!(t[2]&8192||(t[2]|=8192,!Oo(t)));)t=Io(t)}function Fo(e,t){if(vo(e))throw new _i(911,!1);e[21]===null&&(e[21]=[]),e[21].push(t)}function Iee(e,t){if(e[21]===null)return;let n=e[21].indexOf(t);n!==-1&&e[21].splice(n,1)}function Io(e){let t=e[3];return fo(t)?t[3]:t}function Lo(e){return e[7]??=[]}function Ro(e){return e.cleanup??=[]}function Lee(e,t,n,r){let i=Lo(t);i.push(n),e.firstCreatePass&&Ro(e).push(r,i.length-1)}var zo={lFrame:fs(null),bindingsEnabled:!0,skipHydrationRootTNode:null},Bo=!1;function Ree(){return zo.lFrame.elementDepthCount}function zee(){zo.lFrame.elementDepthCount++}function Vo(){zo.lFrame.elementDepthCount--}function Ho(){return zo.bindingsEnabled}function Uo(){return zo.skipHydrationRootTNode!==null}function Wo(e){return zo.skipHydrationRootTNode===e}function Go(){zo.skipHydrationRootTNode=null}function Ko(){return zo.lFrame.lView}function qo(){return zo.lFrame.tView}function w(e){return zo.lFrame.contextLView=e,e[8]}function T(e){return zo.lFrame.contextLView=null,e}function Jo(){let e=Yo();for(;e!==null&&e.type===64;)e=e.parent;return e}function Yo(){return zo.lFrame.currentTNode}function Bee(){let e=zo.lFrame,t=e.currentTNode;return e.isParent?t:t.parent}function Xo(e,t){let n=zo.lFrame;n.currentTNode=e,n.isParent=t}function Zo(){return zo.lFrame.isParent}function Qo(){zo.lFrame.isParent=!1}function $o(){return zo.lFrame.contextLView}function es(){return Bo}function ts(e){let t=Bo;return Bo=e,t}function ns(){let e=zo.lFrame,t=e.bindingRootIndex;return t===-1&&(t=e.bindingRootIndex=e.tView.bindingStartIndex),t}function rs(){return zo.lFrame.bindingIndex}function Vee(e){return zo.lFrame.bindingIndex=e}function is(){return zo.lFrame.bindingIndex++}function as(e){let t=zo.lFrame,n=t.bindingIndex;return t.bindingIndex+=e,n}function Hee(){return zo.lFrame.inI18n}function Uee(e,t){let n=zo.lFrame;n.bindingIndex=n.bindingRootIndex=e,os(t)}function Wee(){return zo.lFrame.currentDirectiveIndex}function os(e){zo.lFrame.currentDirectiveIndex=e}function Gee(e){let t=zo.lFrame.currentDirectiveIndex;return t===-1?null:e[t]}function Kee(){return zo.lFrame.currentQueryIndex}function ss(e){zo.lFrame.currentQueryIndex=e}function cs(e){let t=e[1];return t.type===2?t.declTNode:t.type===1?e[5]:null}function ls(e,t,n){if(n&4){let r=t,i=e;for(;r=r.parent,r===null&&!(n&1)&&(r=cs(i),!(r===null||(i=i[14],r.type&10))););if(r===null)return!1;t=r,e=i}let r=zo.lFrame=ds();return r.currentTNode=t,r.lView=e,!0}function us(e){let t=ds(),n=e[1];zo.lFrame=t,t.currentTNode=n.firstChild,t.lView=e,t.tView=n,t.contextLView=e,t.bindingIndex=n.bindingStartIndex,t.inI18n=!1}function ds(){let e=zo.lFrame,t=e===null?null:e.child;return t===null?fs(e):t}function fs(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 ps(){let e=zo.lFrame;return zo.lFrame=e.parent,e.currentTNode=null,e.lView=null,e}var ms=ps;function hs(){let e=ps();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 gs(e){return(zo.lFrame.contextLView=Fee(e,zo.lFrame.contextLView))[8]}function _s(){return zo.lFrame.selectedIndex}function vs(e){zo.lFrame.selectedIndex=e}function ys(){let e=zo.lFrame;return wo(e.tView,e.selectedIndex)}function E(){zo.lFrame.currentNamespace=`svg`}function bs(){xs()}function xs(){zo.lFrame.currentNamespace=null}function Ss(){return zo.lFrame.currentNamespace}var Cs=!0;function ws(){return Cs}function Ts(e){Cs=e}function Es(e,t=null,n=null,r){let i=Ds(e,t,n,r);return i.resolveInjectorInitializers(),i}function Ds(e,t=null,n=null,r,i=new Set){return new Xa([n||Oa,Na(e)],t||Ja(),null,i)}var Os=class e{static THROW_IF_NOT_FOUND=oa;static NULL=new Ma;static create(e,t){if(Array.isArray(e))return Es({name:``},t,e,``);{let t=e.name??``;return Es({name:t},e.parent,e.providers,t)}}static ɵprov=Oi({token:e,providedIn:`any`,factory:()=>ua(Aa)});static __NG_ELEMENT_ID__=-1},ks=new Fi(``),As=class{static __NG_ELEMENT_ID__=Ms;static __NG_ENV_ID__=e=>e},js=class extends As{_lView;constructor(e){super(),this._lView=e}get destroyed(){return vo(this._lView)}onDestroy(e){let t=this._lView;return Fo(t,e),()=>Iee(t,e)}};function Ms(){return new js(Ko())}var Ns=new Fi(``),Ps=(()=>{class e{taskId=0;pendingTasks=new Set;destroyed=!1;pendingTask=new Xr(!1);debugTaskTracker=C(Ns,{optional:!0});get hasPendingTasks(){return!this.destroyed&&this.pendingTask.value}get hasPendingTasksObservable(){return this.destroyed?new zr(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=Oi({token:e,providedIn:`root`,factory:()=>new e})}return e})(),Fs=class extends Jr{__isAsync;destroyRef=void 0;pendingTasks=void 0;constructor(e=!1){super(),this.__isAsync=e,co()&&(this.destroyRef=C(As,{optional:!0})??void 0,this.pendingTasks=C(Ps,{optional:!0})??void 0)}emit(e){let t=nn(null);try{super.next(e)}finally{nn(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 fr&&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 Is(...e){}function Ls(e){let t,n;function r(){e=Is;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 Rs(e){return queueMicrotask(()=>e()),()=>{e=Is}}var zs=`isAngularZone`,Bs=`isAngularZone_ID`,Vs=0,Hs=class e{hasPendingMacrotasks=!1;hasPendingMicrotasks=!1;isStable=!0;onUnstable=new Fs(!1);onMicrotaskEmpty=new Fs(!1);onStable=new Fs(!1);onError=new Fs(!1);constructor(e){let{enableLongStackTrace:t=!1,shouldCoalesceEventChangeDetection:n=!1,shouldCoalesceRunChangeDetection:r=!1,scheduleInRootZone:i=!1}=e;if(typeof Zone>`u`)throw new _i(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,Ks(a)}static isInAngularZone(){return typeof Zone<`u`&&Zone.current.get(zs)===!0}static assertInAngularZone(){if(!e.isInAngularZone())throw new _i(909,!1)}static assertNotInAngularZone(){if(e.isInAngularZone())throw new _i(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,Us,Is,Is);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)}},Us={};function Ws(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 Gs(e){if(e.isCheckStableRunning||e.callbackScheduled)return;e.callbackScheduled=!0;function t(){Ls(()=>{e.callbackScheduled=!1,qs(e),e.isCheckStableRunning=!0,Ws(e),e.isCheckStableRunning=!1})}e.scheduleInRootZone?Zone.root.run(()=>{t()}):e._outer.run(()=>{t()}),qs(e)}function Ks(e){let t=()=>{Gs(e)},n=Vs++;e._inner=e._inner.fork({name:`angular`,properties:{[zs]:!0,[Bs]:n,[Bs+n]:!0},onInvokeTask:(n,r,i,a,o,s)=>{if(Zs(s))return n.invokeTask(i,a,o,s);try{return Js(e),n.invokeTask(i,a,o,s)}finally{(e.shouldCoalesceEventChangeDetection&&a.type===`eventTask`||e.shouldCoalesceRunChangeDetection)&&t(),Ys(e)}},onInvoke:(n,r,i,a,o,s,c)=>{try{return Js(e),n.invoke(i,a,o,s,c)}finally{e.shouldCoalesceRunChangeDetection&&!e.callbackScheduled&&!Qs(s)&&t(),Ys(e)}},onHasTask:(t,n,r,i)=>{t.hasTask(r,i),n===r&&(i.change==`microTask`?(e._hasPendingMicrotasks=i.microTask,qs(e),Ws(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 qs(e){e.hasPendingMicrotasks=!!(e._hasPendingMicrotasks||(e.shouldCoalesceEventChangeDetection||e.shouldCoalesceRunChangeDetection)&&e.callbackScheduled===!0)}function Js(e){e._nesting++,e.isStable&&(e.isStable=!1,e.onUnstable.emit(null))}function Ys(e){e._nesting--,Ws(e)}var Xs=class{hasPendingMicrotasks=!1;hasPendingMacrotasks=!1;isStable=!0;onUnstable=new Fs;onMicrotaskEmpty=new Fs;onStable=new Fs;onError=new Fs;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 Zs(e){return $s(e,`__ignore_ng_zone__`)}function Qs(e){return $s(e,`__scheduler_tick__`)}function $s(e,t){return!Array.isArray(e)||e.length!==1?!1:e[0]?.data?.[t]===!0}var ec=class{_console=console;handleError(e){this._console.error(`ERROR`,e)}},tc=new Fi(``,{factory:()=>{let e=C(Hs),t=C(Ya),n;return r=>{e.runOutsideAngular(()=>{t.destroyed&&!n?setTimeout(()=>{throw r}):(n??=t.get(ec),n.handleError(r))})}}}),nc={provide:ka,useValue:()=>{C(ec,{optional:!0})},multi:!0};function D(e,t){let[n,r,i]=Pn(e,t?.equal),a=n;return a[tn],a.set=r,a.update=i,a.asReadonly=rc.bind(a),a}function rc(){let e=this[tn];if(e.readonlyFn===void 0){let t=()=>this();t[tn]=e,e.readonlyFn=t}return e.readonlyFn}var ic=new Fi(``,{factory:()=>ac}),ac=`ng`,oc=new Fi(``),sc=new Fi(``,{providedIn:`platform`,factory:()=>`unknown`}),cc=new Fi(``,{factory:()=>C(ks).body?.querySelector(`[ngCspNonce]`)?.getAttribute(`ngCspNonce`)||null}),lc=(()=>{class e{view;node;constructor(e,t){this.view=e,this.node=t}static __NG_ELEMENT_ID__=uc}return e})();function uc(){return new lc(Ko(),Jo())}var dc=class{},fc=new Fi(``,{factory:()=>!0}),pc=new Fi(``),mc=(()=>{class e{static ɵprov=Oi({token:e,providedIn:`root`,factory:()=>new hc})}return e})(),hc=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}},gc=class{[tn];constructor(e){this[tn]=e}destroy(){this[tn].destroy()}};function _c(e,t){let n=t?.injector??C(Os),r=t?.manualCleanup===!0?null:n.get(As),i,a=n.get(lc,null,{optional:!0}),o=n.get(dc);return a===null?i=Sc(e,n.get(mc),o):(i=xc(a.view,o,e),r instanceof js&&r._lView===a.view&&(r=null)),i.injector=n,r!==null&&(i.onDestroyFns=[r.onDestroy(()=>i.destroy())]),new gc(i)}var vc={...Bn,cleanupFns:void 0,zone:null,onDestroyFns:null,run(){let e=ts(!1);try{Vn(this)}finally{ts(e)}},cleanup(){if(!this.cleanupFns?.length)return;let e=nn(null);try{for(;this.cleanupFns.length;)this.cleanupFns.pop()()}finally{this.cleanupFns=[],nn(e)}}},yc={...vc,consumerMarkedDirty(){this.scheduler.schedule(this),this.notifier.notify(12)},destroy(){if(vn(this),this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();this.cleanup(),this.scheduler.remove(this)}},bc={...vc,consumerMarkedDirty(){this.view[2]|=8192,Po(this.view),this.notifier.notify(13)},destroy(){if(vn(this),this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();this.cleanup(),this.view[23]?.delete(this)}};function xc(e,t,n){let r=Object.create(bc);return r.view=e,r.zone=typeof Zone<`u`?Zone.current:null,r.notifier=t,r.fn=Cc(r,n),e[23]??=new Set,e[23].add(r),r.consumerMarkedDirty(r),r}function Sc(e,t,n){let r=Object.create(yc);return r.fn=Cc(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 Cc(e,t){return()=>{t(t=>(e.cleanupFns??=[]).push(t))}}function wc(e){return typeof e==`function`&&e[tn]!==void 0}function Tc(e){return wc(e)&&typeof e.set==`function`}var Ec=Symbol(`InputSignalNode#UNSET`),Dc={...Rn,transformFn:void 0,applyValueToInputSignal(e,t){In(e,t)}};function Oc(e){return{toString:e}.toString()}var kc=(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})(kc||{}),Ac=class{previousValue;currentValue;firstChange;constructor(e,t,n){this.previousValue=e,this.currentValue=t,this.firstChange=n}isFirstChange(){return this.firstChange}};function jc(e,t,n,r){t===null?e[n]=r:t.applyValueToInputSignal(t,r)}var Mc=null,Nc=(()=>{Mc=Fc;let e=()=>Fc;return e.ngInherit=!0,e})();function Pc(){return Mc}function Fc(e){return e.type.prototype.ngOnChanges&&(e.setInput=Lc),Ic}function Ic(){let e=zc(this),t=e?.current;if(t){let n=e.previous;if(n===Da)e.previous=t;else for(let e in t)n[e]=t[e];e.current=null,this.ngOnChanges(t)}}function Lc(e,t,n,r,i){let a=this.declaredInputs[r],o=zc(e)||Bc(e,{previous:Da,current:null}),s=o.current||={},c=o.previous,l=c[a];s[a]=new Ac(l&&l.currentValue,n,c===Da),jc(e,t,i,n)}var Rc=`__ngSimpleChanges__`;function zc(e){return Object.hasOwn(e,Rc)&&e[Rc]||null}function Bc(e,t){return e[Rc]=t}var Vc=[],Hc=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,Yc(o,a)):Yc(o,a)}var Zc=-1,Qc=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 $c(e){return!!(e.flags&8)}function el(e){return!!(e.flags&16)}function tl(e,t,n){let r=0;for(;rt){o=a-1;break}}}for(;a>16}function ll(e,t){let n=cl(e),r=t;for(;n>0;)r=r[14],n--;return r}var ul=!0;function dl(e){let t=ul;return ul=e,t}var fl=255,pl=5,ml=0,hl={};function gl(e,t,n){let r;typeof n==`string`?r=n.charCodeAt(0)||0:Object.hasOwn(n,Vi)&&(r=n[Vi]),r??=n[Vi]=ml++;let i=r&fl,a=1<>pl)]|=a}function _l(e,t){let n=yl(e,t);if(n!==-1)return n;let r=t[1];r.firstCreatePass&&(e.injectorIndex=t.length,vl(r.data,e),vl(t,null),vl(r.blueprint,null));let i=bl(e,t),a=e.injectorIndex;if(ol(i)){let e=sl(i),n=ll(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 vl(e,t){e.push(0,0,0,0,0,0,0,0,t)}function yl(e,t){return e.injectorIndex===-1||e.parent&&e.parent.injectorIndex===e.injectorIndex||t[e.injectorIndex+8]===null?-1:e.injectorIndex}function bl(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=Ll(i),r===null)return Zc;if(n++,i=i[14],r.injectorIndex!==-1)return r.injectorIndex|n<<16}return Zc}function xl(e,t,n){gl(e,t,n)}function Sl(e,t,n){if(n&8||e!==void 0)return e;Qi(t,`NodeInjector`)}function Cl(e,t,n,r){if(n&8&&r===void 0&&(r=null),!(n&3)){let i=e[9],a=ra(void 0);try{return i?i.get(t,r,n&8):ia(t,r,n&8)}finally{ra(a)}}return Sl(r,t,n)}function wl(e,t,n,r=0,i){if(e!==null){if(t[2]&2048&&!(r&2)){let i=Il(e,t,n,r,hl);if(i!==hl)return i}let i=Tl(e,t,n,r,hl);if(i!==hl)return i}return Cl(t,n,r,i)}function Tl(e,t,n,r,i){let a=kl(n);if(typeof a==`function`){if(!ls(t,e,r))return r&1?Sl(i,n,r):Cl(t,n,r,i);try{let e;if(e=a(r),e==null&&!(r&8))Qi(n);else return e}finally{ms()}}else if(typeof a==`number`){let i=null,o=yl(e,t),s=Zc,c=r&1?t[15][5]:null;for((o===-1||r&4)&&(s=o===-1?bl(e,t):t[o+8],s===Zc||!jl(r,!1)?o=-1:(i=t[1],o=sl(s),t=ll(s,t)));o!==-1;){let e=t[1];if(Al(a,o,e.data)){let e=El(o,t,n,i,r,c);if(e!==hl)return e}s=t[o+8],s!==Zc&&jl(r,t[1].data[o+8]===c)&&Al(a,o,t)?(i=e,o=sl(s),t=ll(s,t)):o=-1}}return i}function El(e,t,n,r,i,a){let o=t[1],s=o.data[e+8],c=Dl(s,o,n,r==null?mo(s)&&ul:r!=o&&!!(s.type&3),i&1&&a===s);return c===null?hl:Ol(t,o,c,s,i)}function Dl(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&&go(e)&&e.type===n)return c}return null}function Ol(e,t,n,r,i){let a=e[n],o=t.data;if(a instanceof Qc){let s=a;if(s.resolving)throw Zi(``);let c=dl(s.canSeeViewProviders);s.resolving=!0,o[n].type||o[n];let l=s.injectImpl?ra(s.injectImpl):null;ls(e,r,0);try{a=e[n]=s.factory(void 0,i,o,e,r),t.firstCreatePass&&n>=r.directiveStart&&Uc(n,o[n],t)}finally{l!==null&&ra(l),dl(c),s.resolving=!1,ms()}}return a}function kl(e){if(typeof e==`string`)return e.charCodeAt(0)||0;let t=Object.hasOwn(e,Vi)?e[Vi]:void 0;return typeof t==`number`?t>=0?t&fl:Nl:t}function Al(e,t,n){let r=1<>pl)]&r)}function jl(e,t){return!(e&2)&&!(e&1&&t)}var Ml=class{_tNode;_lView;constructor(e,t){this._tNode=e,this._lView=t}get(e,t,n){return wl(this._tNode,this._lView,e,da(n),t)}};function Nl(){return new Ml(Jo(),Ko())}function Pl(e){return Oc(()=>{let t=e.prototype.constructor,n=t[Bi]||Fl(t),r=Object.prototype,i=Object.getPrototypeOf(e.prototype).constructor;for(;i&&i!==r;){let e=i[Bi]||Fl(i);if(e&&e!==n)return e;i=Object.getPrototypeOf(i)}return e=>new e})}function Fl(e){return Di(e)?()=>{let t=Fl(Ei(e));return t&&t()}:ha(e)}function Il(e,t,n,r,i){let a=e,o=t;for(;a!==null&&o!==null&&o[2]&2048&&!_o(o);){let e=Tl(a,o,n,r|2,hl);if(e!==hl)return e;r&=-5;let t=a.parent;if(!t){let e=o[20];if(e){let t=e.get(n,hl,r);if(t!==hl)return t}t=Ll(o),o=o[14]}a=t}return i}function Ll(e){let t=e[1],n=t.type;return n===2?t.declTNode:n===1?e[5]:null}function Rl(e){return{token:e.token,providedIn:e.autoProvided===!1?null:`root`,factory:e.factory,value:void 0}}function zl(){return Bl(Jo(),Ko())}function Bl(e,t){return new Vl(Co(e,t))}var Vl=(()=>{class e{nativeElement;constructor(e){this.nativeElement=e}static __NG_ELEMENT_ID__=zl}return e})();function Hl(e){return e instanceof Vl?e.nativeElement:e}function Ul(){return this._results[Symbol.iterator]()}var Wl=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 Jr}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=_a(e);(this._changesDetected=!ga(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]=Ul};function Gl(e){return(e.flags&128)==128}var Kl=(function(e){return e[e.OnPush=0]=`OnPush`,e[e.Eager=1]=`Eager`,e[e.Default=1]=`Default`,e})(Kl||{}),ql=new Map,Jl=0;function Yl(){return Jl++}function Xl(e){ql.set(e[19],e)}function Zl(e){ql.delete(e[19])}var Ql=`__ngContext__`;function $l(e,t){uo(t)?(e[Ql]=t[19],Xl(t)):e[Ql]=t}function eu(e){return nu(e[12])}function tu(e){return nu(e[4])}function nu(e){for(;e!==null&&!fo(e);)e=e[4];return e}var ru=void 0;function iu(e){ru=e}function au(){if(ru!==void 0)return ru;if(typeof document<`u`)return document;throw new _i(210,!1)}var ou=!1,su=new Fi(``,{factory:()=>ou}),cu=new WeakMap;function lu(e,t){if(typeof e!=`object`||!e)return;let n=cu.get(e);n||(n=new WeakSet,cu.set(e,n)),n.add(t)}function uu(e){return(e.flags&32)==32}var du=()=>null;function fu(e,t,n=!1){return du(e,t,n)}function pu(e,t){let n=e.contentQueries;if(n!==null){let r=nn(null);try{for(let r=0;r|^->||--!>|)/g,Yee=`​$1​`;function Xee(e){return e.replace(qee,e=>e.replace(Jee,Yee))}function Zee(e,t){return e.createText(t)}function Qee(e,t,n){e.setValue(t,n)}function $ee(e,t){return e.createComment(Xee(t))}function Cu(e,t,n){return e.createElement(t,n)}function wu(e,t,n,r,i){e.insertBefore(t,n,r,i)}function Tu(e,t,n){e.appendChild(t,n)}function Eu(e,t,n,r,i){r===null?Tu(e,t,n):wu(e,t,n,r,i)}function Du(e,t,n,r){e.removeChild(null,t,n,r)}function ete(e,t,n){e.setAttribute(t,`style`,n)}function tte(e,t,n){n===``?e.removeAttribute(t,`class`):e.setAttribute(t,`class`,n)}function Ou(e,t,n){let{mergedAttrs:r,classes:i,styles:a}=n;r!==null&&tl(e,t,r),i!==null&&tte(e,t,i),a!==null&&ete(e,t,a)}function ku(e){let t=nte();return t?t.sanitize(yo.URL,e)||``:yu(e,`URL`)?vu(e):Su(qi(e))}function nte(){let e=Ko();return e&&e[10].sanitizer}function Au(e){return e.ownerDocument.defaultView}function ju(e){return e.ownerDocument}function rte(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 Mu=`ng-template`;function ite(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(Pu(r))return!1;o=!0}}}}}return Pu(r)||o}function Pu(e){return!(e&1)}function ste(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!==``&&!Pu(o)&&(t+=Iu(a,i),i=``),r=o,a||=!Pu(r);n++}return i!==``&&(t+=Iu(a,i)),t}function pte(e){return e.map(fte).join(`,`)}function mte(e){let t=[],n=[],r=1,i=2;for(;r!1});function Bu(e){if(!e)return 0;let t=e.toLowerCase().indexOf(`ms`)>-1?1:1e3;return parseFloat(e)*t}function Vu(e,t){return e.getPropertyValue(t).split(`,`).map(e=>e.trim())}function _te(e){let t=Vu(e,`transition-property`),n=Vu(e,`transition-duration`),r=Vu(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 vte(e){let t=Vu(e,`animation-name`),n=Vu(e,`animation-delay`),r=Vu(e,`animation-duration`),i=Vu(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 Hu(e,t){return e!==void 0&&e.duration>t.duration}function Uu(e){return(e.animationName!=null||e.propertyName!=null)&&e.duration>0}function Wu(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 yte(e,t){let n=getComputedStyle(e),r=vte(n),i=_te(n),a=r.duration>i.duration?r:i;Hu(t.get(e),a)||Uu(a)&&t.set(e,a)}function bte(e,t,n){if(!n)return;let r=e.getAnimations();return r.length===0?yte(e,t):xte(e,t,r)}function xte(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=Wu(e)??0,n,i;e.animationName?i=e.animationName:n=e.transitionProperty,t>=r.duration&&(r={animationName:i,propertyName:n,duration:t})}Hu(t.get(e),r)||Uu(r)&&t.set(e,r)}var Gu=new Set,Ste=!1,Cte=1,Ku=typeof document<`u`&&typeof document?.documentElement?.getAnimations==`function`;function wte(e){return e[9].get(gte,Ste)}function Tte(e,t,n){let r=Ju.get(e);if(r){for(let e of t)r.classList.push(e);for(let e of n)r.cleanupFns.push(e)}else Ju.set(e,{classList:t,cleanupFns:n})}function qu(e){let t=Ju.get(e);if(t){for(let e of t.cleanupFns)e();Ju.delete(e)}Yu.delete(e)}var Ju=new WeakMap,Yu=new WeakMap,Xu=new WeakMap;function Zu(e){return e?e[14]??e:null}var Qu=new WeakSet;function Ete(e,t,n){let r=Xu.get(e);if(!r||r.length===0)return;let i=t.parentNode,a=t.previousSibling,o=Zu(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),Qu.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 Dte(e,t,n){let r=Zu(n),i=Xu.get(e);i?i.some(e=>e.el===t)||i.push({el:t,declarationView:r}):Xu.set(e,[{el:t,declarationView:r}])}function $u(e){let t=e[26]??={};return t.enter??=new Map}function Ote(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 ed(e){return e.composedPath?e.composedPath()[0]:e.target}function td(e,t){let n=Yu.get(t);if(n===void 0)return!0;if(t!==ed(e))return!1;let r=e.animation;if(r){let e=Wu(r);if(e!==void 0&&e+Cte{class e{impl=null;execute(){this.impl?.execute()}static ɵprov=Oi({token:e,providedIn:`root`,factory:()=>new e})}return e})(),sd=[0,1,2,3],cd=(()=>{class e{ngZone=C(Hs);scheduler=C(dc);errorHandler=C(ec,{optional:!0});sequences=new Set;deferredRegistrations=new Set;executing=!1;constructor(){C(rd,{optional:!0})}execute(){let e=this.sequences.size>0;e&&Hc(kc.AfterRenderHooksStart),this.executing=!0;for(let e of sd)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&&Hc(kc.AfterRenderHooksEnd)}register(e){let{view:t}=e;t===void 0?this.executing?this.deferredRegistrations.add(e):this.addSequence(e):((t[25]??=[]).push(e),Po(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(nd.AFTER_NEXT_RENDER,e):e()}static ɵprov=Oi({token:e,providedIn:`root`,factory:()=>new e})}return e})(),ld=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 ud(e,t){let n=t?.injector??C(Os);return ad(`NgAfterNextRender`),jte(e,n,t,!0)}function Ate(e){return e instanceof Function?[void 0,void 0,e,void 0]:[e.earlyRead,e.write,e.mixedReadWrite,e.read]}function jte(e,t,n,r){let i=t.get(od);i.impl??=t.get(cd);let a=t.get(rd,null,{optional:!0}),o=n?.manualCleanup===!0?null:t.get(As),s=t.get(lc,null,{optional:!0}),c=new ld(i.impl,Ate(e),s?.view,r,o,a?.snapshot(null));return i.impl.register(c),c}var dd=new Fi(``,{factory:()=>{let e=C(Ya),t=new Set;return e.onDestroy(()=>t.clear()),{queue:t,isScheduled:!1,scheduler:null,injector:e}}});function fd(e,t,n){let r=e.get(dd);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 Mte(e,t){let n=e.get(dd);if(Array.isArray(t))for(let e of t)n.queue.delete(e);else n.queue.delete(t)}function Nte(e,t){let n=e.get(dd);if(t.detachedLeaveAnimationFns){for(let e of t.detachedLeaveAnimationFns)n.queue.delete(e);t.detachedLeaveAnimationFns=void 0}}function Pte(e){let t=e.get(dd);t.isScheduled||=(ud(()=>{t.isScheduled=!1;for(let e of t.queue)e();t.queue.clear()},{injector:t.injector}),!0)}function Fte(e){let t=e.get(dd);t.scheduler=Pte,t.scheduler(e)}function pd(e,t){for(let[n,r]of t)fd(e,r.animateFns)}function md(e,t,n,r){let i=e?.[26]?.enter;t!==null&&i&&i.has(n.index)&&pd(r,i)}function hd(e,t,n,r){try{n.get(Aa)}catch{return r(!1)}let i=e?.[26];i?.enter?.has(t.index)&&Mte(n,i.enter.get(t.index).animateFns);let a=gd(e,t,i);if(a.size===0){let n=!1;if(e){let r=[];vd(e,t,r),n=r.length>0}if(!n)return r(!1)}e&&Gu.add(e[19]),fd(n,()=>_d(e,t,i||void 0,a,r),i||void 0)}function gd(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 _d(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&&vd(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),bd(e,t.running,i)}else Promise.allSettled(a).then(()=>{e&&Gu.delete(e[19]),i(!0)})}else e&&Gu.delete(e[19]),i(!1)}function vd(e,t,n){if(t.type&12){let r=e[t.index];if(fo(r))for(let e=10;e{e[26]?.running===t&&(e[26].running=void 0,Gu.delete(e[19])),n(!0)})}function xd(e,t,n,r,i,a,o,s){if(i!=null){let c,l=!1;fo(i)?c=i:uo(i)&&(l=!0,i=i[0]);let u=xo(i);e===0&&r!==null?(md(s,r,a,n),o==null?Tu(t,r,u):wu(t,r,u,o||null,!0)):e===1&&r!==null?(md(s,r,a,n),wu(t,r,u,o||null,!0),Ete(a,u,s)):e===2?(s?.[26]?.leave?.has(a.index)&&Dte(a,u,s),Qu.delete(u),hd(s,a,n,e=>{if(Qu.has(u)){Qu.delete(u);return}Du(t,u,l,e)})):e===3&&(Qu.delete(u),hd(s,a,n,()=>{t.destroyNode(u)})),c!=null&&Gd(t,e,n,c,a,r,o)}}function Sd(e,t){wd(e,t),t[0]=null,t[5]=null}function Cd(e,t,n,r,i,a){r[0]=i,r[5]=t,Vd(e,r,n,1,i,a)}function wd(e,t){t[10].changeDetectionScheduler?.notify(9),Vd(e,t,t[11],2,null,null)}function Td(e){let t=e[12];if(!t)return Od(e[1],e);for(;t;){let n=null;if(uo(t))n=t[12];else{let e=t[10];e&&(n=e)}if(!n){for(;t&&!t[4]&&t!==e;)uo(t)&&Od(t[1],t),t=t[3];t===null&&(t=e),uo(t)&&Od(t[1],t),n=t&&t[4]}t=n}}function Ed(e,t){let n=e[9],r=n.indexOf(t);n.splice(r,1)}function Dd(e,t){if(vo(t))return;let n=t[11];n.destroyNode&&Vd(e,t,n,3,null,null),Td(t)}function Od(e,t){if(vo(t))return;let n=nn(null);try{t[2]&=-129,t[2]|=256,t[24]&&vn(t[24]),Ad(e,t),kd(e,t),t[1].type===1&&t[11].destroy();let n=t[16];if(n!==null&&fo(t[3])){n!==t[3]&&Ed(n,t);let r=t[18];r!==null&&r.detachView(e)}Zl(t)}finally{nn(n)}}function kd(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&&tf(e,t,27,!1),Hc(o?kc.TemplateUpdateStart:kc.TemplateCreateStart,i,n),n(r,i)}finally{vs(a),Hc(o?kc.TemplateUpdateEnd:kc.TemplateCreateEnd,i,n)}}function of(e,t,n){pf(e,t,n),(n.flags&64)==64&&mf(e,t,n)}function sf(e,t,n=Co){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];rf(o,n[i],s,a),l=!0}else if(i>c)break}}return o!==null&&Object.hasOwn(r.inputs,i)&&(rf(r,n[o],i,a),l=!0),l}function Tf(e,t){let n=Do(t,e),r=n[1];Ef(r,n);let i=n[0];i!==null&&n[6]===null&&(n[6]=fu(i,n[9])),Hc(kc.ComponentStart);try{Df(r,n,n[8])}finally{Hc(kc.ComponentEnd,n[8])}}function Ef(e,t){for(let n=t.length;n{Po(e.lView)},consumerOnSignalRead(){this.lView[24]=this}};function zf(e){let t=e[24]??Object.create(Bf);return t.lView=e,t}var Bf={...an,consumerIsAlwaysLive:!0,kind:`template`,consumerMarkedDirty:e=>{let t=Io(e.lView);for(;t&&!Vf(t[1]);)t=Io(t);t&&jo(t)},consumerOnSignalRead(){this.lView[24]=this}};function Vf(e){return e.type!==2}function Hf(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 Uf=100;function Wf(e,t=0){let n=e[10].rendererFactory;n.begin?.();try{Gf(e,t)}finally{n.end?.()}}function Gf(e,t){let n=es();try{ts(!0),Zf(e,t);let n=0;for(;Mo(e);){if(n===Uf)throw new _i(103,!1);n++,Zf(e,1)}}finally{ts(n)}}function Kf(e,t,n,r){if(vo(t))return;let i=t[2];us(t);let a=!0,o=null,s=null;Vf(e)?(s=Ff(t),o=pn(s)):rn()===null?(a=!1,s=zf(t),o=pn(s)):t[24]&&=(vn(t[24]),null);try{Ao(t),Vee(e.bindingStartIndex),n!==null&&af(e,t,n,2,r);let a=(i&3)==3;if(a){let n=e.preOrderCheckHooks;n!==null&&Gc(t,n,null)}else{let n=e.preOrderHooks;n!==null&&Kc(t,n,0,null),qc(t,0)}if(Jf(t),Hf(t),qf(t,0),e.contentQueries!==null&&pu(e,t),a){let n=e.contentCheckHooks;n!==null&&Gc(t,n)}else{let n=e.contentHooks;n!==null&&Kc(t,n,1),qc(t,1)}$f(e,t);let o=e.components;o!==null&&Qf(t,o,0);let s=e.viewQuery;if(s!==null&&mu(2,s,r),a){let n=e.viewCheckHooks;n!==null&&Gc(t,n)}else{let n=e.viewHooks;n!==null&&Kc(t,n,2),qc(t,2)}if(e.firstUpdatePass===!0&&(e.firstUpdatePass=!1),t[22]){for(let e of t[22])e();t[22]=null}Nf(t),t[2]&=-73}catch(e){throw Po(t),e}finally{s!==null&&(hn(s,o),a&&Lf(s)),hs()}}function qf(e,t){for(let n=eu(e);n!==null;n=tu(n))for(let e=10;e0&&(e[n-1][4]=r[4]);let a=ba(e,10+t);Sd(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 op(e,t,n,r){let i=10+r,a=n.length;r>0&&(n[i-1][4]=t),r-1&&(ap(e,n),ba(t,n))}this._attachedToViewContainer=!1}Dd(this._lView[1],this._lView)}onDestroy(e){Fo(this._lView,e)}markForCheck(){ep(this._cdRefInjectingView||this._lView,4)}detach(){this._lView[2]&=-129}reattach(){No(this._lView),this._lView[2]|=128}detectChanges(){this._lView[2]|=1024,Wf(this._lView)}checkNoChanges(){}attachToViewContainerRef(){if(this._appRef)throw new _i(902,!1);this._attachedToViewContainer=!0}detachFromAppRef(){this._appRef=null;let e=_o(this._lView),t=this._lView[16];t!==null&&!e&&Ed(t,this._lView),wd(this._lView[1],this._lView)}attachToAppRef(e){if(this._attachedToViewContainer)throw new _i(902,!1);this._appRef=e;let t=_o(this._lView),n=this._lView[16];n!==null&&!t&&sp(n,this._lView),No(this._lView)}},lp=(()=>{class e{_declarationLView;_declarationTContainer;elementRef;static __NG_ELEMENT_ID__=up;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 cp(kf(this._declarationLView,this._declarationTContainer,e,{embeddedViewInjector:t,dehydratedView:n}))}}return e})();function up(){return dp(Jo(),Ko())}function dp(e,t){return e.type&4?new lp(t,e,Bl(e,t)):null}function fp(e,t,n,r,i){let a=e.data[t];if(a===null)a=pp(e,t,n,r,i),Hee()&&(a.flags|=32);else if(a.type&64){a.type=n,a.value=r,a.attrs=i;let e=Bee();a.injectorIndex=e===null?-1:e.injectorIndex}return Xo(a,!0),a}function pp(e,t,n,r,i){let a=Yo(),o=Zo(),s=o?a:a&&a.parent,c=e.data[t]=hp(e,s,n,t,r,i);return mp(e,c,a,o),c}function mp(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 hp(e,t,n,r,i,a){let o=t?t.injectorIndex:-1,s=0;return Uo()&&(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:Ss(),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 gp(e){let t=e[6]??[],n=e[3][11],r=[];for(let e of t)e.data.di===void 0?_p(e,n):r.push(e);e[6]=r}function _p(e,t){let n=0,r=e.firstChild;if(r){let i=e.data.r;for(;nnull,yp=()=>null;function bp(e,t){return vp(e,t)}function xp(e,t,n){return yp(e,t,n)}var Sp=class{},Cp=class{},wp=class{destroyNode=null;static __NG_ELEMENT_ID__=()=>Tp()};function Tp(){let e=Ko(),t=Do(Jo().index,e);return(uo(t)?t:e)[11]}var Ep=(()=>{class e{static ɵprov=Oi({token:e,providedIn:`root`,factory:()=>null})}return e})();function Dp(e){return e.debugInfo?.className||e.type.name||null}var Op={},kp=class{injector;parentInjector;constructor(e,t){this.injector=e,this.parentInjector=t}get(e,t,n){let r=this.injector.get(e,Op,n);return r!==Op||t===Op?r:this.parentInjector.get(e,t,n)}};function Ap(e,t,n){return e[t]=n}function jp(e,t){return e[t]}function Mp(e,t,n){if(n===Lu)return!1;let r=e[t];return!Object.is(r,n)&&(e[t]=n,!0)}function Np(e,t,n,r){let i=Mp(e,t,n);return Mp(e,t+1,r)||i}function Pp(e,t,n,r,i){let a=Np(e,t,n,r);return Mp(e,t+2,i)||a}function Fp(e,t,n,r,i,a){let o=Np(e,t,n,r);return Np(e,t+2,i,a)||o}function Ip(e,t,n){return function r(i){let a=r.__ngNativeEl__;a!==void 0&&lu(i,a),ep(mo(e)?Do(e.index,t):t,5);let o=t[8],s=Lp(t,o,n,i),c=r.__ngNextListenerFn__;for(;c;)s=Lp(t,o,c,i)&&s,c=c.__ngNextListenerFn__;return s}}function Lp(e,t,n,r){let i=nn(null);try{return Hc(kc.OutputStart,t,n),n(r)!==!1}catch(t){return Sf(e,t),!1}finally{Hc(kc.OutputEnd,t,n),nn(i)}}function Rp(e,t,n,r,i,a,o,s){let c=ho(e),l=!1,u=null;if(!r&&c&&(u=Bp(t,n,a,e.index)),u!==null){let e=u.__ngLastListenerFn__||u;e.__ngNextListenerFn__=o,u.__ngLastListenerFn__=o,l=!0}else{let o=Co(e,n),c=r?r(o):o;r||(s.__ngNativeEl__=o);let l=i.listen(c,a,s);zp(a)||Vp(r?t=>r(xo(t[e.index])):e.index,t,n,a,s,l,!1)}return l}function zp(e){return e.startsWith(`animation`)||e.startsWith(`transition`)}function Bp(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 Vp(e,t,n,r,i,a,o){let s=t.firstCreatePass?Ro(t):null,c=Lo(n),l=c.length;c.push(i,a),s&&s.push(r,e,l,(l+1)*(o?-1:1))}function Hp(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,Up(e,t,l,n[a+1],r,i);else if(l>s)break}}return Object.hasOwn(n.outputs,r)&&(c=!0,Up(e,t,a,r,r,i)),c}function Up(e,t,n,r,i,a){let o=t[n],s=t[1],c=o[s.data[n].outputs[r]].subscribe(a);Vp(e.index,s,t,i,a,c,!0)}function Wp(){Gp()}function Gp(){let e=Ko(),t=qo(),n=Jo();if(t.firstCreatePass&&Zp(t,n),n.controlDirectiveIndex===-1)return;ad(`NgSignalForms`);let r=e[n.controlDirectiveIndex];t.data[n.controlDirectiveIndex].controlDef.create(r,new Jp(e,t,n))}function Kp(){qp()}function qp(){let e=Ko(),t=qo(),n=ys();if(n.controlDirectiveIndex===-1)return;let r=t.data[n.controlDirectiveIndex].controlDef,i=e[n.controlDirectiveIndex];r.update(i,new Jp(e,t,n))}var Jp=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 Co(this.tNode,this.lView)}get descriptor(){return`<${this.tNode.value}>`}listenToCustomControlOutput(e,t){let n=this.tView.data[this.tNode.customControlIndex];Hp(this.tNode,this.lView,n,e,Ip(this.tNode,this.lView,t))}listenToCustomControlModel(e){let t=this.tNode.flags&1024?`valueChange`:`checkedChange`,n=this.tView.data[this.tNode.customControlIndex];Hp(this.tNode,this.lView,n,t,Ip(this.tNode,this.lView,e))}listenToDom(e,t){Rp(this.tNode,this.tView,this.lView,void 0,this.lView[11],e,t,Ip(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(Xp(r,o,e)))&&(rf(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=Yp(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}Qp(e,t)}function Qp(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 $p(e,t){return em(e,t)&&tm(e,t+`Change`)}function em(e,t){return t in e.inputs}function tm(e,t){return t in e.outputs}var nm=Symbol(`BINDING`),rm=new Fi(``);function im(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 vm(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&nf.SignalBased)!==0};return i&&(a.transform=i),a})}function Em(e){return Object.keys(e).map(t=>({propName:e[t],templateName:t}))}function Dm(e,t,n){let r=t instanceof Ya?t:t?.injector;return r&&e.getStandaloneInjector!==null&&(r=e.getStandaloneInjector(r)||r),r?new kp(n,r):n}function Om(e){let t=e.get(Cp,null);if(t===null)throw new _i(407,!1);return{rendererFactory:t,sanitizer:e.get(Ep,null),changeDetectionScheduler:e.get(dc,null),ngReflect:!1,tracingService:e.get(rd,null,{optional:!0})}}function km(e,t,n){let r=jm(e);return Cu(t,r,r===`svg`?`svg`:r===`math`?bo:n)}function Am(e){if((e&&`localName`in e&&typeof e.localName==`string`?e.localName:e?.tagName)?.toLowerCase()===`script`)throw new _i(905,!1)}function jm(e){return(e.selectors[0][0]||`div`).toLowerCase()}var Mm=class{componentDef;ngModule;selector;componentType;ngContentSelectors;isBoundToModule;cachedInputs=null;cachedOutputs=null;get inputs(){return this.cachedInputs??=Tm(this.componentDef.inputs),this.cachedInputs}get outputs(){return this.cachedOutputs??=Em(this.componentDef.outputs),this.cachedOutputs}constructor(e,t){this.componentDef=e,this.ngModule=t,this.componentType=e.type,this.selector=pte(e.selectors),this.ngContentSelectors=e.ngContentSelectors??[],this.isBoundToModule=!!t}create(e,t,n,r,i,a,o){Hc(kc.DynamicComponentStart);let s=nn(null);try{let s=this.componentDef,c=Dm(s,r||this.ngModule,e),l=Om(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{nn(s)}}createComponentRef(e,t,n,r,i,a,o){let s=this.componentDef,c=Nm(r,s,a,i),l=e.rendererFactory.createRenderer(null,s),u=r?cf(l,r,s.encapsulation,t):km(s,l,o??null);Am(u);let d=t.get(rm,null),f=Pm(u,()=>t.get(ks,null)??au());d&&d.addHost(f);let p=a?.some(Im)||i?.some(e=>typeof e!=`function`&&e.bindings.some(Im)),m=Xd(null,c,null,512|Qd(s),null,null,e,l,t,null,fu(u,t,!0));d&&Cm&&f instanceof ShadowRoot&&Fo(m,()=>{d.removeHost(f)}),m[27]=u,us(m);let h=null;try{let e=bm(27,m,2,`#host`,()=>c.directiveRegistry,!0,0);Ou(l,u,e),$l(u,m),of(c,m,e),hu(c,e,m),xm(c,e),n!==void 0&&Rm(e,this.ngContentSelectors,n),h=Do(e.index,m),m[8]=h[8],Df(c,m,null)}catch(e){throw h!==null&&Zl(h),Zl(m),e}finally{Hc(kc.DynamicComponentEnd),hs()}return new Lm(this.componentType,m,!!p)}};function Nm(e,t,n,r){let i=e?[`ng-version`,`22.1.7`]:mte(t.selectors[0]),a=null,o=null,s=0;if(n)for(let e of n)s+=e[nm].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 Im(e){let t=e[nm].kind;return t===`input`||t===`twoWay`}var Lm=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=wo(t[1],27),this.location=Bl(this._tNode,t),this.instance=Do(this._tNode.index,t)[8],this.hostView=this.changeDetectorRef=new cp(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),ep(Do(n.index,r),1)}get injector(){return new Ml(this._tNode,this._rootLView)}destroy(){this.hostView.destroy()}onDestroy(e){this.hostView.onDestroy(e)}};function Rm(e,t,n){let r=e.projection=[];for(let e=0;e{class e{static __NG_ELEMENT_ID__=Bm}return e})();function Bm(){return Wm(Jo(),Ko())}var Vm=class e extends zm{_lContainer;_hostTNode;_hostLView;constructor(e,t,n){super(),this._lContainer=e,this._hostTNode=t,this._hostLView=n}get element(){return Bl(this._hostTNode,this._hostLView)}get injector(){return new Ml(this._hostTNode,this._hostLView)}get parentInjector(){let e=bl(this._hostTNode,this._hostLView);if(ol(e)){let t=ll(e,this._hostLView),n=sl(e),r=t[1].data[n+8];return new Ml(r,t)}return new Ml(null,this._hostLView)}clear(){for(;this.length>0;)this.remove(this.length-1)}get(e){let t=Hm(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=bp(this._lContainer,e.ssrId),o=e.createEmbeddedViewImpl(t||{},i,a);return this.insertImpl(o,r,Af(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 Mm(Ui(e)),u=n||this.parentInjector;if(!i&&l.ngModule==null){let e=this.parentInjector.get(Ya,null);e&&(i=e)}let d=Ui(l.componentType??{}),f=bp(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,Af(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(Pee(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 rp(o,i,a,r),t.attachToViewContainerRef(),ya(Um(o),a,t),t}move(e,t){return this.insert(e,t)}indexOf(e){let t=Hm(this._lContainer);return t===null?-1:t.indexOf(e)}remove(e){let t=this._adjustIndex(e,-1),n=ap(this._lContainer,t);n&&(ba(Um(this._lContainer),t),Dd(n[1],n))}detach(e){let t=this._adjustIndex(e,-1),n=ap(this._lContainer,t);return n&&ba(Um(this._lContainer),t)!=null?new cp(n):null}_adjustIndex(e,t=0){return e??this.length+t}};function Hm(e){return e[8]}function Um(e){return e[8]||=[]}function Wm(e,t){let n,r=t[e.index];return fo(r)?n=r:(n=tp(r,t,null,e),t[e.index]=n,ef(t,n)),Km(n,t,e,r),new Vm(n,e,t)}function Gm(e,t){let n=e[11],r=n.createComment(``),i=Co(t,e);return wu(n,n.parentNode(i),r,n.nextSibling(i),!1),r}var Km=Ym,qm=()=>!1;function Jm(e,t,n){return qm(e,t,n)}function Ym(e,t,n,r){if(e[7])return;let i;i=n.type&8?xo(r):Gm(t,n),e[7]=i}var Xm=class e{queryList;matches=null;constructor(e){this.queryList=e}clone(){return new e(this.queryList)}setDirty(){this.queryList.setDirty()}},Zm=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 dh(e,t,n){e.queries===null&&(e.queries=new $m),e.queries.track(new eh(t,n))}function fh(e,t){return e.queries.getByIndex(t)}function ph(e,t){let n=e[1],r=fh(n,t);return r.crossesNgTemplate?oh(n,e,t,[]):ah(n,e,r,t)}function mh(e,t,n){let r,i=wn(()=>{r._dirtyCounter();let n=vh(r,e);if(t&&n===void 0)throw new _i(-951,!1);return n});return r=i[tn],r._dirtyCounter=D(0),r._flatValue=void 0,i}function hh(e){return mh(!0,!1,e)}function gh(e){return mh(!0,!0,e)}function _h(e,t){let n=e[tn];n._lView=Ko(),n._queryIndex=t,n._queryList=sh(n._lView,t),n._queryList.onDirty(()=>n._dirtyCounter.update(e=>e+1))}function vh(e,t){let n=e._lView,r=e._queryIndex;if(n===void 0||r===void 0||n[2]&4)return t?void 0:Oa;let i=sh(n,r),a=ph(n,r);return i.reset(a,Hl),t?i.first:i._changesDetected||e._flatValue===void 0?e._flatValue=i.toArray():e._flatValue}function yh(e){return!!e&&typeof e.then==`function`}function bh(e){return!!e&&typeof e.subscribe==`function`}var xh=class{},Sh=class extends xh{injector;instance=null;constructor(e){super();let t=new Xa([...e.providers,{provide:xh,useValue:this}],e.parent||Ja(),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 wh=(()=>{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=Pa(!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=Oi({token:e,providedIn:`environment`,factory:()=>new e(ua(Ya))})}return e})();function k(e){return Oc(()=>{let t=Ah(e),n={...t,decls:e.decls,vars:e.vars,template:e.template,consts:e.consts||null,ngContentSelectors:e.ngContentSelectors,onPush:e.changeDetection!==Kl.Eager,directiveDefs:null,pipeDefs:null,dependencies:t.standalone&&e.dependencies||null,getStandaloneInjector:t.standalone?e=>e.get(wh).getOrCreateStandaloneInjector(n):null,getExternalStyles:null,signals:e.signals??!1,data:e.data||{},encapsulation:e.encapsulation||gu.Emulated,styles:e.styles||Oa,_:null,schemas:e.schemas||null,tView:null,id:``};t.standalone&&ad(`NgStandalone`),jh(n);let r=e.dependencies;return n.directiveDefs=Mh(r,Th),n.pipeDefs=Mh(r,Gi),n.id=Nh(n),n})}function Th(e){return Ui(e)||Wi(e)}function Eh(e,t){if(e==null)return Da;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=nf.None,c=null),n[a]=[r,s,c],t[a]=o}return n}function Dh(e){if(e==null)return Da;let t={};for(let n in e)Object.hasOwn(e,n)&&(t[e[n]]=n);return t}function Oh(e){return Oc(()=>{let t=Ah(e);return jh(t),t})}function kh(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 Ah(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||Da,exportAs:e.exportAs||null,standalone:e.standalone??!0,signals:e.signals===!0,selectors:e.selectors||Oa,viewQuery:e.viewQuery||null,features:e.features||null,setInput:null,resolveHostDirectives:null,hostDirectives:null,controlDef:null,signalFormsInputPresence:null,inputs:Eh(e.inputs,t),outputs:Dh(e.outputs),debugInfo:null}}function jh(e){e.features?.forEach(t=>t(e))}function Mh(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 Nh(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 Ph=new Fi(``),Fh=(()=>{class e{resolve;reject;initialized=!1;done=!1;donePromise=new Promise((e,t)=>{this.resolve=e,this.reject=t});appInits=C(Ph,{optional:!0})??[];injector=C(Os);constructor(){}runInitializers(){if(this.initialized)return;let e=[];for(let t of this.appInits){let n=so(this.injector,t);if(yh(n))e.push(n);else if(bh(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=Rl({token:e,factory:e.ɵfac})}return e})();function Ih(e){return t=>{t.controlDef={create:(e,t)=>{e?.ɵngControlCreate(t)},update:(e,t)=>{e?.ɵngControlUpdate?.(t)},passThroughInput:e}}}function Lh(e){return Object.getPrototypeOf(e.prototype).constructor}function Rh(e){let t=Lh(e.type),n=!0,r=[e];for(;t&&t!==Function.prototype&&t!==Object.prototype;){let i,a=Object.hasOwn(t,Li)?t[Li]:void 0,o=Object.hasOwn(t,Ri)?t[Ri]:void 0;if(go(e))i=a??o;else{if(a)throw new _i(903,!1);i=o}if(i){if(n){r.push(i);let t=e;t.inputs=Vh(e.inputs),t.declaredInputs=Vh(e.declaredInputs),t.outputs=Vh(e.outputs);let n=i.hostBindings;n&&Wh(e,n);let a=i.viewQuery,o=i.contentQueries;if(a&&Hh(e,a),o&&Uh(e,o),zh(e,i),xi(e.outputs,i.outputs),go(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=il(i.hostAttrs,n=il(n,i.hostAttrs))}}function Vh(e){return e===Da?{}:e===Oa?[]:e}function Hh(e,t){let n=e.viewQuery;e.viewQuery=n?(e,r)=>{t(e,r),n(e,r)}:t}function Uh(e,t){let n=e.contentQueries;e.contentQueries=n?(e,r,i)=>{t(e,r,i),n(e,r,i)}:t}function Wh(e,t){let n=e.hostBindings;e.hostBindings=n?(e,r)=>{t(e,r),n(e,r)}:t}function Gh(e,t,n,r,i,a,o,s){if(n.firstCreatePass){e.mergedAttrs=il(e.mergedAttrs,e.attrs);let t=e.tView=qd(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),Xo(e,!1);let c=Yh(n,t,e,r);ws()&&Id(n,t,c,e),$l(c,t);let l=tp(c,t,c,e);t[r+27]=l,ef(t,l),Jm(l,e,t)}function Kh(e,t,n,r,i,a,o,s,c,l,u){let d=n+27,f;return t.firstCreatePass?(f=fp(t,d,4,o||null,s||null),Ho()&&om(t,e,f,ko(t.consts,l),gf),Wc(t,f)):f=t.data[d],Gh(f,e,t,n,r,i,a,c),ho(f)&&of(t,e,f),l!=null&&sf(e,f,u),f}function qh(e,t,n,r,i,a,o,s,c,l,u){let d=n+27,f;if(t.firstCreatePass){if(f=fp(t,d,4,o||null,s||null),l!=null){let e=ko(t.consts,l);f.localNames=[];for(let t=0;t{throw new _i(600,``)})}var eg=10,tg=(()=>{class e{_runningTick=!1;_destroyed=!1;_destroyListeners=[];_views=[];internalErrorHandler=C(tc);afterRenderManager=C(od);zonelessEnabled=C(fc);rootEffectScheduler=C(mc);dirtyFlags=0;tracingSnapshot=null;allTestViews=new Set;autoDetectTestViews=new Set;includeAllTestViews=!1;afterTick=new Jr;get allViews(){return[...(this.includeAllTestViews?this.allTestViews:this.autoDetectTestViews).keys(),...this._views]}get destroyed(){return this._destroyed}componentTypes=[];components=[];internalPendingTask=C(Ps);get isStable(){return this.internalPendingTask.hasPendingTasksObservable.pipe(hi(e=>!e))}constructor(){C(rd,{optional:!0})}whenStable(){let e;return new Promise(t=>{e=this.isStable.subscribe({next:e=>{e&&t()}})}).finally(()=>{e.unsubscribe()})}_injector=C(Ya);_rendererFactory=null;get injector(){return this._injector}bootstrap(e,t){return this.bootstrapImpl(e,t)}bootstrapImpl(e,t,n=Os.NULL){return this._injector.get(Hs).run(()=>{if(Hc(kc.BootstrapComponentStart),!this._injector.get(Fh).done)throw new _i(405,``);let r=Ui(e),i=this._injector.get(xh),a=new Mm(r,i);this.componentTypes.push(e);let{hostElement:o,directives:s,bindings:c}=ng(t),l=o||a.selector,u=a.create(n,[],l,i.injector,s,c),d=u.location.nativeElement,f=u.injector.get(Zh,null);return f?.registerApplication(d),u.onDestroy(()=>{this.detachView(u.hostView),rg(this.components,u),f?.unregisterApplication(d)}),this._loadComponent(u),Hc(kc.BootstrapComponentEnd,u),u})}tick(){this.zonelessEnabled||(this.dirtyFlags|=1),this._tick()}_tick(){Hc(kc.ChangeDetectionStart),this.tracingSnapshot===null?this.tickImpl():this.tracingSnapshot.run(nd.CHANGE_DETECTION,this.tickImpl)}tickImpl=()=>{if(this._runningTick)throw Hc(kc.ChangeDetectionEnd),new _i(101,!1);let e=nn(null);try{this._runningTick=!0,this.synchronize()}finally{this._runningTick=!1,this.tracingSnapshot?.dispose(),this.tracingSnapshot=null,nn(e),this.afterTick.next(),Hc(kc.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++Mo(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;rg(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(Qh,[]).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),()=>rg(this._destroyListeners,e)}destroy(){if(this._destroyed)throw new _i(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=Rl({token:e,factory:e.ɵfac})}return e})();function ng(e){return e===void 0||typeof e==`string`||e instanceof Element?{hostElement:e}:e}function rg(e,t){let n=e.indexOf(t);n>-1&&e.splice(n,1)}function A(e,t,n,r){let i=Ko();return Mp(i,is(),t)&&(qo(),_f(ys(),i,e,t,n,r)),A}function ig(e){if(ad(`NgAnimateEnter`),!Ku)return ig;let t=Ko();if(wte(t))return ig;let n=Jo(),r=t[9].get(Hs);return kte($u(t),n,()=>ag(t,n,e,r)),Fte(t[9]),pd(t[9],$u(t)),ig}function ag(e,t,n,r){let i=Co(t,e),a=e[11],o=Ote(n),s=[],c=!1,l=e=>{if(ed(e)!==i)return;let t=e instanceof AnimationEvent?`animationend`:`transitionend`;r.runOutsideAngular(()=>{a.listen(i,t,u)})},u=e=>{ed(e)===i&&(td(e,i)&&(c=!0),og(e,i,a))};if(o&&o.length>0){r.runOutsideAngular(()=>{s.push(a.listen(i,`animationstart`,l)),s.push(a.listen(i,`transitionstart`,l))}),Tte(i,o,s);for(let e of o)a.addClass(i,e);r.runOutsideAngular(()=>{requestAnimationFrame(()=>{if(!c&&(bte(i,Yu,Ku),!Yu.has(i))){for(let e of o)a.removeClass(i,e);qu(i)}})})}}function og(e,t,n){let r=Ju.get(t);if(ed(e)===t&&r&&td(e,t)){e.stopPropagation();for(let e of r.classList)n.removeClass(t,e);qu(t)}}var sg=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 cg(e,t,n,r,i){return e===n&&Object.is(t,r)?1:Object.is(i(e,t),i(n,r))?-1:0}function lg(e,t,n,r){let i,a,o=0,s=e.length-1;if(Array.isArray(t)){nn(r);let c=t.length-1;for(nn(null);o<=s&&o<=c;){let r=e.at(o),l=t[o],u=cg(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=cg(s,d,c,f,n);if(p!==0){p<0&&e.updateValue(s,f),s--,c--;continue}let m=n(o,r),h=n(s,d),g=n(o,l);if(Object.is(g,h)){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 pg,a??=fg(e,o,s,n),ug(e,i,o,g))e.updateValue(o,l),o++,s++;else if(a.has(g))i.set(m,e.detach(o)),s--;else{let n=e.create(o,t[o]);e.attach(o,n),o++,s++}}for(;o<=c;)dg(e,i,n,o,t[o]),o++}else if(t!=null){nn(r);let c=t[Symbol.iterator]();nn(null);let l=c.next();for(;!l.done&&o<=s;){let t=e.at(o),r=l.value,u=cg(o,t,o,r,n);if(u!==0)u<0&&e.updateValue(o,r),o++,l=c.next();else{i??=new pg,a??=fg(e,o,s,n);let u=n(o,r);if(ug(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;)dg(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 ug(e,t,n,r){return t!==void 0&&t.has(r)?(e.attach(n,t.get(r)),t.delete(r),!0):!1}function dg(e,t,n,r,i){if(ug(e,t,r,n(r,i)))e.updateValue(r,i);else{let t=e.create(r,i);e.attach(r,t)}}function fg(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 pg=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 j(e,t,n,r,i,a,o,s){ad(`NgControlFlow`);let c=Ko(),l=qo();return qh(c,l,e,t,n,r,i,ko(l.consts,a),256,o,s),mg}function mg(e,t,n,r,i,a,o,s){ad(`NgControlFlow`);let c=Ko(),l=qo();return qh(c,l,e,t,n,r,i,ko(l.consts,a),512,o,s),mg}function M(e,t){ad(`NgControlFlow`);let n=Ko(),r=is(),i=n[r]===Lu?-1:n[r],a=i===-1?void 0:bg(n,27+i);if(Mp(n,r,e)){let r=nn(null);try{if(a!==void 0&&ip(a,0),e!==-1){let r=27+e,i=bg(n,r),a=Tg(n[1],r),o=xp(i,a,n);rp(i,kf(n,a,t,{dehydratedView:o}),0,Af(a,o))}}finally{nn(r)}}else if(a!==void 0){let e=np(a,0);e!==void 0&&(e[8]=t)}}var hg=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 gg(e){return e}function _g(e,t){return t}var vg=class{hasEmptyBlock;trackByFn;liveCollection;constructor(e,t,n){this.hasEmptyBlock=e,this.trackByFn=t,this.liveCollection=n}};function N(e,t,n,r,i,a,o,s,c,l,u,d,f){ad(`NgControlFlow`);let p=Ko(),m=qo(),h=c!==void 0,g=Ko(),_=new vg(h,s?o.bind(g[15][8]):o);g[27+e]=_,qh(p,m,e+1,t,n,r,i,ko(m.consts,a),256),h&&qh(p,m,e+2,c,l,u,d,ko(m.consts,f),512)}var yg=class extends sg{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,rp(this.lContainer,t,e,Af(this.templateTNode,n)),xg(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=bp(this.lContainer,this.templateTNode.tView.ssrId);return kf(this.hostLView,this.templateTNode,new hg(this.lContainer,t,e),{dehydratedView:n})}destroy(e){Dd(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];Nte(e,r),Gu.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 ap(e,t)}function wg(e,t){return np(e,t)}function Tg(e,t){return wo(e,t)}function F(e,t,n){let r=Ko();return Mp(r,is(),t)&&(qo(),uf(ys(),r,e,t,r[11],n)),F}function Eg(e,t,n,r,i){Cf(t,e,n,i?`class`:`style`,r)}function I(e,t,n,r){let i=Ko(),a=i[1],o=e+27,s=a.firstCreatePass?bm(o,i,2,t,gf,Ho(),n,r):a.data[o];if(mo(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),I))}}return Dg(e,t,i,s,r),I}function Dg(e,t,n,r,i){if(bf(r,n,e,t,kg),ho(r)){let e=n[1];of(e,n,r),hu(e,r,n)}i!=null&&sf(n,r)}function L(){let e=qo(),t=xf(Jo());return e.firstCreatePass&&xm(e,t),Wo(t)&&Go(),Vo(),t.classesWithoutHost!=null&&$c(t)&&Eg(e,t,Ko(),t.classesWithoutHost,!0),t.stylesWithoutHost!=null&&el(t)&&Eg(e,t,Ko(),t.stylesWithoutHost,!1),L}function R(e,t,n,r){return I(e,t,n,r),L(),R}function z(e,t,n,r){let i=Ko(),a=i[1],o=e+27,s=a.firstCreatePass?Sm(o,a,2,t,n,r):a.data[o];return bf(s,i,e,t,kg),r!=null&&sf(i,s),z}function B(){return Wo(xf(Jo()))&&Go(),Vo(),B}function Og(e,t,n,r){return z(e,t,n,r),B(),Og}var kg=(e,t,n,r,i)=>(Ts(!0),Cu(t[11],r,Ss()));function Ag(e,t,n){let r=Ko(),i=r[1],a=e+27,o=i.firstCreatePass?bm(a,r,8,`ng-container`,gf,Ho(),t,n):i.data[a];if(bf(o,r,e,`ng-container`,Ng),ho(o)){let e=r[1];of(e,r,o),hu(e,o,r)}return n!=null&&sf(r,o),Ag}function jg(){let e=qo(),t=xf(Jo());return e.firstCreatePass&&xm(e,t),jg}function Mg(e,t,n){return Ag(e,t,n),jg(),Mg}var Ng=(e,t,n,r,i)=>(Ts(!0),$ee(t[11],``));function V(){return Ko()}function Pg(e,t,n){let r=Ko();return Mp(r,is(),t)&&(qo(),df(ys(),r,e,t,r[11],n)),Pg}var Fg=void 0;function Ig(e){let t=Math.floor(Math.abs(e)),n=e.toString().replace(/^[^.]*\.?/,``).length;return t===1&&n===0?1:5}var Lg=[`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`]],Fg,[[`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`]],Fg,[[`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}`,Fg,Fg,Fg],[`.`,`,`,`;`,`%`,`+`,`-`,`E`,`×`,`‰`,`∞`,`NaN`,`:`],[`#,##0.###`,`#,##0%`,`¤#,##0.00`,`#E0`],`USD`,`$`,`US Dollar`,{},`ltr`,Ig],Rg=Object.create(null);function zg(e){let t=Hg(e),n=Bg(t);if(n)return n;let r=t.split(`-`)[0];if(n=Bg(r),n)return n;if(r===`en`)return Lg;throw new _i(701,!1)}function Bg(e){if(!(e in Rg)){let t=aa.ng&&aa.ng.common&&aa.ng.common.locales&&aa.ng.common.locales[e];return t!==void 0&&(Rg[e]=t),t}return Rg[e]}var Vg={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 Hg(e){return e.toLowerCase().replace(/_/g,`-`)}var Ug=`en-US`;function Wg(e){typeof e==`string`&&e.toLowerCase().replace(/_/g,`-`)}function H(e,t,n){let r=Ko(),i=qo(),a=Jo();return Gg(i,r,r[11],a,e,t,n),H}function U(e,t,n){let r=Ko(),i=qo(),a=Jo();return(a.type&3||n)&&Rp(a,i,r,n,r[11],e,t,Ip(a,r,t)),U}function Gg(e,t,n,r,i,a,o){let s=!0,c=null;if((r.type&3||o)&&(c??=Ip(r,t,a),Rp(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 t_(e){return(e&2)==2}function n_(e,t){return e&131071|t<<17}function r_(e){return e|2}function i_(e){return(e&131068)>>2}function a_(e,t){return e&-131069|t<<2}function o_(e){return(e&1)==1}function s_(e){return e|1}function c_(e,t,n,r,i,a){let o=a?t.classBindings:t.styleBindings,s=e_(o),c=i_(o);e[r]=n;let l=!1,u;if(Array.isArray(n)){let e=n;u=e[1],(u===null||Ta(e,u)>0)&&(l=!0)}else u=n;if(i){if(c!==0){let t=e_(e[s+1]);e[r+1]=$g(t,s),t!==0&&(e[t+1]=a_(e[t+1],r)),e[s+1]=n_(e[s+1],r)}else e[r+1]=$g(s,0),s!==0&&(e[s+1]=a_(e[s+1],r)),s=r}else e[r+1]=$g(c,0),s===0?s=r:e[c+1]=a_(e[c+1],r),c=r;l&&(e[r+1]=r_(e[r+1])),u_(e,u,r,!0),u_(e,u,r,!1),l_(t,u,e,r,a),o=$g(s,c),a?t.classBindings=o:t.styleBindings=o}function l_(e,t,n,r,i){let a=i?e.residualClasses:e.residualStyles;a!=null&&typeof t==`string`&&Ta(a,t)>=0&&(n[r+1]=s_(n[r+1]))}function u_(e,t,n,r){let i=e[n+1],a=t===null,o=r?e_(i):i_(i),s=!1;for(;o!==0&&(s===!1||a);){let n=e[o],i=e[o+1];d_(n,t)&&(s=!0,e[o+1]=r?s_(i):r_(i)),o=r?e_(i):i_(i)}s&&(e[n+1]=r?r_(i):s_(i))}function d_(e,t){return e===null||t==null||(Array.isArray(e)?e[1]:e)===t?!0:Array.isArray(e)&&typeof t==`string`?Ta(e,t)>=0:!1}var f_={textEnd:0,key:0,keyEnd:0,value:0,valueEnd:0};function p_(e){return e.substring(f_.key,f_.keyEnd)}function m_(e){return g_(e),h_(e,__(e,0,f_.textEnd))}function h_(e,t){let n=f_.textEnd;return n===t?-1:(t=f_.keyEnd=v_(e,f_.key=t,n),__(e,t,n))}function g_(e){f_.key=0,f_.keyEnd=0,f_.value=0,f_.valueEnd=0,f_.textEnd=e.length}function __(e,t,n){for(;t32;)t++;return t}function y_(e,t,n){return S_(e,t,n,!1),y_}function G(e,t){return S_(e,t,null,!0),G}function b_(e){C_(N_,x_,e,!0)}function x_(e,t){for(let n=m_(t);n>=0;n=h_(t,n))Ca(e,p_(t),!0)}function S_(e,t,n,r){let i=Ko(),a=qo(),o=as(2);if(a.firstUpdatePass&&T_(a,e,o,r),t!==Lu&&Mp(i,o,t)){let s=a.data[_s()];P_(a,s,i,i[11],e,i[o+1]=Lte(t,n),r,o)}}function C_(e,t,n,r){let i=qo(),a=as(2);i.firstUpdatePass&&T_(i,null,a,r);let o=Ko();if(n!==Lu&&Mp(o,a,n)){let s=i.data[_s()];if(L_(s,r)&&!w_(i,a)){let e=r?s.classesWithoutHost:s.stylesWithoutHost;e!==null&&(n=Ci(e,n||``)),Eg(i,s,o,n,r)}else Ite(i,s,o,o[11],o[a+1],o[a+1]=M_(e,t,n),r,a)}}function w_(e,t){return t>=e.expandoStartIndex}function T_(e,t,n,r){let i=e.data;if(i[n+1]===null){let a=i[_s()],o=w_(e,n);L_(a,r)&&t===null&&!o&&(t=!1),t=E_(i,a,t,r),c_(i,a,t,n,o,r)}}function E_(e,t,n,r){let i=Gee(e),a=r?t.residualClasses:t.residualStyles;if(i===null)(r?t.classBindings:t.styleBindings)===0&&(n=A_(null,e,t,n,r),n=j_(n,t.attrs,r),a=null);else{let o=t.directiveStylingLast;if(o===-1||e[o]!==i){if(n=A_(i,e,t,n,r),a===null){let n=D_(e,t,r);n!==void 0&&Array.isArray(n)&&(n=A_(null,e,t,n[1],r),n=j_(n,t.attrs,r),O_(e,t,r,n))}else a=k_(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(i_(r)!==0)return e[e_(r)]}function O_(e,t,n,r){let i=n?t.classBindings:t.styleBindings;e[e_(i)]=r}function k_(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===Lu&&(u=l?Oa:void 0);let d=l?wa(u,r):c===r?u:void 0;if(a&&!I_(d)&&(d=wa(t,r)),I_(d)&&(s=d,o))return s;let f=e[i+1];i=o?e_(f):i_(f)}if(t!==null){let e=a?t.residualClasses:t.residualStyles;e!=null&&(s=wa(e,r))}return s}function I_(e){return e!==void 0}function Lte(e,t){return e==null||e===``||(typeof t==`string`?e=vu(e)+t:typeof e==`object`&&(e=Si(vu(e)))),e}function L_(e,t){return!!(e.flags&(t?8:16))}function K(e,t=``){let n=Ko(),r=qo(),i=e+27,a=r.firstCreatePass?fp(r,i,1,t,null):r.data[i],o=Rte(r,n,a,t);n[i]=o,ws()&&Id(r,n,o,a),Xo(a,!1)}var Rte=(e,t,n,r)=>(Ts(!0),Zee(t[11],r));function R_(e,t,n,r=``){return Mp(e,is(),n)?t+qi(n)+r:Lu}function zte(e,t,n,r,i,a=``){let o=Np(e,rs(),n,i);return as(2),o?t+qi(n)+r+qi(i)+a:Lu}function Bte(e,t,n,r,i,a,o,s=``){let c=Pp(e,rs(),n,i,o);return as(3),c?t+qi(n)+r+qi(i)+a+qi(o)+s:Lu}function Vte(e,t,n,r,i,a,o,s,c,l=``){let u=Fp(e,rs(),n,i,o,c);return as(4),u?t+qi(n)+r+qi(i)+a+qi(o)+s+qi(c)+l:Lu}function q(e){return J(``,e),q}function J(e,t,n){let r=Ko(),i=R_(r,e,t,n);return i!==Lu&&V_(r,_s(),i),J}function Y(e,t,n,r,i){let a=Ko(),o=zte(a,e,t,n,r,i);return o!==Lu&&V_(a,_s(),o),Y}function z_(e,t,n,r,i,a,o){let s=Ko(),c=Bte(s,e,t,n,r,i,a,o);return c!==Lu&&V_(s,_s(),c),z_}function B_(e,t,n,r,i,a,o,s,c){let l=Ko(),u=Vte(l,e,t,n,r,i,a,o,s,c);return u!==Lu&&V_(l,_s(),u),B_}function V_(e,t,n){let r=So(t,e);Qee(e[11],r,n)}function H_(e,t,n){Tc(t)&&(t=t());let r=Ko();return Mp(r,is(),t)&&(qo(),uf(ys(),r,e,t,r[11],n)),H_}function U_(e,t){let n=Tc(e);return n&&e.set(t),n}function W_(e,t){let n=Ko(),r=qo(),i=Jo();return Gg(r,n,n[11],i,e,t),W_}var G_={};function K_(e){ad(`NgLet`);let t=qo(),n=Ko(),r=e+27;return Xo(fp(t,r,128,null,null),!1),Eo(t,n,r,G_),K_}function q_(e){return Eo(qo(),Ko(),_s(),e),e}function J_(e){let t=To($o(),27+e);if(t===G_)throw new _i(314,!1);return t}function Y_(e,t,n=``){return R_(Ko(),e,t,n)}function X_(e,t,n){let r=qo();r.firstCreatePass&&Z_(t,r.data,r.blueprint,go(e),n)}function Z_(e,t,n,r,i){if(e=Ei(e),Array.isArray(e))for(let a=0;a>20;if(Ha(e)||!e.multi){let r=new Qc(l,i,am,null),p=ev(c,t,i?u:u+f,d);p===-1?(xl(_l(s,o),a,c),Q_(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=ev(c,t,u+f,d),m=ev(c,t,u,u+f),h=p>=0&&n[p],g=m>=0&&n[m];if(i&&!g||!i&&!h){xl(_l(s,o),a,c);let u=Wte(i?Ute:Hte,n.length,i,r,l,e);!i&&g&&(n[m].providerFactory=u),Q_(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=$_(n[i?m:p],l,!i&&r);Q_(a,e,p>-1?p:m,t)}!i&&r&&g&&n[m].componentProviders++}}}function Q_(e,t,n,r){let i=Ha(t),a=Ua(t);if(i||a){let o=(a?Ei(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 $_(e,t,n){return n&&e.componentProviders++,e.multi.push(t)-1}function ev(e,t,n,r){for(let i=n;i{n.providersResolver=(t,n)=>X_(t,n?n(e):e,!1),t&&(n.viewProvidersResolver=(e,n)=>X_(e,n?n(t):t,!0))}}function rv(e,t){let n=ns()+e,r=Ko();return r[n]===Lu?Ap(r,n,t()):jp(r,n)}function iv(e,t,n){return sv(Ko(),ns(),e,t,n)}function av(e,t,n,r){return cv(Ko(),ns(),e,t,n,r)}function Gte(e,t,n,r,i,a,o){return Kte(Ko(),ns(),e,t,n,r,i,a)}function ov(e,t){let n=e[t];return n===Lu?void 0:n}function sv(e,t,n,r,i,a){let o=t+n;return Mp(e,o,i)?Ap(e,o+1,a?r.call(a,i):r(i)):ov(e,o+1)}function cv(e,t,n,r,i,a,o){let s=t+n;return Np(e,s,i,a)?Ap(e,s+2,o?r.call(o,i,a):r(i,a)):ov(e,s+2)}function Kte(e,t,n,r,i,a,o,s,c){let l=t+n;return Fp(e,l,i,a,o,s)?Ap(e,l+4,c?r.call(c,i,a,o,s):r(i,a,o,s)):ov(e,l+4)}function lv(e,t){let n=qo(),r,i=e+27;n.firstCreatePass?(r=qte(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=ha(r.type,!0)),o=ra(am);try{let e=dl(!1),t=a();return dl(e),Eo(n,Ko(),i,t),t}finally{ra(o)}}function qte(e,t){if(t)for(let n=t.length-1;n>=0;n--){let r=t[n];if(e===r.name)return r}}function uv(e,t,n){let r=e+27,i=Ko(),a=To(i,r);return fv(i,r)?sv(i,ns(),t,a.transform,n,a):a.transform(n)}function dv(e,t,n,r){let i=e+27,a=Ko(),o=To(a,i);return fv(a,i)?cv(a,ns(),t,o.transform,n,r,o):o.transform(n,r)}function fv(e,t){return e[1].data[t].pure}function pv(e,t){return dp(e,t)}var Jte=(()=>{class e{applicationErrorHandler=C(tc);appRef=C(tg);taskService=C(Ps);ngZone=C(Hs);zonelessEnabled=C(fc);tracing=C(rd,{optional:!0});zoneIsDefined=typeof Zone<`u`&&!!Zone.root.run;schedulerTickApplyArgs=[{data:{__scheduler_tick__:!0}}];subscriptions=new fr;angularZoneId=this.zoneIsDefined?this.ngZone._inner?.get(Bs):null;scheduleInRootZone=!this.zonelessEnabled&&this.zoneIsDefined&&(C(pc,{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?Rs:Ls;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=Rl({token:e,factory:e.ɵfac})}return e})();function Yte(){return[{provide:dc,useExisting:Jte},{provide:Hs,useClass:Xs},{provide:fc,useValue:!0}]}function Xte(){return typeof $localize<`u`&&$localize.locale||`en-US`}var mv=new Fi(``,{factory:()=>C(mv,{optional:!0,skipSelf:!0})||Xte()}),hv=class{destroyed=!1;listeners=null;errorHandler=C(ec,{optional:!0});isEmitting=!1;hasNullListeners=!1;destroyRef=C(As);constructor(){this.destroyRef.onDestroy(()=>{this.destroyed=!0,this.listeners=null})}subscribe(e){if(this.destroyed)throw new _i(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(yi(953,!1));return}if(this.listeners===null)return;this.isEmitting=!0;let t=nn(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&&Zte(this.listeners)),nn(t),this.isEmitting=!1}}};function Zte(e){let t=e.length-1;for(;t>-1;)e[t]===null&&e.splice(t,1),t--}function X(e,t){return wn(e,t?.equal)}function Z(e){return Zn(e)}(class e extends Error{_brand;constructor(e){super(e)}static IDLE=new e(`IDLE`);static LOADING=new e(`LOADING`)});var Qte=e=>e;function Q(e,t){return typeof e==`function`?gv(qn(e,Qte,t?.equal),t?.debugName,t?.set):gv(qn(e.source,e.computation,e.equal),e.debugName,e.set)}function gv(e,t,n){let r=e[tn],i=e;if(n!==void 0){let t=e=>Jn(r,e);i.set=e=>n(e,t),i.update=r=>n(r(Z(e)),t)}else i.set=e=>Jn(r,e),i.update=e=>Yn(r,e);return i.asReadonly=rc.bind(e),i}var _v=!1;function $te(){return _v}function vv(e){_v=e}function yv(e,t){let n=Object.create(Dc);n.value=e,n.transformFn=t?.transform;function r(){if(on(n),n.value===Ec)throw new _i(-950,null);return n.value}return r[tn]=n,r}function bv(e){return new hv}function xv(e,t){return yv(e,t)}function ene(e){return yv(Ec,e)}var $=(xv.required=ene,xv);function Sv(e,t){let n=Object.create(Dc),r=new hv;n.value=e;function i(){return on(n),Cv(n.value),n.value}return i[tn]=n,i.asReadonly=rc.bind(i),i.set=e=>{n.equal(n.value,e)||(In(n,e),r.emit(e))},i.update=e=>{Cv(n.value),i.set(e(n.value))},i.subscribe=r.subscribe.bind(r),i.destroyRef=r.destroyRef,i}function Cv(e){if(e===Ec)throw new _i(952,!1)}function wv(e,t){return Sv(e,t)}function tne(e){return Sv(Ec,e)}var Tv=(wv.required=tne,wv);function Ev(e,t){return hh(t)}function nne(e,t){return gh(t)}var Dv=(Ev.required=nne,Ev),rne=(()=>{class e{static __NG_ELEMENT_ID__=ine}return e})();function ine(e){return ane(Jo(),Ko(),(e&16)==16)}function ane(e,t,n){if(mo(e)&&!n){let n=Do(e.index,t);return new cp(n,n)}if(e.type&175){let e=t[15];return new cp(e,t)}return null}var Ov=new Fi(``),one=new Fi(``);function kv(e){return!e.moduleRef}function sne(e){let t=kv(e)?e.r3Injector:e.moduleRef.injector,n=t.get(Hs);return n.run(()=>{kv(e)?e.r3Injector.resolveInjectorInitializers():e.moduleRef.resolveInjectorInitializers();let r=t.get(tc),i;if(n.runOutsideAngular(()=>{i=n.onError.subscribe({next:r})}),kv(e)){let n=()=>t.destroy(),r=e.platformInjector.get(Ov);r.add(n),t.onDestroy(()=>{i.unsubscribe(),r.delete(n)})}else{let t=()=>e.moduleRef.destroy(),n=e.platformInjector.get(Ov);n.add(t),e.moduleRef.onDestroy(()=>{rg(e.allPlatformModules,e.moduleRef),i.unsubscribe(),n.delete(t)})}return lne(r,n,()=>{let n=t.get(Ps),r=n.add(),i=t.get(Fh);return i.runInitializers(),i.donePromise.then(()=>{if(Wg(t.get(mv,Ug)||`en-US`),!t.get(one,!0))return kv(e)?t.get(tg):(e.allPlatformModules.push(e.moduleRef),e.moduleRef);if(kv(e)){let n=t.get(tg);return e.rootComponent!==void 0&&n.bootstrap(e.rootComponent),n}return cne?.(e.moduleRef,e.allPlatformModules),e.moduleRef}).finally(()=>void n.remove(r))})})}var cne;function lne(e,t,n){try{let r=n();return yh(r)?r.catch(n=>{throw t.runOutsideAngular(()=>e(n)),n}):r}catch(n){throw t.runOutsideAngular(()=>e(n)),n}}var Av=null;function une(e=[],t){return Os.create({name:t,providers:[{provide:Wa,useValue:`platform`},{provide:Ov,useValue:new Set([()=>Av=null])},...e]})}function dne(e=[]){if(Av)return Av;let t=une(e);return Av=t,$h(),fne(t),t}function fne(e){let t=e.get(oc,null);so(e,()=>{t?.forEach(e=>e())})}function pne(e){let{rootComponent:t,appProviders:n,platformProviders:r,platformRef:i}=e;Hc(kc.BootstrapApplicationStart);try{let e=i?.injector??dne(r);return sne({r3Injector:new Sh({providers:[Yte(),nc,...n||[]],parent:e,debugName:``,runEnvironmentInitializers:!1}).injector,platformInjector:e,rootComponent:t})}catch(e){return Promise.reject(e)}finally{Hc(kc.BootstrapApplicationEnd)}}function jv(e){return typeof e==`boolean`?e:e!=null&&e!==`false`}var Mv=Symbol(`NOT_SET`),Nv=new Set,mne={...Rn,kind:`afterRenderEffectPhase`,consumerIsAlwaysLive:!0,consumerAllowSignalWrites:!0,value:Mv,cleanup:null,consumerMarkedDirty(){if(this.sequence.impl.executing){if(this.sequence.lastPhase===null||this.sequence.lastPhase(on(r),r.value),r.signal[tn]=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??Nv)t()}finally{vn(e)}}};function Pv(e,t){let n=t?.injector??C(Os),r=n.get(dc),i=n.get(od),a=n.get(rd,null,{optional:!0});i.impl??=n.get(cd);let o=e;typeof o==`function`&&(o={mixedReadWrite:e});let s=n.get(lc,null,{optional:!0}),c=new hne(i.impl,[o.earlyRead,o.write,o.mixedReadWrite,o.read],s?.view,r,n,a?.snapshot(null));return i.impl.register(c),c}var Fv=null;function Iv(){return Fv}function gne(e){Fv??=e}var _ne=class{},Lv=(function(e){return e[e.Format=0]=`Format`,e[e.Standalone=1]=`Standalone`,e})(Lv||{}),Rv=(function(e){return e[e.Narrow=0]=`Narrow`,e[e.Abbreviated=1]=`Abbreviated`,e[e.Wide=2]=`Wide`,e[e.Short=3]=`Short`,e})(Rv||{}),zv=(function(e){return e[e.Short=0]=`Short`,e[e.Medium=1]=`Medium`,e[e.Long=2]=`Long`,e[e.Full=3]=`Full`,e})(zv||{}),Bv={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 vne(e){return zg(e)[Vg.LocaleId]}function yne(e,t,n){let r=zg(e);return Kv(Kv([r[Vg.DayPeriodsFormat],r[Vg.DayPeriodsStandalone]],t),n)}function bne(e,t,n){let r=zg(e);return Kv(Kv([r[Vg.DaysFormat],r[Vg.DaysStandalone]],t),n)}function xne(e,t,n){let r=zg(e);return Kv(Kv([r[Vg.MonthsFormat],r[Vg.MonthsStandalone]],t),n)}function Sne(e,t){let n=zg(e)[Vg.Eras];return Kv(n,t)}function Vv(e,t){return Kv(zg(e)[Vg.DateFormat],t)}function Hv(e,t){return Kv(zg(e)[Vg.TimeFormat],t)}function Uv(e,t){let n=zg(e)[Vg.DateTimeFormat];return Kv(n,t)}function Wv(e,t){let n=zg(e),r=n[Vg.NumberSymbols][t];if(r===void 0){if(t===Bv.CurrencyDecimal)return n[Vg.NumberSymbols][Bv.Decimal];if(t===Bv.CurrencyGroup)return n[Vg.NumberSymbols][Bv.Group]}return r}function Gv(e){if(!e[Vg.ExtraData])throw new _i(2303,!1)}function Cne(e){let t=zg(e);return Gv(t),(t[Vg.ExtraData][2]||[]).map(e=>typeof e==`string`?qv(e):[qv(e[0]),qv(e[1])])}function wne(e,t,n){let r=zg(e);return Gv(r),Kv(Kv([r[Vg.ExtraData][0],r[Vg.ExtraData][1]],t)||[],n)||[]}function Kv(e,t){for(let n=t;n>-1;n--)if(e[n]!==void 0)return e[n];throw new _i(2304,!1)}function qv(e){let[t,n]=e.split(`:`);return{hours:+t,minutes:+n}}var Tne=/^(\d{4,})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/,Jv=Object.create(null),Ene=/((?:[^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]*)/,Dne=256;function One(e,t,n,r){let i=uy(e);kne(t),t=Xv(n,t)||t;let a=[],o;for(;t;)if(o=Ene.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=sy(r,s),i=ly(i,r));let c=``;return a.forEach(e=>{let t=Fne(e);c+=t?t(i,n,s):e===`''`?`'`:e.replace(/(^'|'$)/g,``).replace(/''/g,`'`)}),c}function kne(e){if(e.length>Dne)throw new _i(2300,!1)}function Yv(e,t,n){let r=new Date(0);return r.setFullYear(e,t,n),r.setHours(0,0,0),r}function Xv(e,t){let n=vne(e);if(Jv[n]??=Object.create(null),Jv[n][t])return Jv[n][t];let r=``;switch(t){case`shortDate`:r=Vv(e,zv.Short);break;case`mediumDate`:r=Vv(e,zv.Medium);break;case`longDate`:r=Vv(e,zv.Long);break;case`fullDate`:r=Vv(e,zv.Full);break;case`shortTime`:r=Hv(e,zv.Short);break;case`mediumTime`:r=Hv(e,zv.Medium);break;case`longTime`:r=Hv(e,zv.Long);break;case`fullTime`:r=Hv(e,zv.Full);break;case`short`:let t=Xv(e,`shortTime`),n=Xv(e,`shortDate`);r=Zv(Uv(e,zv.Short),[t,n]);break;case`medium`:let i=Xv(e,`mediumTime`),a=Xv(e,`mediumDate`);r=Zv(Uv(e,zv.Medium),[i,a]);break;case`long`:let o=Xv(e,`longTime`),s=Xv(e,`longDate`);r=Zv(Uv(e,zv.Long),[o,s]);break;case`full`:let c=Xv(e,`fullTime`),l=Xv(e,`fullDate`);r=Zv(Uv(e,zv.Full),[c,l])}return r&&(Jv[n][t]=r),r}function Zv(e,t){return t&&(e=e.replace(/\{([^}]+)}/g,function(e,n){return Object.hasOwn(t,n)?t[n]:e})),e}function Qv(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 Ane(s,t);let c=Wv(o,Bv.MinusSign);return Qv(s,t,c,r,i)}}function jne(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 _i(2301,!1)}}function ey(e,t,n=Lv.Format,r=!1){return function(i,a){return Mne(i,a,e,t,n,r)}}function Mne(e,t,n,r,i,a){switch(n){case 2:return xne(t,i,r)[e.getMonth()];case 1:return bne(t,i,r)[e.getDay()];case 0:let n=e.getHours(),o=e.getMinutes();if(a){let e=Cne(t),a=wne(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?`+`:``)+Qv(o,2,a)+Qv(Math.abs(i%60),2,a);case 1:return`GMT`+(i>=0?`+`:``)+Qv(o,1,a);case 2:return`GMT`+(i>=0?`+`:``)+Qv(o,2,a)+`:`+Qv(Math.abs(i%60),2,a);case 3:return r===0?`Z`:(i>=0?`+`:``)+Qv(o,2,a)+`:`+Qv(Math.abs(i%60),2,a);default:throw new _i(2310,!1)}}}var Nne=0,ny=4;function Pne(e){let t=Yv(e,Nne,1).getDay();return Yv(e,0,1+(t<=ny?ny:11)-t)}function ry(e){let t=e.getDay(),n=t===0?-3:ny-t;return Yv(e.getFullYear(),e.getMonth(),e.getDate()+n)}function iy(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=ry(n),t=Pne(e.getFullYear()),r=e.getTime()-t.getTime();i=1+Math.round(r/6048e5)}return Qv(i,e,Wv(r,Bv.MinusSign))}}function ay(e,t=!1){return function(n,r){return Qv(ry(n).getFullYear(),e,Wv(r,Bv.MinusSign),t)}}var oy=Object.create(null);function Fne(e){if(oy[e])return oy[e];let t;switch(e){case`G`:case`GG`:case`GGG`:t=ey(3,Rv.Abbreviated);break;case`GGGG`:t=ey(3,Rv.Wide);break;case`GGGGG`:t=ey(3,Rv.Narrow);break;case`y`:t=$v(0,1,0,!1,!0);break;case`yy`:t=$v(0,2,0,!0,!0);break;case`yyy`:t=$v(0,3,0,!1,!0);break;case`yyyy`:t=$v(0,4,0,!1,!0);break;case`Y`:t=ay(1);break;case`YY`:t=ay(2,!0);break;case`YYY`:t=ay(3);break;case`YYYY`:t=ay(4);break;case`M`:case`L`:t=$v(1,1,1);break;case`MM`:case`LL`:t=$v(1,2,1);break;case`MMM`:t=ey(2,Rv.Abbreviated);break;case`MMMM`:t=ey(2,Rv.Wide);break;case`MMMMM`:t=ey(2,Rv.Narrow);break;case`LLL`:t=ey(2,Rv.Abbreviated,Lv.Standalone);break;case`LLLL`:t=ey(2,Rv.Wide,Lv.Standalone);break;case`LLLLL`:t=ey(2,Rv.Narrow,Lv.Standalone);break;case`w`:t=iy(1);break;case`ww`:t=iy(2);break;case`W`:t=iy(1,!0);break;case`d`:t=$v(2,1);break;case`dd`:t=$v(2,2);break;case`c`:case`cc`:t=$v(7,1);break;case`ccc`:t=ey(1,Rv.Abbreviated,Lv.Standalone);break;case`cccc`:t=ey(1,Rv.Wide,Lv.Standalone);break;case`ccccc`:t=ey(1,Rv.Narrow,Lv.Standalone);break;case`cccccc`:t=ey(1,Rv.Short,Lv.Standalone);break;case`E`:case`EE`:case`EEE`:t=ey(1,Rv.Abbreviated);break;case`EEEE`:t=ey(1,Rv.Wide);break;case`EEEEE`:t=ey(1,Rv.Narrow);break;case`EEEEEE`:t=ey(1,Rv.Short);break;case`a`:case`aa`:case`aaa`:t=ey(0,Rv.Abbreviated);break;case`aaaa`:t=ey(0,Rv.Wide);break;case`aaaaa`:t=ey(0,Rv.Narrow);break;case`b`:case`bb`:case`bbb`:t=ey(0,Rv.Abbreviated,Lv.Standalone,!0);break;case`bbbb`:t=ey(0,Rv.Wide,Lv.Standalone,!0);break;case`bbbbb`:t=ey(0,Rv.Narrow,Lv.Standalone,!0);break;case`B`:case`BB`:case`BBB`:t=ey(0,Rv.Abbreviated,Lv.Format,!0);break;case`BBBB`:t=ey(0,Rv.Wide,Lv.Format,!0);break;case`BBBBB`:t=ey(0,Rv.Narrow,Lv.Format,!0);break;case`h`:t=$v(3,1,-12);break;case`hh`:t=$v(3,2,-12);break;case`H`:t=$v(3,1);break;case`HH`:t=$v(3,2);break;case`m`:t=$v(4,1);break;case`mm`:t=$v(4,2);break;case`s`:t=$v(5,1);break;case`ss`:t=$v(5,2);break;case`S`:t=$v(6,1);break;case`SS`:t=$v(6,2);break;case`SSS`:t=$v(6,3);break;case`Z`:case`ZZ`:case`ZZZ`:t=ty(0);break;case`ZZZZZ`:t=ty(3);break;case`O`:case`OO`:case`OOO`:case`z`:case`zz`:case`zzz`:t=ty(1);break;case`OOOO`:case`ZZZZ`:case`zzzz`:t=ty(2);break;default:return null}return oy[e]=t,t}function sy(e,t){e=e.replace(/:/g,``);let n=Date.parse(`Jan 01, 1970 00:00:00 `+e)/6e4;return isNaN(n)?t:n}function cy(e,t){return e=new Date(e.getTime()),e.setMinutes(e.getMinutes()+t),e}function ly(e,t,n){let r=e.getTimezoneOffset();return cy(e,-1*(sy(t,r)-r))}function uy(e){if(fy(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 Yv(t,n-1,r)}let t=parseFloat(e);if(!isNaN(e-t))return new Date(t);let n;if(n=e.match(Tne))return dy(n)}let t=new Date(e);if(!fy(t))throw new _i(2311,!1);return t}function dy(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 fy(e){return e instanceof Date&&!isNaN(e.valueOf())}var py=(()=>{class e{_viewContainerRef;_viewRef=null;ngTemplateOutletContext=null;ngTemplateOutlet=null;ngTemplateOutletInjector=null;injector=C(Os);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)(am(zm))};static ɵdir=Oh({type:e,selectors:[[``,`ngTemplateOutlet`,``]],inputs:{ngTemplateOutletContext:`ngTemplateOutletContext`,ngTemplateOutlet:`ngTemplateOutlet`,ngTemplateOutletInjector:`ngTemplateOutletInjector`},features:[Nc]})}return e})();function my(e,t){return new _i(2100,!1)}var hy=`mediumDate`,gy=new Fi(``),_y=new Fi(``),vy=(()=>{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??hy,a=r??this.defaultOptions?.timezone??this.defaultTimezone??void 0;return One(t,e,i||this.locale,a)}catch(t){throw my(e,t.message)}}static ɵfac=function(t){return new(t||e)(am(mv,16),am(gy,24),am(_y,24))};static ɵpipe=kh({name:`date`,type:e,pure:!0})}return e})(),yy=(()=>{class e{transform(e){return JSON.stringify(e,null,2)}static ɵfac=function(t){return new(t||e)};static ɵpipe=kh({name:`json`,type:e,pure:!1})}return e})();function by(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 xy=`browser`,Sy=class{_doc;constructor(e){this._doc=e}manager},Cy=(()=>{class e extends Sy{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)(ua(ks))};static ɵprov=Oi({token:e,factory:e.ɵfac})}return e})(),wy=new Fi(``),Ty=(()=>{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 Cy));this._plugins=n.slice().reverse();let r=e.find(e=>e instanceof Cy);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 _i(-5101,!1);return this._eventNameToPlugin.set(e,t),t}static ɵfac=function(t){return new(t||e)(ua(wy),ua(Hs))};static ɵprov=Oi({token:e,factory:e.ɵfac})}return e})(),Ey=`ng-app-id`;function Dy(e){for(let t of e)t.remove()}function Oy(e,t){let n=t.createElement(`style`);return n.textContent=e,n}function ky(e,t,n,r){let i=e.head?.querySelectorAll(`style[${Ey}="${t}"],link[${Ey}="${t}"]`);if(!i||i.length===0)return!1;for(let e of i)e.removeAttribute(Ey),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 Ay(e,t){let n=t.createElement(`link`);return n.setAttribute(`rel`,`stylesheet`),n.setAttribute(`href`,e),n}var jy=(()=>{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,ky(e,t,this.inline,this.external)&&this.hosts.add(e.head)}addStyles(e,t){for(let t of e)this.addUsage(t,this.inline,Oy);t?.forEach(e=>this.addUsage(e,this.external,Ay))}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&&(Dy(n.elements),t.delete(e)))}ngOnDestroy(){for(let[,{elements:e}]of[...this.inline,...this.external])Dy(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,Oy(t,this.doc)));for(let[t,{elements:n}]of this.external)n.push(this.addElement(e,Ay(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)(ua(ks),ua(ic),ua(cc,8),ua(sc))};static ɵprov=Oi({token:e,factory:e.ɵfac})}return e})(),My={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`},Ny=/%COMP%/g,Py=`%COMP%`,Fy=`_nghost-${Py}`,Iy=`_ngcontent-${Py}`,Ly=!0,Ry=new Fi(``,{factory:()=>Ly}),zy=new Fi(``);function By(e){return Iy.replace(Ny,e)}function Vy(e){return Fy.replace(Ny,e)}function Hy(e,t){return t.map(t=>t.replace(Ny,e))}var Uy=(()=>{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 Wy(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 Jy?n.applyToHost(e):n instanceof qy&&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 gu.Emulated:r=new Jy(o,s,t,this.appId,c,i,a,l,this.cssVarNamespace);break;case gu.ShadowDom:return new Ky(o,e,t,i,a,this.nonce,l,this.cssVarNamespace,s);case gu.ExperimentalIsolatedShadowDom:return new Ky(o,e,t,i,a,this.nonce,l,this.cssVarNamespace);default:r=new qy(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)(ua(Ty),ua(rm),ua(ic),ua(Ry),ua(ks),ua(Hs),ua(cc),ua(rd,8),ua(zy,8))};static ɵprov=Oi({token:e,factory:e.ɵfac})}return e})(),Wy=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(My[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 _i(-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 _i(-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=My[r];i?e.setAttributeNS(i,t,n):e.setAttribute(t,n)}else e.setAttribute(t,n)}removeAttribute(e,t,n){if(n){let r=My[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&(Ru.DashCase|Ru.Important)?e.style.setProperty(t,n,r&Ru.Important?`important`:``):e.style[t]=n}removeStyle(e,t,n){let r=t.startsWith(`--`);r&&(t=t.replace(`%NS%`,this.cssVarNamespace)),r||n&Ru.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=Iv().getGlobalEventTarget(this.doc,e),!e))throw new _i(-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 Ky=class extends Wy{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=Hy(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=Ay(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)}},qy=class extends Wy{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?Hy(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&&Gu.size===0&&this.sharedStylesHost.removeStyles(this.styles,this.styleUrls)}},Jy=class extends qy{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=By(l),this.hostAttr=Vy(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}},Yy=class e extends _ne{supportsDOMEvents=!0;static makeCurrent(){gne(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=Zy();return t==null?null:Qy(t)}resetBaseElement(){Xy=null}getUserAgent(){return window.navigator.userAgent}getCookie(e){return by(document.cookie,e)}},Xy=null;function Zy(){return Xy||=document.head.querySelector(`base`),Xy?Xy.getAttribute(`href`):null}function Qy(e){return new URL(e,document.baseURI).pathname}var $y=[`alt`,`control`,`meta`,`shift`],eb={"\b":`Backspace`," ":`Tab`,"":`Delete`,"\x1B":`Escape`,Del:`Delete`,Esc:`Escape`,Left:`ArrowLeft`,Right:`ArrowRight`,Up:`ArrowUp`,Down:`ArrowDown`,Menu:`ContextMenu`,Scroll:`ScrollLock`,Win:`OS`},tb={alt:e=>e.altKey,control:e=>e.ctrlKey,meta:e=>e.metaKey,shift:e=>e.shiftKey},nb=(()=>{class e extends Sy{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(()=>Iv().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.`),$y.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=eb[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`),$y.forEach(t=>{if(t!==n){let n=tb[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)(ua(ks))};static ɵprov=Oi({token:e,factory:e.ɵfac})}return e})();async function rb(e,t,n){return pne({rootComponent:e,...ib(t,n)})}function ib(e,t){return{platformRef:t?.platformRef,appProviders:[...lb,...e?.providers??[]],platformProviders:cb}}function ab(){Yy.makeCurrent()}function ob(){return new ec}function sb(){return iu(document),document}var cb=[{provide:sc,useValue:xy},{provide:oc,useValue:ab,multi:!0},{provide:ks,useFactory:sb}],lb=[{provide:Wa,useValue:`root`},{provide:ec,useFactory:ob},{provide:wy,useClass:Cy,multi:!0},{provide:wy,useClass:nb,multi:!0},Uy,{provide:rm,useClass:jy},{provide:jy,useExisting:rm},Ty,{provide:Cp,useExisting:Uy},[]];function ub(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 mb({code:i,why:fb(a.why,e),fix:fb(a.fix,e),docs:o,cause:e.cause,sources:e.sources,data:fb(a.data,e)},s);for(let e of t)e(r,n);return r};n[i]=s}return n}function _b(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 Cb=Math.random.bind(Math),wb=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function Tb(e=21){let t=``,n=e;for(;n--;)t+=wb[Cb()*64|0];return t}var Eb=6e4,Db=e=>e,Ob=Db,{clearTimeout:kb,setTimeout:Ab}=globalThis;function jb(e,t){let{post:n,on:r,off:i=()=>{},eventNames:a=[],serialize:o=Db,deserialize:s=Ob,resolver:c,bind:l=`rpc`,timeout:u=Eb,proxify:d=!0}=t,f=!1,p=new Map,m,h;async function g(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:g}=Sb(),_=Tb();s.i=_;let ee;async function te(n=s){return u>=0&&(ee=Ab(()=>{try{if(t.onTimeoutError?.call(h,e,r)!==!0)throw Error(`[birpc] timeout on calling "${e}"`)}catch(e){g(e)}p.delete(_)},u),typeof ee==`object`&&(ee=ee.unref?.())),p.set(_,{resolve:d,reject:g,timeoutId:ee,method:e}),await c(n),l}try{t.onRequest?await t.onRequest.call(h,s,te,d):await te()}catch(e){if(t.onGeneralError?.call(h,e)!==!0)throw e;return}finally{kb(ee),p.delete(_)}return l}let _={$call:(e,...t)=>g(e,t,!1),$callOptional:(e,...t)=>g(e,t,!1,!0),$callEvent:(e,...t)=>g(e,t,!0),$callRaw:e=>g(e.method,e.args,e.event,e.optional),$rejectPendingCalls:te,get $closed(){return f},get $meta(){return t.meta},$close:ee,$functions:e};h=d?new Proxy({},{get(t,n){if(Object.hasOwn(_,n))return _[n];if(n===`then`&&!a.includes(`then`)&&!(`then`in e))return;let r=(...e)=>g(n,e,!0);if(a.includes(n))return r.asEvent=r,r;let i=(...e)=>g(n,e,!1);return i.asEvent=r,i}}):_;function ee(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(ne)}function te(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 ne(r,...i){let a;try{a=s(r)}catch(e){if(t.onGeneralError?.call(h,e)!==!0)throw e;return}if(a.t===`q`){let{m:r,a:s,o:u}=a,d,f,p=await(c?c.call(h,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`?h:e,s)}catch(e){f=e}if(a.i){if(f&&t.onFunctionError&&t.onFunctionError.call(h,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(h,e,r,s)!==!0)throw e}try{await n(o({t:`s`,i:a.i,e:f}),...i)}catch(e){if(t.onGeneralError?.call(h,e,r,s)!==!0)throw e}}}else{let{i:e,r:t,e:n}=a,r=p.get(e);r&&(kb(r.timeoutId),n?r.reject(n):r.resolve(t)),p.delete(e)}}return m=r(ne),h}function Mb(e,t){return t.safety?t.safety:e===`static`||e===`query`||e==null?`read`:`action`}var Nb=Object.freeze({type:`object`,additionalProperties:!0});function Pb(e){let t=e[`~standard`];if(t.jsonSchema)try{return t.jsonSchema.input({target:`draft-2020-12`})}catch{return Nb}return Nb}function Fb(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 Lb(e,t){return Ib(e,t)??[e]}function Rb(e){return typeof e==`string`?`'${e}'`:new Hb().serialize(e)}var zb=` _-,;:!?.'"()[]{}@*/\\&#%\`^+<=>|~$0123456789abcdefghijklmnopqrstuvwxyz`,Bb=(function(){let e=new Uint8Array(128);for(let t=0;t<69;t++)e[zb.charCodeAt(t)]=t+1;for(let t=65;t<=90;t++)e[t]=e[t+32];return e})();function Vb(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})(),Ub=[1779033703,-1150833019,1013904242,-1521486534,1359893119,-1694144372,528734635,1541459225],Wb=[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],Gb=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_`,Kb=[],qb=class{_data=new Jb;_hash=new Jb([...Ub]);_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)Kb[n]=e[t+n]|0;else{let e=Kb[n-15],t=(e<<25|e>>>7)^(e<<14|e>>>18)^e>>>3,r=Kb[n-2],i=(r<<15|r>>>17)^(r<<13|r>>>19)^r>>>10;Kb[n]=t+Kb[n-7]+i+Kb[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),h=u+m+d+Wb[n]+Kb[n],g=p+f;u=l,l=c,c=s,s=o+h|0,o=a,a=i,i=r,r=h+g|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=Jb.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 Yb(e){return new qb().finalize(e).toBase64()}function Xb(e){return Yb(Rb(e))}function Zb(e){return Xb(e)}function Qb(){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 $b=/^[\w+.-]{2,}:\/\//;function ex(e){return e.endsWith(`/`)?e:`${e}/`}function tx(e){return(e.endsWith(`/`)?e.slice(0,-1):e)||`/`}function nx(e,...t){let n=e;for(let e of t)e&&e!==`/`&&(n=n?ex(n)+e.replace(/^\.?\//,``):e);return n}function rx(e,t){if(!t||t===`/`||$b.test(e))return e;let n=tx(t);return e.startsWith(n)?e:nx(n,e)}function ix(e,t){let n=e.match($b);return t+(n?e.slice(n[0].length):e)}var ax=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function ox(e=21){let t=``,n=e;for(;n--;)t+=ax[Math.random()*64|0];return t}var sx=Symbol.for(`immer-nothing`),cx=Symbol.for(`immer-draftable`),lx=Symbol.for(`immer-state`),ux=[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 dx(e,...t){{let n=ux[e],r=Fx(n)?n.apply(null,t):n;throw Error(`[Immer] ${r}`)}}var fx=Object,px=fx.getPrototypeOf,mx=`constructor`,hx=`prototype`,gx=`configurable`,_x=`enumerable`,vx=`writable`,yx=`value`,bx=e=>!!e&&!!e[lx];function xx(e){return e?wx(e)||jx(e)||!!e[cx]||!!e[mx]?.[cx]||Mx(e)||Nx(e):!1}var Sx=fx[hx][mx].toString(),Cx=new WeakMap;function wx(e){if(!e||!Px(e))return!1;let t=px(e);if(t===null||t===fx[hx])return!0;let n=fx.hasOwnProperty.call(t,mx)&&t[mx];if(n===Object)return!0;if(!Fx(n))return!1;let r=Cx.get(n);return r===void 0&&(r=Function.toString.call(n),Cx.set(n,r)),r===Sx}function Tx(e,t,n=!0){Ex(e)===0?(n?Reflect.ownKeys(e):fx.keys(e)).forEach(n=>{t(n,e[n],e)}):e.forEach((n,r)=>t(r,n,e))}function Ex(e){let t=e[lx];return t?t.type_:jx(e)?1:Mx(e)?2:Nx(e)?3:0}var Dx=(e,t,n=Ex(e))=>n===2?e.has(t):fx[hx].hasOwnProperty.call(e,t),Ox=(e,t,n=Ex(e))=>n===2?e.get(t):e[t],kx=(e,t,n,r=Ex(e))=>{r===2?e.set(t,n):r===3?e.add(n):e[t]=n};function Ax(e,t){return e===t?e!==0||1/e==1/t:e!==e&&t!==t}var jx=Array.isArray,Mx=e=>e instanceof Map,Nx=e=>e instanceof Set,Px=e=>typeof e==`object`,Fx=e=>typeof e==`function`,Ix=e=>typeof e==`boolean`;function Lx(e){let t=+e;return Number.isInteger(t)&&String(t)===e}var Rx=e=>Px(e)?e?.[lx]:null,zx=e=>e.copy_||e.base_,Bx=e=>e.modified_?e.copy_:e.base_;function Vx(e,t){if(Mx(e))return new Map(e);if(Nx(e))return new Set(e);if(jx(e))return Array[hx].slice.call(e);let n=wx(e);if(t===!0||t===`class_only`&&!n){let t=fx.getOwnPropertyDescriptors(e);delete t[lx];let n=Reflect.ownKeys(t);for(let r=0;r1&&fx.defineProperties(e,{set:Wx,add:Wx,clear:Wx,delete:Wx}),fx.freeze(e),t&&Tx(e,(e,t)=>{Hx(t,!0)},!1),e)}function Ux(){dx(2)}var Wx={[yx]:Ux};function Gx(e){return e===null||!Px(e)||fx.isFrozen(e)}var Kx=`MapSet`,qx=`Patches`,Jx=`ArrayMethods`,Yx={};function Xx(e){let t=Yx[e];return t||dx(0,e),t}var Zx=e=>!!Yx[e];function Qx(e,t){Yx[e]||(Yx[e]=t)}var $x,eS=()=>$x,tS=(e,t)=>({drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:Zx(Kx)?Xx(Kx):void 0,arrayMethodsPlugin_:Zx(Jx)?Xx(Jx):void 0});function nS(e,t){t&&(e.patchPlugin_=Xx(qx),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function rS(e){iS(e),e.drafts_.forEach(oS),e.drafts_=null}function iS(e){e===$x&&($x=e.parent_)}var aS=e=>$x=tS($x,e);function oS(e){let t=e[lx];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function sS(e,t){t.unfinalizedDrafts_=t.drafts_.length;let n=t.drafts_[0];if(e!==void 0&&e!==n){n[lx].modified_&&(rS(t),dx(4)),xx(e)&&(e=cS(t,e));let{patchPlugin_:r}=t;r&&r.generateReplacementPatches_(n[lx].base_,e,t)}else e=cS(t,n);return lS(t,e,!0),rS(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e===sx?void 0:e}function cS(e,t){if(Gx(t))return t;let n=t[lx];if(!n)return _S(t,e.handledSet_,e);if(!dS(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);hS(n,e)}return n.copy_}function lS(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&Hx(t,n)}function uS(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var dS=(e,t)=>e.scope_===t,fS=[];function pS(e,t,n,r){let i=zx(e),a=e.type_;if(r!==void 0&&Ox(i,r,a)===t){kx(i,r,n,a);return}if(!e.draftLocations_){let t=e.draftLocations_=new Map;Tx(i,(e,n)=>{if(bx(n)){let r=t.get(n)||[];r.push(e),t.set(n,r)}})}let o=e.draftLocations_.get(t)??fS;for(let e of o)kx(i,e,n,a)}function mS(e,t,n){e.callbacks_.push(function(r){let i=t;if(!i||!dS(i,r))return;r.mapSetPlugin_?.fixSetContents(i);let a=Bx(i);pS(e,i.draft_??i,a,n),hS(i,r)})}function hS(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)}uS(e)}}function gS(e,t,n){let{scope_:r}=e;if(bx(n)){let i=n[lx];dS(i,r)&&i.callbacks_.push(function(){ES(e),pS(e,n,Bx(i),t)})}else xx(n)&&e.callbacks_.push(function(){let i=zx(e);e.type_===3?i.has(n)&&_S(n,r.handledSet_,r):Ox(i,t,e.type_)===n&&r.drafts_.length>1&&(e.assigned_.get(t)??!1)===!0&&e.copy_&&_S(Ox(e.copy_,t,e.type_),r.handledSet_,r)})}function _S(e,t,n){return!n.immer_.autoFreeze_&&n.unfinalizedDrafts_<1||bx(e)||t.has(e)||!xx(e)||Gx(e)?e:(t.add(e),Tx(e,(r,i)=>{if(bx(i)){let t=i[lx];dS(t,n)&&(kx(e,r,Bx(t),e.type_),uS(t))}else xx(i)&&_S(i,t,n)}),e)}function vS(e,t){let n=jx(e),r={type_:+!!n,scope_:t?t.scope_:eS(),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=yS;n&&(i=[r],a=bS);let{revoke:o,proxy:s}=Proxy.revocable(i,a);return r.draft_=s,r.revoke_=o,[s,r]}var yS={get(e,t){if(t===lx)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=zx(e);if(!Dx(i,t,e.type_))return CS(e,i,t);let a=i[t];if(e.finalized_||!xx(a)||r&&e.operationMethod&&n?.isMutatingArrayMethod(e.operationMethod)&&Lx(t))return a;if(a===xS(e.base_,t)||SS(e,t,a)){ES(e);let n=e.type_===1?+t:t,r=OS(e.scope_,a,e,n);return e.copy_[n]=r}return a},has(e,t){return t in zx(e)},ownKeys(e){return Reflect.ownKeys(zx(e))},set(e,t,n){let r=wS(zx(e),t);if(r?.set)return r.set.call(e.draft_,n),!0;if(!e.modified_){let r=xS(zx(e),t),i=r?.[lx];if(i&&i.base_===n)return e.copy_[t]=n,e.assigned_.delete(t),!0;if(Ax(n,r)&&(n!==void 0||Dx(e.base_,t,e.type_)))return!0;ES(e),TS(e)}return e.copy_[t]===n&&(n!==void 0||Dx(e.copy_,t,e.type_))||Number.isNaN(n)&&Number.isNaN(e.copy_[t])?!0:(e.copy_[t]=n,e.assigned_.set(t,!0),gS(e,t,n),!0)},deleteProperty(e,t){return ES(e),xS(e.base_,t)!==void 0||t in e.base_?(e.assigned_.set(t,!1),TS(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){let n=zx(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r&&{[vx]:!0,[gx]:e.type_!==1||t!==`length`,[_x]:r[_x],[yx]:n[t]}},defineProperty(){dx(11)},getPrototypeOf(e){return px(e.base_)},setPrototypeOf(){dx(12)}},bS={};for(let e in yS){let t=yS[e];bS[e]=function(){let e=arguments;return e[0]=e[0][0],t.apply(this,e)}}bS.deleteProperty=function(e,t){return isNaN(parseInt(t))&&dx(13),bS.set.call(this,e,t,void 0)},bS.set=function(e,t,n){return t!==`length`&&isNaN(parseInt(t))&&dx(14),yS.set.call(this,e[0],t,n,e[0])};function xS(e,t){let n=e[lx];return(n?zx(n):e)[t]}function SS(e,t,n){return e.type_!==1||!e.allIndicesReassigned_||e.assigned_?.get(t)||!xx(n)||n[lx]?!1:e.baseRefs_.has(n)}function CS(e,t,n){let r=wS(t,n);return r?yx in r?r[yx]:r.get?.call(e.draft_):void 0}function wS(e,t){if(!(t in e))return;let n=px(e);for(;n;){let e=Object.getOwnPropertyDescriptor(n,t);if(e)return e;n=px(n)}}function TS(e){e.modified_||(e.modified_=!0,e.parent_&&TS(e.parent_))}function ES(e){e.copy_||=(e.assigned_=new Map,Vx(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var DS=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(e,t,n)=>{if(Fx(e)&&!Fx(t)){let n=t;t=e;let r=this;return function(e=n,...i){return r.produce(e,e=>t.call(this,e,...i))}}Fx(t)||dx(6),n!==void 0&&!Fx(n)&&dx(7);let r;if(xx(e)){let i=aS(this),a=OS(i,e,void 0),o=!0;try{r=t(a),o=!1}finally{o?rS(i):iS(i)}return nS(i,n),sS(r,i)}if(!e||!Px(e)){if(r=t(e),r===void 0&&(r=e),r===sx&&(r=void 0),this.autoFreeze_&&Hx(r,!0),n){let t=[],i=[];Xx(qx).generateReplacementPatches_(e,r,{patches_:t,inversePatches_:i}),n(t,i)}return r}dx(1,e)},this.produceWithPatches=(e,t)=>{if(Fx(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]},Ix(e?.autoFreeze)&&this.setAutoFreeze(e.autoFreeze),Ix(e?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),Ix(e?.useStrictIteration)&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){xx(e)||dx(8),bx(e)&&(e=kS(e));let t=aS(this),n=OS(t,e,void 0);return n[lx].isManual_=!0,iS(t),n}finishDraft(e,t){let n=e&&e[lx];(!n||!n.isManual_)&&dx(9);let{scope_:r}=n;return nS(r,t),sS(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=Xx(qx).applyPatches_;return bx(e)?r(e,t):this.produce(e,e=>r(e,t))}};function OS(e,t,n,r){let[i,a]=Mx(t)?Xx(Kx).proxyMap_(t,n):Nx(t)?Xx(Kx).proxySet_(t,n):vS(t,n);return(n?.scope_??eS()).drafts_.push(i),a.callbacks_=n?.callbacks_??[],a.key_=r,n&&r!==void 0?mS(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 kS(e){return bx(e)||dx(10,e),AS(e)}function AS(e){if(!xx(e)||Gx(e))return e;let t=e[lx],n,r=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=Vx(e,t.scope_.immer_.useStrictShallowCopy_),r=t.scope_.immer_.shouldUseStrictIteration()}else n=Vx(e,!0);let i=n;return Nx(n)&&(n=new Set),Tx(i,(e,t)=>{kx(n,e,AS(t))},r),t&&(t.finalized_=!1),n}function jS(){ux.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=Rx(Ox(e,n.key_)),i=Ox(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||Dx(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=Ox(o,e,c),f=Ox(s,e,c),p=l?Dx(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===sx?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(Nx(e))return new Set(Array.from(e).map(u));let t=Object.create(px(e));for(let n in e)t[n]=u(e[n]);return Dx(e,cx)&&(t[cx]=e[cx]),t}function d(e){return bx(e)?u(e):e}Qx(qx,{applyPatches_:l,generatePatches_:i,generateReplacementPatches_:c,getPath:e})}globalThis.Iterator?.from;var MS=new DS,NS=MS.produce,PS=MS.produceWithPatches.bind(MS),FS=MS.applyPatches.bind(MS),IS=1e3;function LS(e,t){if(e.add(t),e.size>IS){let t=e.values().next().value;t!==void 0&&e.delete(t)}}function RS(e){let{enablePatches:t=!1}=e;t&&jS();let n=Qb(),r=e.initialValue,i=new Set;return{on:n.on,value:()=>r,patch:(e,t=ox())=>{i.has(t)||(jS(),r=FS(r,e),LS(i,t),n.emit(`updated`,r,void 0,t))},mutate:(e,a=ox())=>{if(!i.has(a)){if(LS(i,a),t){let[t,i]=PS(r,e);if(t===r)return;r=t,n.emit(`updated`,r,i,a)}else{let t=NS(r,e);if(t===r)return;r=t,n.emit(`updated`,r,void 0,a)}}},syncIds:i}}var zS=typeof self==`object`?self:globalThis,BS=new Set([`Error`,`EvalError`,`RangeError`,`ReferenceError`,`SyntaxError`,`TypeError`,`URIError`,`AggregateError`]),VS=new Set([`Boolean`,`Number`,`String`,`Int8Array`,`Uint8Array`,`Uint8ClampedArray`,`Int16Array`,`Uint16Array`,`Int32Array`,`Uint32Array`,`Float16Array`,`Float32Array`,`Float64Array`,`BigInt64Array`,`BigUint64Array`]);function HS(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=BS.has(e)?zS[e]:void 0;return n(new(r??zS.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`&&VS.has(a))return n(new zS[a](o),i);throw TypeError(`unable to deserialize unsafe or unknown type: ${String(a)}`)};return r}function US(e){return HS(new Map,e)(0)}var WS=``,{toString:GS}={},{keys:KS}=Object;function qS(e){let t=typeof e;if(t!==`object`||!e)return[0,t];let n=GS.call(e).slice(8,-1);switch(n){case`Array`:return[1,WS];case`Object`:return[2,WS];case`Date`:return[3,WS];case`RegExp`:return[4,WS];case`Map`:return[5,WS];case`Set`:return[6,WS];case`DataView`:return[1,n]}return n.includes(`Array`)?[1,n]:n.includes(`Error`)?[7,n]:[2,n]}function JS([e,t]){return e===0&&(t===`function`||t===`symbol`)}function YS(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]=qS(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 KS(r))(e||!JS(qS(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||!(JS(qS(n))||JS(qS(i))))&&t.push([a(n),a(i)]);return n}case 6:{let t=[],n=i([o,t],r);for(let n of r)(e||!JS(qS(n)))&&t.push(a(n));return n}}let{message:c}=r;return i([o,{name:s,message:c}],r)};return a}function XS(e,t={}){let n=[];return YS(!(t.json||t.lossy),!!t.json,new Map,n)(e),n}var{parse:ZS,stringify:QS}=JSON,$S={json:!0,lossy:!0};function eC(e){return US(ZS(e))}function tC(e){return QS(XS(e,$S))}function nC(e){return US(e)}function rC(e){return tC(e)}function iC(e){return eC(e)}var aC=256,oC=class extends Error{name=`StreamClosedError`};function sC(e={}){let t=e.id??ox(),n=Math.max(0,e.replayWindow??0),r=Qb(),i=new AbortController,a=[],o=!1,s=0;function c(e){if(o)throw new oC(`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=lC(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 cC(e={}){let t=e.id??ox(),n=Math.max(1,e.highWaterMark??aC),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 h(){o||a||(o=!0,e.onCancel?.(),m(void 0))}function g(){return u||(u=new ReadableStream({start(e){l=e,f()},cancel(){h()}}),u)}return{id:t,get cancelled(){return o},get done(){return a},get lastSeenSeq(){return i},get readable(){return g()},cancel:h,_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 h(),Promise.resolve({value:void 0,done:!0})}}}}}function lC(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 uC=128;function dC(e){return e.replace(/[^\w-]+/g,`_`).slice(0,uC)}var fC=`modulepreload`,pC=function(e,t){return new URL(e,t).href},mC={},hC=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=pC(t,n),t=s(t),t in mC)return;mC[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`:fC,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)})},gC=`__connection.json`,_C=`__DEVFRAME_CONNECTION__`,vC=`x-birpc-session`,yC=`__rpc-dump/index.json`,bC=`devframe:services`,xC=`devframe_otp`,SC=`devframe_auth_token`;vb.postMessage.remoteAssetsError;var CC=class{cacheMap=new Map;options;keySerializer;constructor(e){this.options=e,this.keySerializer=e.keySerializer||(e=>Zb(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()}},wC=xb({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 TC(e){if(e.agent&&e.jsonSerializable===!1)throw wC.DF0019({name:e.name});e.agent&&!e.jsonSerializable&&(e.jsonSerializable=!0)}async function EC(e,t){let n=e[`~standard`].validate(t);return n instanceof Promise?await n:n}function DC(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 OC(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 jC(e,t){let n=e.handler;if(!n){let r=await AC(e,t);if(!r.handler)throw wC.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 OC(e.name,r,t),o=await a(...n);return await kC(e.name,i,o)}}var MC=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 jC(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 wC.DF0021({name:e.name});TC(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 wC.DF0022({name:e.name});TC(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 jC(this.definitions.get(e),this.context)}getSchema(e){let t=this.definitions.get(e);if(!t)throw wC.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 NC(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 FC(t,`undefined`,r,e);return n}return i!==null&&PC(i,r,e,t),n})}function PC(e,t,n,r){if(typeof e==`bigint`)throw FC(r,`BigInt`,t,n);if(typeof e!=`object`)return;if(e instanceof Map)throw FC(r,`Map`,t,n);if(e instanceof Set)throw FC(r,`Set`,t,n);if(e instanceof Date)throw FC(r,`Date`,t,n);if(Array.isArray(e))return;let i=Object.getPrototypeOf(e);if(i!==null&&i!==Object.prototype)throw FC(r,e.constructor?.name??`class instance`,t,n)}function FC(e,t,n,r){let i=IC(n,r);return wC.DF0020({name:e||``,type:t,path:i})}function IC(e,t){return Array.isArray(e)?`[${t}]`:t===``?``:t}var LC=`__DEVFRAME_CONNECTION_META__`,RC=`__DEVFRAME_CONNECTION_AUTH_TOKEN__`;function zC(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 BC(){return zC(_C)}function VC(){return zC(LC)}function HC(e){if(e)return e;try{let e=localStorage.getItem(RC);if(e)return e}catch{}return zC(RC)}function UC(e){globalThis[_C]=e,globalThis[LC]={...e.connectionMeta,baseUrl:e.metaBaseUrl},e.authToken&&WC(e.authToken)}function WC(e){try{localStorage.setItem(RC,e)}catch{}globalThis[RC]=e;let t=BC();t&&(globalThis[_C]={...t,authToken:e})}function GC(e){let t=rx(gC,e);try{return new URL(t,globalThis.location?.href).href}catch{return t}}function KC(e,t){return t&&t!==e.authToken?{...e,authToken:t}:e}function qC(){let e=BC();if(e)return KC(e,HC()??e.authToken??e.connectionMeta.authToken);let t=VC();if(t)return{connectionMeta:t,metaBaseUrl:t.baseUrl??GC(`./`),authToken:HC(t.authToken)}}async function JC(e={}){if(e.connection){let t=KC(e.connection,HC(e.authToken??e.connection.authToken??e.connection.connectionMeta.authToken));return UC(t),t}let t=Array.isArray(e.baseURL)?e.baseURL:[e.baseURL??`./`];if(e.connectionMeta){let n={connectionMeta:e.connectionMeta,metaBaseUrl:GC(t[0]??`./`),authToken:HC(e.authToken??e.connectionMeta.authToken)};return UC(n),n}let n=qC();if(n){let t=KC(n,HC(e.authToken??n.authToken??n.connectionMeta.authToken));return UC(t),t}let r=[];for(let n of t){let t=rx(gC,n),i=GC(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:HC(e.authToken??r.authToken)};return UC(o),o}catch(e){r.push(e)}}throw Error(`Failed to get connection meta from ${t.join(`, `)}`,{cause:r})}var YC=class extends Error{name=`DevframeConnectionError`;kind;constructor(e,t,n){super(t,n),this.kind=e}};function XC(e=xC){try{let t=globalThis.location?.hash?.replace(/^#/,``)??``;return new URLSearchParams(t).get(e)||void 0}catch{return}}function ZC(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 QC(e=xC){let t=XC(e);return t&&ZC(e),t}async function $C(e,t={}){let n=QC(t.param??`devframe_otp`);return n?e.isTrusted?!0:e.requestTrustWithCode(n):!1}function ew(e){let t={},n=new WeakMap,r,i=()=>(r??=e.sharedState.get(bC,{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 tw(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:vb.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:vb.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=RS({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(vb.client.isTrustedUpdated,e=>{e&&!n&&(n=!0,d())})}})}}}var nw=new Map;function rw(e=nw){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?NC(n,r??``):`s:${rC(n)}`},deserialize:e=>{let n=e.startsWith(`s:`)?iC(e.slice(2)):JSON.parse(e);return n.t===`q`&&n.i&&n.m&&t.set(n.i,n.m),n}}}function iw(){}function aw(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 ow(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 sw(e){let{onConnected:t=iw,onError:n=iw,onDisconnected:r=iw,definitions:i,fetch:a=globalThis.fetch.bind(globalThis)}=e,o=e.url;e.authToken&&(o=`${o}${o.includes(`?`)?`&`:`?`}${SC}=${encodeURIComponent(e.authToken)}`);let s=rw(i),c=new AbortController,l=!1,u,d,f,p,m=new Promise((e,t)=>{f=e,p=t});m.catch(()=>{});function h(e){l||(l=!0,p(e),n(e),r())}function g(){l||(l=!0,p(Error(`Devframe SSE stream closed`)),r())}function _(e,n){if(e===`session`){f(n),t();return}u?.(n)}async function ee(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=aw(r);if(!e)break;r=e.rest;let{event:t,data:n}=ow(e.frame);n.length>0&&_(t,n.join(` -`))}}g()}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 ee(e.body)}catch(e){if(c.signal.aborted){g();return}h(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`,[vC]: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 cw(e,t){let{channel:n,rpcOptions:r={}}=t;return jb(e,{...n,timeout:-1,...r,proxify:!1})}function lw(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(vb.client.connectionStatus,e,n)}let p=new Set;function m(e){for(let t of[...p])t.reject(e)}function h(){return l===`disconnected`||l===`error`?new YC(`connection`,`[devframe] Not connected to the devframe server`,{cause:u??void 0}):l===`unauthorized`?new YC(`auth`,`[devframe] Not authorized by the devframe server`,{cause:u??void 0}):null}function g(e,t){return new Promise((n,r)=>{let a=!1,o,c={reject(e){a||(l(),i.emit(vb.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 YC(`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(vb.client.error,n,t),r(n)})})}let _=new Map;for(let e of r.jsonSerializableMethods??[])_.set(e,{jsonSerializable:!0});let ee=e.createChannel({definitions:_,onError(e){f(`error`,e),i.emit(vb.client.connectionError,e),m(new YC(`connection`,`[devframe] Connection to the devframe server failed`,{cause:e}))},onDisconnected(){l!==`error`&&f(`disconnected`),m(new YC(`connection`,`[devframe] Disconnected from the devframe server`,{cause:u??void 0}))}}),te=cw(a.functions,{channel:ee,rpcOptions:o});a.register({name:vb.broadcast.authRevoked,type:`event`,handler:()=>{c=!1;let e=new YC(`auth`,`[devframe] The devframe server revoked this client's trust`);f(`unauthorized`,e),i.emit(vb.client.connectionError,e),m(e),i.emit(vb.client.isTrustedUpdated,!1)}});let ne=n;async function re(e){ne=e;let t=await te.$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 YC(`auth`,`[devframe] The devframe server refused this client's credentials`);f(`unauthorized`,e),i.emit(vb.client.connectionError,e)}return i.emit(vb.client.isTrustedUpdated,c),t.isTrusted}async function ie(e){let t=(await te.$call(`anonymous:devframe:auth:exchange`,{code:e,ua:navigator.userAgent,origin:location.origin}))?.authToken??null;return t&&(ne=t,c=!0,d.resolve(!0),f(`connected`),i.emit(vb.client.isTrustedUpdated,!0)),t}async function ae(e={}){await te.$call(`anonymous:devframe:auth:request-code`,{ua:navigator.userAgent,origin:location.origin,...e.reissue?{reissue:!0}:{}})}async function oe(){return c?!0:re(ne??``)}async function se(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:oe,requestTrustWithToken:re,requestTrustWithCode:ie,requestAuthCode:ae,ensureTrusted:se,call:(...e)=>{let t=String(e[0]),n=h();return n?(i.emit(vb.client.error,n,t),Promise.reject(n)):g(te.$call(...e),t)},callEvent:(...e)=>{let t=h();if(t){i.emit(vb.client.error,t,String(e[0]));return}return te.$callEvent(...e)},callOptional:(...e)=>{let t=String(e[0]),n=h();return n?(i.emit(vb.client.error,n,t),Promise.reject(n)):g(te.$callOptional(...e),t)},close:()=>{ee.close()}}}function uw(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 dw(e){let{authToken:t,connectionMeta:n,metaBaseUrl:r,events:i,clientRpc:a,rpcOptions:o={},sseOptions:s={},callTimeout:c=0}=e,l=uw(n.sse,r??`./`,location);return lw({transport:`sse`,authToken:t,connectionMeta:n,events:i,clientRpc:a,rpcOptions:o,callTimeout:c,createChannel:e=>sw({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 fw(e){let{name:t,message:n,cause:r,...i}=e,a=r instanceof Error?r:pw(r)?fw(r):r,o=a===void 0?Error(n):Error(n,{cause:a});return o.name=t,Object.assign(o,i),o}function pw(e){return typeof e==`object`&&!!e&&typeof e.message==`string`&&typeof e.name==`string`}function mw(e){return typeof e==`object`&&!!e&&e.type===`static`&&typeof e.path==`string`}function hw(e){return typeof e==`object`&&!!e&&e.type===`query`&&typeof e.records==`object`&&e.records!==null}function gw(e){return typeof e==`object`&&!!e&&(`output`in e||`error`in e)}function _w(e){if(e.error)throw fw(e.error);return e.output}function vw(e){return e.some(e=>e!=null)}function yw(e){return typeof e==`object`&&e&&`serialization`in e&&`data`in e?e.data:e}function bw(e,t){let n=new Map,r=new Map;function i(e,t){return t===`structured-clone`&&Array.isArray(e)?nC(e):e}function a(e,t){return i(yw(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 gw(r)?_w(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(mw(r)){if(vw(n))throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`);return await o(r)}if(hw(r)){let e=Zb(n),i=r.records[e];if(i)return _w(await s(i,r.serialization));if(r.fallback)return _w(await s(r.fallback,r.serialization));throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`)}if(!vw(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 xw(e){let t=bw(await e.fetchJsonFromBases(yC),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 Sw=``;function Cw(e,t){return`${e}${Sw}${t}`}function ww(e){let t=new Map,n=new Map;e.client.register({name:vb.broadcast.streamingChunk,type:`event`,handler(e,n,r,i){t.get(Cw(e,n))?._push(r,i)}}),e.client.register({name:vb.broadcast.streamingEnd,type:`event`,handler(e,n,r){let i=Cw(e,n),a=t.get(i);a&&(a._end(r),t.delete(i))}}),e.client.register({name:vb.broadcast.streamingUploadCancel,type:`event`,handler(e,t){let r=Cw(e,t),i=n.get(r);i&&(i.abort(`server cancelled upload`),n.delete(r))}}),e.events.on(vb.client.isTrustedUpdated,n=>{if(n)for(let[n,r]of t){if(r.cancelled||r.done)continue;let t=n.indexOf(Sw);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=Cw(n,r),o=t.get(a);if(o)return o;let s=cC({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(vb.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=Cw(t,r),a=n.get(i);if(a)return a;let o=sC({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 Tw(){}var Ew=new Map;function Dw(e){let t=e.url;e.authToken&&(t=`${t}?${SC}=${encodeURIComponent(e.authToken)}`);let n=new WebSocket(t),{onConnected:r=Tw,onError:i=Tw,onDisconnected:a=Tw,definitions:o=Ew}=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=rw(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 Ow(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 ix(a,/^https/i.test(a)?`wss://`:`ws://`);let o=new URL(a,r);return o.protocol=i,o.href}function kw(e){let{authToken:t,connectionMeta:n,metaBaseUrl:r,events:i,clientRpc:a,rpcOptions:o={},wsOptions:s={},callTimeout:c=0}=e,l=Ow(n.websocket,r??`./`,location);return lw({transport:`websocket`,authToken:t,connectionMeta:n,events:i,clientRpc:a,rpcOptions:o,callTimeout:c,createChannel:e=>Dw({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 Aw(e){return e.includes(`:`)}function jw(e,t){return Aw(t)?t:`${e}:${t}`}function Mw(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 Nw(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 Mw(a)}function Pw(e,t){return{global:Nw(e,t,`global`),project:Nw(e,t,`project`)}}function Fw(e,t){return{namespace:t,base:e,rpc:{namespace:t,register(n){if(Aw(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(jw(t,n),...r)),callEvent:((n,...r)=>e.callEvent(jw(t,n),...r)),callOptional:((n,...r)=>e.callOptional(jw(t,n),...r)),sharedState:((n,r)=>e.sharedState.get(jw(t,n),r)),streaming:{subscribe:(n,r,i)=>e.streaming.subscribe(jw(t,n),r,i),upload:(n,r)=>e.streaming.upload(jw(t,n),r)}},settings:Pw(e,t),scope:e.scope}}function Iw(){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 Lw(e,t={}){let n=t.modelContext??Iw();if(!n)return()=>{};let r=n,i=new Map,a=new Map;function o(t,n){let o=dC(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=Mb(t.type,n),u=r.registerTool({name:o,description:n.description,inputSchema:Fb(t.args),annotations:{title:n.title??t.name,readOnlyHint:l===`read`,destructiveHint:l===`destructive`},execute:n=>Rw(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 Rw(e,t,n){try{let r=Lb(n,e.args?.length);return{content:[{type:`text`,text:zw(await(await jC(e,t))(...r))}]}}catch(e){return{isError:!0,content:[{type:`text`,text:Bw(e)}]}}}function zw(e){return e===void 0?`undefined`:typeof e==`string`?e:JSON.stringify(e,null,2)}function Bw(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 Vw(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 Hw(e={}){let{baseURL:t=`./`,rpcOptions:n={},cacheOptions:r=!1}=e,i=Qb(),a=Array.isArray(t)?t:[t],o=await JC(e),{connectionMeta:s,metaBaseUrl:c,authToken:l}=o,u=a[0]??`./`;try{u=new URL(`.`,c).href}catch{}let d=new CC({functions:[],...typeof e.cacheOptions==`object`?e.cacheOptions:{}}),f={rpc:void 0},p=new MC(f),m=e.webmcp===!1?void 0:Lw(p),h,g=!1,_=0,ee;function te(){_++,ee=void 0,d.clear(),r===!0&&d.updateOptions({functions:[]})}r&&(p.register({name:vb.broadcast.cacheInvalidate,type:`event`,handler:te}),i.on(vb.client.connectionStatus,te),i.on(vb.client.isTrustedUpdated,te));async function ne(e){let t=[u,...a.filter(e=>e!==u)].filter(e=>e!=null),n=[];for(let r of t)try{return await fetch(rx(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 re=e.callTimeout??0,ie=re>0?re:1/0,ae,oe={authToken:l,connectionMeta:s,metaBaseUrl:c,events:i,clientRpc:p,callTimeout:e.callTimeout,rpcOptions:{...n,async onRequest(e,t,i){let a=performance.now()+ie;if(await n.onRequest?.call(this,e,t,i),r===!0&&e.i&&ae.isTrusted&&!e.m.startsWith(`anonymous:`)&&e.m!==`devframe:rpc:cacheable-functions`){function t(){if(performance.now()>=a)throw new YC(`timeout`,`[devframe] RPC call "${e.m}" timed out after ${re}ms`)}for(;!ee&&(t(),!(g||ae.status!==`connected`));){let e=_;ee=ae.callOptional(`devframe:rpc:cacheable-functions`).then(t=>{e===_&&d.updateOptions({functions:t??[]})}).catch(t=>{throw e===_&&(ee=void 0),t}),await ee}await ee,t()}let o=_;if(r&&e.i&&!g&&ae.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&&d.apply(e,n)}else await t(e)}}},se=Vw(e.transport??`auto`,s);ae=se===`static`?await xw({fetchJsonFromBases:ne}):se===`sse`?dw({...oe,sseOptions:e.sseOptions}):kw({...oe,wsOptions:e.wsOptions});let ce;try{ce=new BroadcastChannel(`devframe-auth`)}catch{}let le,ue=!1;function de(e){return((...t)=>ue||!le?e(...t):le.then(()=>e(...t)))}function fe(){g=!0,te();try{h?.(),m?.()}finally{try{ce?.close()}finally{ae.close?.()}}}let pe={events:i,get isTrusted(){return ae.isTrusted},get status(){return ae.status},get connectionError(){return ae.connectionError},get transport(){return ae.transport??se},get connection(){return o},connectionMeta:s,ensureTrusted:ae.ensureTrusted,requestTrust:ae.requestTrust,requestTrustWithToken:async e=>(WC(e),o={...o,authToken:e},ae.requestTrustWithToken(e)),requestTrustWithCode:async e=>{let t=await ae.requestTrustWithCode(e);if(!t)return!1;WC(t),o={...o,authToken:t};try{ce?.postMessage({type:`auth-update`,authToken:t})}catch{}return!0},requestAuthCode:e=>ae.requestAuthCode(e),call:de(ae.call),callEvent:de(ae.callEvent),callOptional:de(ae.callOptional),client:p,sharedState:void 0,services:void 0,streaming:void 0,cacheManager:d,scope:void 0,close:fe};pe.sharedState=tw(pe),pe.streaming=ww(pe),pe.services=ew(pe);let me=new Map;pe.scope=(e=>{if(!e)return pe;let t=me.get(e);return t||(t=Fw(pe,e),me.set(e,t)),t}),f.rpc=pe;function he(){try{return typeof window<`u`&&window.self===window.top}catch{return!1}}async function ge(){if(e.simpleAuth!==!1&&he()&&typeof globalThis.prompt==`function`)for(await pe.requestAuthCode().catch(()=>{});!pe.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 pe.requestTrustWithCode(t))return}}async function _e(){let t=await ae.requestTrust(),n=e.otpParam??`devframe_otp`,r=n?await $C(pe,{param:n}):!1;t||r||pe.isTrusted||await ge()}return le=_e().then(()=>{ue=!0},()=>{ue=!0}),s.mcp&&hC(async()=>{let{setupBrowserAgentRpcBridge:e}=await import(`./browser-agent-rpc-KH4HHvHf-DtH28z9R.js`);return{setupBrowserAgentRpcBridge:e}},[],import.meta.url).then(({setupBrowserAgentRpcBridge:e})=>{g||(h=e(pe))}).catch(()=>{}),ce&&(ce.onmessage=e=>{e.data?.type===`auth-update`&&e.data.authToken&&pe.requestTrustWithToken(e.data.authToken)}),pe}var Uw=Hw,Ww=[`components`,`injectors`,`signals`,`ngrx`,`tanstackQuery`,`forms`,`router`,`pipes`,`http`,`analog`,`capacitor`,`errors`,`plugins`],Gw=[`angular`,`ngrx`,`analog`,`angular-native`,`nativescript`,`capacitor`];function Kw(e){return`pangular:${e}`}var qw=[`forms`,`router`,`ngrx`,`http`,`analog`,`components`,`tanstackQuery`,`plugins`],Jw={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},capacitorCalls:{default:200,min:10,max:2e3},idleAfterMs:{default:6e4,min:0,max:6e5}},Yw={"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`,"cache-off-or-filter":`the transfer cache is off, or its filter (or another withHttpTransferCacheOptions setting) left it out`},Xw=[[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 Zw(e){return Xw.some(([t])=>t===e)}var Qw=/^[a-z][a-z0-9-]{0,39}$/;function $w(e,t){let n=t.plugins?.[e],r=t.inspectors.plugins&&Qw.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 eT=`pangular`,tT={mod:`Mod`,ctrl:`Ctrl`,control:`Ctrl`,meta:`Meta`,cmd:`Meta`,command:`Meta`,alt:`Alt`,option:`Alt`,opt:`Alt`,shift:`Shift`},nT=[`Mod`,`Ctrl`,`Meta`,`Alt`,`Shift`];function rT(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=tT[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[...nT.filter(e=>n.has(e)),r].join(`+`)}function iT(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 aT(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 oT=[{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:`capacitor`,label:`Capacitor`,inspector:`capacitor`},{id:`plugins`,label:`Plugins`,inspector:`plugins`}],sT=1e4;function cT(e){return oT.filter(t=>!(`inspector`in t)||e.inspectors[t.inspector])}var lT={components:`a component instance, by its id in the component tree`,injectors:`a component's element injector, by the component's id`,forms:`a form, by its id`},uT=200;function dT(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 fT(e){let t=new URLSearchParams(e.replace(/^#/,``)),n=e=>{let n=t.get(e)?.trim();return n&&n.length<=uT?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 pT=[{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 mT(e){let t=cT(e).map(e=>({id:`tab:${e.id}`,title:`Go to ${e.label}`,group:`Go to`,keywords:`tab open`})),n=pT.filter(t=>!t.inspector||e.inspectors[t.inspector]).map(({inspector:e,...t})=>t);return[...t,...n]}function hT(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:{}}function gT(e,t){return typeof e==`boolean`?e:t}var _T=100,vT=100;function yT(e){if(!Array.isArray(e))return[];let t=e.filter(e=>typeof e==`string`).map(e=>e.trim()).filter(e=>e&&e.length<=vT);return[...new Set(t)].slice(0,_T)}function bT(e,t){let{default:n,min:r,max:i}=Jw[t];return typeof e!=`number`||!Number.isFinite(e)?n:Math.min(i,Math.max(r,Math.round(e)))}function xT(e,t){return Object.fromEntries(e.map(e=>[e,t(e)]))}function ST(e){let t=hT(e),n=hT(t.agent),r=hT(t.inspectors),i=hT(n.tools),a=hT(t.actions),o=gT(t.actions,!0),s=hT(t.redaction),c=hT(t.limits),l=xT(Ww,e=>gT(r[e],!0));return{inspectors:l,agent:{readOnly:gT(n.readOnly,!1),tools:xT(Ww,e=>l[e]&&gT(i[e],!0)),browserTools:gT(n.browserTools,!1)},actions:xT(qw,e=>l[e]&&gT(a[e],o)),redaction:{secretNames:yT(s.secretNames),unmask:yT(s.unmask)},limits:Object.fromEntries(Object.keys(Jw).map(e=>[e,bT(c[e],e)])),popup:{hotkey:DT(hT(t.popup).hotkey)},plugins:ET(t.plugins),lint:{rules:wT(t.lint)}}}var CT=200;function wT(e){let t=hT(hT(e).rules),n={};for(let[e,r]of Object.entries(t).slice(0,CT))typeof r==`boolean`&&(n[e]=r);return n}var TT=100;function ET(e){let t={};for(let[n,r]of Object.entries(hT(e)).slice(0,TT)){if(!Qw.test(n))continue;if(typeof r==`boolean`){t[n]={enabled:r,tools:!0,actions:!0};continue}let e=hT(r);r!==void 0&&Object.keys(e).length&&(t[n]={enabled:gT(e.enabled,!0),tools:gT(e.tools,!0),actions:gT(e.actions,!0)})}return t}function DT(e){return e===!1?!1:rT(e)??`Alt+Shift+P`}function OT(e){let t=e?.configs;return ST(t?.[eT])}function kT(e){return`${{forms:`Writing to forms`,router:`Navigating and clearing navigations`,ngrx:`Restoring NgRx state and dispatching actions`,http:`Changing HTTP mock rules and SSR overrides, and clearing HTTP calls`,analog:`Calling API routes and clearing server calls`,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 AT=[`pangular:build-meta`],jT={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`},MT={forms:`Form writes`,router:`Navigation`,ngrx:`NgRx restore and dispatch`,http:`HTTP mocking`,analog:`Analog API calls`,components:`Component edits`,tanstackQuery:`TanStack Query invalidate and refetch`,plugins:`Plugin actions`},NT={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`,capacitorCalls:e=>`${e} Capacitor plugin calls`,idleAfterMs:e=>e?`idle ${e/1e3} s after the last agent call`:`never idle`};function PT(e){let t=[],n=(e,n)=>{n.length&&t.push({label:e,value:n.join(`, `)})},r=Ww.filter(t=>e.inspectors[t]);n(`Inspectors off`,Ww.filter(t=>!e.inspectors[t]).map(e=>jT[e])),n(`Agent`,e.agent.readOnly?[`Read-only`]:[]),n(`Hidden from the agent`,r.filter(t=>!e.agent.tools[t]).map(e=>jT[e])),n(`Blocked actions`,qw.filter(t=>e.inspectors[t]&&!e.actions[t]).map(e=>MT[e])),n(`Extra secret names`,e.redaction.secretNames),n(`Unmasked names`,e.redaction.unmask),n(`Limits`,Object.keys(Jw).filter(t=>e.limits[t]!==Jw[t].default).map(t=>NT[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 FT(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 IT(e){return!e.tags.length&&!e.directives.length&&!e.text}function LT(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 RT={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 zT(e){let t=/^(\d+)\.(\d+)/.exec(e.trim());return t?`${t[1]}.${t[2]}`:e.trim()}function BT(e){let t=/^(\d+)(?:\.(\d+))?/.exec(e.trim());return t?[Number(t[1]),Number(t[2]??0)]:null}function VT(e,t){let n=BT(e),r=BT(t);return!n||!r?!1:n[0]===r[0]?n[1]>=r[1]:n[0]>r[0]}function HT(e,t){return e?.capabilities?.[t]===!1}function UT(e,t){let n=RT[e],r=`${n.subject} needs Angular ${n.since} or later`;if(!t)return`${r}; this page's Angular version is unknown.`;let i=zT(t);return VT(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}.`}var WT=/^on (viewport|interaction|hover)\b/;function GT(e){let t=e.filter(e=>!/^(prefetch|hydrate) /.test(e));return t.length>0&&t.every(e=>WT.test(e))}function KT(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(GT(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 qT=`pangular-page-id`,JT=null;function YT(e){JT=e}function XT(){if(JT)return JT;try{return new URLSearchParams(location.search).get(`pageId`)||(window.top===window?null:sessionStorage.getItem(qT)||null)}catch{return null}}function ZT(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 QT(e,t){return e?t?e.pages?.[t]??null:e:null}function $T(e,t){return e?t?e.pages?.[t]??null:e.graph??null:null}function eE(){return{functions:[...AT]}}function tE(e,t,n){return e?e.scope(`pangular`).rpc.call(t,...n===void 0?[]:[n]):Promise.resolve(null)}function nE(e,t,n){return tE(e,t,n).then(e=>e,()=>null)}function rE(e){return e?.connectionMeta.backend===`static`}function iE(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 aE(e=globalThis){delete e.__DEVFRAME_CONNECTION__,delete e.__DEVFRAME_CONNECTION_META__}function oE(e){return e.split(`@`)[1]??``}var sE={signal:`Signal Forms`,reactive:`Reactive`,template:`Template-driven`},cE={own:`validator`,directive:`template attribute`,tree:`cross-field rule`,async:`async`,parse:`parse`,submission:`server`,schema:`schema`,manual:`setErrors`},lE=nE,uE={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 dE(e){return uE[e]??e}var fE=`https://pangular-inspector.dev/security/#opt-fields-in-or-out`;async function pE(e,t){return await lE(e,`request-form-action`,t)??{ok:!1,error:`The devtools server did not answer.`}}function mE(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 hE=/"(?:[^"\\\n]|\\.)*"|`([^`\n]*)`|\*\*/g;function gE(e){return(e??``).replace(/^_Labels, paths.*_\n\n/,``).replace(hE,(e,t)=>t??(e===`**`?``:e))}function _E(e){return OT(e?.connectionMeta)}function vE(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)?[...e]:void 0}function yE(e,t){if(!t||typeof t!=`object`)return e;let n=vE(t.secretNames),r=vE(t.unmask);return!n||!r?e:{...e,redaction:{secretNames:n,unmask:r}}}function bE(e,t){return _E(e).actions[t]}var xE={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`};function SE(e){return xE[e]}var CE=`https://pangular-inspector.dev/getting-started/configuration/#inspectors-and-agent-tools`;function wE(e,t){let n=xE[e];return!n||t.inspectors[n]}function TE(e,t){e&1&&(E(),Og(0,`rect`,5)(1,`rect`,6)(2,`rect`,7)(3,`rect`,8))}function EE(e,t){e&1&&(E(),Og(0,`path`,9)(1,`circle`,10)(2,`circle`,11)(3,`path`,12))}function DE(e,t){e&1&&(E(),Og(0,`path`,13)(1,`path`,14))}function OE(e,t){e&1&&(E(),Og(0,`path`,15)(1,`path`,16)(2,`path`,17))}function kE(e,t){e&1&&(E(),Og(0,`circle`,18)(1,`path`,19)(2,`circle`,20))}function AE(e,t){e&1&&(E(),Og(0,`path`,1))}function jE(e,t){e&1&&(E(),Og(0,`path`,21)(1,`path`,22)(2,`path`,23)(3,`path`,24))}function ME(e,t){e&1&&(E(),Og(0,`ellipse`,25)(1,`path`,26)(2,`path`,27))}function NE(e,t){e&1&&(E(),Og(0,`rect`,28)(1,`path`,29)(2,`path`,30)(3,`path`,31))}function PE(e,t){e&1&&(E(),Og(0,`circle`,32)(1,`path`,9)(2,`path`,33))}function FE(e,t){e&1&&(E(),Og(0,`path`,34)(1,`path`,35)(2,`path`,36)(3,`path`,37)(4,`circle`,38))}function IE(e,t){e&1&&(E(),Og(0,`circle`,39)(1,`path`,40))}function LE(e,t){e&1&&(E(),Og(0,`ellipse`,41)(1,`path`,42)(2,`path`,43)(3,`path`,44)(4,`path`,45))}function RE(e,t){e&1&&(E(),Og(0,`circle`,32)(1,`path`,46)(2,`path`,47))}function zE(e,t){e&1&&(E(),Og(0,`path`,2))}function BE(e,t){e&1&&(E(),Og(0,`path`,3))}function VE(e,t){e&1&&(E(),Og(0,`path`,4))}var HE=class e{name=$.required();static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-tab-icon`]],inputs:{name:[1,`name`]},decls:18,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`]],template:function(e,t){if(e&1&&(E(),z(0,`svg`,0),j(1,TE,4,0)(2,EE,4,0)(3,DE,2,0)(4,OE,3,0)(5,kE,3,0)(6,AE,1,0,`:svg:path`,1)(7,jE,4,0)(8,ME,3,0)(9,NE,4,0)(10,PE,3,0)(11,FE,5,0)(12,IE,2,0)(13,LE,5,0)(14,RE,3,0)(15,zE,1,0,`:svg:path`,2)(16,BE,1,0,`:svg:path`,3)(17,VE,1,0,`:svg:path`,4),B()),e&2){let e;O(),M((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===`plugins`?15:e===`analog`?16:e===`capacitor`?17:-1)}},styles:[`[_nghost-%COMP%] { +`);return r>=0?n.slice(0,r):n}function Ci(e,t){return e?t?`${e} ${t}`:e:t||``}var wi=bi({__forward_ref__:bi});function Ti(e){return e.__forward_ref__=Ti,e}function Ei(e){return Di(e)?e():e}function Di(e){return typeof e==`function`&&Object.hasOwn(e,wi)&&e.__forward_ref__===Ti}function Oi(e){return{token:e.token,providedIn:e.providedIn||null,factory:e.factory,value:void 0}}function ki(e){return Ai(e,Ni)}function Ai(e,t){return Object.hasOwn(e,t)&&e[t]||null}function ji(e){return(e?.[Ni]??null)||null}function Mi(e){return e&&Object.hasOwn(e,Pi)?e[Pi]:null}var Ni=bi({ɵprov:bi}),Pi=bi({ɵinj:bi}),Fi=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=Oi({token:this,providedIn:t.providedIn||`root`,factory:t.factory}))}get multi(){return this}toString(){return`InjectionToken ${this._desc}`}};function Ii(e){return e&&!!e.ɵproviders}var Li=bi({ɵcmp:bi}),Ri=bi({ɵdir:bi}),zi=bi({ɵpipe:bi}),Bi=bi({ɵfac:bi}),Vi=bi({__NG_ELEMENT_ID__:bi}),Hi=bi({__NG_ENV_ID__:bi});function Ui(e){return Ki(e,`@Component`),e[Li]||null}function Wi(e){return Ki(e,`@Directive`),e[Ri]||null}function Gi(e){return Ki(e,`@Pipe`),e[zi]||null}function Ki(e,t){if(e==null)throw new _i(-919,!1)}function qi(e){return typeof e==`string`?e:e==null?``:String(e)}var Ji=bi({ngErrorCode:bi}),Yi=bi({ngErrorMessage:bi}),Xi=bi({ngTokenPath:bi});function Zi(e,t){return $i(``,-200,t)}function Qi(e,t){throw new _i(-201,!1)}function $i(e,t,n){let r=new _i(t,e);return r[Ji]=t,r[Yi]=e,n&&(r[Xi]=n),r}function ea(e){return e[Ji]}var ta;function na(){return ta}function ra(e){let t=ta;return ta=e,t}function ia(e,t,n){let r=ki(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;Qi(e,``)}var aa=globalThis,oa={},sa=`__NG_DI_FLAG__`,ca=class{injector;constructor(e){this.injector=e}retrieve(e,t){let n=da(t)||0;try{return this.injector.get(e,n&8?null:oa,n)}catch(e){if(Kn(e))return e;throw e}}};function la(e,t=0){let n=Un();if(n===void 0)throw new _i(-203,!1);if(n===null)return ia(e,void 0,t);{let r=fa(t),i=n.retrieve(e,r);if(Kn(i)){if(r.optional)return null;throw i}return i}}function ua(e,t=0){return(na()||la)(Ei(e),t)}function C(e,t){return ua(e,da(t))}function da(e){return e===void 0||typeof e==`number`?e:0|(e.optional&&8)|(e.host&&1)|(e.self&&2)|(e.skipSelf&&4)}function fa(e){return{optional:!!(e&8),host:!!(e&1),self:!!(e&2),skipSelf:!!(e&4)}}function pa(e){let t=[];for(let n=0;nArray.isArray(e)?va(e,t):t(e))}function ya(e,t,n){t>=e.length?e.push(n):e.splice(t,0,n)}function ba(e,t){return t>=e.length-1?e.pop():e.splice(t,1)[0]}function xa(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 Ca(e,t,n){let r=Ta(e,t);return r>=0?e[r|1]=n:(r=~r,Sa(e,r,t,n)),r}function wa(e,t){let n=Ta(e,t);if(n>=0)return e[n|1]}function Ta(e,t){return Ea(e,t,1)}function Ea(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 va(t,e=>{let t=e;Ia(t,a,[],r)&&(i||=[],i.push(t))}),i!==void 0&&Fa(i,a),n}function Fa(e,t){for(let n=0;n{t(e,r)})}}function Ia(e,t,n,r){if(e=Ei(e),!e)return!1;let i=null,a=Mi(e),o=!a&&Ui(e);if(!a&&!o){let t=e.ngModule;if(a=Mi(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)Ia(i,t,n,r)}}else if(a){if(a.imports!=null&&!s){r.add(i);let e;try{va(a.imports,i=>{Ia(i,t,n,r)&&(e||=[],e.push(i))})}finally{}e!==void 0&&Fa(e,t)}if(!s){let e=ha(i)||(()=>new i);t({provide:i,useFactory:e,deps:Oa},i),t({provide:ja,useValue:i,multi:!0},i),t({provide:ka,useValue:()=>ua(i),multi:!0},i)}let o=a.providers;if(o!=null&&!s){let n=e;La(o,e=>{t(e,n)})}}else return!1;return i!==e&&e.providers!==void 0}function La(e,t){for(let n of e)Ii(n)&&(n=n.ɵproviders),Array.isArray(n)?La(n,t):t(n)}var Ra=bi({provide:String,useValue:bi});function za(e){return typeof e==`object`&&!!e&&Ra in e}function Ba(e){return!!(e&&e.useExisting)}function Va(e){return!!(e&&e.useFactory)}function Ha(e){return typeof e==`function`}function Ua(e){return!!e.useClass}var Wa=new Fi(``),Ga={},Ka={},qa=void 0;function Ja(){return qa===void 0&&(qa=new Ma),qa}var Ya=class{},Xa=class extends Ya{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,oo(e,e=>this.processProvider(e)),this.records.set(Aa,no(void 0,this)),r.has(`environment`)&&this.records.set(Ya,no(void 0,this));let i=this.records.get(Wa);i!=null&&typeof i.value==`string`&&this.scopes.add(i.value),this.injectorDefTypes=new Set(this.get(ja,Oa,{self:!0}))}retrieve(e,t){let n=da(t)||0;try{return this.get(e,oa,n)}catch(e){if(Kn(e))return e;throw e}}destroy(){to(this),this._destroyed=!0;let e=nn(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(),nn(e)}}onDestroy(e){return to(this),this._onDestroyHooks.push(e),()=>this.removeOnDestroy(e)}runInContext(e){to(this);let t=Wn(this),n=ra(void 0);try{return e()}finally{Wn(t),ra(n)}}get(e,t=oa,n){if(to(this),Object.hasOwn(e,Hi))return e[Hi](this);let r=da(n),i=Wn(this),a=ra(void 0);try{if(!(r&4)){let t=this.records.get(e);if(t===void 0){let n=ao(e)&&ki(e);t=n&&this.injectableDefInScope(n)?no(Za(e),Ga):null,this.records.set(e,t)}if(t!=null)return this.hydrate(e,t,r)}let n=r&2?Ja():this.parent;return t=r&8&&t===oa?null:t,n.get(e,t)}catch(e){let t=ea(e);throw t===-200||t===-201?new _i(t,null):e}finally{ra(a),Wn(i)}}resolveInjectorInitializers(){let e=nn(null),t=Wn(this),n=ra(void 0);try{let e=this.get(ka,Oa,{self:!0});for(let t of e)t()}finally{Wn(t),ra(n),nn(e)}}toString(){return`R3Injector[...]`}processProvider(e){e=Ei(e);let t=Ha(e)?e:Ei(e&&e.provide),n=$a(e);if(!Ha(e)&&e.multi===!0){let n=this.records.get(t);n||(n=no(void 0,Ga,!0),n.factory=()=>pa(n.multi),this.records.set(t,n)),t=e,n.multi.push(e)}this.records.set(t,n)}hydrate(e,t,n){let r=nn(null);try{if(t.value===Ka)throw Zi(``);return t.value===Ga&&(t.value=Ka,t.value=t.factory(void 0,n)),typeof t.value==`object`&&t.value&&io(t.value)&&this._ngOnDestroyHooks.add(t.value),t.value}finally{nn(r)}}injectableDefInScope(e){if(!e.providedIn)return!1;let t=Ei(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 Za(e){let t=ki(e),n=t===null?ha(e):t.factory;if(n!==null)return n;if(e instanceof Fi)throw new _i(-204,!1);if(e instanceof Function)return Qa(e);throw new _i(-204,!1)}function Qa(e){if(e.length>0)throw new _i(-204,!1);let t=ji(e);return t===null?()=>new e:()=>t.factory(e)}function $a(e){return za(e)?no(void 0,e.useValue):no(eo(e),Ga)}function eo(e,t,n){let r;if(Ha(e)){let t=Ei(e);return ha(t)||Za(t)}if(za(e))r=()=>Ei(e.useValue);else if(Va(e))r=()=>e.useFactory(...pa(e.deps||[]));else if(Ba(e))r=(t,n)=>ua(Ei(e.useExisting),n!==void 0&&n&8?8:void 0);else{let t=Ei(e&&(e.useClass||e.provide));if(ro(e))r=()=>new t(...pa(e.deps));else return ha(t)||Za(t)}return r}function to(e){if(e.destroyed)throw new _i(-205,!1)}function no(e,t,n=!1){return{factory:e,value:t,multi:n?[]:void 0}}function ro(e){return!!e.deps}function io(e){return typeof e==`object`&&!!e&&typeof e.ngOnDestroy==`function`}function ao(e){return typeof e==`function`||typeof e==`object`&&e.ngMetadataName===`InjectionToken`}function oo(e,t){for(let n of e)Array.isArray(n)?oo(n,t):n&&Ii(n)?oo(n.ɵproviders,t):t(n)}function so(e,t){let n;e instanceof Xa?(to(e),n=e):n=new ca(e);let r=Wn(n),i=ra(void 0);try{return t()}finally{Wn(r),ra(i)}}function co(){return na()!==void 0||Un()!=null}var lo=1;function uo(e){return Array.isArray(e)&&typeof e[lo]==`object`}function fo(e){return Array.isArray(e)&&e[lo]===!0}function po(e){return!!(e.flags&4)}function mo(e){return e.componentOffset>-1}function ho(e){return(e.flags&1)==1}function go(e){return!!e.template}function _o(e){return!!(e[2]&512)}function vo(e){return(e[2]&256)==256}var yo=(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})(yo||{}),bo=`math`;function xo(e){for(;Array.isArray(e);)e=e[0];return e}function So(e,t){return xo(t[e])}function Co(e,t){return xo(t[e.index])}function wo(e,t){return e.data[t]}function To(e,t){return e[t]}function Eo(e,t,n,r){n>=e.data.length&&(e.data[n]=null,e.blueprint[n]=null),t[n]=r}function Do(e,t){let n=t[e];return uo(n)?n:n[0]}function Oo(e){return(e[2]&128)==128}function Pee(e){return fo(e[3])}function ko(e,t){return t==null?null:e[t]}function Ao(e){e[17]=0}function jo(e){e[2]&1024||(e[2]|=1024,Oo(e)&&Po(e))}function Fee(e,t){for(;e>0;)t=t[14],e--;return t}function Mo(e){return!!(e[2]&9216||e[24]?.dirty)}function No(e){e[10].changeDetectionScheduler?.notify(8),e[2]&64&&(e[2]|=1024),Mo(e)&&Po(e)}function Po(e){e[10].changeDetectionScheduler?.notify(0);let t=Io(e);for(;t!==null&&!(t[2]&8192||(t[2]|=8192,!Oo(t)));)t=Io(t)}function Fo(e,t){if(vo(e))throw new _i(911,!1);e[21]===null&&(e[21]=[]),e[21].push(t)}function Iee(e,t){if(e[21]===null)return;let n=e[21].indexOf(t);n!==-1&&e[21].splice(n,1)}function Io(e){let t=e[3];return fo(t)?t[3]:t}function Lo(e){return e[7]??=[]}function Ro(e){return e.cleanup??=[]}function Lee(e,t,n,r){let i=Lo(t);i.push(n),e.firstCreatePass&&Ro(e).push(r,i.length-1)}var zo={lFrame:fs(null),bindingsEnabled:!0,skipHydrationRootTNode:null},Bo=!1;function Ree(){return zo.lFrame.elementDepthCount}function zee(){zo.lFrame.elementDepthCount++}function Vo(){zo.lFrame.elementDepthCount--}function Ho(){return zo.bindingsEnabled}function Uo(){return zo.skipHydrationRootTNode!==null}function Wo(e){return zo.skipHydrationRootTNode===e}function Go(){zo.skipHydrationRootTNode=null}function Ko(){return zo.lFrame.lView}function qo(){return zo.lFrame.tView}function w(e){return zo.lFrame.contextLView=e,e[8]}function T(e){return zo.lFrame.contextLView=null,e}function Jo(){let e=Yo();for(;e!==null&&e.type===64;)e=e.parent;return e}function Yo(){return zo.lFrame.currentTNode}function Bee(){let e=zo.lFrame,t=e.currentTNode;return e.isParent?t:t.parent}function Xo(e,t){let n=zo.lFrame;n.currentTNode=e,n.isParent=t}function Zo(){return zo.lFrame.isParent}function Qo(){zo.lFrame.isParent=!1}function $o(){return zo.lFrame.contextLView}function es(){return Bo}function ts(e){let t=Bo;return Bo=e,t}function ns(){let e=zo.lFrame,t=e.bindingRootIndex;return t===-1&&(t=e.bindingRootIndex=e.tView.bindingStartIndex),t}function rs(){return zo.lFrame.bindingIndex}function Vee(e){return zo.lFrame.bindingIndex=e}function is(){return zo.lFrame.bindingIndex++}function as(e){let t=zo.lFrame,n=t.bindingIndex;return t.bindingIndex+=e,n}function Hee(){return zo.lFrame.inI18n}function Uee(e,t){let n=zo.lFrame;n.bindingIndex=n.bindingRootIndex=e,os(t)}function Wee(){return zo.lFrame.currentDirectiveIndex}function os(e){zo.lFrame.currentDirectiveIndex=e}function Gee(e){let t=zo.lFrame.currentDirectiveIndex;return t===-1?null:e[t]}function Kee(){return zo.lFrame.currentQueryIndex}function ss(e){zo.lFrame.currentQueryIndex=e}function cs(e){let t=e[1];return t.type===2?t.declTNode:t.type===1?e[5]:null}function ls(e,t,n){if(n&4){let r=t,i=e;for(;r=r.parent,r===null&&!(n&1)&&(r=cs(i),!(r===null||(i=i[14],r.type&10))););if(r===null)return!1;t=r,e=i}let r=zo.lFrame=ds();return r.currentTNode=t,r.lView=e,!0}function us(e){let t=ds(),n=e[1];zo.lFrame=t,t.currentTNode=n.firstChild,t.lView=e,t.tView=n,t.contextLView=e,t.bindingIndex=n.bindingStartIndex,t.inI18n=!1}function ds(){let e=zo.lFrame,t=e===null?null:e.child;return t===null?fs(e):t}function fs(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 ps(){let e=zo.lFrame;return zo.lFrame=e.parent,e.currentTNode=null,e.lView=null,e}var ms=ps;function hs(){let e=ps();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 gs(e){return(zo.lFrame.contextLView=Fee(e,zo.lFrame.contextLView))[8]}function _s(){return zo.lFrame.selectedIndex}function vs(e){zo.lFrame.selectedIndex=e}function ys(){let e=zo.lFrame;return wo(e.tView,e.selectedIndex)}function E(){zo.lFrame.currentNamespace=`svg`}function bs(){xs()}function xs(){zo.lFrame.currentNamespace=null}function Ss(){return zo.lFrame.currentNamespace}var Cs=!0;function ws(){return Cs}function Ts(e){Cs=e}function Es(e,t=null,n=null,r){let i=Ds(e,t,n,r);return i.resolveInjectorInitializers(),i}function Ds(e,t=null,n=null,r,i=new Set){return new Xa([n||Oa,Na(e)],t||Ja(),null,i)}var Os=class e{static THROW_IF_NOT_FOUND=oa;static NULL=new Ma;static create(e,t){if(Array.isArray(e))return Es({name:``},t,e,``);{let t=e.name??``;return Es({name:t},e.parent,e.providers,t)}}static ɵprov=Oi({token:e,providedIn:`any`,factory:()=>ua(Aa)});static __NG_ELEMENT_ID__=-1},ks=new Fi(``),As=class{static __NG_ELEMENT_ID__=Ms;static __NG_ENV_ID__=e=>e},js=class extends As{_lView;constructor(e){super(),this._lView=e}get destroyed(){return vo(this._lView)}onDestroy(e){let t=this._lView;return Fo(t,e),()=>Iee(t,e)}};function Ms(){return new js(Ko())}var Ns=new Fi(``),Ps=(()=>{class e{taskId=0;pendingTasks=new Set;destroyed=!1;pendingTask=new Xr(!1);debugTaskTracker=C(Ns,{optional:!0});get hasPendingTasks(){return!this.destroyed&&this.pendingTask.value}get hasPendingTasksObservable(){return this.destroyed?new zr(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=Oi({token:e,providedIn:`root`,factory:()=>new e})}return e})(),Fs=class extends Jr{__isAsync;destroyRef=void 0;pendingTasks=void 0;constructor(e=!1){super(),this.__isAsync=e,co()&&(this.destroyRef=C(As,{optional:!0})??void 0,this.pendingTasks=C(Ps,{optional:!0})??void 0)}emit(e){let t=nn(null);try{super.next(e)}finally{nn(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 fr&&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 Is(...e){}function Ls(e){let t,n;function r(){e=Is;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 Rs(e){return queueMicrotask(()=>e()),()=>{e=Is}}var zs=`isAngularZone`,Bs=`isAngularZone_ID`,Vs=0,Hs=class e{hasPendingMacrotasks=!1;hasPendingMicrotasks=!1;isStable=!0;onUnstable=new Fs(!1);onMicrotaskEmpty=new Fs(!1);onStable=new Fs(!1);onError=new Fs(!1);constructor(e){let{enableLongStackTrace:t=!1,shouldCoalesceEventChangeDetection:n=!1,shouldCoalesceRunChangeDetection:r=!1,scheduleInRootZone:i=!1}=e;if(typeof Zone>`u`)throw new _i(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,Ks(a)}static isInAngularZone(){return typeof Zone<`u`&&Zone.current.get(zs)===!0}static assertInAngularZone(){if(!e.isInAngularZone())throw new _i(909,!1)}static assertNotInAngularZone(){if(e.isInAngularZone())throw new _i(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,Us,Is,Is);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)}},Us={};function Ws(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 Gs(e){if(e.isCheckStableRunning||e.callbackScheduled)return;e.callbackScheduled=!0;function t(){Ls(()=>{e.callbackScheduled=!1,qs(e),e.isCheckStableRunning=!0,Ws(e),e.isCheckStableRunning=!1})}e.scheduleInRootZone?Zone.root.run(()=>{t()}):e._outer.run(()=>{t()}),qs(e)}function Ks(e){let t=()=>{Gs(e)},n=Vs++;e._inner=e._inner.fork({name:`angular`,properties:{[zs]:!0,[Bs]:n,[Bs+n]:!0},onInvokeTask:(n,r,i,a,o,s)=>{if(Zs(s))return n.invokeTask(i,a,o,s);try{return Js(e),n.invokeTask(i,a,o,s)}finally{(e.shouldCoalesceEventChangeDetection&&a.type===`eventTask`||e.shouldCoalesceRunChangeDetection)&&t(),Ys(e)}},onInvoke:(n,r,i,a,o,s,c)=>{try{return Js(e),n.invoke(i,a,o,s,c)}finally{e.shouldCoalesceRunChangeDetection&&!e.callbackScheduled&&!Qs(s)&&t(),Ys(e)}},onHasTask:(t,n,r,i)=>{t.hasTask(r,i),n===r&&(i.change==`microTask`?(e._hasPendingMicrotasks=i.microTask,qs(e),Ws(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 qs(e){e.hasPendingMicrotasks=!!(e._hasPendingMicrotasks||(e.shouldCoalesceEventChangeDetection||e.shouldCoalesceRunChangeDetection)&&e.callbackScheduled===!0)}function Js(e){e._nesting++,e.isStable&&(e.isStable=!1,e.onUnstable.emit(null))}function Ys(e){e._nesting--,Ws(e)}var Xs=class{hasPendingMicrotasks=!1;hasPendingMacrotasks=!1;isStable=!0;onUnstable=new Fs;onMicrotaskEmpty=new Fs;onStable=new Fs;onError=new Fs;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 Zs(e){return $s(e,`__ignore_ng_zone__`)}function Qs(e){return $s(e,`__scheduler_tick__`)}function $s(e,t){return!Array.isArray(e)||e.length!==1?!1:e[0]?.data?.[t]===!0}var ec=class{_console=console;handleError(e){this._console.error(`ERROR`,e)}},tc=new Fi(``,{factory:()=>{let e=C(Hs),t=C(Ya),n;return r=>{e.runOutsideAngular(()=>{t.destroyed&&!n?setTimeout(()=>{throw r}):(n??=t.get(ec),n.handleError(r))})}}}),nc={provide:ka,useValue:()=>{C(ec,{optional:!0})},multi:!0};function D(e,t){let[n,r,i]=Pn(e,t?.equal),a=n;return a[tn],a.set=r,a.update=i,a.asReadonly=rc.bind(a),a}function rc(){let e=this[tn];if(e.readonlyFn===void 0){let t=()=>this();t[tn]=e,e.readonlyFn=t}return e.readonlyFn}var ic=new Fi(``,{factory:()=>ac}),ac=`ng`,oc=new Fi(``),sc=new Fi(``,{providedIn:`platform`,factory:()=>`unknown`}),cc=new Fi(``,{factory:()=>C(ks).body?.querySelector(`[ngCspNonce]`)?.getAttribute(`ngCspNonce`)||null}),lc=(()=>{class e{view;node;constructor(e,t){this.view=e,this.node=t}static __NG_ELEMENT_ID__=uc}return e})();function uc(){return new lc(Ko(),Jo())}var dc=class{},fc=new Fi(``,{factory:()=>!0}),pc=new Fi(``),mc=(()=>{class e{static ɵprov=Oi({token:e,providedIn:`root`,factory:()=>new hc})}return e})(),hc=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}},gc=class{[tn];constructor(e){this[tn]=e}destroy(){this[tn].destroy()}};function _c(e,t){let n=t?.injector??C(Os),r=t?.manualCleanup===!0?null:n.get(As),i,a=n.get(lc,null,{optional:!0}),o=n.get(dc);return a===null?i=Sc(e,n.get(mc),o):(i=xc(a.view,o,e),r instanceof js&&r._lView===a.view&&(r=null)),i.injector=n,r!==null&&(i.onDestroyFns=[r.onDestroy(()=>i.destroy())]),new gc(i)}var vc={...Bn,cleanupFns:void 0,zone:null,onDestroyFns:null,run(){let e=ts(!1);try{Vn(this)}finally{ts(e)}},cleanup(){if(!this.cleanupFns?.length)return;let e=nn(null);try{for(;this.cleanupFns.length;)this.cleanupFns.pop()()}finally{this.cleanupFns=[],nn(e)}}},yc={...vc,consumerMarkedDirty(){this.scheduler.schedule(this),this.notifier.notify(12)},destroy(){if(vn(this),this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();this.cleanup(),this.scheduler.remove(this)}},bc={...vc,consumerMarkedDirty(){this.view[2]|=8192,Po(this.view),this.notifier.notify(13)},destroy(){if(vn(this),this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();this.cleanup(),this.view[23]?.delete(this)}};function xc(e,t,n){let r=Object.create(bc);return r.view=e,r.zone=typeof Zone<`u`?Zone.current:null,r.notifier=t,r.fn=Cc(r,n),e[23]??=new Set,e[23].add(r),r.consumerMarkedDirty(r),r}function Sc(e,t,n){let r=Object.create(yc);return r.fn=Cc(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 Cc(e,t){return()=>{t(t=>(e.cleanupFns??=[]).push(t))}}function wc(e){return typeof e==`function`&&e[tn]!==void 0}function Tc(e){return wc(e)&&typeof e.set==`function`}var Ec=Symbol(`InputSignalNode#UNSET`),Dc={...Rn,transformFn:void 0,applyValueToInputSignal(e,t){In(e,t)}};function Oc(e){return{toString:e}.toString()}var kc=(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})(kc||{}),Ac=class{previousValue;currentValue;firstChange;constructor(e,t,n){this.previousValue=e,this.currentValue=t,this.firstChange=n}isFirstChange(){return this.firstChange}};function jc(e,t,n,r){t===null?e[n]=r:t.applyValueToInputSignal(t,r)}var Mc=null,Nc=(()=>{Mc=Fc;let e=()=>Fc;return e.ngInherit=!0,e})();function Pc(){return Mc}function Fc(e){return e.type.prototype.ngOnChanges&&(e.setInput=Lc),Ic}function Ic(){let e=zc(this),t=e?.current;if(t){let n=e.previous;if(n===Da)e.previous=t;else for(let e in t)n[e]=t[e];e.current=null,this.ngOnChanges(t)}}function Lc(e,t,n,r,i){let a=this.declaredInputs[r],o=zc(e)||Bc(e,{previous:Da,current:null}),s=o.current||={},c=o.previous,l=c[a];s[a]=new Ac(l&&l.currentValue,n,c===Da),jc(e,t,i,n)}var Rc=`__ngSimpleChanges__`;function zc(e){return Object.hasOwn(e,Rc)&&e[Rc]||null}function Bc(e,t){return e[Rc]=t}var Vc=[],Hc=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,Yc(o,a)):Yc(o,a)}var Zc=-1,Qc=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 $c(e){return!!(e.flags&8)}function el(e){return!!(e.flags&16)}function tl(e,t,n){let r=0;for(;rt){o=a-1;break}}}for(;a>16}function ll(e,t){let n=cl(e),r=t;for(;n>0;)r=r[14],n--;return r}var ul=!0;function dl(e){let t=ul;return ul=e,t}var fl=255,pl=5,ml=0,hl={};function gl(e,t,n){let r;typeof n==`string`?r=n.charCodeAt(0)||0:Object.hasOwn(n,Vi)&&(r=n[Vi]),r??=n[Vi]=ml++;let i=r&fl,a=1<>pl)]|=a}function _l(e,t){let n=yl(e,t);if(n!==-1)return n;let r=t[1];r.firstCreatePass&&(e.injectorIndex=t.length,vl(r.data,e),vl(t,null),vl(r.blueprint,null));let i=bl(e,t),a=e.injectorIndex;if(ol(i)){let e=sl(i),n=ll(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 vl(e,t){e.push(0,0,0,0,0,0,0,0,t)}function yl(e,t){return e.injectorIndex===-1||e.parent&&e.parent.injectorIndex===e.injectorIndex||t[e.injectorIndex+8]===null?-1:e.injectorIndex}function bl(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=Ll(i),r===null)return Zc;if(n++,i=i[14],r.injectorIndex!==-1)return r.injectorIndex|n<<16}return Zc}function xl(e,t,n){gl(e,t,n)}function Sl(e,t,n){if(n&8||e!==void 0)return e;Qi(t,`NodeInjector`)}function Cl(e,t,n,r){if(n&8&&r===void 0&&(r=null),!(n&3)){let i=e[9],a=ra(void 0);try{return i?i.get(t,r,n&8):ia(t,r,n&8)}finally{ra(a)}}return Sl(r,t,n)}function wl(e,t,n,r=0,i){if(e!==null){if(t[2]&2048&&!(r&2)){let i=Il(e,t,n,r,hl);if(i!==hl)return i}let i=Tl(e,t,n,r,hl);if(i!==hl)return i}return Cl(t,n,r,i)}function Tl(e,t,n,r,i){let a=kl(n);if(typeof a==`function`){if(!ls(t,e,r))return r&1?Sl(i,n,r):Cl(t,n,r,i);try{let e;if(e=a(r),e==null&&!(r&8))Qi(n);else return e}finally{ms()}}else if(typeof a==`number`){let i=null,o=yl(e,t),s=Zc,c=r&1?t[15][5]:null;for((o===-1||r&4)&&(s=o===-1?bl(e,t):t[o+8],s===Zc||!jl(r,!1)?o=-1:(i=t[1],o=sl(s),t=ll(s,t)));o!==-1;){let e=t[1];if(Al(a,o,e.data)){let e=El(o,t,n,i,r,c);if(e!==hl)return e}s=t[o+8],s!==Zc&&jl(r,t[1].data[o+8]===c)&&Al(a,o,t)?(i=e,o=sl(s),t=ll(s,t)):o=-1}}return i}function El(e,t,n,r,i,a){let o=t[1],s=o.data[e+8],c=Dl(s,o,n,r==null?mo(s)&&ul:r!=o&&!!(s.type&3),i&1&&a===s);return c===null?hl:Ol(t,o,c,s,i)}function Dl(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&&go(e)&&e.type===n)return c}return null}function Ol(e,t,n,r,i){let a=e[n],o=t.data;if(a instanceof Qc){let s=a;if(s.resolving)throw Zi(``);let c=dl(s.canSeeViewProviders);s.resolving=!0,o[n].type||o[n];let l=s.injectImpl?ra(s.injectImpl):null;ls(e,r,0);try{a=e[n]=s.factory(void 0,i,o,e,r),t.firstCreatePass&&n>=r.directiveStart&&Uc(n,o[n],t)}finally{l!==null&&ra(l),dl(c),s.resolving=!1,ms()}}return a}function kl(e){if(typeof e==`string`)return e.charCodeAt(0)||0;let t=Object.hasOwn(e,Vi)?e[Vi]:void 0;return typeof t==`number`?t>=0?t&fl:Nl:t}function Al(e,t,n){let r=1<>pl)]&r)}function jl(e,t){return!(e&2)&&!(e&1&&t)}var Ml=class{_tNode;_lView;constructor(e,t){this._tNode=e,this._lView=t}get(e,t,n){return wl(this._tNode,this._lView,e,da(n),t)}};function Nl(){return new Ml(Jo(),Ko())}function Pl(e){return Oc(()=>{let t=e.prototype.constructor,n=t[Bi]||Fl(t),r=Object.prototype,i=Object.getPrototypeOf(e.prototype).constructor;for(;i&&i!==r;){let e=i[Bi]||Fl(i);if(e&&e!==n)return e;i=Object.getPrototypeOf(i)}return e=>new e})}function Fl(e){return Di(e)?()=>{let t=Fl(Ei(e));return t&&t()}:ha(e)}function Il(e,t,n,r,i){let a=e,o=t;for(;a!==null&&o!==null&&o[2]&2048&&!_o(o);){let e=Tl(a,o,n,r|2,hl);if(e!==hl)return e;r&=-5;let t=a.parent;if(!t){let e=o[20];if(e){let t=e.get(n,hl,r);if(t!==hl)return t}t=Ll(o),o=o[14]}a=t}return i}function Ll(e){let t=e[1],n=t.type;return n===2?t.declTNode:n===1?e[5]:null}function Rl(e){return{token:e.token,providedIn:e.autoProvided===!1?null:`root`,factory:e.factory,value:void 0}}function zl(){return Bl(Jo(),Ko())}function Bl(e,t){return new Vl(Co(e,t))}var Vl=(()=>{class e{nativeElement;constructor(e){this.nativeElement=e}static __NG_ELEMENT_ID__=zl}return e})();function Hl(e){return e instanceof Vl?e.nativeElement:e}function Ul(){return this._results[Symbol.iterator]()}var Wl=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 Jr}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=_a(e);(this._changesDetected=!ga(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]=Ul};function Gl(e){return(e.flags&128)==128}var Kl=(function(e){return e[e.OnPush=0]=`OnPush`,e[e.Eager=1]=`Eager`,e[e.Default=1]=`Default`,e})(Kl||{}),ql=new Map,Jl=0;function Yl(){return Jl++}function Xl(e){ql.set(e[19],e)}function Zl(e){ql.delete(e[19])}var Ql=`__ngContext__`;function $l(e,t){uo(t)?(e[Ql]=t[19],Xl(t)):e[Ql]=t}function eu(e){return nu(e[12])}function tu(e){return nu(e[4])}function nu(e){for(;e!==null&&!fo(e);)e=e[4];return e}var ru=void 0;function iu(e){ru=e}function au(){if(ru!==void 0)return ru;if(typeof document<`u`)return document;throw new _i(210,!1)}var ou=!1,su=new Fi(``,{factory:()=>ou}),cu=new WeakMap;function lu(e,t){if(typeof e!=`object`||!e)return;let n=cu.get(e);n||(n=new WeakSet,cu.set(e,n)),n.add(t)}function uu(e){return(e.flags&32)==32}var du=()=>null;function fu(e,t,n=!1){return du(e,t,n)}function pu(e,t){let n=e.contentQueries;if(n!==null){let r=nn(null);try{for(let r=0;r|^->||--!>|)/g,Jee=`​$1​`;function Yee(e){return e.replace(Cu,e=>e.replace(qee,Jee))}function Xee(e,t){return e.createText(t)}function Zee(e,t,n){e.setValue(t,n)}function Qee(e,t){return e.createComment(Yee(t))}function wu(e,t,n){return e.createElement(t,n)}function Tu(e,t,n,r,i){e.insertBefore(t,n,r,i)}function Eu(e,t,n){e.appendChild(t,n)}function Du(e,t,n,r,i){r===null?Eu(e,t,n):Tu(e,t,n,r,i)}function Ou(e,t,n,r){e.removeChild(null,t,n,r)}function $ee(e,t,n){e.setAttribute(t,`style`,n)}function ete(e,t,n){n===``?e.removeAttribute(t,`class`):e.setAttribute(t,`class`,n)}function ku(e,t,n){let{mergedAttrs:r,classes:i,styles:a}=n;r!==null&&tl(e,t,r),i!==null&&ete(e,t,i),a!==null&&$ee(e,t,a)}function Au(e){let t=tte();return t?t.sanitize(yo.URL,e)||``:yu(e,`URL`)?vu(e):Su(qi(e))}function tte(){let e=Ko();return e&&e[10].sanitizer}function ju(e){return e.ownerDocument.defaultView}function Mu(e){return e.ownerDocument}function nte(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 Nu=`ng-template`;function rte(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(Fu(r))return!1;o=!0}}}}}return Fu(r)||o}function Fu(e){return!(e&1)}function ote(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!==``&&!Fu(o)&&(t+=Lu(a,i),i=``),r=o,a||=!Fu(r);n++}return i!==``&&(t+=Lu(a,i)),t}function fte(e){return e.map(dte).join(`,`)}function pte(e){let t=[],n=[],r=1,i=2;for(;r!1});function Vu(e){if(!e)return 0;let t=e.toLowerCase().indexOf(`ms`)>-1?1:1e3;return parseFloat(e)*t}function Hu(e,t){return e.getPropertyValue(t).split(`,`).map(e=>e.trim())}function gte(e){let t=Hu(e,`transition-property`),n=Hu(e,`transition-duration`),r=Hu(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 _te(e){let t=Hu(e,`animation-name`),n=Hu(e,`animation-delay`),r=Hu(e,`animation-duration`),i=Hu(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 Uu(e,t){return e!==void 0&&e.duration>t.duration}function Wu(e){return(e.animationName!=null||e.propertyName!=null)&&e.duration>0}function Gu(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 vte(e,t){let n=getComputedStyle(e),r=_te(n),i=gte(n),a=r.duration>i.duration?r:i;Uu(t.get(e),a)||Wu(a)&&t.set(e,a)}function yte(e,t,n){if(!n)return;let r=e.getAnimations();return r.length===0?vte(e,t):bte(e,t,r)}function bte(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=Gu(e)??0,n,i;e.animationName?i=e.animationName:n=e.transitionProperty,t>=r.duration&&(r={animationName:i,propertyName:n,duration:t})}Uu(t.get(e),r)||Wu(r)&&t.set(e,r)}var Ku=new Set,xte=!1,Ste=1,qu=typeof document<`u`&&typeof document?.documentElement?.getAnimations==`function`;function Cte(e){return e[9].get(hte,xte)}function wte(e,t,n){let r=Yu.get(e);if(r){for(let e of t)r.classList.push(e);for(let e of n)r.cleanupFns.push(e)}else Yu.set(e,{classList:t,cleanupFns:n})}function Ju(e){let t=Yu.get(e);if(t){for(let e of t.cleanupFns)e();Yu.delete(e)}Xu.delete(e)}var Yu=new WeakMap,Xu=new WeakMap,Zu=new WeakMap;function Qu(e){return e?e[14]??e:null}var $u=new WeakSet;function Tte(e,t,n){let r=Zu.get(e);if(!r||r.length===0)return;let i=t.parentNode,a=t.previousSibling,o=Qu(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),$u.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 Ete(e,t,n){let r=Qu(n),i=Zu.get(e);i?i.some(e=>e.el===t)||i.push({el:t,declarationView:r}):Zu.set(e,[{el:t,declarationView:r}])}function ed(e){let t=e[26]??={};return t.enter??=new Map}function Dte(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 td(e){return e.composedPath?e.composedPath()[0]:e.target}function nd(e,t){let n=Xu.get(t);if(n===void 0)return!0;if(t!==td(e))return!1;let r=e.animation;if(r){let e=Gu(r);if(e!==void 0&&e+Ste{class e{impl=null;execute(){this.impl?.execute()}static ɵprov=Oi({token:e,providedIn:`root`,factory:()=>new e})}return e})(),cd=[0,1,2,3],ld=(()=>{class e{ngZone=C(Hs);scheduler=C(dc);errorHandler=C(ec,{optional:!0});sequences=new Set;deferredRegistrations=new Set;executing=!1;constructor(){C(id,{optional:!0})}execute(){let e=this.sequences.size>0;e&&Hc(kc.AfterRenderHooksStart),this.executing=!0;for(let e of cd)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&&Hc(kc.AfterRenderHooksEnd)}register(e){let{view:t}=e;t===void 0?this.executing?this.deferredRegistrations.add(e):this.addSequence(e):((t[25]??=[]).push(e),Po(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(rd.AFTER_NEXT_RENDER,e):e()}static ɵprov=Oi({token:e,providedIn:`root`,factory:()=>new e})}return e})(),ud=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 dd(e,t){let n=t?.injector??C(Os);return od(`NgAfterNextRender`),Ate(e,n,t,!0)}function kte(e){return e instanceof Function?[void 0,void 0,e,void 0]:[e.earlyRead,e.write,e.mixedReadWrite,e.read]}function Ate(e,t,n,r){let i=t.get(sd);i.impl??=t.get(ld);let a=t.get(id,null,{optional:!0}),o=n?.manualCleanup===!0?null:t.get(As),s=t.get(lc,null,{optional:!0}),c=new ud(i.impl,kte(e),s?.view,r,o,a?.snapshot(null));return i.impl.register(c),c}var fd=new Fi(``,{factory:()=>{let e=C(Ya),t=new Set;return e.onDestroy(()=>t.clear()),{queue:t,isScheduled:!1,scheduler:null,injector:e}}});function pd(e,t,n){let r=e.get(fd);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 jte(e,t){let n=e.get(fd);if(Array.isArray(t))for(let e of t)n.queue.delete(e);else n.queue.delete(t)}function Mte(e,t){let n=e.get(fd);if(t.detachedLeaveAnimationFns){for(let e of t.detachedLeaveAnimationFns)n.queue.delete(e);t.detachedLeaveAnimationFns=void 0}}function Nte(e){let t=e.get(fd);t.isScheduled||=(dd(()=>{t.isScheduled=!1;for(let e of t.queue)e();t.queue.clear()},{injector:t.injector}),!0)}function Pte(e){let t=e.get(fd);t.scheduler=Nte,t.scheduler(e)}function md(e,t){for(let[n,r]of t)pd(e,r.animateFns)}function hd(e,t,n,r){let i=e?.[26]?.enter;t!==null&&i&&i.has(n.index)&&md(r,i)}function gd(e,t,n,r){try{n.get(Aa)}catch{return r(!1)}let i=e?.[26];i?.enter?.has(t.index)&&jte(n,i.enter.get(t.index).animateFns);let a=Fte(e,t,i);if(a.size===0){let n=!1;if(e){let r=[];vd(e,t,r),n=r.length>0}if(!n)return r(!1)}e&&Ku.add(e[19]),pd(n,()=>_d(e,t,i||void 0,a,r),i||void 0)}function Fte(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 _d(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&&vd(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),bd(e,t.running,i)}else Promise.allSettled(a).then(()=>{e&&Ku.delete(e[19]),i(!0)})}else e&&Ku.delete(e[19]),i(!1)}function vd(e,t,n){if(t.type&12){let r=e[t.index];if(fo(r))for(let e=10;e{e[26]?.running===t&&(e[26].running=void 0,Ku.delete(e[19])),n(!0)})}function xd(e,t,n,r,i,a,o,s){if(i!=null){let c,l=!1;fo(i)?c=i:uo(i)&&(l=!0,i=i[0]);let u=xo(i);e===0&&r!==null?(hd(s,r,a,n),o==null?Eu(t,r,u):Tu(t,r,u,o||null,!0)):e===1&&r!==null?(hd(s,r,a,n),Tu(t,r,u,o||null,!0),Tte(a,u,s)):e===2?(s?.[26]?.leave?.has(a.index)&&Ete(a,u,s),$u.delete(u),gd(s,a,n,e=>{if($u.has(u)){$u.delete(u);return}Ou(t,u,l,e)})):e===3&&($u.delete(u),gd(s,a,n,()=>{t.destroyNode(u)})),c!=null&&Gd(t,e,n,c,a,r,o)}}function Sd(e,t){wd(e,t),t[0]=null,t[5]=null}function Cd(e,t,n,r,i,a){r[0]=i,r[5]=t,Vd(e,r,n,1,i,a)}function wd(e,t){t[10].changeDetectionScheduler?.notify(9),Vd(e,t,t[11],2,null,null)}function Td(e){let t=e[12];if(!t)return Od(e[1],e);for(;t;){let n=null;if(uo(t))n=t[12];else{let e=t[10];e&&(n=e)}if(!n){for(;t&&!t[4]&&t!==e;)uo(t)&&Od(t[1],t),t=t[3];t===null&&(t=e),uo(t)&&Od(t[1],t),n=t&&t[4]}t=n}}function Ed(e,t){let n=e[9],r=n.indexOf(t);n.splice(r,1)}function Dd(e,t){if(vo(t))return;let n=t[11];n.destroyNode&&Vd(e,t,n,3,null,null),Td(t)}function Od(e,t){if(vo(t))return;let n=nn(null);try{t[2]&=-129,t[2]|=256,t[24]&&vn(t[24]),Ad(e,t),kd(e,t),t[1].type===1&&t[11].destroy();let n=t[16];if(n!==null&&fo(t[3])){n!==t[3]&&Ed(n,t);let r=t[18];r!==null&&r.detachView(e)}Zl(t)}finally{nn(n)}}function kd(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&&tf(e,t,27,!1),Hc(o?kc.TemplateUpdateStart:kc.TemplateCreateStart,i,n),n(r,i)}finally{vs(a),Hc(o?kc.TemplateUpdateEnd:kc.TemplateCreateEnd,i,n)}}function of(e,t,n){pf(e,t,n),(n.flags&64)==64&&mf(e,t,n)}function sf(e,t,n=Co){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];rf(o,n[i],s,a),l=!0}else if(i>c)break}}return o!==null&&Object.hasOwn(r.inputs,i)&&(rf(r,n[o],i,a),l=!0),l}function Tf(e,t){let n=Do(t,e),r=n[1];Ef(r,n);let i=n[0];i!==null&&n[6]===null&&(n[6]=fu(i,n[9])),Hc(kc.ComponentStart);try{Df(r,n,n[8])}finally{Hc(kc.ComponentEnd,n[8])}}function Ef(e,t){for(let n=t.length;n{Po(e.lView)},consumerOnSignalRead(){this.lView[24]=this}};function zf(e){let t=e[24]??Object.create(Bf);return t.lView=e,t}var Bf={...an,consumerIsAlwaysLive:!0,kind:`template`,consumerMarkedDirty:e=>{let t=Io(e.lView);for(;t&&!Vf(t[1]);)t=Io(t);t&&jo(t)},consumerOnSignalRead(){this.lView[24]=this}};function Vf(e){return e.type!==2}function Hf(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 Uf=100;function Wf(e,t=0){let n=e[10].rendererFactory;n.begin?.();try{Gf(e,t)}finally{n.end?.()}}function Gf(e,t){let n=es();try{ts(!0),Zf(e,t);let n=0;for(;Mo(e);){if(n===Uf)throw new _i(103,!1);n++,Zf(e,1)}}finally{ts(n)}}function Kf(e,t,n,r){if(vo(t))return;let i=t[2];us(t);let a=!0,o=null,s=null;Vf(e)?(s=Ff(t),o=pn(s)):rn()===null?(a=!1,s=zf(t),o=pn(s)):t[24]&&=(vn(t[24]),null);try{Ao(t),Vee(e.bindingStartIndex),n!==null&&af(e,t,n,2,r);let a=(i&3)==3;if(a){let n=e.preOrderCheckHooks;n!==null&&Gc(t,n,null)}else{let n=e.preOrderHooks;n!==null&&Kc(t,n,0,null),qc(t,0)}if(Jf(t),Hf(t),qf(t,0),e.contentQueries!==null&&pu(e,t),a){let n=e.contentCheckHooks;n!==null&&Gc(t,n)}else{let n=e.contentHooks;n!==null&&Kc(t,n,1),qc(t,1)}$f(e,t);let o=e.components;o!==null&&Qf(t,o,0);let s=e.viewQuery;if(s!==null&&mu(2,s,r),a){let n=e.viewCheckHooks;n!==null&&Gc(t,n)}else{let n=e.viewHooks;n!==null&&Kc(t,n,2),qc(t,2)}if(e.firstUpdatePass===!0&&(e.firstUpdatePass=!1),t[22]){for(let e of t[22])e();t[22]=null}Nf(t),t[2]&=-73}catch(e){throw Po(t),e}finally{s!==null&&(hn(s,o),a&&Lf(s)),hs()}}function qf(e,t){for(let n=eu(e);n!==null;n=tu(n))for(let e=10;e0&&(e[n-1][4]=r[4]);let a=ba(e,10+t);Sd(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 op(e,t,n,r){let i=10+r,a=n.length;r>0&&(n[i-1][4]=t),r-1&&(ap(e,n),ba(t,n))}this._attachedToViewContainer=!1}Dd(this._lView[1],this._lView)}onDestroy(e){Fo(this._lView,e)}markForCheck(){ep(this._cdRefInjectingView||this._lView,4)}detach(){this._lView[2]&=-129}reattach(){No(this._lView),this._lView[2]|=128}detectChanges(){this._lView[2]|=1024,Wf(this._lView)}checkNoChanges(){}attachToViewContainerRef(){if(this._appRef)throw new _i(902,!1);this._attachedToViewContainer=!0}detachFromAppRef(){this._appRef=null;let e=_o(this._lView),t=this._lView[16];t!==null&&!e&&Ed(t,this._lView),wd(this._lView[1],this._lView)}attachToAppRef(e){if(this._attachedToViewContainer)throw new _i(902,!1);this._appRef=e;let t=_o(this._lView),n=this._lView[16];n!==null&&!t&&sp(n,this._lView),No(this._lView)}},lp=(()=>{class e{_declarationLView;_declarationTContainer;elementRef;static __NG_ELEMENT_ID__=up;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 cp(kf(this._declarationLView,this._declarationTContainer,e,{embeddedViewInjector:t,dehydratedView:n}))}}return e})();function up(){return dp(Jo(),Ko())}function dp(e,t){return e.type&4?new lp(t,e,Bl(e,t)):null}function fp(e,t,n,r,i){let a=e.data[t];if(a===null)a=pp(e,t,n,r,i),Hee()&&(a.flags|=32);else if(a.type&64){a.type=n,a.value=r,a.attrs=i;let e=Bee();a.injectorIndex=e===null?-1:e.injectorIndex}return Xo(a,!0),a}function pp(e,t,n,r,i){let a=Yo(),o=Zo(),s=o?a:a&&a.parent,c=e.data[t]=hp(e,s,n,t,r,i);return mp(e,c,a,o),c}function mp(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 hp(e,t,n,r,i,a){let o=t?t.injectorIndex:-1,s=0;return Uo()&&(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:Ss(),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 gp(e){let t=e[6]??[],n=e[3][11],r=[];for(let e of t)e.data.di===void 0?_p(e,n):r.push(e);e[6]=r}function _p(e,t){let n=0,r=e.firstChild;if(r){let i=e.data.r;for(;nnull,yp=()=>null;function bp(e,t){return vp(e,t)}function xp(e,t,n){return yp(e,t,n)}var Sp=class{},Cp=class{},wp=class{destroyNode=null;static __NG_ELEMENT_ID__=()=>Tp()};function Tp(){let e=Ko(),t=Do(Jo().index,e);return(uo(t)?t:e)[11]}var Ep=(()=>{class e{static ɵprov=Oi({token:e,providedIn:`root`,factory:()=>null})}return e})();function Dp(e){return e.debugInfo?.className||e.type.name||null}var Op={},kp=class{injector;parentInjector;constructor(e,t){this.injector=e,this.parentInjector=t}get(e,t,n){let r=this.injector.get(e,Op,n);return r!==Op||t===Op?r:this.parentInjector.get(e,t,n)}};function Ap(e,t,n){return e[t]=n}function jp(e,t){return e[t]}function Mp(e,t,n){if(n===Ru)return!1;let r=e[t];return!Object.is(r,n)&&(e[t]=n,!0)}function Np(e,t,n,r){let i=Mp(e,t,n);return Mp(e,t+1,r)||i}function Pp(e,t,n,r,i){let a=Np(e,t,n,r);return Mp(e,t+2,i)||a}function Fp(e,t,n,r,i,a){let o=Np(e,t,n,r);return Np(e,t+2,i,a)||o}function Ip(e,t,n){return function r(i){let a=r.__ngNativeEl__;a!==void 0&&lu(i,a),ep(mo(e)?Do(e.index,t):t,5);let o=t[8],s=Lp(t,o,n,i),c=r.__ngNextListenerFn__;for(;c;)s=Lp(t,o,c,i)&&s,c=c.__ngNextListenerFn__;return s}}function Lp(e,t,n,r){let i=nn(null);try{return Hc(kc.OutputStart,t,n),n(r)!==!1}catch(t){return Sf(e,t),!1}finally{Hc(kc.OutputEnd,t,n),nn(i)}}function Rp(e,t,n,r,i,a,o,s){let c=ho(e),l=!1,u=null;if(!r&&c&&(u=Bp(t,n,a,e.index)),u!==null){let e=u.__ngLastListenerFn__||u;e.__ngNextListenerFn__=o,u.__ngLastListenerFn__=o,l=!0}else{let o=Co(e,n),c=r?r(o):o;r||(s.__ngNativeEl__=o);let l=i.listen(c,a,s);zp(a)||Vp(r?t=>r(xo(t[e.index])):e.index,t,n,a,s,l,!1)}return l}function zp(e){return e.startsWith(`animation`)||e.startsWith(`transition`)}function Bp(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 Vp(e,t,n,r,i,a,o){let s=t.firstCreatePass?Ro(t):null,c=Lo(n),l=c.length;c.push(i,a),s&&s.push(r,e,l,(l+1)*(o?-1:1))}function Hp(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,Up(e,t,l,n[a+1],r,i);else if(l>s)break}}return Object.hasOwn(n.outputs,r)&&(c=!0,Up(e,t,a,r,r,i)),c}function Up(e,t,n,r,i,a){let o=t[n],s=t[1],c=o[s.data[n].outputs[r]].subscribe(a);Vp(e.index,s,t,i,a,c,!0)}function Wp(){Gp()}function Gp(){let e=Ko(),t=qo(),n=Jo();if(t.firstCreatePass&&Zp(t,n),n.controlDirectiveIndex===-1)return;od(`NgSignalForms`);let r=e[n.controlDirectiveIndex];t.data[n.controlDirectiveIndex].controlDef.create(r,new Jp(e,t,n))}function Kp(){qp()}function qp(){let e=Ko(),t=qo(),n=ys();if(n.controlDirectiveIndex===-1)return;let r=t.data[n.controlDirectiveIndex].controlDef,i=e[n.controlDirectiveIndex];r.update(i,new Jp(e,t,n))}var Jp=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 Co(this.tNode,this.lView)}get descriptor(){return`<${this.tNode.value}>`}listenToCustomControlOutput(e,t){let n=this.tView.data[this.tNode.customControlIndex];Hp(this.tNode,this.lView,n,e,Ip(this.tNode,this.lView,t))}listenToCustomControlModel(e){let t=this.tNode.flags&1024?`valueChange`:`checkedChange`,n=this.tView.data[this.tNode.customControlIndex];Hp(this.tNode,this.lView,n,t,Ip(this.tNode,this.lView,e))}listenToDom(e,t){Rp(this.tNode,this.tView,this.lView,void 0,this.lView[11],e,t,Ip(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(Xp(r,o,e)))&&(rf(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=Yp(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}Qp(e,t)}function Qp(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 $p(e,t){return em(e,t)&&tm(e,t+`Change`)}function em(e,t){return t in e.inputs}function tm(e,t){return t in e.outputs}var nm=Symbol(`BINDING`),rm=new Fi(``);function im(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 vm(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&nf.SignalBased)!==0};return i&&(a.transform=i),a})}function Em(e){return Object.keys(e).map(t=>({propName:e[t],templateName:t}))}function Dm(e,t,n){let r=t instanceof Ya?t:t?.injector;return r&&e.getStandaloneInjector!==null&&(r=e.getStandaloneInjector(r)||r),r?new kp(n,r):n}function Om(e){let t=e.get(Cp,null);if(t===null)throw new _i(407,!1);return{rendererFactory:t,sanitizer:e.get(Ep,null),changeDetectionScheduler:e.get(dc,null),ngReflect:!1,tracingService:e.get(id,null,{optional:!0})}}function km(e,t,n){let r=jm(e);return wu(t,r,r===`svg`?`svg`:r===`math`?bo:n)}function Am(e){if((e&&`localName`in e&&typeof e.localName==`string`?e.localName:e?.tagName)?.toLowerCase()===`script`)throw new _i(905,!1)}function jm(e){return(e.selectors[0][0]||`div`).toLowerCase()}var Mm=class{componentDef;ngModule;selector;componentType;ngContentSelectors;isBoundToModule;cachedInputs=null;cachedOutputs=null;get inputs(){return this.cachedInputs??=Tm(this.componentDef.inputs),this.cachedInputs}get outputs(){return this.cachedOutputs??=Em(this.componentDef.outputs),this.cachedOutputs}constructor(e,t){this.componentDef=e,this.ngModule=t,this.componentType=e.type,this.selector=fte(e.selectors),this.ngContentSelectors=e.ngContentSelectors??[],this.isBoundToModule=!!t}create(e,t,n,r,i,a,o){Hc(kc.DynamicComponentStart);let s=nn(null);try{let s=this.componentDef,c=Dm(s,r||this.ngModule,e),l=Om(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{nn(s)}}createComponentRef(e,t,n,r,i,a,o){let s=this.componentDef,c=Nm(r,s,a,i),l=e.rendererFactory.createRenderer(null,s),u=r?cf(l,r,s.encapsulation,t):km(s,l,o??null);Am(u);let d=t.get(rm,null),f=Pm(u,()=>t.get(ks,null)??au());d&&d.addHost(f);let p=a?.some(Im)||i?.some(e=>typeof e!=`function`&&e.bindings.some(Im)),m=Xd(null,c,null,512|Qd(s),null,null,e,l,t,null,fu(u,t,!0));d&&Cm&&f instanceof ShadowRoot&&Fo(m,()=>{d.removeHost(f)}),m[27]=u,us(m);let h=null;try{let e=bm(27,m,2,`#host`,()=>c.directiveRegistry,!0,0);ku(l,u,e),$l(u,m),of(c,m,e),hu(c,e,m),xm(c,e),n!==void 0&&Rm(e,this.ngContentSelectors,n),h=Do(e.index,m),m[8]=h[8],Df(c,m,null)}catch(e){throw h!==null&&Zl(h),Zl(m),e}finally{Hc(kc.DynamicComponentEnd),hs()}return new Lm(this.componentType,m,!!p)}};function Nm(e,t,n,r){let i=e?[`ng-version`,`22.1.7`]:pte(t.selectors[0]),a=null,o=null,s=0;if(n)for(let e of n)s+=e[nm].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 Im(e){let t=e[nm].kind;return t===`input`||t===`twoWay`}var Lm=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=wo(t[1],27),this.location=Bl(this._tNode,t),this.instance=Do(this._tNode.index,t)[8],this.hostView=this.changeDetectorRef=new cp(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),ep(Do(n.index,r),1)}get injector(){return new Ml(this._tNode,this._rootLView)}destroy(){this.hostView.destroy()}onDestroy(e){this.hostView.onDestroy(e)}};function Rm(e,t,n){let r=e.projection=[];for(let e=0;e{class e{static __NG_ELEMENT_ID__=Bm}return e})();function Bm(){return Wm(Jo(),Ko())}var Vm=class e extends zm{_lContainer;_hostTNode;_hostLView;constructor(e,t,n){super(),this._lContainer=e,this._hostTNode=t,this._hostLView=n}get element(){return Bl(this._hostTNode,this._hostLView)}get injector(){return new Ml(this._hostTNode,this._hostLView)}get parentInjector(){let e=bl(this._hostTNode,this._hostLView);if(ol(e)){let t=ll(e,this._hostLView),n=sl(e),r=t[1].data[n+8];return new Ml(r,t)}return new Ml(null,this._hostLView)}clear(){for(;this.length>0;)this.remove(this.length-1)}get(e){let t=Hm(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=bp(this._lContainer,e.ssrId),o=e.createEmbeddedViewImpl(t||{},i,a);return this.insertImpl(o,r,Af(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 Mm(Ui(e)),u=n||this.parentInjector;if(!i&&l.ngModule==null){let e=this.parentInjector.get(Ya,null);e&&(i=e)}let d=Ui(l.componentType??{}),f=bp(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,Af(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(Pee(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 rp(o,i,a,r),t.attachToViewContainerRef(),ya(Um(o),a,t),t}move(e,t){return this.insert(e,t)}indexOf(e){let t=Hm(this._lContainer);return t===null?-1:t.indexOf(e)}remove(e){let t=this._adjustIndex(e,-1),n=ap(this._lContainer,t);n&&(ba(Um(this._lContainer),t),Dd(n[1],n))}detach(e){let t=this._adjustIndex(e,-1),n=ap(this._lContainer,t);return n&&ba(Um(this._lContainer),t)!=null?new cp(n):null}_adjustIndex(e,t=0){return e??this.length+t}};function Hm(e){return e[8]}function Um(e){return e[8]||=[]}function Wm(e,t){let n,r=t[e.index];return fo(r)?n=r:(n=tp(r,t,null,e),t[e.index]=n,ef(t,n)),Km(n,t,e,r),new Vm(n,e,t)}function Gm(e,t){let n=e[11],r=n.createComment(``),i=Co(t,e);return Tu(n,n.parentNode(i),r,n.nextSibling(i),!1),r}var Km=Ym,qm=()=>!1;function Jm(e,t,n){return qm(e,t,n)}function Ym(e,t,n,r){if(e[7])return;let i;i=n.type&8?xo(r):Gm(t,n),e[7]=i}var Xm=class e{queryList;matches=null;constructor(e){this.queryList=e}clone(){return new e(this.queryList)}setDirty(){this.queryList.setDirty()}},Zm=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 dh(e,t,n){e.queries===null&&(e.queries=new $m),e.queries.track(new eh(t,n))}function fh(e,t){return e.queries.getByIndex(t)}function ph(e,t){let n=e[1],r=fh(n,t);return r.crossesNgTemplate?oh(n,e,t,[]):ah(n,e,r,t)}function mh(e,t,n){let r,i=wn(()=>{r._dirtyCounter();let n=vh(r,e);if(t&&n===void 0)throw new _i(-951,!1);return n});return r=i[tn],r._dirtyCounter=D(0),r._flatValue=void 0,i}function hh(e){return mh(!0,!1,e)}function gh(e){return mh(!0,!0,e)}function _h(e,t){let n=e[tn];n._lView=Ko(),n._queryIndex=t,n._queryList=sh(n._lView,t),n._queryList.onDirty(()=>n._dirtyCounter.update(e=>e+1))}function vh(e,t){let n=e._lView,r=e._queryIndex;if(n===void 0||r===void 0||n[2]&4)return t?void 0:Oa;let i=sh(n,r),a=ph(n,r);return i.reset(a,Hl),t?i.first:i._changesDetected||e._flatValue===void 0?e._flatValue=i.toArray():e._flatValue}function yh(e){return!!e&&typeof e.then==`function`}function bh(e){return!!e&&typeof e.subscribe==`function`}var xh=class{},Sh=class extends xh{injector;instance=null;constructor(e){super();let t=new Xa([...e.providers,{provide:xh,useValue:this}],e.parent||Ja(),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 wh=(()=>{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=Pa(!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=Oi({token:e,providedIn:`environment`,factory:()=>new e(ua(Ya))})}return e})();function k(e){return Oc(()=>{let t=Ah(e),n={...t,decls:e.decls,vars:e.vars,template:e.template,consts:e.consts||null,ngContentSelectors:e.ngContentSelectors,onPush:e.changeDetection!==Kl.Eager,directiveDefs:null,pipeDefs:null,dependencies:t.standalone&&e.dependencies||null,getStandaloneInjector:t.standalone?e=>e.get(wh).getOrCreateStandaloneInjector(n):null,getExternalStyles:null,signals:e.signals??!1,data:e.data||{},encapsulation:e.encapsulation||gu.Emulated,styles:e.styles||Oa,_:null,schemas:e.schemas||null,tView:null,id:``};t.standalone&&od(`NgStandalone`),jh(n);let r=e.dependencies;return n.directiveDefs=Mh(r,Th),n.pipeDefs=Mh(r,Gi),n.id=Nh(n),n})}function Th(e){return Ui(e)||Wi(e)}function Eh(e,t){if(e==null)return Da;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=nf.None,c=null),n[a]=[r,s,c],t[a]=o}return n}function Dh(e){if(e==null)return Da;let t={};for(let n in e)Object.hasOwn(e,n)&&(t[e[n]]=n);return t}function Oh(e){return Oc(()=>{let t=Ah(e);return jh(t),t})}function kh(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 Ah(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||Da,exportAs:e.exportAs||null,standalone:e.standalone??!0,signals:e.signals===!0,selectors:e.selectors||Oa,viewQuery:e.viewQuery||null,features:e.features||null,setInput:null,resolveHostDirectives:null,hostDirectives:null,controlDef:null,signalFormsInputPresence:null,inputs:Eh(e.inputs,t),outputs:Dh(e.outputs),debugInfo:null}}function jh(e){e.features?.forEach(t=>t(e))}function Mh(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 Nh(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 Ph=new Fi(``),Fh=(()=>{class e{resolve;reject;initialized=!1;done=!1;donePromise=new Promise((e,t)=>{this.resolve=e,this.reject=t});appInits=C(Ph,{optional:!0})??[];injector=C(Os);constructor(){}runInitializers(){if(this.initialized)return;let e=[];for(let t of this.appInits){let n=so(this.injector,t);if(yh(n))e.push(n);else if(bh(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=Rl({token:e,factory:e.ɵfac})}return e})();function Ih(e){return t=>{t.controlDef={create:(e,t)=>{e?.ɵngControlCreate(t)},update:(e,t)=>{e?.ɵngControlUpdate?.(t)},passThroughInput:e}}}function Lh(e){return Object.getPrototypeOf(e.prototype).constructor}function Rh(e){let t=Lh(e.type),n=!0,r=[e];for(;t&&t!==Function.prototype&&t!==Object.prototype;){let i,a=Object.hasOwn(t,Li)?t[Li]:void 0,o=Object.hasOwn(t,Ri)?t[Ri]:void 0;if(go(e))i=a??o;else{if(a)throw new _i(903,!1);i=o}if(i){if(n){r.push(i);let t=e;t.inputs=Vh(e.inputs),t.declaredInputs=Vh(e.declaredInputs),t.outputs=Vh(e.outputs);let n=i.hostBindings;n&&Wh(e,n);let a=i.viewQuery,o=i.contentQueries;if(a&&Hh(e,a),o&&Uh(e,o),zh(e,i),xi(e.outputs,i.outputs),go(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=il(i.hostAttrs,n=il(n,i.hostAttrs))}}function Vh(e){return e===Da?{}:e===Oa?[]:e}function Hh(e,t){let n=e.viewQuery;e.viewQuery=n?(e,r)=>{t(e,r),n(e,r)}:t}function Uh(e,t){let n=e.contentQueries;e.contentQueries=n?(e,r,i)=>{t(e,r,i),n(e,r,i)}:t}function Wh(e,t){let n=e.hostBindings;e.hostBindings=n?(e,r)=>{t(e,r),n(e,r)}:t}function Gh(e,t,n,r,i,a,o,s){if(n.firstCreatePass){e.mergedAttrs=il(e.mergedAttrs,e.attrs);let t=e.tView=qd(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),Xo(e,!1);let c=Yh(n,t,e,r);ws()&&Id(n,t,c,e),$l(c,t);let l=tp(c,t,c,e);t[r+27]=l,ef(t,l),Jm(l,e,t)}function Kh(e,t,n,r,i,a,o,s,c,l,u){let d=n+27,f;return t.firstCreatePass?(f=fp(t,d,4,o||null,s||null),Ho()&&om(t,e,f,ko(t.consts,l),gf),Wc(t,f)):f=t.data[d],Gh(f,e,t,n,r,i,a,c),ho(f)&&of(t,e,f),l!=null&&sf(e,f,u),f}function qh(e,t,n,r,i,a,o,s,c,l,u){let d=n+27,f;if(t.firstCreatePass){if(f=fp(t,d,4,o||null,s||null),l!=null){let e=ko(t.consts,l);f.localNames=[];for(let t=0;t{throw new _i(600,``)})}var eg=10,tg=(()=>{class e{_runningTick=!1;_destroyed=!1;_destroyListeners=[];_views=[];internalErrorHandler=C(tc);afterRenderManager=C(sd);zonelessEnabled=C(fc);rootEffectScheduler=C(mc);dirtyFlags=0;tracingSnapshot=null;allTestViews=new Set;autoDetectTestViews=new Set;includeAllTestViews=!1;afterTick=new Jr;get allViews(){return[...(this.includeAllTestViews?this.allTestViews:this.autoDetectTestViews).keys(),...this._views]}get destroyed(){return this._destroyed}componentTypes=[];components=[];internalPendingTask=C(Ps);get isStable(){return this.internalPendingTask.hasPendingTasksObservable.pipe(hi(e=>!e))}constructor(){C(id,{optional:!0})}whenStable(){let e;return new Promise(t=>{e=this.isStable.subscribe({next:e=>{e&&t()}})}).finally(()=>{e.unsubscribe()})}_injector=C(Ya);_rendererFactory=null;get injector(){return this._injector}bootstrap(e,t){return this.bootstrapImpl(e,t)}bootstrapImpl(e,t,n=Os.NULL){return this._injector.get(Hs).run(()=>{if(Hc(kc.BootstrapComponentStart),!this._injector.get(Fh).done)throw new _i(405,``);let r=Ui(e),i=this._injector.get(xh),a=new Mm(r,i);this.componentTypes.push(e);let{hostElement:o,directives:s,bindings:c}=ng(t),l=o||a.selector,u=a.create(n,[],l,i.injector,s,c),d=u.location.nativeElement,f=u.injector.get(Zh,null);return f?.registerApplication(d),u.onDestroy(()=>{this.detachView(u.hostView),rg(this.components,u),f?.unregisterApplication(d)}),this._loadComponent(u),Hc(kc.BootstrapComponentEnd,u),u})}tick(){this.zonelessEnabled||(this.dirtyFlags|=1),this._tick()}_tick(){Hc(kc.ChangeDetectionStart),this.tracingSnapshot===null?this.tickImpl():this.tracingSnapshot.run(rd.CHANGE_DETECTION,this.tickImpl)}tickImpl=()=>{if(this._runningTick)throw Hc(kc.ChangeDetectionEnd),new _i(101,!1);let e=nn(null);try{this._runningTick=!0,this.synchronize()}finally{this._runningTick=!1,this.tracingSnapshot?.dispose(),this.tracingSnapshot=null,nn(e),this.afterTick.next(),Hc(kc.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++Mo(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;rg(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(Qh,[]).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),()=>rg(this._destroyListeners,e)}destroy(){if(this._destroyed)throw new _i(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=Rl({token:e,factory:e.ɵfac})}return e})();function ng(e){return e===void 0||typeof e==`string`||e instanceof Element?{hostElement:e}:e}function rg(e,t){let n=e.indexOf(t);n>-1&&e.splice(n,1)}function A(e,t,n,r){let i=Ko();return Mp(i,is(),t)&&(qo(),_f(ys(),i,e,t,n,r)),A}function ig(e){if(od(`NgAnimateEnter`),!qu)return ig;let t=Ko();if(Cte(t))return ig;let n=Jo(),r=t[9].get(Hs);return Ote(ed(t),n,()=>ag(t,n,e,r)),Pte(t[9]),md(t[9],ed(t)),ig}function ag(e,t,n,r){let i=Co(t,e),a=e[11],o=Dte(n),s=[],c=!1,l=e=>{if(td(e)!==i)return;let t=e instanceof AnimationEvent?`animationend`:`transitionend`;r.runOutsideAngular(()=>{a.listen(i,t,u)})},u=e=>{td(e)===i&&(nd(e,i)&&(c=!0),og(e,i,a))};if(o&&o.length>0){r.runOutsideAngular(()=>{s.push(a.listen(i,`animationstart`,l)),s.push(a.listen(i,`transitionstart`,l))}),wte(i,o,s);for(let e of o)a.addClass(i,e);r.runOutsideAngular(()=>{requestAnimationFrame(()=>{if(!c&&(yte(i,Xu,qu),!Xu.has(i))){for(let e of o)a.removeClass(i,e);Ju(i)}})})}}function og(e,t,n){let r=Yu.get(t);if(td(e)===t&&r&&nd(e,t)){e.stopPropagation();for(let e of r.classList)n.removeClass(t,e);Ju(t)}}var sg=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 cg(e,t,n,r,i){return e===n&&Object.is(t,r)?1:Object.is(i(e,t),i(n,r))?-1:0}function lg(e,t,n,r){let i,a,o=0,s=e.length-1;if(Array.isArray(t)){nn(r);let c=t.length-1;for(nn(null);o<=s&&o<=c;){let r=e.at(o),l=t[o],u=cg(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=cg(s,d,c,f,n);if(p!==0){p<0&&e.updateValue(s,f),s--,c--;continue}let m=n(o,r),h=n(s,d),g=n(o,l);if(Object.is(g,h)){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 pg,a??=fg(e,o,s,n),ug(e,i,o,g))e.updateValue(o,l),o++,s++;else if(a.has(g))i.set(m,e.detach(o)),s--;else{let n=e.create(o,t[o]);e.attach(o,n),o++,s++}}for(;o<=c;)dg(e,i,n,o,t[o]),o++}else if(t!=null){nn(r);let c=t[Symbol.iterator]();nn(null);let l=c.next();for(;!l.done&&o<=s;){let t=e.at(o),r=l.value,u=cg(o,t,o,r,n);if(u!==0)u<0&&e.updateValue(o,r),o++,l=c.next();else{i??=new pg,a??=fg(e,o,s,n);let u=n(o,r);if(ug(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;)dg(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 ug(e,t,n,r){return t!==void 0&&t.has(r)?(e.attach(n,t.get(r)),t.delete(r),!0):!1}function dg(e,t,n,r,i){if(ug(e,t,r,n(r,i)))e.updateValue(r,i);else{let t=e.create(r,i);e.attach(r,t)}}function fg(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 pg=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 j(e,t,n,r,i,a,o,s){od(`NgControlFlow`);let c=Ko(),l=qo();return qh(c,l,e,t,n,r,i,ko(l.consts,a),256,o,s),mg}function mg(e,t,n,r,i,a,o,s){od(`NgControlFlow`);let c=Ko(),l=qo();return qh(c,l,e,t,n,r,i,ko(l.consts,a),512,o,s),mg}function M(e,t){od(`NgControlFlow`);let n=Ko(),r=is(),i=n[r]===Ru?-1:n[r],a=i===-1?void 0:bg(n,27+i);if(Mp(n,r,e)){let r=nn(null);try{if(a!==void 0&&ip(a,0),e!==-1){let r=27+e,i=bg(n,r),a=Tg(n[1],r),o=xp(i,a,n);rp(i,kf(n,a,t,{dehydratedView:o}),0,Af(a,o))}}finally{nn(r)}}else if(a!==void 0){let e=np(a,0);e!==void 0&&(e[8]=t)}}var hg=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 gg(e){return e}function _g(e,t){return t}var vg=class{hasEmptyBlock;trackByFn;liveCollection;constructor(e,t,n){this.hasEmptyBlock=e,this.trackByFn=t,this.liveCollection=n}};function N(e,t,n,r,i,a,o,s,c,l,u,d,f){od(`NgControlFlow`);let p=Ko(),m=qo(),h=c!==void 0,g=Ko(),_=new vg(h,s?o.bind(g[15][8]):o);g[27+e]=_,qh(p,m,e+1,t,n,r,i,ko(m.consts,a),256),h&&qh(p,m,e+2,c,l,u,d,ko(m.consts,f),512)}var yg=class extends sg{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,rp(this.lContainer,t,e,Af(this.templateTNode,n)),xg(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=bp(this.lContainer,this.templateTNode.tView.ssrId);return kf(this.hostLView,this.templateTNode,new hg(this.lContainer,t,e),{dehydratedView:n})}destroy(e){Dd(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];Mte(e,r),Ku.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 ap(e,t)}function wg(e,t){return np(e,t)}function Tg(e,t){return wo(e,t)}function F(e,t,n){let r=Ko();return Mp(r,is(),t)&&(qo(),uf(ys(),r,e,t,r[11],n)),F}function Eg(e,t,n,r,i){Cf(t,e,n,i?`class`:`style`,r)}function I(e,t,n,r){let i=Ko(),a=i[1],o=e+27,s=a.firstCreatePass?bm(o,i,2,t,gf,Ho(),n,r):a.data[o];if(mo(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),I))}}return Dg(e,t,i,s,r),I}function Dg(e,t,n,r,i){if(bf(r,n,e,t,kg),ho(r)){let e=n[1];of(e,n,r),hu(e,r,n)}i!=null&&sf(n,r)}function L(){let e=qo(),t=xf(Jo());return e.firstCreatePass&&xm(e,t),Wo(t)&&Go(),Vo(),t.classesWithoutHost!=null&&$c(t)&&Eg(e,t,Ko(),t.classesWithoutHost,!0),t.stylesWithoutHost!=null&&el(t)&&Eg(e,t,Ko(),t.stylesWithoutHost,!1),L}function R(e,t,n,r){return I(e,t,n,r),L(),R}function z(e,t,n,r){let i=Ko(),a=i[1],o=e+27,s=a.firstCreatePass?Sm(o,a,2,t,n,r):a.data[o];return bf(s,i,e,t,kg),r!=null&&sf(i,s),z}function B(){return Wo(xf(Jo()))&&Go(),Vo(),B}function Og(e,t,n,r){return z(e,t,n,r),B(),Og}var kg=(e,t,n,r,i)=>(Ts(!0),wu(t[11],r,Ss()));function Ag(e,t,n){let r=Ko(),i=r[1],a=e+27,o=i.firstCreatePass?bm(a,r,8,`ng-container`,gf,Ho(),t,n):i.data[a];if(bf(o,r,e,`ng-container`,Ng),ho(o)){let e=r[1];of(e,r,o),hu(e,o,r)}return n!=null&&sf(r,o),Ag}function jg(){let e=qo(),t=xf(Jo());return e.firstCreatePass&&xm(e,t),jg}function Mg(e,t,n){return Ag(e,t,n),jg(),Mg}var Ng=(e,t,n,r,i)=>(Ts(!0),Qee(t[11],``));function V(){return Ko()}function Pg(e,t,n){let r=Ko();return Mp(r,is(),t)&&(qo(),df(ys(),r,e,t,r[11],n)),Pg}var Fg=void 0;function Ig(e){let t=Math.floor(Math.abs(e)),n=e.toString().replace(/^[^.]*\.?/,``).length;return t===1&&n===0?1:5}var Lg=[`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`]],Fg,[[`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`]],Fg,[[`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}`,Fg,Fg,Fg],[`.`,`,`,`;`,`%`,`+`,`-`,`E`,`×`,`‰`,`∞`,`NaN`,`:`],[`#,##0.###`,`#,##0%`,`¤#,##0.00`,`#E0`],`USD`,`$`,`US Dollar`,{},`ltr`,Ig],Rg=Object.create(null);function zg(e){let t=Hg(e),n=Bg(t);if(n)return n;let r=t.split(`-`)[0];if(n=Bg(r),n)return n;if(r===`en`)return Lg;throw new _i(701,!1)}function Bg(e){if(!(e in Rg)){let t=aa.ng&&aa.ng.common&&aa.ng.common.locales&&aa.ng.common.locales[e];return t!==void 0&&(Rg[e]=t),t}return Rg[e]}var Vg={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 Hg(e){return e.toLowerCase().replace(/_/g,`-`)}var Ug=`en-US`;function Wg(e){typeof e==`string`&&e.toLowerCase().replace(/_/g,`-`)}function H(e,t,n){let r=Ko(),i=qo(),a=Jo();return Gg(i,r,r[11],a,e,t,n),H}function U(e,t,n){let r=Ko(),i=qo(),a=Jo();return(a.type&3||n)&&Rp(a,i,r,n,r[11],e,t,Ip(a,r,t)),U}function Gg(e,t,n,r,i,a,o){let s=!0,c=null;if((r.type&3||o)&&(c??=Ip(r,t,a),Rp(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 t_(e){return(e&2)==2}function n_(e,t){return e&131071|t<<17}function r_(e){return e|2}function i_(e){return(e&131068)>>2}function a_(e,t){return e&-131069|t<<2}function o_(e){return(e&1)==1}function s_(e){return e|1}function c_(e,t,n,r,i,a){let o=a?t.classBindings:t.styleBindings,s=e_(o),c=i_(o);e[r]=n;let l=!1,u;if(Array.isArray(n)){let e=n;u=e[1],(u===null||Ta(e,u)>0)&&(l=!0)}else u=n;if(i){if(c!==0){let t=e_(e[s+1]);e[r+1]=$g(t,s),t!==0&&(e[t+1]=a_(e[t+1],r)),e[s+1]=n_(e[s+1],r)}else e[r+1]=$g(s,0),s!==0&&(e[s+1]=a_(e[s+1],r)),s=r}else e[r+1]=$g(c,0),s===0?s=r:e[c+1]=a_(e[c+1],r),c=r;l&&(e[r+1]=r_(e[r+1])),u_(e,u,r,!0),u_(e,u,r,!1),l_(t,u,e,r,a),o=$g(s,c),a?t.classBindings=o:t.styleBindings=o}function l_(e,t,n,r,i){let a=i?e.residualClasses:e.residualStyles;a!=null&&typeof t==`string`&&Ta(a,t)>=0&&(n[r+1]=s_(n[r+1]))}function u_(e,t,n,r){let i=e[n+1],a=t===null,o=r?e_(i):i_(i),s=!1;for(;o!==0&&(s===!1||a);){let n=e[o],i=e[o+1];d_(n,t)&&(s=!0,e[o+1]=r?s_(i):r_(i)),o=r?e_(i):i_(i)}s&&(e[n+1]=r?r_(i):s_(i))}function d_(e,t){return e===null||t==null||(Array.isArray(e)?e[1]:e)===t?!0:Array.isArray(e)&&typeof t==`string`?Ta(e,t)>=0:!1}var f_={textEnd:0,key:0,keyEnd:0,value:0,valueEnd:0};function p_(e){return e.substring(f_.key,f_.keyEnd)}function m_(e){return g_(e),h_(e,__(e,0,f_.textEnd))}function h_(e,t){let n=f_.textEnd;return n===t?-1:(t=f_.keyEnd=v_(e,f_.key=t,n),__(e,t,n))}function g_(e){f_.key=0,f_.keyEnd=0,f_.value=0,f_.valueEnd=0,f_.textEnd=e.length}function __(e,t,n){for(;t32;)t++;return t}function y_(e,t,n){return S_(e,t,n,!1),y_}function G(e,t){return S_(e,t,null,!0),G}function b_(e){C_(N_,x_,e,!0)}function x_(e,t){for(let n=m_(t);n>=0;n=h_(t,n))Ca(e,p_(t),!0)}function S_(e,t,n,r){let i=Ko(),a=qo(),o=as(2);if(a.firstUpdatePass&&T_(a,e,o,r),t!==Ru&&Mp(i,o,t)){let s=a.data[_s()];F_(a,s,i,i[11],e,i[o+1]=Ite(t,n),r,o)}}function C_(e,t,n,r){let i=qo(),a=as(2);i.firstUpdatePass&&T_(i,null,a,r);let o=Ko();if(n!==Ru&&Mp(o,a,n)){let s=i.data[_s()];if(R_(s,r)&&!w_(i,a)){let e=r?s.classesWithoutHost:s.stylesWithoutHost;e!==null&&(n=Ci(e,n||``)),Eg(i,s,o,n,r)}else P_(i,s,o,o[11],o[a+1],o[a+1]=M_(e,t,n),r,a)}}function w_(e,t){return t>=e.expandoStartIndex}function T_(e,t,n,r){let i=e.data;if(i[n+1]===null){let a=i[_s()],o=w_(e,n);R_(a,r)&&t===null&&!o&&(t=!1),t=E_(i,a,t,r),c_(i,a,t,n,o,r)}}function E_(e,t,n,r){let i=Gee(e),a=r?t.residualClasses:t.residualStyles;if(i===null)(r?t.classBindings:t.styleBindings)===0&&(n=A_(null,e,t,n,r),n=j_(n,t.attrs,r),a=null);else{let o=t.directiveStylingLast;if(o===-1||e[o]!==i){if(n=A_(i,e,t,n,r),a===null){let n=D_(e,t,r);n!==void 0&&Array.isArray(n)&&(n=A_(null,e,t,n[1],r),n=j_(n,t.attrs,r),O_(e,t,r,n))}else a=k_(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(i_(r)!==0)return e[e_(r)]}function O_(e,t,n,r){let i=n?t.classBindings:t.styleBindings;e[e_(i)]=r}function k_(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===Ru&&(u=l?Oa:void 0);let d=l?wa(u,r):c===r?u:void 0;if(a&&!L_(d)&&(d=wa(t,r)),L_(d)&&(s=d,o))return s;let f=e[i+1];i=o?e_(f):i_(f)}if(t!==null){let e=a?t.residualClasses:t.residualStyles;e!=null&&(s=wa(e,r))}return s}function L_(e){return e!==void 0}function Ite(e,t){return e==null||e===``||(typeof t==`string`?e=vu(e)+t:typeof e==`object`&&(e=Si(vu(e)))),e}function R_(e,t){return!!(e.flags&(t?8:16))}function K(e,t=``){let n=Ko(),r=qo(),i=e+27,a=r.firstCreatePass?fp(r,i,1,t,null):r.data[i],o=Lte(r,n,a,t);n[i]=o,ws()&&Id(r,n,o,a),Xo(a,!1)}var Lte=(e,t,n,r)=>(Ts(!0),Xee(t[11],r));function z_(e,t,n,r=``){return Mp(e,is(),n)?t+qi(n)+r:Ru}function Rte(e,t,n,r,i,a=``){let o=Np(e,rs(),n,i);return as(2),o?t+qi(n)+r+qi(i)+a:Ru}function zte(e,t,n,r,i,a,o,s=``){let c=Pp(e,rs(),n,i,o);return as(3),c?t+qi(n)+r+qi(i)+a+qi(o)+s:Ru}function Bte(e,t,n,r,i,a,o,s,c,l=``){let u=Fp(e,rs(),n,i,o,c);return as(4),u?t+qi(n)+r+qi(i)+a+qi(o)+s+qi(c)+l:Ru}function q(e){return J(``,e),q}function J(e,t,n){let r=Ko(),i=z_(r,e,t,n);return i!==Ru&&H_(r,_s(),i),J}function Y(e,t,n,r,i){let a=Ko(),o=Rte(a,e,t,n,r,i);return o!==Ru&&H_(a,_s(),o),Y}function B_(e,t,n,r,i,a,o){let s=Ko(),c=zte(s,e,t,n,r,i,a,o);return c!==Ru&&H_(s,_s(),c),B_}function V_(e,t,n,r,i,a,o,s,c){let l=Ko(),u=Bte(l,e,t,n,r,i,a,o,s,c);return u!==Ru&&H_(l,_s(),u),V_}function H_(e,t,n){let r=So(t,e);Zee(e[11],r,n)}function U_(e,t,n){Tc(t)&&(t=t());let r=Ko();return Mp(r,is(),t)&&(qo(),uf(ys(),r,e,t,r[11],n)),U_}function W_(e,t){let n=Tc(e);return n&&e.set(t),n}function G_(e,t){let n=Ko(),r=qo(),i=Jo();return Gg(r,n,n[11],i,e,t),G_}var K_={};function q_(e){od(`NgLet`);let t=qo(),n=Ko(),r=e+27;return Xo(fp(t,r,128,null,null),!1),Eo(t,n,r,K_),q_}function J_(e){return Eo(qo(),Ko(),_s(),e),e}function Y_(e){let t=To($o(),27+e);if(t===K_)throw new _i(314,!1);return t}function X_(e,t,n=``){return z_(Ko(),e,t,n)}function Z_(e,t,n){let r=qo();r.firstCreatePass&&Q_(t,r.data,r.blueprint,go(e),n)}function Q_(e,t,n,r,i){if(e=Ei(e),Array.isArray(e))for(let a=0;a>20;if(Ha(e)||!e.multi){let r=new Qc(l,i,am,null),p=tv(c,t,i?u:u+f,d);p===-1?(xl(_l(s,o),a,c),$_(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=tv(c,t,u+f,d),m=tv(c,t,u,u+f),h=p>=0&&n[p],g=m>=0&&n[m];if(i&&!g||!i&&!h){xl(_l(s,o),a,c);let u=Ute(i?Hte:Vte,n.length,i,r,l,e);!i&&g&&(n[m].providerFactory=u),$_(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=ev(n[i?m:p],l,!i&&r);$_(a,e,p>-1?p:m,t)}!i&&r&&g&&n[m].componentProviders++}}}function $_(e,t,n,r){let i=Ha(t),a=Ua(t);if(i||a){let o=(a?Ei(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 ev(e,t,n){return n&&e.componentProviders++,e.multi.push(t)-1}function tv(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 iv(e,t){let n=ns()+e,r=Ko();return r[n]===Ru?Ap(r,n,t()):jp(r,n)}function av(e,t,n){return cv(Ko(),ns(),e,t,n)}function ov(e,t,n,r){return lv(Ko(),ns(),e,t,n,r)}function Wte(e,t,n,r,i,a,o){return Gte(Ko(),ns(),e,t,n,r,i,a)}function sv(e,t){let n=e[t];return n===Ru?void 0:n}function cv(e,t,n,r,i,a){let o=t+n;return Mp(e,o,i)?Ap(e,o+1,a?r.call(a,i):r(i)):sv(e,o+1)}function lv(e,t,n,r,i,a,o){let s=t+n;return Np(e,s,i,a)?Ap(e,s+2,o?r.call(o,i,a):r(i,a)):sv(e,s+2)}function Gte(e,t,n,r,i,a,o,s,c){let l=t+n;return Fp(e,l,i,a,o,s)?Ap(e,l+4,c?r.call(c,i,a,o,s):r(i,a,o,s)):sv(e,l+4)}function uv(e,t){let n=qo(),r,i=e+27;n.firstCreatePass?(r=Kte(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=ha(r.type,!0)),o=ra(am);try{let e=dl(!1),t=a();return dl(e),Eo(n,Ko(),i,t),t}finally{ra(o)}}function Kte(e,t){if(t)for(let n=t.length-1;n>=0;n--){let r=t[n];if(e===r.name)return r}}function dv(e,t,n){let r=e+27,i=Ko(),a=To(i,r);return pv(i,r)?cv(i,ns(),t,a.transform,n,a):a.transform(n)}function fv(e,t,n,r){let i=e+27,a=Ko(),o=To(a,i);return pv(a,i)?lv(a,ns(),t,o.transform,n,r,o):o.transform(n,r)}function pv(e,t){return e[1].data[t].pure}function mv(e,t){return dp(e,t)}var qte=(()=>{class e{applicationErrorHandler=C(tc);appRef=C(tg);taskService=C(Ps);ngZone=C(Hs);zonelessEnabled=C(fc);tracing=C(id,{optional:!0});zoneIsDefined=typeof Zone<`u`&&!!Zone.root.run;schedulerTickApplyArgs=[{data:{__scheduler_tick__:!0}}];subscriptions=new fr;angularZoneId=this.zoneIsDefined?this.ngZone._inner?.get(Bs):null;scheduleInRootZone=!this.zonelessEnabled&&this.zoneIsDefined&&(C(pc,{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?Rs:Ls;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=Rl({token:e,factory:e.ɵfac})}return e})();function Jte(){return[{provide:dc,useExisting:qte},{provide:Hs,useClass:Xs},{provide:fc,useValue:!0}]}function Yte(){return typeof $localize<`u`&&$localize.locale||`en-US`}var hv=new Fi(``,{factory:()=>C(hv,{optional:!0,skipSelf:!0})||Yte()}),gv=class{destroyed=!1;listeners=null;errorHandler=C(ec,{optional:!0});isEmitting=!1;hasNullListeners=!1;destroyRef=C(As);constructor(){this.destroyRef.onDestroy(()=>{this.destroyed=!0,this.listeners=null})}subscribe(e){if(this.destroyed)throw new _i(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(yi(953,!1));return}if(this.listeners===null)return;this.isEmitting=!0;let t=nn(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&&Xte(this.listeners)),nn(t),this.isEmitting=!1}}};function Xte(e){let t=e.length-1;for(;t>-1;)e[t]===null&&e.splice(t,1),t--}function X(e,t){return wn(e,t?.equal)}function Z(e){return Zn(e)}(class e extends Error{_brand;constructor(e){super(e)}static IDLE=new e(`IDLE`);static LOADING=new e(`LOADING`)});var Zte=e=>e;function Q(e,t){return typeof e==`function`?_v(qn(e,Zte,t?.equal),t?.debugName,t?.set):_v(qn(e.source,e.computation,e.equal),e.debugName,e.set)}function _v(e,t,n){let r=e[tn],i=e;if(n!==void 0){let t=e=>Jn(r,e);i.set=e=>n(e,t),i.update=r=>n(r(Z(e)),t)}else i.set=e=>Jn(r,e),i.update=e=>Yn(r,e);return i.asReadonly=rc.bind(e),i}var vv=!1;function Qte(){return vv}function yv(e){vv=e}function bv(e,t){let n=Object.create(Dc);n.value=e,n.transformFn=t?.transform;function r(){if(on(n),n.value===Ec)throw new _i(-950,null);return n.value}return r[tn]=n,r}function xv(e){return new gv}function Sv(e,t){return bv(e,t)}function $te(e){return bv(Ec,e)}var $=(Sv.required=$te,Sv);function Cv(e,t){let n=Object.create(Dc),r=new gv;n.value=e;function i(){return on(n),wv(n.value),n.value}return i[tn]=n,i.asReadonly=rc.bind(i),i.set=e=>{n.equal(n.value,e)||(In(n,e),r.emit(e))},i.update=e=>{wv(n.value),i.set(e(n.value))},i.subscribe=r.subscribe.bind(r),i.destroyRef=r.destroyRef,i}function wv(e){if(e===Ec)throw new _i(952,!1)}function Tv(e,t){return Cv(e,t)}function ene(e){return Cv(Ec,e)}var Ev=(Tv.required=ene,Tv);function Dv(e,t){return hh(t)}function tne(e,t){return gh(t)}var Ov=(Dv.required=tne,Dv),nne=(()=>{class e{static __NG_ELEMENT_ID__=rne}return e})();function rne(e){return ine(Jo(),Ko(),(e&16)==16)}function ine(e,t,n){if(mo(e)&&!n){let n=Do(e.index,t);return new cp(n,n)}if(e.type&175){let e=t[15];return new cp(e,t)}return null}var kv=new Fi(``),ane=new Fi(``);function Av(e){return!e.moduleRef}function one(e){let t=Av(e)?e.r3Injector:e.moduleRef.injector,n=t.get(Hs);return n.run(()=>{Av(e)?e.r3Injector.resolveInjectorInitializers():e.moduleRef.resolveInjectorInitializers();let r=t.get(tc),i;if(n.runOutsideAngular(()=>{i=n.onError.subscribe({next:r})}),Av(e)){let n=()=>t.destroy(),r=e.platformInjector.get(kv);r.add(n),t.onDestroy(()=>{i.unsubscribe(),r.delete(n)})}else{let t=()=>e.moduleRef.destroy(),n=e.platformInjector.get(kv);n.add(t),e.moduleRef.onDestroy(()=>{rg(e.allPlatformModules,e.moduleRef),i.unsubscribe(),n.delete(t)})}return cne(r,n,()=>{let n=t.get(Ps),r=n.add(),i=t.get(Fh);return i.runInitializers(),i.donePromise.then(()=>{if(Wg(t.get(hv,Ug)||`en-US`),!t.get(ane,!0))return Av(e)?t.get(tg):(e.allPlatformModules.push(e.moduleRef),e.moduleRef);if(Av(e)){let n=t.get(tg);return e.rootComponent!==void 0&&n.bootstrap(e.rootComponent),n}return sne?.(e.moduleRef,e.allPlatformModules),e.moduleRef}).finally(()=>void n.remove(r))})})}var sne;function cne(e,t,n){try{let r=n();return yh(r)?r.catch(n=>{throw t.runOutsideAngular(()=>e(n)),n}):r}catch(n){throw t.runOutsideAngular(()=>e(n)),n}}var jv=null;function lne(e=[],t){return Os.create({name:t,providers:[{provide:Wa,useValue:`platform`},{provide:kv,useValue:new Set([()=>jv=null])},...e]})}function une(e=[]){if(jv)return jv;let t=lne(e);return jv=t,$h(),dne(t),t}function dne(e){let t=e.get(oc,null);so(e,()=>{t?.forEach(e=>e())})}function fne(e){let{rootComponent:t,appProviders:n,platformProviders:r,platformRef:i}=e;Hc(kc.BootstrapApplicationStart);try{let e=i?.injector??une(r);return one({r3Injector:new Sh({providers:[Jte(),nc,...n||[]],parent:e,debugName:``,runEnvironmentInitializers:!1}).injector,platformInjector:e,rootComponent:t})}catch(e){return Promise.reject(e)}finally{Hc(kc.BootstrapApplicationEnd)}}function Mv(e){return typeof e==`boolean`?e:e!=null&&e!==`false`}var Nv=Symbol(`NOT_SET`),Pv=new Set,pne={...Rn,kind:`afterRenderEffectPhase`,consumerIsAlwaysLive:!0,consumerAllowSignalWrites:!0,value:Nv,cleanup:null,consumerMarkedDirty(){if(this.sequence.impl.executing){if(this.sequence.lastPhase===null||this.sequence.lastPhase(on(r),r.value),r.signal[tn]=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??Pv)t()}finally{vn(e)}}};function Fv(e,t){let n=t?.injector??C(Os),r=n.get(dc),i=n.get(sd),a=n.get(id,null,{optional:!0});i.impl??=n.get(ld);let o=e;typeof o==`function`&&(o={mixedReadWrite:e});let s=n.get(lc,null,{optional:!0}),c=new mne(i.impl,[o.earlyRead,o.write,o.mixedReadWrite,o.read],s?.view,r,n,a?.snapshot(null));return i.impl.register(c),c}var Iv=null;function Lv(){return Iv}function hne(e){Iv??=e}var gne=class{},Rv=(function(e){return e[e.Format=0]=`Format`,e[e.Standalone=1]=`Standalone`,e})(Rv||{}),zv=(function(e){return e[e.Narrow=0]=`Narrow`,e[e.Abbreviated=1]=`Abbreviated`,e[e.Wide=2]=`Wide`,e[e.Short=3]=`Short`,e})(zv||{}),Bv=(function(e){return e[e.Short=0]=`Short`,e[e.Medium=1]=`Medium`,e[e.Long=2]=`Long`,e[e.Full=3]=`Full`,e})(Bv||{}),Vv={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 _ne(e){return zg(e)[Vg.LocaleId]}function vne(e,t,n){let r=zg(e);return qv(qv([r[Vg.DayPeriodsFormat],r[Vg.DayPeriodsStandalone]],t),n)}function yne(e,t,n){let r=zg(e);return qv(qv([r[Vg.DaysFormat],r[Vg.DaysStandalone]],t),n)}function bne(e,t,n){let r=zg(e);return qv(qv([r[Vg.MonthsFormat],r[Vg.MonthsStandalone]],t),n)}function xne(e,t){let n=zg(e)[Vg.Eras];return qv(n,t)}function Hv(e,t){return qv(zg(e)[Vg.DateFormat],t)}function Uv(e,t){return qv(zg(e)[Vg.TimeFormat],t)}function Wv(e,t){let n=zg(e)[Vg.DateTimeFormat];return qv(n,t)}function Gv(e,t){let n=zg(e),r=n[Vg.NumberSymbols][t];if(r===void 0){if(t===Vv.CurrencyDecimal)return n[Vg.NumberSymbols][Vv.Decimal];if(t===Vv.CurrencyGroup)return n[Vg.NumberSymbols][Vv.Group]}return r}function Kv(e){if(!e[Vg.ExtraData])throw new _i(2303,!1)}function Sne(e){let t=zg(e);return Kv(t),(t[Vg.ExtraData][2]||[]).map(e=>typeof e==`string`?Jv(e):[Jv(e[0]),Jv(e[1])])}function Cne(e,t,n){let r=zg(e);return Kv(r),qv(qv([r[Vg.ExtraData][0],r[Vg.ExtraData][1]],t)||[],n)||[]}function qv(e,t){for(let n=t;n>-1;n--)if(e[n]!==void 0)return e[n];throw new _i(2304,!1)}function Jv(e){let[t,n]=e.split(`:`);return{hours:+t,minutes:+n}}var wne=/^(\d{4,})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/,Yv=Object.create(null),Tne=/((?:[^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]*)/,Ene=256;function Dne(e,t,n,r){let i=Lne(e);One(t),t=Zv(n,t)||t;let a=[],o;for(;t;)if(o=Tne.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=cy(r,s),i=Ine(i,r));let c=``;return a.forEach(e=>{let t=Pne(e);c+=t?t(i,n,s):e===`''`?`'`:e.replace(/(^'|'$)/g,``).replace(/''/g,`'`)}),c}function One(e){if(e.length>Ene)throw new _i(2300,!1)}function Xv(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=_ne(e);if(Yv[n]??=Object.create(null),Yv[n][t])return Yv[n][t];let r=``;switch(t){case`shortDate`:r=Hv(e,Bv.Short);break;case`mediumDate`:r=Hv(e,Bv.Medium);break;case`longDate`:r=Hv(e,Bv.Long);break;case`fullDate`:r=Hv(e,Bv.Full);break;case`shortTime`:r=Uv(e,Bv.Short);break;case`mediumTime`:r=Uv(e,Bv.Medium);break;case`longTime`:r=Uv(e,Bv.Long);break;case`fullTime`:r=Uv(e,Bv.Full);break;case`short`:let t=Zv(e,`shortTime`),n=Zv(e,`shortDate`);r=Qv(Wv(e,Bv.Short),[t,n]);break;case`medium`:let i=Zv(e,`mediumTime`),a=Zv(e,`mediumDate`);r=Qv(Wv(e,Bv.Medium),[i,a]);break;case`long`:let o=Zv(e,`longTime`),s=Zv(e,`longDate`);r=Qv(Wv(e,Bv.Long),[o,s]);break;case`full`:let c=Zv(e,`fullTime`),l=Zv(e,`fullDate`);r=Qv(Wv(e,Bv.Full),[c,l])}return r&&(Yv[n][t]=r),r}function Qv(e,t){return t&&(e=e.replace(/\{([^}]+)}/g,function(e,n){return Object.hasOwn(t,n)?t[n]:e})),e}function $v(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 kne(s,t);let c=Gv(o,Vv.MinusSign);return $v(s,t,c,r,i)}}function Ane(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 _i(2301,!1)}}function ty(e,t,n=Rv.Format,r=!1){return function(i,a){return jne(i,a,e,t,n,r)}}function jne(e,t,n,r,i,a){switch(n){case 2:return bne(t,i,r)[e.getMonth()];case 1:return yne(t,i,r)[e.getDay()];case 0:let n=e.getHours(),o=e.getMinutes();if(a){let e=Sne(t),a=Cne(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?`+`:``)+$v(o,2,a)+$v(Math.abs(i%60),2,a);case 1:return`GMT`+(i>=0?`+`:``)+$v(o,1,a);case 2:return`GMT`+(i>=0?`+`:``)+$v(o,2,a)+`:`+$v(Math.abs(i%60),2,a);case 3:return r===0?`Z`:(i>=0?`+`:``)+$v(o,2,a)+`:`+$v(Math.abs(i%60),2,a);default:throw new _i(2310,!1)}}}var Mne=0,ry=4;function Nne(e){let t=Xv(e,Mne,1).getDay();return Xv(e,0,1+(t<=ry?ry:11)-t)}function iy(e){let t=e.getDay(),n=t===0?-3:ry-t;return Xv(e.getFullYear(),e.getMonth(),e.getDate()+n)}function ay(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=iy(n),t=Nne(e.getFullYear()),r=e.getTime()-t.getTime();i=1+Math.round(r/6048e5)}return $v(i,e,Gv(r,Vv.MinusSign))}}function oy(e,t=!1){return function(n,r){return $v(iy(n).getFullYear(),e,Gv(r,Vv.MinusSign),t)}}var sy=Object.create(null);function Pne(e){if(sy[e])return sy[e];let t;switch(e){case`G`:case`GG`:case`GGG`:t=ty(3,zv.Abbreviated);break;case`GGGG`:t=ty(3,zv.Wide);break;case`GGGGG`:t=ty(3,zv.Narrow);break;case`y`:t=ey(0,1,0,!1,!0);break;case`yy`:t=ey(0,2,0,!0,!0);break;case`yyy`:t=ey(0,3,0,!1,!0);break;case`yyyy`:t=ey(0,4,0,!1,!0);break;case`Y`:t=oy(1);break;case`YY`:t=oy(2,!0);break;case`YYY`:t=oy(3);break;case`YYYY`:t=oy(4);break;case`M`:case`L`:t=ey(1,1,1);break;case`MM`:case`LL`:t=ey(1,2,1);break;case`MMM`:t=ty(2,zv.Abbreviated);break;case`MMMM`:t=ty(2,zv.Wide);break;case`MMMMM`:t=ty(2,zv.Narrow);break;case`LLL`:t=ty(2,zv.Abbreviated,Rv.Standalone);break;case`LLLL`:t=ty(2,zv.Wide,Rv.Standalone);break;case`LLLLL`:t=ty(2,zv.Narrow,Rv.Standalone);break;case`w`:t=ay(1);break;case`ww`:t=ay(2);break;case`W`:t=ay(1,!0);break;case`d`:t=ey(2,1);break;case`dd`:t=ey(2,2);break;case`c`:case`cc`:t=ey(7,1);break;case`ccc`:t=ty(1,zv.Abbreviated,Rv.Standalone);break;case`cccc`:t=ty(1,zv.Wide,Rv.Standalone);break;case`ccccc`:t=ty(1,zv.Narrow,Rv.Standalone);break;case`cccccc`:t=ty(1,zv.Short,Rv.Standalone);break;case`E`:case`EE`:case`EEE`:t=ty(1,zv.Abbreviated);break;case`EEEE`:t=ty(1,zv.Wide);break;case`EEEEE`:t=ty(1,zv.Narrow);break;case`EEEEEE`:t=ty(1,zv.Short);break;case`a`:case`aa`:case`aaa`:t=ty(0,zv.Abbreviated);break;case`aaaa`:t=ty(0,zv.Wide);break;case`aaaaa`:t=ty(0,zv.Narrow);break;case`b`:case`bb`:case`bbb`:t=ty(0,zv.Abbreviated,Rv.Standalone,!0);break;case`bbbb`:t=ty(0,zv.Wide,Rv.Standalone,!0);break;case`bbbbb`:t=ty(0,zv.Narrow,Rv.Standalone,!0);break;case`B`:case`BB`:case`BBB`:t=ty(0,zv.Abbreviated,Rv.Format,!0);break;case`BBBB`:t=ty(0,zv.Wide,Rv.Format,!0);break;case`BBBBB`:t=ty(0,zv.Narrow,Rv.Format,!0);break;case`h`:t=ey(3,1,-12);break;case`hh`:t=ey(3,2,-12);break;case`H`:t=ey(3,1);break;case`HH`:t=ey(3,2);break;case`m`:t=ey(4,1);break;case`mm`:t=ey(4,2);break;case`s`:t=ey(5,1);break;case`ss`:t=ey(5,2);break;case`S`:t=ey(6,1);break;case`SS`:t=ey(6,2);break;case`SSS`:t=ey(6,3);break;case`Z`:case`ZZ`:case`ZZZ`:t=ny(0);break;case`ZZZZZ`:t=ny(3);break;case`O`:case`OO`:case`OOO`:case`z`:case`zz`:case`zzz`:t=ny(1);break;case`OOOO`:case`ZZZZ`:case`zzzz`:t=ny(2);break;default:return null}return sy[e]=t,t}function cy(e,t){e=e.replace(/:/g,``);let n=Date.parse(`Jan 01, 1970 00:00:00 `+e)/6e4;return isNaN(n)?t:n}function Fne(e,t){return e=new Date(e.getTime()),e.setMinutes(e.getMinutes()+t),e}function Ine(e,t,n){let r=e.getTimezoneOffset();return Fne(e,-1*(cy(t,r)-r))}function Lne(e){if(ly(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 Xv(t,n-1,r)}let t=parseFloat(e);if(!isNaN(e-t))return new Date(t);let n;if(n=e.match(wne))return Rne(n)}let t=new Date(e);if(!ly(t))throw new _i(2311,!1);return t}function Rne(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 ly(e){return e instanceof Date&&!isNaN(e.valueOf())}var uy=(()=>{class e{_viewContainerRef;_viewRef=null;ngTemplateOutletContext=null;ngTemplateOutlet=null;ngTemplateOutletInjector=null;injector=C(Os);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)(am(zm))};static ɵdir=Oh({type:e,selectors:[[``,`ngTemplateOutlet`,``]],inputs:{ngTemplateOutletContext:`ngTemplateOutletContext`,ngTemplateOutlet:`ngTemplateOutlet`,ngTemplateOutletInjector:`ngTemplateOutletInjector`},features:[Nc]})}return e})();function dy(e,t){return new _i(2100,!1)}var fy=`mediumDate`,py=new Fi(``),my=new Fi(``),hy=(()=>{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??fy,a=r??this.defaultOptions?.timezone??this.defaultTimezone??void 0;return Dne(t,e,i||this.locale,a)}catch(t){throw dy(e,t.message)}}static ɵfac=function(t){return new(t||e)(am(hv,16),am(py,24),am(my,24))};static ɵpipe=kh({name:`date`,type:e,pure:!0})}return e})(),gy=(()=>{class e{transform(e){return JSON.stringify(e,null,2)}static ɵfac=function(t){return new(t||e)};static ɵpipe=kh({name:`json`,type:e,pure:!1})}return e})();function _y(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 vy=`browser`,yy=class{_doc;constructor(e){this._doc=e}manager},by=(()=>{class e extends yy{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)(ua(ks))};static ɵprov=Oi({token:e,factory:e.ɵfac})}return e})(),xy=new Fi(``),Sy=(()=>{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 by));this._plugins=n.slice().reverse();let r=e.find(e=>e instanceof by);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 _i(-5101,!1);return this._eventNameToPlugin.set(e,t),t}static ɵfac=function(t){return new(t||e)(ua(xy),ua(Hs))};static ɵprov=Oi({token:e,factory:e.ɵfac})}return e})(),Cy=`ng-app-id`;function wy(e){for(let t of e)t.remove()}function Ty(e,t){let n=t.createElement(`style`);return n.textContent=e,n}function Ey(e,t,n,r){let i=e.head?.querySelectorAll(`style[${Cy}="${t}"],link[${Cy}="${t}"]`);if(!i||i.length===0)return!1;for(let e of i)e.removeAttribute(Cy),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 Dy(e,t){let n=t.createElement(`link`);return n.setAttribute(`rel`,`stylesheet`),n.setAttribute(`href`,e),n}var Oy=(()=>{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,Ey(e,t,this.inline,this.external)&&this.hosts.add(e.head)}addStyles(e,t){for(let t of e)this.addUsage(t,this.inline,Ty);t?.forEach(e=>this.addUsage(e,this.external,Dy))}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&&(wy(n.elements),t.delete(e)))}ngOnDestroy(){for(let[,{elements:e}]of[...this.inline,...this.external])wy(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,Ty(t,this.doc)));for(let[t,{elements:n}]of this.external)n.push(this.addElement(e,Dy(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)(ua(ks),ua(ic),ua(cc,8),ua(sc))};static ɵprov=Oi({token:e,factory:e.ɵfac})}return e})(),ky={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`},Ay=/%COMP%/g,jy=`%COMP%`,My=`_nghost-${jy}`,Ny=`_ngcontent-${jy}`,Py=!0,Fy=new Fi(``,{factory:()=>Py}),Iy=new Fi(``);function Ly(e){return Ny.replace(Ay,e)}function Ry(e){return My.replace(Ay,e)}function zy(e,t){return t.map(t=>t.replace(Ay,e))}var By=(()=>{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 Vy(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 Gy?n.applyToHost(e):n instanceof Wy&&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 gu.Emulated:r=new Gy(o,s,t,this.appId,c,i,a,l,this.cssVarNamespace);break;case gu.ShadowDom:return new Uy(o,e,t,i,a,this.nonce,l,this.cssVarNamespace,s);case gu.ExperimentalIsolatedShadowDom:return new Uy(o,e,t,i,a,this.nonce,l,this.cssVarNamespace);default:r=new Wy(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)(ua(Sy),ua(rm),ua(ic),ua(Fy),ua(ks),ua(Hs),ua(cc),ua(id,8),ua(Iy,8))};static ɵprov=Oi({token:e,factory:e.ɵfac})}return e})(),Vy=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(ky[t]||t,e):this.doc.createElement(e)}createComment(e){return this.doc.createComment(e)}createText(e){return this.doc.createTextNode(e)}appendChild(e,t){(Hy(e)?e.content:e).appendChild(t)}insertBefore(e,t,n){if(e){let r=Hy(e)?e.content:e;if(n!=null&&n.parentNode!==r)throw new _i(-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 _i(-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=ky[r];i?e.setAttributeNS(i,t,n):e.setAttribute(t,n)}else e.setAttribute(t,n)}removeAttribute(e,t,n){if(n){let r=ky[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&(zu.DashCase|zu.Important)?e.style.setProperty(t,n,r&zu.Important?`important`:``):e.style[t]=n}removeStyle(e,t,n){let r=t.startsWith(`--`);r&&(t=t.replace(`%NS%`,this.cssVarNamespace)),r||n&zu.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=Lv().getGlobalEventTarget(this.doc,e),!e))throw new _i(-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 Hy(e){return e.tagName===`TEMPLATE`&&e.content!==void 0}var Uy=class extends Vy{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=zy(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=Dy(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)}},Wy=class extends Vy{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?zy(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&&Ku.size===0&&this.sharedStylesHost.removeStyles(this.styles,this.styleUrls)}},Gy=class extends Wy{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=Ly(l),this.hostAttr=Ry(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}},Ky=class e extends gne{supportsDOMEvents=!0;static makeCurrent(){hne(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=Jy();return t==null?null:Yy(t)}resetBaseElement(){qy=null}getUserAgent(){return window.navigator.userAgent}getCookie(e){return _y(document.cookie,e)}},qy=null;function Jy(){return qy||=document.head.querySelector(`base`),qy?qy.getAttribute(`href`):null}function Yy(e){return new URL(e,document.baseURI).pathname}var Xy=[`alt`,`control`,`meta`,`shift`],Zy={"\b":`Backspace`," ":`Tab`,"":`Delete`,"\x1B":`Escape`,Del:`Delete`,Esc:`Escape`,Left:`ArrowLeft`,Right:`ArrowRight`,Up:`ArrowUp`,Down:`ArrowDown`,Menu:`ContextMenu`,Scroll:`ScrollLock`,Win:`OS`},Qy={alt:e=>e.altKey,control:e=>e.ctrlKey,meta:e=>e.metaKey,shift:e=>e.shiftKey},$y=(()=>{class e extends yy{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(()=>Lv().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=Zy[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=Qy[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)(ua(ks))};static ɵprov=Oi({token:e,factory:e.ɵfac})}return e})();async function eb(e,t,n){return fne({rootComponent:e,...tb(t,n)})}function tb(e,t){return{platformRef:t?.platformRef,appProviders:[...ob,...e?.providers??[]],platformProviders:ab}}function nb(){Ky.makeCurrent()}function rb(){return new ec}function ib(){return iu(document),document}var ab=[{provide:sc,useValue:vy},{provide:oc,useValue:nb,multi:!0},{provide:ks,useFactory:ib}],ob=[{provide:Wa,useValue:`root`},{provide:ec,useFactory:rb},{provide:xy,useClass:by,multi:!0},{provide:xy,useClass:$y,multi:!0},By,{provide:rm,useClass:Oy},{provide:Oy,useExisting:rm},Sy,{provide:Cp,useExisting:By},[]];function sb(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 db({code:i,why:lb(a.why,e),fix:lb(a.fix,e),docs:o,cause:e.cause,sources:e.sources,data:lb(a.data,e)},s);for(let e of t)e(r,n);return r};n[i]=s}return n}function mb(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 bb=Math.random.bind(Math),xb=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function Sb(e=21){let t=``,n=e;for(;n--;)t+=xb[bb()*64|0];return t}var Cb=6e4,wb=e=>e,Tb=wb,{clearTimeout:Eb,setTimeout:Db}=globalThis;function Ob(e,t){let{post:n,on:r,off:i=()=>{},eventNames:a=[],serialize:o=wb,deserialize:s=Tb,resolver:c,bind:l=`rpc`,timeout:u=Cb,proxify:d=!0}=t,f=!1,p=new Map,m,h;async function g(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:g}=yb(),_=Sb();s.i=_;let ee;async function te(n=s){return u>=0&&(ee=Db(()=>{try{if(t.onTimeoutError?.call(h,e,r)!==!0)throw Error(`[birpc] timeout on calling "${e}"`)}catch(e){g(e)}p.delete(_)},u),typeof ee==`object`&&(ee=ee.unref?.())),p.set(_,{resolve:d,reject:g,timeoutId:ee,method:e}),await c(n),l}try{t.onRequest?await t.onRequest.call(h,s,te,d):await te()}catch(e){if(t.onGeneralError?.call(h,e)!==!0)throw e;return}finally{Eb(ee),p.delete(_)}return l}let _={$call:(e,...t)=>g(e,t,!1),$callOptional:(e,...t)=>g(e,t,!1,!0),$callEvent:(e,...t)=>g(e,t,!0),$callRaw:e=>g(e.method,e.args,e.event,e.optional),$rejectPendingCalls:te,get $closed(){return f},get $meta(){return t.meta},$close:ee,$functions:e};h=d?new Proxy({},{get(t,n){if(Object.hasOwn(_,n))return _[n];if(n===`then`&&!a.includes(`then`)&&!(`then`in e))return;let r=(...e)=>g(n,e,!0);if(a.includes(n))return r.asEvent=r,r;let i=(...e)=>g(n,e,!1);return i.asEvent=r,i}}):_;function ee(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(ne)}function te(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 ne(r,...i){let a;try{a=s(r)}catch(e){if(t.onGeneralError?.call(h,e)!==!0)throw e;return}if(a.t===`q`){let{m:r,a:s,o:u}=a,d,f,p=await(c?c.call(h,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`?h:e,s)}catch(e){f=e}if(a.i){if(f&&t.onFunctionError&&t.onFunctionError.call(h,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(h,e,r,s)!==!0)throw e}try{await n(o({t:`s`,i:a.i,e:f}),...i)}catch(e){if(t.onGeneralError?.call(h,e,r,s)!==!0)throw e}}}else{let{i:e,r:t,e:n}=a,r=p.get(e);r&&(Eb(r.timeoutId),n?r.reject(n):r.resolve(t)),p.delete(e)}}return m=r(ne),h}function kb(e,t){return t.safety?t.safety:e===`static`||e===`query`||e==null?`read`:`action`}var Ab=Object.freeze({type:`object`,additionalProperties:!0});function jb(e){let t=e[`~standard`];if(t.jsonSchema)try{return t.jsonSchema.input({target:`draft-2020-12`})}catch{return Ab}return Ab}function Mb(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 Pb(e,t){return Nb(e,t)??[e]}function Fb(e){return typeof e==`string`?`'${e}'`:new zb().serialize(e)}var Ib=` _-,;:!?.'"()[]{}@*/\\&#%\`^+<=>|~$0123456789abcdefghijklmnopqrstuvwxyz`,Lb=(function(){let e=new Uint8Array(128);for(let t=0;t<69;t++)e[Ib.charCodeAt(t)]=t+1;for(let t=65;t<=90;t++)e[t]=e[t+32];return e})();function Rb(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})(),Bb=[1779033703,-1150833019,1013904242,-1521486534,1359893119,-1694144372,528734635,1541459225],Vb=[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],Hb=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_`,Ub=[],Wb=class{_data=new Gb;_hash=new Gb([...Bb]);_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)Ub[n]=e[t+n]|0;else{let e=Ub[n-15],t=(e<<25|e>>>7)^(e<<14|e>>>18)^e>>>3,r=Ub[n-2],i=(r<<15|r>>>17)^(r<<13|r>>>19)^r>>>10;Ub[n]=t+Ub[n-7]+i+Ub[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),h=u+m+d+Vb[n]+Ub[n],g=p+f;u=l,l=c,c=s,s=o+h|0,o=a,a=i,i=r,r=h+g|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=Gb.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 Kb(e){return new Wb().finalize(e).toBase64()}function qb(e){return Kb(Fb(e))}function Jb(e){return qb(e)}function Yb(){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 Xb=/^[\w+.-]{2,}:\/\//;function Zb(e){return e.endsWith(`/`)?e:`${e}/`}function Qb(e){return(e.endsWith(`/`)?e.slice(0,-1):e)||`/`}function $b(e,...t){let n=e;for(let e of t)e&&e!==`/`&&(n=n?Zb(n)+e.replace(/^\.?\//,``):e);return n}function ex(e,t){if(!t||t===`/`||Xb.test(e))return e;let n=Qb(t);return e.startsWith(n)?e:$b(n,e)}function tx(e,t){let n=e.match(Xb);return t+(n?e.slice(n[0].length):e)}var nx=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function rx(e=21){let t=``,n=e;for(;n--;)t+=nx[Math.random()*64|0];return t}var ix=Symbol.for(`immer-nothing`),ax=Symbol.for(`immer-draftable`),ox=Symbol.for(`immer-state`),sx=[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 cx(e,...t){{let n=sx[e],r=Mx(n)?n.apply(null,t):n;throw Error(`[Immer] ${r}`)}}var lx=Object,ux=lx.getPrototypeOf,dx=`constructor`,fx=`prototype`,px=`configurable`,mx=`enumerable`,hx=`writable`,gx=`value`,_x=e=>!!e&&!!e[ox];function vx(e){return e?xx(e)||Ox(e)||!!e[ax]||!!e[dx]?.[ax]||kx(e)||Ax(e):!1}var yx=lx[fx][dx].toString(),bx=new WeakMap;function xx(e){if(!e||!jx(e))return!1;let t=ux(e);if(t===null||t===lx[fx])return!0;let n=lx.hasOwnProperty.call(t,dx)&&t[dx];if(n===Object)return!0;if(!Mx(n))return!1;let r=bx.get(n);return r===void 0&&(r=Function.toString.call(n),bx.set(n,r)),r===yx}function Sx(e,t,n=!0){Cx(e)===0?(n?Reflect.ownKeys(e):lx.keys(e)).forEach(n=>{t(n,e[n],e)}):e.forEach((n,r)=>t(r,n,e))}function Cx(e){let t=e[ox];return t?t.type_:Ox(e)?1:kx(e)?2:Ax(e)?3:0}var wx=(e,t,n=Cx(e))=>n===2?e.has(t):lx[fx].hasOwnProperty.call(e,t),Tx=(e,t,n=Cx(e))=>n===2?e.get(t):e[t],Ex=(e,t,n,r=Cx(e))=>{r===2?e.set(t,n):r===3?e.add(n):e[t]=n};function Dx(e,t){return e===t?e!==0||1/e==1/t:e!==e&&t!==t}var Ox=Array.isArray,kx=e=>e instanceof Map,Ax=e=>e instanceof Set,jx=e=>typeof e==`object`,Mx=e=>typeof e==`function`,Nx=e=>typeof e==`boolean`;function Px(e){let t=+e;return Number.isInteger(t)&&String(t)===e}var Fx=e=>jx(e)?e?.[ox]:null,Ix=e=>e.copy_||e.base_,Lx=e=>e.modified_?e.copy_:e.base_;function Rx(e,t){if(kx(e))return new Map(e);if(Ax(e))return new Set(e);if(Ox(e))return Array[fx].slice.call(e);let n=xx(e);if(t===!0||t===`class_only`&&!n){let t=lx.getOwnPropertyDescriptors(e);delete t[ox];let n=Reflect.ownKeys(t);for(let r=0;r1&&lx.defineProperties(e,{set:Vx,add:Vx,clear:Vx,delete:Vx}),lx.freeze(e),t&&Sx(e,(e,t)=>{zx(t,!0)},!1),e)}function Bx(){cx(2)}var Vx={[gx]:Bx};function Hx(e){return e===null||!jx(e)||lx.isFrozen(e)}var Ux=`MapSet`,Wx=`Patches`,Gx=`ArrayMethods`,Kx={};function qx(e){let t=Kx[e];return t||cx(0,e),t}var Jx=e=>!!Kx[e];function Yx(e,t){Kx[e]||(Kx[e]=t)}var Xx,Zx=()=>Xx,Qx=(e,t)=>({drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:Jx(Ux)?qx(Ux):void 0,arrayMethodsPlugin_:Jx(Gx)?qx(Gx):void 0});function $x(e,t){t&&(e.patchPlugin_=qx(Wx),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function eS(e){tS(e),e.drafts_.forEach(rS),e.drafts_=null}function tS(e){e===Xx&&(Xx=e.parent_)}var nS=e=>Xx=Qx(Xx,e);function rS(e){let t=e[ox];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function iS(e,t){t.unfinalizedDrafts_=t.drafts_.length;let n=t.drafts_[0];if(e!==void 0&&e!==n){n[ox].modified_&&(eS(t),cx(4)),vx(e)&&(e=aS(t,e));let{patchPlugin_:r}=t;r&&r.generateReplacementPatches_(n[ox].base_,e,t)}else e=aS(t,n);return oS(t,e,!0),eS(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e===ix?void 0:e}function aS(e,t){if(Hx(t))return t;let n=t[ox];if(!n)return mS(t,e.handledSet_,e);if(!cS(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);fS(n,e)}return n.copy_}function oS(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&zx(t,n)}function sS(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var cS=(e,t)=>e.scope_===t,lS=[];function uS(e,t,n,r){let i=Ix(e),a=e.type_;if(r!==void 0&&Tx(i,r,a)===t){Ex(i,r,n,a);return}if(!e.draftLocations_){let t=e.draftLocations_=new Map;Sx(i,(e,n)=>{if(_x(n)){let r=t.get(n)||[];r.push(e),t.set(n,r)}})}let o=e.draftLocations_.get(t)??lS;for(let e of o)Ex(i,e,n,a)}function dS(e,t,n){e.callbacks_.push(function(r){let i=t;if(!i||!cS(i,r))return;r.mapSetPlugin_?.fixSetContents(i);let a=Lx(i);uS(e,i.draft_??i,a,n),fS(i,r)})}function fS(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)}sS(e)}}function pS(e,t,n){let{scope_:r}=e;if(_x(n)){let i=n[ox];cS(i,r)&&i.callbacks_.push(function(){CS(e),uS(e,n,Lx(i),t)})}else vx(n)&&e.callbacks_.push(function(){let i=Ix(e);e.type_===3?i.has(n)&&mS(n,r.handledSet_,r):Tx(i,t,e.type_)===n&&r.drafts_.length>1&&(e.assigned_.get(t)??!1)===!0&&e.copy_&&mS(Tx(e.copy_,t,e.type_),r.handledSet_,r)})}function mS(e,t,n){return!n.immer_.autoFreeze_&&n.unfinalizedDrafts_<1||_x(e)||t.has(e)||!vx(e)||Hx(e)?e:(t.add(e),Sx(e,(r,i)=>{if(_x(i)){let t=i[ox];cS(t,n)&&(Ex(e,r,Lx(t),e.type_),sS(t))}else vx(i)&&mS(i,t,n)}),e)}function hS(e,t){let n=Ox(e),r={type_:+!!n,scope_:t?t.scope_:Zx(),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=gS;n&&(i=[r],a=_S);let{revoke:o,proxy:s}=Proxy.revocable(i,a);return r.draft_=s,r.revoke_=o,[s,r]}var gS={get(e,t){if(t===ox)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=Ix(e);if(!wx(i,t,e.type_))return bS(e,i,t);let a=i[t];if(e.finalized_||!vx(a)||r&&e.operationMethod&&n?.isMutatingArrayMethod(e.operationMethod)&&Px(t))return a;if(a===vS(e.base_,t)||yS(e,t,a)){CS(e);let n=e.type_===1?+t:t,r=TS(e.scope_,a,e,n);return e.copy_[n]=r}return a},has(e,t){return t in Ix(e)},ownKeys(e){return Reflect.ownKeys(Ix(e))},set(e,t,n){let r=xS(Ix(e),t);if(r?.set)return r.set.call(e.draft_,n),!0;if(!e.modified_){let r=vS(Ix(e),t),i=r?.[ox];if(i&&i.base_===n)return e.copy_[t]=n,e.assigned_.delete(t),!0;if(Dx(n,r)&&(n!==void 0||wx(e.base_,t,e.type_)))return!0;CS(e),SS(e)}return e.copy_[t]===n&&(n!==void 0||wx(e.copy_,t,e.type_))||Number.isNaN(n)&&Number.isNaN(e.copy_[t])?!0:(e.copy_[t]=n,e.assigned_.set(t,!0),pS(e,t,n),!0)},deleteProperty(e,t){return CS(e),vS(e.base_,t)!==void 0||t in e.base_?(e.assigned_.set(t,!1),SS(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){let n=Ix(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r&&{[hx]:!0,[px]:e.type_!==1||t!==`length`,[mx]:r[mx],[gx]:n[t]}},defineProperty(){cx(11)},getPrototypeOf(e){return ux(e.base_)},setPrototypeOf(){cx(12)}},_S={};for(let e in gS){let t=gS[e];_S[e]=function(){let e=arguments;return e[0]=e[0][0],t.apply(this,e)}}_S.deleteProperty=function(e,t){return isNaN(parseInt(t))&&cx(13),_S.set.call(this,e,t,void 0)},_S.set=function(e,t,n){return t!==`length`&&isNaN(parseInt(t))&&cx(14),gS.set.call(this,e[0],t,n,e[0])};function vS(e,t){let n=e[ox];return(n?Ix(n):e)[t]}function yS(e,t,n){return e.type_!==1||!e.allIndicesReassigned_||e.assigned_?.get(t)||!vx(n)||n[ox]?!1:e.baseRefs_.has(n)}function bS(e,t,n){let r=xS(t,n);return r?gx in r?r[gx]:r.get?.call(e.draft_):void 0}function xS(e,t){if(!(t in e))return;let n=ux(e);for(;n;){let e=Object.getOwnPropertyDescriptor(n,t);if(e)return e;n=ux(n)}}function SS(e){e.modified_||(e.modified_=!0,e.parent_&&SS(e.parent_))}function CS(e){e.copy_||=(e.assigned_=new Map,Rx(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var wS=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(e,t,n)=>{if(Mx(e)&&!Mx(t)){let n=t;t=e;let r=this;return function(e=n,...i){return r.produce(e,e=>t.call(this,e,...i))}}Mx(t)||cx(6),n!==void 0&&!Mx(n)&&cx(7);let r;if(vx(e)){let i=nS(this),a=TS(i,e,void 0),o=!0;try{r=t(a),o=!1}finally{o?eS(i):tS(i)}return $x(i,n),iS(r,i)}if(!e||!jx(e)){if(r=t(e),r===void 0&&(r=e),r===ix&&(r=void 0),this.autoFreeze_&&zx(r,!0),n){let t=[],i=[];qx(Wx).generateReplacementPatches_(e,r,{patches_:t,inversePatches_:i}),n(t,i)}return r}cx(1,e)},this.produceWithPatches=(e,t)=>{if(Mx(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]},Nx(e?.autoFreeze)&&this.setAutoFreeze(e.autoFreeze),Nx(e?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),Nx(e?.useStrictIteration)&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){vx(e)||cx(8),_x(e)&&(e=ES(e));let t=nS(this),n=TS(t,e,void 0);return n[ox].isManual_=!0,tS(t),n}finishDraft(e,t){let n=e&&e[ox];(!n||!n.isManual_)&&cx(9);let{scope_:r}=n;return $x(r,t),iS(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=qx(Wx).applyPatches_;return _x(e)?r(e,t):this.produce(e,e=>r(e,t))}};function TS(e,t,n,r){let[i,a]=kx(t)?qx(Ux).proxyMap_(t,n):Ax(t)?qx(Ux).proxySet_(t,n):hS(t,n);return(n?.scope_??Zx()).drafts_.push(i),a.callbacks_=n?.callbacks_??[],a.key_=r,n&&r!==void 0?dS(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 ES(e){return _x(e)||cx(10,e),DS(e)}function DS(e){if(!vx(e)||Hx(e))return e;let t=e[ox],n,r=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=Rx(e,t.scope_.immer_.useStrictShallowCopy_),r=t.scope_.immer_.shouldUseStrictIteration()}else n=Rx(e,!0);let i=n;return Ax(n)&&(n=new Set),Sx(i,(e,t)=>{Ex(n,e,DS(t))},r),t&&(t.finalized_=!1),n}function OS(){sx.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=Fx(Tx(e,n.key_)),i=Tx(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||wx(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=Tx(o,e,c),f=Tx(s,e,c),p=l?wx(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===ix?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(Ax(e))return new Set(Array.from(e).map(u));let t=Object.create(ux(e));for(let n in e)t[n]=u(e[n]);return wx(e,ax)&&(t[ax]=e[ax]),t}function d(e){return _x(e)?u(e):e}Yx(Wx,{applyPatches_:l,generatePatches_:i,generateReplacementPatches_:c,getPath:e})}globalThis.Iterator?.from;var kS=new wS,AS=kS.produce,jS=kS.produceWithPatches.bind(kS),MS=kS.applyPatches.bind(kS),NS=1e3;function PS(e,t){if(e.add(t),e.size>NS){let t=e.values().next().value;t!==void 0&&e.delete(t)}}function FS(e){let{enablePatches:t=!1}=e;t&&OS();let n=Yb(),r=e.initialValue,i=new Set;return{on:n.on,value:()=>r,patch:(e,t=rx())=>{i.has(t)||(OS(),r=MS(r,e),PS(i,t),n.emit(`updated`,r,void 0,t))},mutate:(e,a=rx())=>{if(!i.has(a)){if(PS(i,a),t){let[t,i]=jS(r,e);if(t===r)return;r=t,n.emit(`updated`,r,i,a)}else{let t=AS(r,e);if(t===r)return;r=t,n.emit(`updated`,r,void 0,a)}}},syncIds:i}}var IS=typeof self==`object`?self:globalThis,LS=new Set([`Error`,`EvalError`,`RangeError`,`ReferenceError`,`SyntaxError`,`TypeError`,`URIError`,`AggregateError`]),RS=new Set([`Boolean`,`Number`,`String`,`Int8Array`,`Uint8Array`,`Uint8ClampedArray`,`Int16Array`,`Uint16Array`,`Int32Array`,`Uint32Array`,`Float16Array`,`Float32Array`,`Float64Array`,`BigInt64Array`,`BigUint64Array`]);function zS(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=LS.has(e)?IS[e]:void 0;return n(new(r??IS.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`&&RS.has(a))return n(new IS[a](o),i);throw TypeError(`unable to deserialize unsafe or unknown type: ${String(a)}`)};return r}function BS(e){return zS(new Map,e)(0)}var VS=``,{toString:HS}={},{keys:US}=Object;function WS(e){let t=typeof e;if(t!==`object`||!e)return[0,t];let n=HS.call(e).slice(8,-1);switch(n){case`Array`:return[1,VS];case`Object`:return[2,VS];case`Date`:return[3,VS];case`RegExp`:return[4,VS];case`Map`:return[5,VS];case`Set`:return[6,VS];case`DataView`:return[1,n]}return n.includes(`Array`)?[1,n]:n.includes(`Error`)?[7,n]:[2,n]}function GS([e,t]){return e===0&&(t===`function`||t===`symbol`)}function KS(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]=WS(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 US(r))(e||!GS(WS(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||!(GS(WS(n))||GS(WS(i))))&&t.push([a(n),a(i)]);return n}case 6:{let t=[],n=i([o,t],r);for(let n of r)(e||!GS(WS(n)))&&t.push(a(n));return n}}let{message:c}=r;return i([o,{name:s,message:c}],r)};return a}function qS(e,t={}){let n=[];return KS(!(t.json||t.lossy),!!t.json,new Map,n)(e),n}var{parse:JS,stringify:YS}=JSON,XS={json:!0,lossy:!0};function ZS(e){return BS(JS(e))}function QS(e){return YS(qS(e,XS))}function $S(e){return BS(e)}function eC(e){return QS(e)}function tC(e){return ZS(e)}var nC=256,rC=class extends Error{name=`StreamClosedError`};function iC(e={}){let t=e.id??rx(),n=Math.max(0,e.replayWindow??0),r=Yb(),i=new AbortController,a=[],o=!1,s=0;function c(e){if(o)throw new rC(`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=oC(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 aC(e={}){let t=e.id??rx(),n=Math.max(1,e.highWaterMark??nC),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 h(){o||a||(o=!0,e.onCancel?.(),m(void 0))}function g(){return u||(u=new ReadableStream({start(e){l=e,f()},cancel(){h()}}),u)}return{id:t,get cancelled(){return o},get done(){return a},get lastSeenSeq(){return i},get readable(){return g()},cancel:h,_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 h(),Promise.resolve({value:void 0,done:!0})}}}}}function oC(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 sC=128;function cC(e){return e.replace(/[^\w-]+/g,`_`).slice(0,sC)}var lC=`modulepreload`,uC=function(e,t){return new URL(e,t).href},dC={},fC=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=uC(t,n),t=s(t),t in dC)return;dC[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`:lC,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)})},pC=`__connection.json`,mC=`__DEVFRAME_CONNECTION__`,hC=`x-birpc-session`,gC=`__rpc-dump/index.json`,_C=`devframe:services`,vC=`devframe_otp`,yC=`devframe_auth_token`;hb.postMessage.remoteAssetsError;var bC=class{cacheMap=new Map;options;keySerializer;constructor(e){this.options=e,this.keySerializer=e.keySerializer||(e=>Jb(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()}},xC=vb({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 SC(e){if(e.agent&&e.jsonSerializable===!1)throw xC.DF0019({name:e.name});e.agent&&!e.jsonSerializable&&(e.jsonSerializable=!0)}async function CC(e,t){let n=e[`~standard`].validate(t);return n instanceof Promise?await n:n}function wC(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 TC(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 OC(e,t){let n=e.handler;if(!n){let r=await DC(e,t);if(!r.handler)throw xC.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 TC(e.name,r,t),o=await a(...n);return await EC(e.name,i,o)}}var kC=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 OC(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 xC.DF0021({name:e.name});SC(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 xC.DF0022({name:e.name});SC(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 OC(this.definitions.get(e),this.context)}getSchema(e){let t=this.definitions.get(e);if(!t)throw xC.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 AC(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 MC(t,`undefined`,r,e);return n}return i!==null&&jC(i,r,e,t),n})}function jC(e,t,n,r){if(typeof e==`bigint`)throw MC(r,`BigInt`,t,n);if(typeof e!=`object`)return;if(e instanceof Map)throw MC(r,`Map`,t,n);if(e instanceof Set)throw MC(r,`Set`,t,n);if(e instanceof Date)throw MC(r,`Date`,t,n);if(Array.isArray(e))return;let i=Object.getPrototypeOf(e);if(i!==null&&i!==Object.prototype)throw MC(r,e.constructor?.name??`class instance`,t,n)}function MC(e,t,n,r){let i=NC(n,r);return xC.DF0020({name:e||``,type:t,path:i})}function NC(e,t){return Array.isArray(e)?`[${t}]`:t===``?``:t}var PC=`__DEVFRAME_CONNECTION_META__`,FC=`__DEVFRAME_CONNECTION_AUTH_TOKEN__`;function IC(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 LC(){return IC(mC)}function RC(){return IC(PC)}function zC(e){if(e)return e;try{let e=localStorage.getItem(FC);if(e)return e}catch{}return IC(FC)}function BC(e){globalThis[mC]=e,globalThis[PC]={...e.connectionMeta,baseUrl:e.metaBaseUrl},e.authToken&&VC(e.authToken)}function VC(e){try{localStorage.setItem(FC,e)}catch{}globalThis[FC]=e;let t=LC();t&&(globalThis[mC]={...t,authToken:e})}function HC(e){let t=ex(pC,e);try{return new URL(t,globalThis.location?.href).href}catch{return t}}function UC(e,t){return t&&t!==e.authToken?{...e,authToken:t}:e}function WC(){let e=LC();if(e)return UC(e,zC()??e.authToken??e.connectionMeta.authToken);let t=RC();if(t)return{connectionMeta:t,metaBaseUrl:t.baseUrl??HC(`./`),authToken:zC(t.authToken)}}async function GC(e={}){if(e.connection){let t=UC(e.connection,zC(e.authToken??e.connection.authToken??e.connection.connectionMeta.authToken));return BC(t),t}let t=Array.isArray(e.baseURL)?e.baseURL:[e.baseURL??`./`];if(e.connectionMeta){let n={connectionMeta:e.connectionMeta,metaBaseUrl:HC(t[0]??`./`),authToken:zC(e.authToken??e.connectionMeta.authToken)};return BC(n),n}let n=WC();if(n){let t=UC(n,zC(e.authToken??n.authToken??n.connectionMeta.authToken));return BC(t),t}let r=[];for(let n of t){let t=ex(pC,n),i=HC(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:zC(e.authToken??r.authToken)};return BC(o),o}catch(e){r.push(e)}}throw Error(`Failed to get connection meta from ${t.join(`, `)}`,{cause:r})}var KC=class extends Error{name=`DevframeConnectionError`;kind;constructor(e,t,n){super(t,n),this.kind=e}};function qC(e=vC){try{let t=globalThis.location?.hash?.replace(/^#/,``)??``;return new URLSearchParams(t).get(e)||void 0}catch{return}}function JC(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 YC(e=vC){let t=qC(e);return t&&JC(e),t}async function XC(e,t={}){let n=YC(t.param??`devframe_otp`);return n?e.isTrusted?!0:e.requestTrustWithCode(n):!1}function ZC(e){let t={},n=new WeakMap,r,i=()=>(r??=e.sharedState.get(_C,{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 QC(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:hb.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:hb.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=FS({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(hb.client.isTrustedUpdated,e=>{e&&!n&&(n=!0,d())})}})}}}var $C=new Map;function ew(e=$C){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?AC(n,r??``):`s:${eC(n)}`},deserialize:e=>{let n=e.startsWith(`s:`)?tC(e.slice(2)):JSON.parse(e);return n.t===`q`&&n.i&&n.m&&t.set(n.i,n.m),n}}}function tw(){}function nw(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 rw(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 iw(e){let{onConnected:t=tw,onError:n=tw,onDisconnected:r=tw,definitions:i,fetch:a=globalThis.fetch.bind(globalThis)}=e,o=e.url;e.authToken&&(o=`${o}${o.includes(`?`)?`&`:`?`}${yC}=${encodeURIComponent(e.authToken)}`);let s=ew(i),c=new AbortController,l=!1,u,d,f,p,m=new Promise((e,t)=>{f=e,p=t});m.catch(()=>{});function h(e){l||(l=!0,p(e),n(e),r())}function g(){l||(l=!0,p(Error(`Devframe SSE stream closed`)),r())}function _(e,n){if(e===`session`){f(n),t();return}u?.(n)}async function ee(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=nw(r);if(!e)break;r=e.rest;let{event:t,data:n}=rw(e.frame);n.length>0&&_(t,n.join(` +`))}}g()}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 ee(e.body)}catch(e){if(c.signal.aborted){g();return}h(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`,[hC]: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 aw(e,t){let{channel:n,rpcOptions:r={}}=t;return Ob(e,{...n,timeout:-1,...r,proxify:!1})}function ow(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(hb.client.connectionStatus,e,n)}let p=new Set;function m(e){for(let t of[...p])t.reject(e)}function h(){return l===`disconnected`||l===`error`?new KC(`connection`,`[devframe] Not connected to the devframe server`,{cause:u??void 0}):l===`unauthorized`?new KC(`auth`,`[devframe] Not authorized by the devframe server`,{cause:u??void 0}):null}function g(e,t){return new Promise((n,r)=>{let a=!1,o,c={reject(e){a||(l(),i.emit(hb.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 KC(`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(hb.client.error,n,t),r(n)})})}let _=new Map;for(let e of r.jsonSerializableMethods??[])_.set(e,{jsonSerializable:!0});let ee=e.createChannel({definitions:_,onError(e){f(`error`,e),i.emit(hb.client.connectionError,e),m(new KC(`connection`,`[devframe] Connection to the devframe server failed`,{cause:e}))},onDisconnected(){l!==`error`&&f(`disconnected`),m(new KC(`connection`,`[devframe] Disconnected from the devframe server`,{cause:u??void 0}))}}),te=aw(a.functions,{channel:ee,rpcOptions:o});a.register({name:hb.broadcast.authRevoked,type:`event`,handler:()=>{c=!1;let e=new KC(`auth`,`[devframe] The devframe server revoked this client's trust`);f(`unauthorized`,e),i.emit(hb.client.connectionError,e),m(e),i.emit(hb.client.isTrustedUpdated,!1)}});let ne=n;async function re(e){ne=e;let t=await te.$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 KC(`auth`,`[devframe] The devframe server refused this client's credentials`);f(`unauthorized`,e),i.emit(hb.client.connectionError,e)}return i.emit(hb.client.isTrustedUpdated,c),t.isTrusted}async function ie(e){let t=(await te.$call(`anonymous:devframe:auth:exchange`,{code:e,ua:navigator.userAgent,origin:location.origin}))?.authToken??null;return t&&(ne=t,c=!0,d.resolve(!0),f(`connected`),i.emit(hb.client.isTrustedUpdated,!0)),t}async function ae(e={}){await te.$call(`anonymous:devframe:auth:request-code`,{ua:navigator.userAgent,origin:location.origin,...e.reissue?{reissue:!0}:{}})}async function oe(){return c?!0:re(ne??``)}async function se(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:oe,requestTrustWithToken:re,requestTrustWithCode:ie,requestAuthCode:ae,ensureTrusted:se,call:(...e)=>{let t=String(e[0]),n=h();return n?(i.emit(hb.client.error,n,t),Promise.reject(n)):g(te.$call(...e),t)},callEvent:(...e)=>{let t=h();if(t){i.emit(hb.client.error,t,String(e[0]));return}return te.$callEvent(...e)},callOptional:(...e)=>{let t=String(e[0]),n=h();return n?(i.emit(hb.client.error,n,t),Promise.reject(n)):g(te.$callOptional(...e),t)},close:()=>{ee.close()}}}function sw(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 cw(e){let{authToken:t,connectionMeta:n,metaBaseUrl:r,events:i,clientRpc:a,rpcOptions:o={},sseOptions:s={},callTimeout:c=0}=e,l=sw(n.sse,r??`./`,location);return ow({transport:`sse`,authToken:t,connectionMeta:n,events:i,clientRpc:a,rpcOptions:o,callTimeout:c,createChannel:e=>iw({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 lw(e){let{name:t,message:n,cause:r,...i}=e,a=r instanceof Error?r:uw(r)?lw(r):r,o=a===void 0?Error(n):Error(n,{cause:a});return o.name=t,Object.assign(o,i),o}function uw(e){return typeof e==`object`&&!!e&&typeof e.message==`string`&&typeof e.name==`string`}function dw(e){return typeof e==`object`&&!!e&&e.type===`static`&&typeof e.path==`string`}function fw(e){return typeof e==`object`&&!!e&&e.type===`query`&&typeof e.records==`object`&&e.records!==null}function pw(e){return typeof e==`object`&&!!e&&(`output`in e||`error`in e)}function mw(e){if(e.error)throw lw(e.error);return e.output}function hw(e){return e.some(e=>e!=null)}function gw(e){return typeof e==`object`&&e&&`serialization`in e&&`data`in e?e.data:e}function _w(e,t){let n=new Map,r=new Map;function i(e,t){return t===`structured-clone`&&Array.isArray(e)?$S(e):e}function a(e,t){return i(gw(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 pw(r)?mw(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(dw(r)){if(hw(n))throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`);return await o(r)}if(fw(r)){let e=Jb(n),i=r.records[e];if(i)return mw(await s(i,r.serialization));if(r.fallback)return mw(await s(r.fallback,r.serialization));throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`)}if(!hw(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 vw(e){let t=_w(await e.fetchJsonFromBases(gC),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 yw=``;function bw(e,t){return`${e}${yw}${t}`}function xw(e){let t=new Map,n=new Map;e.client.register({name:hb.broadcast.streamingChunk,type:`event`,handler(e,n,r,i){t.get(bw(e,n))?._push(r,i)}}),e.client.register({name:hb.broadcast.streamingEnd,type:`event`,handler(e,n,r){let i=bw(e,n),a=t.get(i);a&&(a._end(r),t.delete(i))}}),e.client.register({name:hb.broadcast.streamingUploadCancel,type:`event`,handler(e,t){let r=bw(e,t),i=n.get(r);i&&(i.abort(`server cancelled upload`),n.delete(r))}}),e.events.on(hb.client.isTrustedUpdated,n=>{if(n)for(let[n,r]of t){if(r.cancelled||r.done)continue;let t=n.indexOf(yw);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=bw(n,r),o=t.get(a);if(o)return o;let s=aC({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(hb.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=bw(t,r),a=n.get(i);if(a)return a;let o=iC({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 Sw(){}var Cw=new Map;function ww(e){let t=e.url;e.authToken&&(t=`${t}?${yC}=${encodeURIComponent(e.authToken)}`);let n=new WebSocket(t),{onConnected:r=Sw,onError:i=Sw,onDisconnected:a=Sw,definitions:o=Cw}=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=ew(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 Tw(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 tx(a,/^https/i.test(a)?`wss://`:`ws://`);let o=new URL(a,r);return o.protocol=i,o.href}function Ew(e){let{authToken:t,connectionMeta:n,metaBaseUrl:r,events:i,clientRpc:a,rpcOptions:o={},wsOptions:s={},callTimeout:c=0}=e,l=Tw(n.websocket,r??`./`,location);return ow({transport:`websocket`,authToken:t,connectionMeta:n,events:i,clientRpc:a,rpcOptions:o,callTimeout:c,createChannel:e=>ww({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 Dw(e){return e.includes(`:`)}function Ow(e,t){return Dw(t)?t:`${e}:${t}`}function kw(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 Aw(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 kw(a)}function jw(e,t){return{global:Aw(e,t,`global`),project:Aw(e,t,`project`)}}function Mw(e,t){return{namespace:t,base:e,rpc:{namespace:t,register(n){if(Dw(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(Ow(t,n),...r)),callEvent:((n,...r)=>e.callEvent(Ow(t,n),...r)),callOptional:((n,...r)=>e.callOptional(Ow(t,n),...r)),sharedState:((n,r)=>e.sharedState.get(Ow(t,n),r)),streaming:{subscribe:(n,r,i)=>e.streaming.subscribe(Ow(t,n),r,i),upload:(n,r)=>e.streaming.upload(Ow(t,n),r)}},settings:jw(e,t),scope:e.scope}}function Nw(){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 Pw(e,t={}){let n=t.modelContext??Nw();if(!n)return()=>{};let r=n,i=new Map,a=new Map;function o(t,n){let o=cC(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=kb(t.type,n),u=r.registerTool({name:o,description:n.description,inputSchema:Mb(t.args),annotations:{title:n.title??t.name,readOnlyHint:l===`read`,destructiveHint:l===`destructive`},execute:n=>Fw(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 Fw(e,t,n){try{let r=Pb(n,e.args?.length);return{content:[{type:`text`,text:Iw(await(await OC(e,t))(...r))}]}}catch(e){return{isError:!0,content:[{type:`text`,text:Lw(e)}]}}}function Iw(e){return e===void 0?`undefined`:typeof e==`string`?e:JSON.stringify(e,null,2)}function Lw(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 Rw(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 zw(e={}){let{baseURL:t=`./`,rpcOptions:n={},cacheOptions:r=!1}=e,i=Yb(),a=Array.isArray(t)?t:[t],o=await GC(e),{connectionMeta:s,metaBaseUrl:c,authToken:l}=o,u=a[0]??`./`;try{u=new URL(`.`,c).href}catch{}let d=new bC({functions:[],...typeof e.cacheOptions==`object`?e.cacheOptions:{}}),f={rpc:void 0},p=new kC(f),m=e.webmcp===!1?void 0:Pw(p),h,g=!1,_=0,ee;function te(){_++,ee=void 0,d.clear(),r===!0&&d.updateOptions({functions:[]})}r&&(p.register({name:hb.broadcast.cacheInvalidate,type:`event`,handler:te}),i.on(hb.client.connectionStatus,te),i.on(hb.client.isTrustedUpdated,te));async function ne(e){let t=[u,...a.filter(e=>e!==u)].filter(e=>e!=null),n=[];for(let r of t)try{return await fetch(ex(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 re=e.callTimeout??0,ie=re>0?re:1/0,ae,oe={authToken:l,connectionMeta:s,metaBaseUrl:c,events:i,clientRpc:p,callTimeout:e.callTimeout,rpcOptions:{...n,async onRequest(e,t,i){let a=performance.now()+ie;if(await n.onRequest?.call(this,e,t,i),r===!0&&e.i&&ae.isTrusted&&!e.m.startsWith(`anonymous:`)&&e.m!==`devframe:rpc:cacheable-functions`){function t(){if(performance.now()>=a)throw new KC(`timeout`,`[devframe] RPC call "${e.m}" timed out after ${re}ms`)}for(;!ee&&(t(),!(g||ae.status!==`connected`));){let e=_;ee=ae.callOptional(`devframe:rpc:cacheable-functions`).then(t=>{e===_&&d.updateOptions({functions:t??[]})}).catch(t=>{throw e===_&&(ee=void 0),t}),await ee}await ee,t()}let o=_;if(r&&e.i&&!g&&ae.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&&d.apply(e,n)}else await t(e)}}},se=Rw(e.transport??`auto`,s);ae=se===`static`?await vw({fetchJsonFromBases:ne}):se===`sse`?cw({...oe,sseOptions:e.sseOptions}):Ew({...oe,wsOptions:e.wsOptions});let ce;try{ce=new BroadcastChannel(`devframe-auth`)}catch{}let le,ue=!1;function de(e){return((...t)=>ue||!le?e(...t):le.then(()=>e(...t)))}function fe(){g=!0,te();try{h?.(),m?.()}finally{try{ce?.close()}finally{ae.close?.()}}}let pe={events:i,get isTrusted(){return ae.isTrusted},get status(){return ae.status},get connectionError(){return ae.connectionError},get transport(){return ae.transport??se},get connection(){return o},connectionMeta:s,ensureTrusted:ae.ensureTrusted,requestTrust:ae.requestTrust,requestTrustWithToken:async e=>(VC(e),o={...o,authToken:e},ae.requestTrustWithToken(e)),requestTrustWithCode:async e=>{let t=await ae.requestTrustWithCode(e);if(!t)return!1;VC(t),o={...o,authToken:t};try{ce?.postMessage({type:`auth-update`,authToken:t})}catch{}return!0},requestAuthCode:e=>ae.requestAuthCode(e),call:de(ae.call),callEvent:de(ae.callEvent),callOptional:de(ae.callOptional),client:p,sharedState:void 0,services:void 0,streaming:void 0,cacheManager:d,scope:void 0,close:fe};pe.sharedState=QC(pe),pe.streaming=xw(pe),pe.services=ZC(pe);let me=new Map;pe.scope=(e=>{if(!e)return pe;let t=me.get(e);return t||(t=Mw(pe,e),me.set(e,t)),t}),f.rpc=pe;function he(){try{return typeof window<`u`&&window.self===window.top}catch{return!1}}async function ge(){if(e.simpleAuth!==!1&&he()&&typeof globalThis.prompt==`function`)for(await pe.requestAuthCode().catch(()=>{});!pe.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 pe.requestTrustWithCode(t))return}}async function _e(){let t=await ae.requestTrust(),n=e.otpParam??`devframe_otp`,r=n?await XC(pe,{param:n}):!1;t||r||pe.isTrusted||await ge()}return le=_e().then(()=>{ue=!0},()=>{ue=!0}),s.mcp&&fC(async()=>{let{setupBrowserAgentRpcBridge:e}=await import(`./browser-agent-rpc-KH4HHvHf-B4GGvz72.js`);return{setupBrowserAgentRpcBridge:e}},[],import.meta.url).then(({setupBrowserAgentRpcBridge:e})=>{g||(h=e(pe))}).catch(()=>{}),ce&&(ce.onmessage=e=>{e.data?.type===`auth-update`&&e.data.authToken&&pe.requestTrustWithToken(e.data.authToken)}),pe}var Bw=zw,Vw=[`components`,`injectors`,`signals`,`ngrx`,`tanstackQuery`,`forms`,`router`,`pipes`,`http`,`analog`,`capacitor`,`errors`,`plugins`],Hw=[`angular`,`ngrx`,`analog`,`angular-native`,`nativescript`,`capacitor`];function Uw(e){return`pangular:${e}`}var Ww=[`forms`,`router`,`ngrx`,`http`,`analog`,`components`,`tanstackQuery`,`plugins`],Gw={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},capacitorCalls:{default:200,min:10,max:2e3},idleAfterMs:{default:6e4,min:0,max:6e5}},Kw={"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`,"cache-off-or-filter":`the transfer cache is off, or its filter (or another withHttpTransferCacheOptions setting) left it out`},qw=[[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 Jw(e){return qw.some(([t])=>t===e)}var Yw=/^[a-z][a-z0-9-]{0,39}$/;function Xw(e,t){let n=t.plugins?.[e],r=t.inspectors.plugins&&Yw.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 Zw=`pangular`,Qw={mod:`Mod`,ctrl:`Ctrl`,control:`Ctrl`,meta:`Meta`,cmd:`Meta`,command:`Meta`,alt:`Alt`,option:`Alt`,opt:`Alt`,shift:`Shift`},$w=[`Mod`,`Ctrl`,`Meta`,`Alt`,`Shift`];function eT(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=Qw[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[...$w.filter(e=>n.has(e)),r].join(`+`)}function tT(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 nT(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 rT=[{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:`capacitor`,label:`Capacitor`,inspector:`capacitor`},{id:`plugins`,label:`Plugins`,inspector:`plugins`}],iT=1e4;function aT(e){return rT.filter(t=>!(`inspector`in t)||e.inspectors[t.inspector])}var oT={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`},sT=200;function cT(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 lT(e){let t=new URLSearchParams(e.replace(/^#/,``)),n=e=>{let n=t.get(e)?.trim();return n&&n.length<=sT?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 uT=[{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 dT(e){let t=aT(e).map(e=>({id:`tab:${e.id}`,title:`Go to ${e.label}`,group:`Go to`,keywords:`tab open`})),n=uT.filter(t=>!t.inspector||e.inspectors[t.inspector]).map(({inspector:e,...t})=>t);return[...t,...n]}function fT(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:{}}function pT(e,t){return typeof e==`boolean`?e:t}var mT=100,hT=100;function gT(e){if(!Array.isArray(e))return[];let t=e.filter(e=>typeof e==`string`).map(e=>e.trim()).filter(e=>e&&e.length<=hT);return[...new Set(t)].slice(0,mT)}function _T(e,t){let{default:n,min:r,max:i}=Gw[t];return typeof e!=`number`||!Number.isFinite(e)?n:Math.min(i,Math.max(r,Math.round(e)))}function vT(e,t){return Object.fromEntries(e.map(e=>[e,t(e)]))}function yT(e){let t=fT(e),n=fT(t.agent),r=fT(t.inspectors),i=fT(n.tools),a=fT(t.actions),o=pT(t.actions,!0),s=fT(t.redaction),c=fT(t.limits),l=vT(Vw,e=>pT(r[e],!0));return{inspectors:l,agent:{readOnly:pT(n.readOnly,!1),tools:vT(Vw,e=>l[e]&&pT(i[e],!0)),browserTools:pT(n.browserTools,!1)},actions:vT(Ww,e=>l[e]&&pT(a[e],o)),redaction:{secretNames:gT(s.secretNames),unmask:gT(s.unmask)},limits:Object.fromEntries(Object.keys(Gw).map(e=>[e,_T(c[e],e)])),popup:{hotkey:wT(fT(t.popup).hotkey)},plugins:CT(t.plugins),lint:{rules:xT(t.lint)}}}var bT=200;function xT(e){let t=fT(fT(e).rules),n={};for(let[e,r]of Object.entries(t).slice(0,bT))typeof r==`boolean`&&(n[e]=r);return n}var ST=100;function CT(e){let t={};for(let[n,r]of Object.entries(fT(e)).slice(0,ST)){if(!Yw.test(n))continue;if(typeof r==`boolean`){t[n]={enabled:r,tools:!0,actions:!0};continue}let e=fT(r);r!==void 0&&Object.keys(e).length&&(t[n]={enabled:pT(e.enabled,!0),tools:pT(e.tools,!0),actions:pT(e.actions,!0)})}return t}function wT(e){return e===!1?!1:eT(e)??`Alt+Shift+P`}function TT(e){let t=e?.configs;return yT(t?.[Zw])}function ET(e){return`${{forms:`Writing to forms`,router:`Navigating and clearing navigations`,ngrx:`Restoring NgRx state and dispatching actions`,http:`Changing HTTP mock rules and SSR overrides, and clearing HTTP calls`,analog:`Calling API routes and clearing server calls`,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 DT=[`pangular:build-meta`],OT={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`},kT={forms:`Form writes`,router:`Navigation`,ngrx:`NgRx restore and dispatch`,http:`HTTP mocking`,analog:`Analog API calls`,components:`Component edits`,tanstackQuery:`TanStack Query invalidate and refetch`,plugins:`Plugin actions`},AT={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`,capacitorCalls:e=>`${e} Capacitor plugin calls`,idleAfterMs:e=>e?`idle ${e/1e3} s after the last agent call`:`never idle`};function jT(e){let t=[],n=(e,n)=>{n.length&&t.push({label:e,value:n.join(`, `)})},r=Vw.filter(t=>e.inspectors[t]);n(`Inspectors off`,Vw.filter(t=>!e.inspectors[t]).map(e=>OT[e])),n(`Agent`,e.agent.readOnly?[`Read-only`]:[]),n(`Hidden from the agent`,r.filter(t=>!e.agent.tools[t]).map(e=>OT[e])),n(`Blocked actions`,Ww.filter(t=>e.inspectors[t]&&!e.actions[t]).map(e=>kT[e])),n(`Extra secret names`,e.redaction.secretNames),n(`Unmasked names`,e.redaction.unmask),n(`Limits`,Object.keys(Gw).filter(t=>e.limits[t]!==Gw[t].default).map(t=>AT[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 MT(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 NT(e){return!e.tags.length&&!e.directives.length&&!e.text}function PT(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 FT={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 IT(e){let t=/^(\d+)\.(\d+)/.exec(e.trim());return t?`${t[1]}.${t[2]}`:e.trim()}function LT(e){let t=/^(\d+)(?:\.(\d+))?/.exec(e.trim());return t?[Number(t[1]),Number(t[2]??0)]:null}function RT(e,t){let n=LT(e),r=LT(t);return!n||!r?!1:n[0]===r[0]?n[1]>=r[1]:n[0]>r[0]}function zT(e,t){return e?.capabilities?.[t]===!1}function BT(e,t){let n=FT[e],r=`${n.subject} needs Angular ${n.since} or later`;if(!t)return`${r}; this page's Angular version is unknown.`;let i=IT(t);return RT(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 VT(e){return e.hydration===`hydrated`&&e.hydratedAt===void 0?`hydrated before inspection`:e.hydration}var HT=/^on (viewport|interaction|hover)\b/;function UT(e){let t=e.filter(e=>!/^(prefetch|hydrate) /.test(e));return t.length>0&&t.every(e=>HT.test(e))}function WT(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(UT(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 GT=`pangular-page-id`,KT=null;function qT(e){KT=e}function JT(){if(KT)return KT;try{return new URLSearchParams(location.search).get(`pageId`)||(window.top===window?null:sessionStorage.getItem(GT)||null)}catch{return null}}function YT(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 XT(e,t){return e?t?e.pages?.[t]??null:e:null}function ZT(e,t){return e?t?e.pages?.[t]??null:e.graph??null:null}function QT(){return{functions:[...DT]}}function $T(e,t,n){return e?e.scope(`pangular`).rpc.call(t,...n===void 0?[]:[n]):Promise.resolve(null)}function eE(e,t,n){return $T(e,t,n).then(e=>e,()=>null)}function tE(e){return e?.connectionMeta.backend===`static`}function nE(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 rE(e=globalThis){delete e.__DEVFRAME_CONNECTION__,delete e.__DEVFRAME_CONNECTION_META__}function iE(e){return e.split(`@`)[1]??``}var aE={signal:`Signal Forms`,reactive:`Reactive`,template:`Template-driven`},oE={own:`validator`,directive:`template attribute`,tree:`cross-field rule`,async:`async`,parse:`parse`,submission:`server`,schema:`schema`,manual:`setErrors`},sE=eE,cE={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 lE(e){return cE[e]??e}var uE=`https://pangular-inspector.dev/security/#opt-fields-in-or-out`;async function dE(e,t){return await sE(e,`request-form-action`,t)??{ok:!1,error:`The devtools server did not answer.`}}function fE(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 pE=/"(?:[^"\\\n]|\\.)*"|`([^`\n]*)`|\*\*/g;function mE(e){return(e??``).replace(/^_Labels, paths.*_\n\n/,``).replace(pE,(e,t)=>t??(e===`**`?``:e))}function hE(e){return TT(e?.connectionMeta)}function gE(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)?[...e]:void 0}function _E(e,t){if(!t||typeof t!=`object`)return e;let n=gE(t.secretNames),r=gE(t.unmask);return!n||!r?e:{...e,redaction:{secretNames:n,unmask:r}}}function vE(e,t){return hE(e).actions[t]}var yE={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`};function bE(e){return yE[e]}var xE=`https://pangular-inspector.dev/getting-started/configuration/#inspectors-and-agent-tools`;function SE(e,t){let n=yE[e];return!n||t.inspectors[n]}function CE(e,t){e&1&&(E(),Og(0,`rect`,5)(1,`rect`,6)(2,`rect`,7)(3,`rect`,8))}function wE(e,t){e&1&&(E(),Og(0,`path`,9)(1,`circle`,10)(2,`circle`,11)(3,`path`,12))}function TE(e,t){e&1&&(E(),Og(0,`path`,13)(1,`path`,14))}function EE(e,t){e&1&&(E(),Og(0,`path`,15)(1,`path`,16)(2,`path`,17))}function DE(e,t){e&1&&(E(),Og(0,`circle`,18)(1,`path`,19)(2,`circle`,20))}function OE(e,t){e&1&&(E(),Og(0,`path`,1))}function kE(e,t){e&1&&(E(),Og(0,`path`,21)(1,`path`,22)(2,`path`,23)(3,`path`,24))}function AE(e,t){e&1&&(E(),Og(0,`ellipse`,25)(1,`path`,26)(2,`path`,27))}function jE(e,t){e&1&&(E(),Og(0,`rect`,28)(1,`path`,29)(2,`path`,30)(3,`path`,31))}function ME(e,t){e&1&&(E(),Og(0,`circle`,32)(1,`path`,9)(2,`path`,33))}function NE(e,t){e&1&&(E(),Og(0,`path`,34)(1,`path`,35)(2,`path`,36)(3,`path`,37)(4,`circle`,38))}function PE(e,t){e&1&&(E(),Og(0,`circle`,39)(1,`path`,40))}function FE(e,t){e&1&&(E(),Og(0,`ellipse`,41)(1,`path`,42)(2,`path`,43)(3,`path`,44)(4,`path`,45))}function IE(e,t){e&1&&(E(),Og(0,`circle`,32)(1,`path`,46)(2,`path`,47))}function LE(e,t){e&1&&(E(),Og(0,`path`,2))}function RE(e,t){e&1&&(E(),Og(0,`path`,3))}function zE(e,t){e&1&&(E(),Og(0,`path`,4))}var BE=class e{name=$.required();static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-tab-icon`]],inputs:{name:[1,`name`]},decls:18,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`]],template:function(e,t){if(e&1&&(E(),z(0,`svg`,0),j(1,CE,4,0)(2,wE,4,0)(3,TE,2,0)(4,EE,3,0)(5,DE,3,0)(6,OE,1,0,`:svg:path`,1)(7,kE,4,0)(8,AE,3,0)(9,jE,4,0)(10,ME,3,0)(11,NE,5,0)(12,PE,2,0)(13,FE,5,0)(14,IE,3,0)(15,LE,1,0,`:svg:path`,2)(16,RE,1,0,`:svg:path`,3)(17,zE,1,0,`:svg:path`,4),B()),e&2){let e;O(),M((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===`plugins`?15:e===`analog`?16:e===`capacitor`?17:-1)}},styles:[`[_nghost-%COMP%] { display: inline-flex; flex-shrink: 0; -}`]})},UE=(e,t)=>t.tab,WE=(e,t)=>t.label;function GE(e,t){e&1&&K(0),e&2&&J(` `,W().meta()?.projectName,` `)}function KE(e,t){e&1&&K(0,` Project details unavailable `)}function qE(e,t){e&1&&K(0,` Loading… `)}function JE(e,t){e&1&&(K(0,` Run `),I(1,`code`),K(2,`pangular build`),L(),K(3,` again to rebuild the report. `))}function YE(e,t){e&1&&K(0,` Check that the dev server is running. `)}function XE(e,t){if(e&1){let e=V();I(0,`button`,12),H(`click`,function(){return w(e),T(W(2).loadMeta())}),K(1,`Try again`),L()}}function ZE(e,t){if(e&1&&(I(0,`p`,10),j(1,JE,4,0)(2,YE,1,0),L(),j(3,XE,2,0,`button`,11)),e&2){let e=W();O(),M(e.staticReport()?1:2),O(2),M(e.staticReport()?-1:3)}}function QE(e,t){e&1&&(I(0,`li`,5)(1,`span`),K(2,`Analog`),L(),K(3),L()),e&2&&(O(3),q(t))}function $E(e,t){e&1&&(I(0,`li`)(1,`span`),K(2,`Change detection`),L(),K(3),L()),e&2&&(O(3),q(t))}function eD(e,t){if(e&1&&(I(0,`span`,19),K(1),L(),I(2,`span`,20),K(3),L()),e&2){let e=W().$implicit,t=W();O(),q(t.cards()[e.tab]?.value),O(2),q(t.cards()[e.tab]?.sub)}}function tD(e,t){e&1&&(I(0,`span`,21),K(1,`–`),L(),I(2,`span`,20),K(3,`Count unavailable`),L())}function nD(e,t){e&1&&(R(0,`span`,22),I(1,`span`,20),K(2,`Counting…`),L())}function rD(e,t){if(e&1){let e=V();I(0,`button`,13),H(`click`,function(){let t=w(e).$implicit;return T(W().navigate.emit(t.tab))}),I(1,`span`,14)(2,`span`,15),R(3,`app-tab-icon`,16),L(),I(4,`span`,17),K(5,`→`),L()(),I(6,`span`,18),K(7),L(),j(8,eD,4,2)(9,tD,4,0)(10,nD,3,0),L()}if(e&2){let e,n=t.$implicit,r=t.$index,i=W().stateOf(n.tab);y_(`animation-delay`,60*r,`ms`),A(`aria-busy`,i===`loading`),O(3),F(`name`,n.tab),O(4),q(n.label),O(),M((e=i)===`ready`?8:e===`error`?9:10)}}function iD(e,t){e&1&&(I(0,`p`),K(1,`Loading…`),L())}function aD(e,t){if(e&1&&(I(0,`div`)(1,`dt`),K(2),L(),I(3,`dd`),K(4),L()()),e&2){let e=t.$implicit;O(2),q(e.label),O(2),q(e.value)}}function oD(e,t){if(e&1&&(I(0,`dl`),N(1,aD,5,2,`div`,null,WE),L()),e&2){let e=W();O(),P(e.configItems())}}function sD(e,t){e&1&&(I(0,`p`),K(1,`Defaults`),L())}var cD=[{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 lD(e){return cD.filter(t=>wE(t.tab,e))}var uD={zoneless:`Zoneless`,zone:`zone.js`,"zone-unused":`Zoneless, zone.js loaded`};function dD(e){return e&&Object.hasOwn(uD,e)?uD[e]:null}var fD=new Set([`signal`,`computed`,`linkedSignal`,`effect`]),pD={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 mD(e,t,n){return`${e} ${e===1?t:n}`}function hD(e,t){for(let n of e??[])t(n),hD(n.children,t)}function gD(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 · ${mD(t,`directive`,`directives`)}`}}function _D(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 · ${mD(t,`redirect`,`redirects`)}`}}function vD(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]=pD[e]??[e,e];return mD(t,n,r)});return{value:e.length,sub:n.join(` · `)}}function yD(e,t){let n=e?.forms??[],r=t?n.filter(e=>oE(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 bD(e){return e.cancelled||e.status===void 0?!1:e.status===0||e.status>=400}function xD(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(bD).length;return{value:o.length,sub:`${o.length===1?`call`:`calls`} · ${s} failed`}}var SD=class e{rpc=$(null);navigate=bv();staticReport=X(()=>rE(this.rpc()));meta=D(null);redaction=D(null);config=X(()=>yE(_E(this.rpc()),this.redaction()));stats=X(()=>this.rpc()?lD(this.config()):[]);configItems=X(()=>PT(this.config()));metaState=D(`loading`);states=D({});rows=D({});injectorTree=D(null);signalGraph=D(null);formsState=D(null);httpState=D(null);pageId=XT();destroyRef=C(As);stopLive=[];zone=X(()=>dD(QT(this.injectorTree(),this.pageId)?.zone));liveInjectors=X(()=>{let e=QT(this.injectorTree(),this.pageId);if(!e?.roots?.length)return null;let t=0,n=0,r=e=>{t++,n+=e.providers?.length??0};return hD(e.roots,r),hD(e.environment,r),{injectors:t,providers:n}});liveSignals=X(()=>{let e=$T(this.signalGraph(),this.pageId);return e?.nodes?.length?e.nodes.filter(e=>fD.has(e.kind??``)).length:null});cards=X(()=>{let e=this.rows(),t={};if(e.components&&(t.components=gD(e.components)),e.routes&&(t.routes=_D(e.routes)),e.store&&(t.store=vD(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 · ${mD(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=yD(i,this.pageId));let a=this.httpState();return a&&(t.network=xD(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),!rE(e)&&tE(e,`redaction-config`).then(t=>{this.rpc()===e&&this.redaction.set(t)}).catch(()=>{})}constructor(){_c(()=>{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);let n=_E(e),r=e=>wE(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)),wE(`forms`,t)&&r(`forms`,e=>this.formsState.set(e??{}),`forms`),wE(`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=k({type:e,selectors:[[`app-dashboard`]],inputs:{rpc:[1,`rpc`]},outputs:{navigate:`navigate`},decls:33,vars:14,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`],[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`]],template:function(e,t){if(e&1&&(I(0,`section`,0)(1,`div`,1)(2,`p`,2),K(3,`Project`),L(),I(4,`h2`,3),j(5,GE,1,1)(6,KE,1,0)(7,qE,1,0),L(),j(8,ZE,4,2),L(),I(9,`ul`,4)(10,`li`)(11,`span`),K(12,`Angular`),L(),K(13),L(),I(14,`li`)(15,`span`),K(16,`TypeScript`),L(),K(17),L(),I(18,`li`)(19,`span`),K(20,`SSR`),L(),K(21),L(),j(22,QE,4,1,`li`,5),j(23,$E,4,1,`li`),L()(),I(24,`div`,6),N(25,rD,11,6,`button`,7,UE),L(),I(27,`section`,8)(28,`h2`,9),K(29,`Configuration`),L(),j(30,iD,2,0,`p`)(31,oD,3,0,`dl`)(32,sD,2,0,`p`),L()),e&2){let e,n,r;A(`aria-busy`,t.metaState()===`loading`),O(4),G(`muted`,t.metaState()!==`ready`),O(),M((e=t.metaState())===`ready`?5:e===`error`?6:7),O(3),M(t.metaState()===`error`?8:-1),O(),G(`pending`,t.metaState()===`loading`),O(4),q(t.meta()?.angularVersion??`…`),O(4),q(t.meta()?.typescript??`…`),O(4),q(t.meta()?t.meta()?.ssr?`On`:`Off`:`…`),O(),M((n=t.meta()?.analog)?22:-1,n),O(),M((r=t.zone())?23:-1,r),O(2),P(t.stats()),O(2),A(`aria-busy`,!t.rpc()),O(3),M(t.rpc()?t.configItems().length?31:32:30)}},dependencies:[HE],styles:[`[_nghost-%COMP%] { +}`]})},VE=(e,t)=>t.tab,HE=(e,t)=>t.label;function UE(e,t){e&1&&K(0),e&2&&J(` `,W().meta()?.projectName,` `)}function WE(e,t){e&1&&K(0,` Project details unavailable `)}function GE(e,t){e&1&&K(0,` Loading… `)}function KE(e,t){e&1&&(K(0,` Run `),I(1,`code`),K(2,`pangular build`),L(),K(3,` again to rebuild the report. `))}function qE(e,t){e&1&&K(0,` Check that the dev server is running. `)}function JE(e,t){if(e&1){let e=V();I(0,`button`,12),H(`click`,function(){return w(e),T(W(2).loadMeta())}),K(1,`Try again`),L()}}function YE(e,t){if(e&1&&(I(0,`p`,10),j(1,KE,4,0)(2,qE,1,0),L(),j(3,JE,2,0,`button`,11)),e&2){let e=W();O(),M(e.staticReport()?1:2),O(2),M(e.staticReport()?-1:3)}}function XE(e,t){e&1&&(I(0,`li`,5)(1,`span`),K(2,`Analog`),L(),K(3),L()),e&2&&(O(3),q(t))}function ZE(e,t){e&1&&(I(0,`li`)(1,`span`),K(2,`Change detection`),L(),K(3),L()),e&2&&(O(3),q(t))}function QE(e,t){if(e&1&&(I(0,`span`,19),K(1),L(),I(2,`span`,20),K(3),L()),e&2){let e=W().$implicit,t=W();O(),q(t.cards()[e.tab]?.value),O(2),q(t.cards()[e.tab]?.sub)}}function $E(e,t){e&1&&(I(0,`span`,21),K(1,`–`),L(),I(2,`span`,20),K(3,`Count unavailable`),L())}function eD(e,t){e&1&&(R(0,`span`,22),I(1,`span`,20),K(2,`Counting…`),L())}function tD(e,t){if(e&1){let e=V();I(0,`button`,13),H(`click`,function(){let t=w(e).$implicit;return T(W().navigate.emit(t.tab))}),I(1,`span`,14)(2,`span`,15),R(3,`app-tab-icon`,16),L(),I(4,`span`,17),K(5,`→`),L()(),I(6,`span`,18),K(7),L(),j(8,QE,4,2)(9,$E,4,0)(10,eD,3,0),L()}if(e&2){let e,n=t.$implicit,r=t.$index,i=W().stateOf(n.tab);y_(`animation-delay`,60*r,`ms`),A(`aria-busy`,i===`loading`),O(3),F(`name`,n.tab),O(4),q(n.label),O(),M((e=i)===`ready`?8:e===`error`?9:10)}}function nD(e,t){e&1&&(I(0,`p`),K(1,`Loading…`),L())}function rD(e,t){if(e&1&&(I(0,`div`)(1,`dt`),K(2),L(),I(3,`dd`),K(4),L()()),e&2){let e=t.$implicit;O(2),q(e.label),O(2),q(e.value)}}function iD(e,t){if(e&1&&(I(0,`dl`),N(1,rD,5,2,`div`,null,HE),L()),e&2){let e=W();O(),P(e.configItems())}}function aD(e,t){e&1&&(I(0,`p`),K(1,`Defaults`),L())}var oD=[{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 sD(e){return oD.filter(t=>SE(t.tab,e))}var cD={zoneless:`Zoneless`,zone:`zone.js`,"zone-unused":`Zoneless, zone.js loaded`};function lD(e){return e&&Object.hasOwn(cD,e)?cD[e]:null}var uD=new Set([`signal`,`computed`,`linkedSignal`,`effect`]),dD={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 fD(e,t,n){return`${e} ${e===1?t:n}`}function pD(e,t){for(let n of e??[])t(n),pD(n.children,t)}function mD(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 · ${fD(t,`directive`,`directives`)}`}}function hD(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 · ${fD(t,`redirect`,`redirects`)}`}}function gD(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]=dD[e]??[e,e];return fD(t,n,r)});return{value:e.length,sub:n.join(` · `)}}function _D(e,t){let n=e?.forms??[],r=t?n.filter(e=>iE(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 vD(e){return e.cancelled||e.status===void 0?!1:e.status===0||e.status>=400}function yD(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(vD).length;return{value:o.length,sub:`${o.length===1?`call`:`calls`} · ${s} failed`}}var bD=class e{rpc=$(null);navigate=xv();staticReport=X(()=>tE(this.rpc()));meta=D(null);redaction=D(null);config=X(()=>_E(hE(this.rpc()),this.redaction()));stats=X(()=>this.rpc()?sD(this.config()):[]);configItems=X(()=>jT(this.config()));metaState=D(`loading`);states=D({});rows=D({});injectorTree=D(null);signalGraph=D(null);formsState=D(null);httpState=D(null);pageId=JT();destroyRef=C(As);stopLive=[];zone=X(()=>lD(XT(this.injectorTree(),this.pageId)?.zone));liveInjectors=X(()=>{let e=XT(this.injectorTree(),this.pageId);if(!e?.roots?.length)return null;let t=0,n=0,r=e=>{t++,n+=e.providers?.length??0};return pD(e.roots,r),pD(e.environment,r),{injectors:t,providers:n}});liveSignals=X(()=>{let e=ZT(this.signalGraph(),this.pageId);return e?.nodes?.length?e.nodes.filter(e=>uD.has(e.kind??``)).length:null});cards=X(()=>{let e=this.rows(),t={};if(e.components&&(t.components=mD(e.components)),e.routes&&(t.routes=hD(e.routes)),e.store&&(t.store=gD(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 · ${fD(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=_D(i,this.pageId));let a=this.httpState();return a&&(t.network=yD(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),!tE(e)&&$T(e,`redaction-config`).then(t=>{this.rpc()===e&&this.redaction.set(t)}).catch(()=>{})}constructor(){_c(()=>{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);let n=hE(e),r=e=>SE(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)),SE(`forms`,t)&&r(`forms`,e=>this.formsState.set(e??{}),`forms`),SE(`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=k({type:e,selectors:[[`app-dashboard`]],inputs:{rpc:[1,`rpc`]},outputs:{navigate:`navigate`},decls:33,vars:14,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`],[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`]],template:function(e,t){if(e&1&&(I(0,`section`,0)(1,`div`,1)(2,`p`,2),K(3,`Project`),L(),I(4,`h2`,3),j(5,UE,1,1)(6,WE,1,0)(7,GE,1,0),L(),j(8,YE,4,2),L(),I(9,`ul`,4)(10,`li`)(11,`span`),K(12,`Angular`),L(),K(13),L(),I(14,`li`)(15,`span`),K(16,`TypeScript`),L(),K(17),L(),I(18,`li`)(19,`span`),K(20,`SSR`),L(),K(21),L(),j(22,XE,4,1,`li`,5),j(23,ZE,4,1,`li`),L()(),I(24,`div`,6),N(25,tD,11,6,`button`,7,VE),L(),I(27,`section`,8)(28,`h2`,9),K(29,`Configuration`),L(),j(30,nD,2,0,`p`)(31,iD,3,0,`dl`)(32,aD,2,0,`p`),L()),e&2){let e,n,r;A(`aria-busy`,t.metaState()===`loading`),O(4),G(`muted`,t.metaState()!==`ready`),O(),M((e=t.metaState())===`ready`?5:e===`error`?6:7),O(3),M(t.metaState()===`error`?8:-1),O(),G(`pending`,t.metaState()===`loading`),O(4),q(t.meta()?.angularVersion??`…`),O(4),q(t.meta()?.typescript??`…`),O(4),q(t.meta()?t.meta()?.ssr?`On`:`Off`:`…`),O(),M((n=t.meta()?.analog)?22:-1,n),O(),M((r=t.zone())?23:-1,r),O(2),P(t.stats()),O(2),A(`aria-busy`,!t.rpc()),O(3),M(t.rpc()?t.configItems().length?31:32:30)}},dependencies:[BE],styles:[`[_nghost-%COMP%] { display: block; max-width: 1200px; } @@ -325,7 +325,7 @@ h2.muted[_ngcontent-%COMP%] { .skeleton[_ngcontent-%COMP%] { animation: none; } -}`]})},CD=`pangular:panel-action-result`,wD=6e3,TD=0;function ED(e=window){return e.location.protocol===`chrome-extension:`&&e.parent!==e}function DD(e,t=window){let n=`pa-${Date.now().toString(36)}-${++TD}`;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!==CD||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`}),wD);t.addEventListener(`message`,a),t.parent.postMessage({...e,requestId:n},t.location.origin)})}var OD=class e{available=ED();reveal(e,t){return DD({type:`pangular:reveal-element`,pageId:e,id:t})}openSource(e,t,n){return DD({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=Rl({token:e,factory:e.ɵfac})};function kD(e){let t=e?.pages;return t&&typeof t==`object`?t:{}}function AD(e){let t=C(As),n=D({}),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(kD(e));o(a.value()),i=a.on(`updated`,o)}catch{r===e&&n.set({})}};return _c(()=>{let t=e();t&&t!==r&&Z(()=>void a(t))}),t.onDestroy(()=>i?.()),n.asReadonly()}function jD(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 MD=[`*`];function ND(e,t){if(e&1&&(z(0,`div`,1)(1,`p`,2),K(2),B(),z(3,`p`,3),K(4),Jg(5),z(6,`a`,4),K(7,`Supported versions`),B()()()),e&2){let e=W();G(`compact`,e.compact()),O(2),q(e.title()),O(2),J(` `,t,` `),O(2),Pg(`href`,e.docsUrl,ku)}}var PD=`https://pangular-inspector.dev/getting-started/installation/#supported-angular-versions`,FD=class e{page=$(null);capability=$.required();missing=$(!1,{transform:jv});compact=$(!1,{transform:jv});docsUrl=PD;text=X(()=>{let e=this.page();return!this.missing()&&!HT(e,this.capability())?null:UT(this.capability(),e?.version)});title=X(()=>{let e=this.page()?.version;return e?`Not available on Angular ${zT(e)}`:`Not available on this page`});static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-angular-unavailable`]],inputs:{page:[1,`page`],capability:[1,`capability`],missing:[1,`missing`],compact:[1,`compact`]},ngContentSelectors:MD,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&&(qg(),j(0,ND,8,5,`div`,0)),e&2){let e;M((e=t.text())?0:-1,e)}},styles:[`[_nghost-%COMP%] { +}`]})},xD=`pangular:panel-action-result`,SD=6e3,CD=0;function wD(e=window){return e.location.protocol===`chrome-extension:`&&e.parent!==e}function TD(e,t=window){let n=`pa-${Date.now().toString(36)}-${++CD}`;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!==xD||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`}),SD);t.addEventListener(`message`,a),t.parent.postMessage({...e,requestId:n},t.location.origin)})}var ED=class e{available=wD();reveal(e,t){return TD({type:`pangular:reveal-element`,pageId:e,id:t})}openSource(e,t,n){return TD({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=Rl({token:e,factory:e.ɵfac})};function DD(e){let t=e?.pages;return t&&typeof t==`object`?t:{}}function OD(e){let t=C(As),n=D({}),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(DD(e));o(a.value()),i=a.on(`updated`,o)}catch{r===e&&n.set({})}};return _c(()=>{let t=e();t&&t!==r&&Z(()=>void a(t))}),t.onDestroy(()=>i?.()),n.asReadonly()}function kD(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 AD=[`*`];function jD(e,t){if(e&1&&(z(0,`div`,1)(1,`p`,2),K(2),B(),z(3,`p`,3),K(4),Jg(5),z(6,`a`,4),K(7,`Supported versions`),B()()()),e&2){let e=W();G(`compact`,e.compact()),O(2),q(e.title()),O(2),J(` `,t,` `),O(2),Pg(`href`,e.docsUrl,Au)}}var MD=`https://pangular-inspector.dev/getting-started/installation/#supported-angular-versions`,ND=class e{page=$(null);capability=$.required();missing=$(!1,{transform:Mv});compact=$(!1,{transform:Mv});docsUrl=MD;text=X(()=>{let e=this.page();return!this.missing()&&!zT(e,this.capability())?null:BT(this.capability(),e?.version)});title=X(()=>{let e=this.page()?.version;return e?`Not available on Angular ${IT(e)}`:`Not available on this page`});static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-angular-unavailable`]],inputs:{page:[1,`page`],capability:[1,`capability`],missing:[1,`missing`],compact:[1,`compact`]},ngContentSelectors:AD,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&&(qg(),j(0,jD,8,5,`div`,0)),e&2){let e;M((e=t.text())?0:-1,e)}},styles:[`[_nghost-%COMP%] { display: block; } @@ -372,7 +372,7 @@ a[_ngcontent-%COMP%] { a[_ngcontent-%COMP%]:focus-visible { outline: 2px solid var(--%NS%accent); outline-offset: 2px; -}`]})};function ID(e){return e?.platform===`angular-native`}function LD(e){return ID(e)||e?.platform===`nativescript`}function RD(e,t){let n=Object.values(e??{}).filter(ID);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 zD=[`trigger`],BD=[`list`],VD=(e,t)=>t.value;function HD(e,t){if(e&1&&(z(0,`span`,4),K(1),B()),e&2){let e=W();O(),q(e.current().hint)}}function UD(e,t){if(e&1&&(z(0,`span`,15),K(1),B()),e&2){let e=W().$implicit;O(),q(e.hint)}}function WD(e,t){if(e&1){let e=V();z(0,`li`,11),U(`pointerenter`,function(){let t=w(e).$index;return T(W(2).active.set(t))})(`pointerdown`,function(e){return e.preventDefault()})(`click`,function(){let t=w(e).$index;return T(W(2).choose(t))}),E(),z(1,`svg`,12),Og(2,`path`,13),B(),bs(),z(3,`span`,14),K(4),B(),j(5,UD,2,1,`span`,15),B()}if(e&2){let e=t.$implicit,n=t.$index,r=W(2);G(`active`,n===r.active())(`selected`,e.value===r.value()),A(`id`,r.uid+`-opt-`+n)(`aria-selected`,e.value===r.value())(`aria-disabled`,e.disabled||null),O(4),q(e.label),O(),M(e.hint?5:-1)}}function GD(e,t){if(e&1&&(z(0,`li`,10),K(1),B()),e&2){let e=W(2);O(),q(e.emptyText())}}function KD(e,t){if(e&1&&(z(0,`ul`,8,1),ig(`list-in`),U(`pointerdown`,function(e){return e.preventDefault()}),N(2,WD,6,9,`li`,9,VD,!1,GD,2,1,`li`,10),B()),e&2){let e=W();G(`up`,e.dropUp()),A(`id`,e.uid+`-list`)(`aria-labelledby`,e.labelledBy()||e.uid+`-trigger`),O(2),P(e.options())}}var qD=0,JD=class e{options=$.required();value=Tv(null);placeholder=$(`Select…`);ariaLabel=$(``);labelledBy=$(``);describedBy=$(``);disabled=$(!1);emptyText=$(`Nothing to choose`);uid=`app-select-${++qD}`;open=D(!1);active=D(-1);dropUp=D(!1);current=X(()=>this.options().find(e=>e.value===this.value())??null);host=C(Vl);injector=C(Os);trigger=Dv.required(`trigger`);list=Dv(`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=k({type:e,selectors:[[`app-select`]],viewQuery:function(e,t){e&1&&Xg(t.trigger,zD,5)(t.list,BD,5),e&2&&Zg(2)},hostAttrs:[1,`app-select`],hostVars:2,hostBindings:function(e,t){e&1&&H(`pointerdown`,function(e){return t.onOutside(e)},ju),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&&(z(0,`button`,2,0),U(`click`,function(){return t.toggle()})(`keydown`,function(e){return t.onKey(e)})(`blur`,function(e){return t.onBlur(e)}),z(2,`span`,3),K(3),B(),j(4,HD,2,1,`span`,4),E(),z(5,`svg`,5),Og(6,`path`,6),B()(),j(7,KD,5,5,`ul`,7)),e&2&&(Pg(`disabled`,t.disabled()),A(`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),O(2),G(`placeholder`,!t.current()),O(),J(` `,t.current()?.label??t.placeholder(),` `),O(),M(t.current()?.hint?4:-1),O(3),M(t.open()?7:-1))},styles:[`[_nghost-%COMP%] { +}`]})};function PD(e){return e?.platform===`angular-native`}function FD(e){return PD(e)||e?.platform===`nativescript`}function ID(e,t){let n=Object.values(e??{}).filter(PD);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 LD=[`trigger`],RD=[`list`],zD=(e,t)=>t.value;function BD(e,t){if(e&1&&(z(0,`span`,4),K(1),B()),e&2){let e=W();O(),q(e.current().hint)}}function VD(e,t){if(e&1&&(z(0,`span`,15),K(1),B()),e&2){let e=W().$implicit;O(),q(e.hint)}}function HD(e,t){if(e&1){let e=V();z(0,`li`,11),U(`pointerenter`,function(){let t=w(e).$index;return T(W(2).active.set(t))})(`pointerdown`,function(e){return e.preventDefault()})(`click`,function(){let t=w(e).$index;return T(W(2).choose(t))}),E(),z(1,`svg`,12),Og(2,`path`,13),B(),bs(),z(3,`span`,14),K(4),B(),j(5,VD,2,1,`span`,15),B()}if(e&2){let e=t.$implicit,n=t.$index,r=W(2);G(`active`,n===r.active())(`selected`,e.value===r.value()),A(`id`,r.uid+`-opt-`+n)(`aria-selected`,e.value===r.value())(`aria-disabled`,e.disabled||null),O(4),q(e.label),O(),M(e.hint?5:-1)}}function UD(e,t){if(e&1&&(z(0,`li`,10),K(1),B()),e&2){let e=W(2);O(),q(e.emptyText())}}function WD(e,t){if(e&1&&(z(0,`ul`,8,1),ig(`list-in`),U(`pointerdown`,function(e){return e.preventDefault()}),N(2,HD,6,9,`li`,9,zD,!1,UD,2,1,`li`,10),B()),e&2){let e=W();G(`up`,e.dropUp()),A(`id`,e.uid+`-list`)(`aria-labelledby`,e.labelledBy()||e.uid+`-trigger`),O(2),P(e.options())}}var GD=0,KD=class e{options=$.required();value=Ev(null);placeholder=$(`Select…`);ariaLabel=$(``);labelledBy=$(``);describedBy=$(``);disabled=$(!1);emptyText=$(`Nothing to choose`);uid=`app-select-${++GD}`;open=D(!1);active=D(-1);dropUp=D(!1);current=X(()=>this.options().find(e=>e.value===this.value())??null);host=C(Vl);injector=C(Os);trigger=Ov.required(`trigger`);list=Ov(`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=k({type:e,selectors:[[`app-select`]],viewQuery:function(e,t){e&1&&Xg(t.trigger,LD,5)(t.list,RD,5),e&2&&Zg(2)},hostAttrs:[1,`app-select`],hostVars:2,hostBindings:function(e,t){e&1&&H(`pointerdown`,function(e){return t.onOutside(e)},Mu),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&&(z(0,`button`,2,0),U(`click`,function(){return t.toggle()})(`keydown`,function(e){return t.onKey(e)})(`blur`,function(e){return t.onBlur(e)}),z(2,`span`,3),K(3),B(),j(4,BD,2,1,`span`,4),E(),z(5,`svg`,5),Og(6,`path`,6),B()(),j(7,WD,5,5,`ul`,7)),e&2&&(Pg(`disabled`,t.disabled()),A(`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),O(2),G(`placeholder`,!t.current()),O(),J(` `,t.current()?.label??t.placeholder(),` `),O(),M(t.current()?.hint?4:-1),O(3),M(t.open()?7:-1))},styles:[`[_nghost-%COMP%] { position: relative; display: inline-flex; min-width: 0; @@ -567,7 +567,7 @@ li.selected[_ngcontent-%COMP%] .check[_ngcontent-%COMP%] { .chevron[_ngcontent-%COMP%] { transition: none; } -}`]})};function YD(e,t){let n=FT(t);if(IT(n))return{nodes:e,matches:0};let r=0,i=e=>e.flatMap(e=>{let t=LT(e,n);t&&r++;let a=i(e.children);return t||a.length?[{...e,children:a}]:[]});return{nodes:i(e),matches:r}}function XD(e){return e.flatMap(e=>e.kind===`directive`?XD(e.children):[{...e,children:XD(e.children)}])}function ZD(e){return(e.attributes?.length?e.attributes:e.directives??[e.name]).map(e=>`[${e}]`).join(` `)}var QD={hydrated:`Hydrated`,skipped:`Skipped`,mismatched:`Mismatch`,client:`Client`};function $D(e){return QD[e]}function eO(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 tO(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 nO(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 rO(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&&!iO(t.roots,i)?{pageId:r,selectedId:null,detailId:n,destroyed:i}:{pageId:r,selectedId:i,detailId:n,destroyed:null}}function iO(e,t){return e.some(e=>e.id===t||iO(e.children,t))}function aO(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 oO=(e,t)=>t.key,sO=(e,t)=>t.id;function cO(e,t){e&1&&(z(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 `),z(2,`code`),K(3,`provideClientHydration()`),B(),K(4,` and use a development build to see each component's status. `),B())}function lO(e,t){if(e&1&&(z(0,`li`)(1,`span`,9),K(2),B(),K(3),B()),e&2){let e=t.$implicit;b_(`count count-`+e.key),O(2),q(e.value),O(),J(` `,e.label,` `)}}function uO(e,t){if(e&1&&(z(0,`span`,15),K(1,`Expected `),z(2,`code`),K(3),B()()),e&2){let e=W().$implicit;O(3),q(e.expected)}}function dO(e,t){if(e&1&&(z(0,`span`,15),K(1,`Found `),z(2,`code`),K(3),B()()),e&2){let e=W().$implicit;O(3),q(e.actual)}}function fO(e,t){if(e&1){let e=V();z(0,`li`)(1,`button`,12),U(`click`,function(){let t=w(e).$implicit;return T(W(4).showNode.emit(t.id))})(`focus`,function(){let t=w(e).$implicit;return T(W(4).highlight.emit(t.id))})(`blur`,function(){return w(e),T(W(4).highlight.emit(null))})(`mouseenter`,function(){let t=w(e).$implicit;return T(W(4).highlight.emit(t.id))})(`mouseleave`,function(){return w(e),T(W(4).highlight.emit(null))}),z(2,`span`,13),K(3),B(),z(4,`span`,14),K(5),B(),j(6,uO,4,1,`span`,15),j(7,dO,4,1,`span`,15),B()()}if(e&2){let e=t.$implicit;O(3),q(e.name),O(2),J(`<`,e.tag,`>`),O(),M(e.expected?6:-1),O(),M(e.actual?7:-1)}}function pO(e,t){if(e&1&&(z(0,`h3`,10),K(1,`Mismatches`),B(),z(2,`ul`,11),N(3,fO,8,4,`li`,null,sO),B()),e&2){let e=W(2);O(3),P(e.mismatches)}}function mO(e,t){if(e&1){let e=V();z(0,`div`,3)(1,`ul`,4),N(2,lO,4,4,`li`,5,oO),B(),z(4,`button`,6),U(`click`,function(){return w(e),T(W(2).toggleOverlay())}),E(),z(5,`svg`,7),Og(6,`rect`,8),B(),K(7,` Outline on page `),B()(),j(8,pO,5,0)}if(e&2){let e=W(),t=W();O(2),P(t.counts()),O(2),A(`aria-pressed`,t.overlayOn()),O(4),M(e.mismatches.length?8:-1)}}function hO(e,t){e&1&&j(0,cO,5,0,`p`,2)(1,mO,9,2),e&2&&M(+!!t.hydrated)}function gO(e,t){e&1&&(z(0,`p`,2),K(1,` This page was not rendered on the server, so there is nothing to hydrate. With server-side rendering and `),z(2,`code`),K(3,`provideClientHydration()`),B(),K(4,`, each component shows whether it was hydrated, skipped or mismatched. `),B())}var _O=class e{report=$(void 0);overlay=bv();showNode=bv();highlight=bv();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=k({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&&(z(0,`section`,0)(1,`h2`,1),K(2,`Hydration`),B(),j(3,hO,2,1)(4,gO,5,0,`p`,2),B()),e&2){let e;O(3),M((e=t.report())?3:4,e)}},styles:[`.hydration[_ngcontent-%COMP%] { +}`]})};function qD(e,t){let n=MT(t);if(NT(n))return{nodes:e,matches:0};let r=0,i=e=>e.flatMap(e=>{let t=PT(e,n);t&&r++;let a=i(e.children);return t||a.length?[{...e,children:a}]:[]});return{nodes:i(e),matches:r}}function JD(e){return e.flatMap(e=>e.kind===`directive`?JD(e.children):[{...e,children:JD(e.children)}])}function YD(e){return(e.attributes?.length?e.attributes:e.directives??[e.name]).map(e=>`[${e}]`).join(` `)}var XD={hydrated:`Hydrated`,skipped:`Skipped`,mismatched:`Mismatch`,client:`Client`};function ZD(e){return XD[e]}function QD(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 $D(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 eO(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 tO(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&&!nO(t.roots,i)?{pageId:r,selectedId:null,detailId:n,destroyed:i}:{pageId:r,selectedId:i,detailId:n,destroyed:null}}function nO(e,t){return e.some(e=>e.id===t||nO(e.children,t))}function rO(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 iO=(e,t)=>t.key,aO=(e,t)=>t.id;function oO(e,t){e&1&&(z(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 `),z(2,`code`),K(3,`provideClientHydration()`),B(),K(4,` and use a development build to see each component's status. `),B())}function sO(e,t){if(e&1&&(z(0,`li`)(1,`span`,9),K(2),B(),K(3),B()),e&2){let e=t.$implicit;b_(`count count-`+e.key),O(2),q(e.value),O(),J(` `,e.label,` `)}}function cO(e,t){if(e&1&&(z(0,`span`,15),K(1,`Expected `),z(2,`code`),K(3),B()()),e&2){let e=W().$implicit;O(3),q(e.expected)}}function lO(e,t){if(e&1&&(z(0,`span`,15),K(1,`Found `),z(2,`code`),K(3),B()()),e&2){let e=W().$implicit;O(3),q(e.actual)}}function uO(e,t){if(e&1){let e=V();z(0,`li`)(1,`button`,12),U(`click`,function(){let t=w(e).$implicit;return T(W(4).showNode.emit(t.id))})(`focus`,function(){let t=w(e).$implicit;return T(W(4).highlight.emit(t.id))})(`blur`,function(){return w(e),T(W(4).highlight.emit(null))})(`mouseenter`,function(){let t=w(e).$implicit;return T(W(4).highlight.emit(t.id))})(`mouseleave`,function(){return w(e),T(W(4).highlight.emit(null))}),z(2,`span`,13),K(3),B(),z(4,`span`,14),K(5),B(),j(6,cO,4,1,`span`,15),j(7,lO,4,1,`span`,15),B()()}if(e&2){let e=t.$implicit;O(3),q(e.name),O(2),J(`<`,e.tag,`>`),O(),M(e.expected?6:-1),O(),M(e.actual?7:-1)}}function dO(e,t){if(e&1&&(z(0,`h3`,10),K(1,`Mismatches`),B(),z(2,`ul`,11),N(3,uO,8,4,`li`,null,aO),B()),e&2){let e=W(2);O(3),P(e.mismatches)}}function fO(e,t){if(e&1){let e=V();z(0,`div`,3)(1,`ul`,4),N(2,sO,4,4,`li`,5,iO),B(),z(4,`button`,6),U(`click`,function(){return w(e),T(W(2).toggleOverlay())}),E(),z(5,`svg`,7),Og(6,`rect`,8),B(),K(7,` Outline on page `),B()(),j(8,dO,5,0)}if(e&2){let e=W(),t=W();O(2),P(t.counts()),O(2),A(`aria-pressed`,t.overlayOn()),O(4),M(e.mismatches.length?8:-1)}}function pO(e,t){e&1&&j(0,oO,5,0,`p`,2)(1,fO,9,2),e&2&&M(+!!t.hydrated)}function mO(e,t){e&1&&(z(0,`p`,2),K(1,` This page was not rendered on the server, so there is nothing to hydrate. With server-side rendering and `),z(2,`code`),K(3,`provideClientHydration()`),B(),K(4,`, each component shows whether it was hydrated, skipped or mismatched. `),B())}var hO=class e{report=$(void 0);overlay=xv();showNode=xv();highlight=xv();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=k({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&&(z(0,`section`,0)(1,`h2`,1),K(2,`Hydration`),B(),j(3,pO,2,1)(4,mO,5,0,`p`,2),B()),e&2){let e;O(3),M((e=t.report())?3:4,e)}},styles:[`.hydration[_ngcontent-%COMP%] { margin-top: 16px; } @@ -738,7 +738,7 @@ svg[_ngcontent-%COMP%] { button[_ngcontent-%COMP%] { transition: none; } -}`]})};function vO(e){return new Date(e).toLocaleTimeString()}var yO=/[ \t\n\r]/;function bO(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;e0?0:-1)},styles:[`[_nghost-%COMP%] { +}`]})};function gO(e){return new Date(e).toLocaleTimeString()}var _O=/[ \t\n\r]/;function vO(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;e0?0:-1)},styles:[`[_nghost-%COMP%] { display: block; } @@ -765,7 +765,7 @@ a[_ngcontent-%COMP%] { a[_ngcontent-%COMP%]:focus-visible { outline: 2px solid var(--%NS%accent); outline-offset: 2px; -}`]})},TO=864e13,EO=200,DO=300,OO=100,kO=10,AO=100,jO=2e3,MO=2e3,NO=4e3,PO=1e3,FO=100,IO=3,LO=50,RO={component:`c`,hook:`h`,afterRender:`r`,output:`o`},zO=Object.values(RO),BO=e=>!!e&&typeof e==`object`&&!Array.isArray(e),VO=e=>typeof e==`number`&&Number.isFinite(e)&&e>=0?e:0,HO=(e,t)=>typeof e==`string`?e.slice(0,t):``,UO=e=>VO(e)>0?VO(e):void 0,WO=(e,t)=>Array.isArray(e)?e.slice(0,t):[];function GO(e){if(!BO(e))return null;let t=HO(e.name,EO);return t?{name:t,checks:VO(e.checks),ms:VO(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>PO||typeof o!=`string`||!zO.includes(o)?null:[n,r,VO(i),a,o]}function qO(e,t){if(!BO(e)||typeof e.id!=`number`)return null;let n=WO(e.components,kO).map(GO).filter(e=>!!e),r=HO(e.trigger,DO),i=WO(e.spans,40).map(e=>KO(e,t)).filter(e=>!!e),a=Array.isArray(e.spans)?e.spans.length-40:0,o=Math.floor(VO(e.droppedSpans))+Math.max(0,a),s={t:typeof e.t==`number`?VO(e.t):void 0,hookMs:UO(e.hookMs),afterRenderMs:UO(e.afterRenderMs),outputMs:UO(e.outputMs)},c=ZO(e.cause),l=UO(e.refreshed),u=UO(e.unchanged);return{id:VO(e.id),at:VO(e.at),ms:VO(e.ms),passes:VO(e.passes),...r?{trigger:r}:{},checks:VO(e.checks),components:n,...Object.fromEntries(Object.entries(s).filter(([,e])=>e!==void 0)),...i.length?{spans:i}:{},...o?{droppedSpans:o}:{},...c?{cause:c}:{},...l?{refreshed:l}:{},...u?{unchanged:u}:{}}}var JO=[`event`,`http`,`timer`,`signal`,`effect`,`markForCheck`,`input`,`view`,`tick`,`zone`,`unknown`],YO={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`},XO=e=>typeof e==`string`&&JO.includes(e);function ZO(e){if(!BO(e)||!XO(e.kind))return;let t=[`component`,`listener`,`event`,`target`,`signal`,`task`],n={kind:e.kind};XO(e.via)&&(n.via=e.via);for(let r of t){let t=HO(e[r],EO);t&&(n[r]=t)}e.zone===!0&&(n.zone=!0);let r=WO(e.stack,IO).map(e=>HO(e,DO)).filter(Boolean);r.length&&(n.stack=r);let i=Math.floor(VO(e.more));return i&&(n.more=i),n}function QO(e){if(!BO(e))return null;let t=HO(e.name,EO);if(!t)return null;let n=e.strategy;return{name:t,refreshed:Math.floor(VO(e.refreshed)),unchanged:Math.floor(VO(e.unchanged)),...n===`OnPush`||n===`Eager`?{strategy:n}:{}}}function $O(e){if(!BO(e))return null;let t=HO(e.name,EO),n=HO(e.input,EO);if(!t||!n)return null;let r=HO(e.parent,EO);return{name:t,input:n,...r?{parent:r}:{},inPlace:Math.floor(VO(e.inPlace)),sameContents:Math.floor(VO(e.sameContents))}}function ek(e){if(!BO(e))return null;let t=HO(e.name,EO);if(!t)return null;let n=WO(e.tasks,3).map(e=>HO(e,EO)).filter(Boolean);return{name:t,ticks:Math.floor(VO(e.ticks)),...n.length?{tasks:n}:{}}}function tk(e){if(!BO(e))return;let t={};if(BO(e.causes))for(let n of JO){let r=Math.floor(VO(e.causes[n]));r&&(t[n]=r)}let n=WO(e.components,AO).map(QO).filter(e=>!!e),r=WO(e.inputs,LO).map($O).filter(e=>!!e),i=WO(e.zone,LO).map(ek).filter(e=>!!e),a=Math.floor(VO(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 nk(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(`${YO[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 ${YO[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 rk(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 ik(e){let t=GO(e);return!t||!BO(e)?null:{...t,maxMs:VO(e.maxMs),cycles:VO(e.cycles)}}function ak(e){if(!BO(e))return null;let t=HO(e.name,EO),n=HO(e.hook,OO);if(!t||!n)return null;let{calls:r,ms:i,maxMs:a}=e;return{name:t,hook:n,calls:VO(r),ms:VO(i),maxMs:VO(a)}}function ok(e){if(!BO(e))return null;let t=HO(e.name,EO);if(!t)return null;let n=HO(e.listener,EO);return{name:t,...n?{listener:n}:{},calls:VO(e.calls),ms:VO(e.ms),maxMs:VO(e.maxMs)}}function sk(e){if(BO(e)&&VO(e.runs))return{runs:VO(e.runs),ms:VO(e.ms),maxMs:VO(e.maxMs)}}function ck(e,t){if(!BO(e))return null;let n=WO(e.spanNames,NO).map(e=>HO(e,DO)),r=Array.isArray(e.cycles)?e.cycles.slice(-Math.min(t,MO)).map(e=>qO(e,n.length)).filter(e=>!!e):[],i={},a=0;if(BO(e.hosts)){let t=Object.entries(e.hosts);a=Math.max(0,t.length-jO);for(let[e,n]of t.slice(0,jO))e.length<50&&VO(n)&&(i[e]=VO(n))}let o=Array.isArray(e.components)?e.components:[],s=Math.floor(VO(e.droppedClasses))+Math.max(0,o.length-AO),c=Math.floor(VO(e.droppedHosts))+a,l=WO(e.hooks,FO).map(ak).filter(e=>!!e),u=WO(e.outputs,FO).map(ok).filter(e=>!!e),d=Math.max(0,WO(e.hooks,1/0).length-FO)+Math.max(0,WO(e.outputs,1/0).length-FO),f=Math.floor(VO(e.droppedTimings))+d,p=sk(e.afterRender),m=r.some(e=>e.spans?.length),h=tk(e.diagnosis);return{recording:e.recording===!0,startedAt:typeof e.startedAt==`number`&&e.startedAt<=TO?VO(e.startedAt):null,dropped:VO(e.dropped),cycles:r,components:o.slice(0,AO).map(ik).filter(e=>!!e),...s?{droppedClasses:s}:{},hosts:i,...c?{droppedHosts:c}:{},...l.length?{hooks:l}:{},...u.length?{outputs:u}:{},...f?{droppedTimings:f}:{},...p?{afterRender:p}:{},...m?{spanNames:n}:{},...h?{diagnosis:h}:{}}}var lk=`pangular-inspector/change-detection`;function uk(e,t,n=Date.now()){return{format:lk,version:1,exportedAt:n,pageId:t,recording:{...ck(e,MO)??e,recording:!1,hosts:{}}}}function dk(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(!BO(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=BO(n.recording)?n.recording:n;if(!Array.isArray(r.cycles))return{ok:!1,error:`The file has no change detection cycles.`};let i=ck(r,t);if(!i)return{ok:!1,error:`The file is not a recording.`};let a=HO(n.pageId??r.pageId,49)||`imported`,o=UO(n.exportedAt);return{ok:!0,pageId:a,...o?{exportedAt:o}:{},recording:{...i,recording:!1}}}var fk=1,pk=1,mk=2,hk={c:`component`,h:`lifecycle-hook`,r:`after-render`,o:`output`},gk=e=>Math.round(e*1e6)/1e3;function _k(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:fk,tid:pk,ts:gk(e),dur:gk(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:nk(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===RO.output){let n=e+i;a.push({name:l,cat:hk[d],ph:`X`,pid:fk,tid:mk,ts:gk(n),dur:gk(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=gk((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:fk,tid:e,args:{name:n}});return{traceEvents:[l(0,`process_name`,`Angular change detection (page ${t})`),l(pk,`thread_name`,`Change detection`),l(mk,`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<=TO?{startedAt:new Date(e.startedAt).toISOString()}:{}}}}var vk=16.6;function yk(e){return e.ms>vk}function bk(e){return`${e<10?e.toFixed(2):Math.round(e)} ms`}function xk(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 Sk(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 Ck(e){let t=e.reduce((e,t)=>Math.max(e,t.ms),0);return Math.max(t,vk*1.25)}function wk(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 Tk={c:`component`,h:`hook`,r:`afterRender`,o:`output`};function Ek(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 Dk(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],h=f>0&&m!==void 0&&ot.kind,kk=(e,t)=>t.name,Ak=(e,t)=>t.name+`.`+t.input;function jk(e,t){e&1&&(z(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. `),B())}function Mk(e,t){if(e&1&&(z(0,`tr`)(1,`td`),K(2),B(),z(3,`td`,6),K(4),B()()),e&2){let e=t.$implicit;O(2),q(e.label),O(2),q(e.count)}}function Nk(e,t){if(e&1&&(z(0,`table`)(1,`thead`)(2,`tr`)(3,`th`,4),K(4,`Trigger`),B(),z(5,`th`,5),K(6,`Cycles`),B()()(),z(7,`tbody`),N(8,Mk,5,2,`tr`,null,Ok),B()()),e&2){let e=W(2);O(8),P(e.causes())}}function Pk(e,t){e&1&&(z(0,`p`,3),K(1,`No cycle has a cause yet.`),B())}function Fk(e,t){if(e&1&&(z(0,`tr`)(1,`td`,7),K(2),B(),z(3,`td`,6),K(4),B(),z(5,`td`,7),K(6),B()()),e&2){let e=t.$implicit;O(2),q(e.name),O(2),q(e.ticks),O(2),q(e.tasks?.join(`, `))}}function Ik(e,t){if(e&1&&(z(0,`table`)(1,`thead`)(2,`tr`)(3,`th`,4),K(4,`Component`),B(),z(5,`th`,5),K(6,`Zone-only ticks`),B(),z(7,`th`,4),K(8,`After`),B()()(),z(9,`tbody`),N(10,Fk,7,3,`tr`,null,kk),B()()),e&2){let e=W(3);O(10),P(e.zone())}}function Lk(e,t){if(e&1&&(z(0,`p`,3),K(1),B()),e&2){let e=W(3);O(),q(e.zoneNote())}}function Rk(e,t){if(e&1&&(z(0,`div`)(1,`h4`),K(2,`Depends on zone.js`),B(),j(3,Ik,12,0,`table`)(4,Lk,2,1,`p`,3),B()),e&2){let e=W(),t=W();O(3),M(t.zone().length?3:e.triggers?4:-1)}}function zk(e,t){e&1&&(z(0,`p`,3),K(1,`The page can't watch DOM updates, so wasted checks are not counted.`),B())}function Bk(e,t){if(e&1&&(z(0,`tr`)(1,`td`,7),K(2),B(),z(3,`td`,6),K(4),B(),z(5,`td`,6),K(6),B(),z(7,`td`),K(8),B()()),e&2){let e=t.$implicit,n=W(3);O(2),q(e.name),O(2),q(e.refreshed),O(2),Y(``,e.unchanged,` (`,n.share(e.unchanged,e.refreshed),`)`),O(2),q(e.strategy??`Unknown`)}}function Vk(e,t){if(e&1&&(z(0,`table`)(1,`thead`)(2,`tr`)(3,`th`,4),K(4,`Component`),B(),z(5,`th`,5),K(6,`Refreshed`),B(),z(7,`th`,5),K(8,`Changed nothing`),B(),z(9,`th`,4),K(10,`Strategy`),B()()(),z(11,`tbody`),N(12,Bk,9,5,`tr`,null,kk),B()()),e&2){let e=W(2);O(12),P(e.wasted())}}function Hk(e,t){e&1&&(z(0,`p`,3),K(1,`Every refreshed check changed something.`),B())}function Uk(e,t){if(e&1&&(z(0,`tr`)(1,`td`,7),K(2),B(),z(3,`td`,7),K(4),B(),z(5,`td`,6),K(6),B(),z(7,`td`,6),K(8),B()()),e&2){let e=t.$implicit;O(2),Y(``,e.name,`.`,e.input),O(2),q(e.parent??`Unknown`),O(2),q(e.inPlace),O(2),q(e.sameContents)}}function Wk(e,t){if(e&1&&(z(0,`h4`),K(1,`Inputs that break OnPush`),B(),z(2,`table`)(3,`thead`)(4,`tr`)(5,`th`,4),K(6,`Input`),B(),z(7,`th`,4),K(8,`Set by`),B(),z(9,`th`,5),K(10,`Changed in place`),B(),z(11,`th`,5),K(12,`Same contents, new reference`),B()()(),z(13,`tbody`),N(14,Uk,9,5,`tr`,null,Ak),B()()),e&2){let e=W(2);O(14),P(e.inputs())}}function Gk(e,t){if(e&1&&(z(0,`li`),K(1),B()),e&2){let e=t.$implicit;O(),q(e.text)}}function Kk(e,t){if(e&1&&(z(0,`h4`),K(1,`Hints`),B(),z(2,`ul`,8),N(3,Gk,2,1,`li`,null,gg),B()),e&2){let e=W(2);O(3),P(e.hints())}}function qk(e,t){if(e&1&&(z(0,`section`,0)(1,`h3`,1),K(2,`Why it ran and what it wasted`),B(),z(3,`div`,2)(4,`div`)(5,`h4`),K(6,`What started the cycles`),B(),j(7,jk,2,0,`p`,3)(8,Nk,10,0,`table`)(9,Pk,2,0,`p`,3),B(),j(10,Rk,5,1,`div`),B(),z(11,`h4`),K(12,`Wasted checks`),B(),j(13,zk,2,0,`p`,3)(14,Vk,14,0,`table`)(15,Hk,2,0,`p`,3),j(16,Wk,16,0),j(17,Kk,5,0),B()),e&2){let e=t,n=W();O(7),M(e.triggers?n.causes().length?8:9:7),O(3),M(n.hasZone()?10:-1),O(3),M(e.waste?n.wasted().length?14:15:13),O(3),M(n.inputs().length?16:-1),O(),M(n.hints().length?17:-1)}}var Jk=10,Yk=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:YO[t],count:e[t]}))});zone=X(()=>(this.diagnosis()?.zone??[]).slice(0,Jk));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,Jk));inputs=X(()=>(this.diagnosis()?.inputs??[]).slice(0,Jk));hints=X(()=>rk(this.diagnosis()??void 0).slice(0,Jk));share(e,t){return t?`${Math.round(e/t*100)}%`:`0%`}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({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&&j(0,qk,18,5,`section`,0),e&2){let e;M((e=t.diagnosis())?0:-1,e)}},styles:[`[_nghost-%COMP%] { +}`]})},CO=864e13,wO=200,TO=300,EO=100,DO=10,OO=100,kO=2e3,AO=2e3,jO=4e3,MO=1e3,NO=100,PO=3,FO=50,IO={component:`c`,hook:`h`,afterRender:`r`,output:`o`},LO=Object.values(IO),RO=e=>!!e&&typeof e==`object`&&!Array.isArray(e),zO=e=>typeof e==`number`&&Number.isFinite(e)&&e>=0?e:0,BO=(e,t)=>typeof e==`string`?e.slice(0,t):``,VO=e=>zO(e)>0?zO(e):void 0,HO=(e,t)=>Array.isArray(e)?e.slice(0,t):[];function UO(e){if(!RO(e))return null;let t=BO(e.name,wO);return t?{name:t,checks:zO(e.checks),ms:zO(e.ms)}:null}function WO(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>MO||typeof o!=`string`||!LO.includes(o)?null:[n,r,zO(i),a,o]}function GO(e,t){if(!RO(e)||typeof e.id!=`number`)return null;let n=HO(e.components,DO).map(UO).filter(e=>!!e),r=BO(e.trigger,TO),i=HO(e.spans,40).map(e=>WO(e,t)).filter(e=>!!e),a=Array.isArray(e.spans)?e.spans.length-40:0,o=Math.floor(zO(e.droppedSpans))+Math.max(0,a),s={t:typeof e.t==`number`?zO(e.t):void 0,hookMs:VO(e.hookMs),afterRenderMs:VO(e.afterRenderMs),outputMs:VO(e.outputMs)},c=YO(e.cause),l=VO(e.refreshed),u=VO(e.unchanged);return{id:zO(e.id),at:zO(e.at),ms:zO(e.ms),passes:zO(e.passes),...r?{trigger:r}:{},checks:zO(e.checks),components:n,...Object.fromEntries(Object.entries(s).filter(([,e])=>e!==void 0)),...i.length?{spans:i}:{},...o?{droppedSpans:o}:{},...c?{cause:c}:{},...l?{refreshed:l}:{},...u?{unchanged:u}:{}}}var KO=[`event`,`http`,`timer`,`signal`,`effect`,`markForCheck`,`input`,`view`,`tick`,`zone`,`unknown`],qO={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`},JO=e=>typeof e==`string`&&KO.includes(e);function YO(e){if(!RO(e)||!JO(e.kind))return;let t=[`component`,`listener`,`event`,`target`,`signal`,`task`],n={kind:e.kind};JO(e.via)&&(n.via=e.via);for(let r of t){let t=BO(e[r],wO);t&&(n[r]=t)}e.zone===!0&&(n.zone=!0);let r=HO(e.stack,PO).map(e=>BO(e,TO)).filter(Boolean);r.length&&(n.stack=r);let i=Math.floor(zO(e.more));return i&&(n.more=i),n}function XO(e){if(!RO(e))return null;let t=BO(e.name,wO);if(!t)return null;let n=e.strategy;return{name:t,refreshed:Math.floor(zO(e.refreshed)),unchanged:Math.floor(zO(e.unchanged)),...n===`OnPush`||n===`Eager`?{strategy:n}:{}}}function ZO(e){if(!RO(e))return null;let t=BO(e.name,wO),n=BO(e.input,wO);if(!t||!n)return null;let r=BO(e.parent,wO);return{name:t,input:n,...r?{parent:r}:{},inPlace:Math.floor(zO(e.inPlace)),sameContents:Math.floor(zO(e.sameContents))}}function QO(e){if(!RO(e))return null;let t=BO(e.name,wO);if(!t)return null;let n=HO(e.tasks,3).map(e=>BO(e,wO)).filter(Boolean);return{name:t,ticks:Math.floor(zO(e.ticks)),...n.length?{tasks:n}:{}}}function $O(e){if(!RO(e))return;let t={};if(RO(e.causes))for(let n of KO){let r=Math.floor(zO(e.causes[n]));r&&(t[n]=r)}let n=HO(e.components,OO).map(XO).filter(e=>!!e),r=HO(e.inputs,FO).map(ZO).filter(e=>!!e),i=HO(e.zone,FO).map(QO).filter(e=>!!e),a=Math.floor(zO(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 ek(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(`${qO[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 ${qO[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 tk(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 nk(e){let t=UO(e);return!t||!RO(e)?null:{...t,maxMs:zO(e.maxMs),cycles:zO(e.cycles)}}function rk(e){if(!RO(e))return null;let t=BO(e.name,wO),n=BO(e.hook,EO);if(!t||!n)return null;let{calls:r,ms:i,maxMs:a}=e;return{name:t,hook:n,calls:zO(r),ms:zO(i),maxMs:zO(a)}}function ik(e){if(!RO(e))return null;let t=BO(e.name,wO);if(!t)return null;let n=BO(e.listener,wO);return{name:t,...n?{listener:n}:{},calls:zO(e.calls),ms:zO(e.ms),maxMs:zO(e.maxMs)}}function ak(e){if(RO(e)&&zO(e.runs))return{runs:zO(e.runs),ms:zO(e.ms),maxMs:zO(e.maxMs)}}function ok(e,t){if(!RO(e))return null;let n=HO(e.spanNames,jO).map(e=>BO(e,TO)),r=Array.isArray(e.cycles)?e.cycles.slice(-Math.min(t,AO)).map(e=>GO(e,n.length)).filter(e=>!!e):[],i={},a=0;if(RO(e.hosts)){let t=Object.entries(e.hosts);a=Math.max(0,t.length-kO);for(let[e,n]of t.slice(0,kO))e.length<50&&zO(n)&&(i[e]=zO(n))}let o=Array.isArray(e.components)?e.components:[],s=Math.floor(zO(e.droppedClasses))+Math.max(0,o.length-OO),c=Math.floor(zO(e.droppedHosts))+a,l=HO(e.hooks,NO).map(rk).filter(e=>!!e),u=HO(e.outputs,NO).map(ik).filter(e=>!!e),d=Math.max(0,HO(e.hooks,1/0).length-NO)+Math.max(0,HO(e.outputs,1/0).length-NO),f=Math.floor(zO(e.droppedTimings))+d,p=ak(e.afterRender),m=r.some(e=>e.spans?.length),h=$O(e.diagnosis);return{recording:e.recording===!0,startedAt:typeof e.startedAt==`number`&&e.startedAt<=CO?zO(e.startedAt):null,dropped:zO(e.dropped),cycles:r,components:o.slice(0,OO).map(nk).filter(e=>!!e),...s?{droppedClasses:s}:{},hosts:i,...c?{droppedHosts:c}:{},...l.length?{hooks:l}:{},...u.length?{outputs:u}:{},...f?{droppedTimings:f}:{},...p?{afterRender:p}:{},...m?{spanNames:n}:{},...h?{diagnosis:h}:{}}}var sk=`pangular-inspector/change-detection`;function ck(e,t,n=Date.now()){return{format:sk,version:1,exportedAt:n,pageId:t,recording:{...ok(e,AO)??e,recording:!1,hosts:{}}}}function lk(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(!RO(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=RO(n.recording)?n.recording:n;if(!Array.isArray(r.cycles))return{ok:!1,error:`The file has no change detection cycles.`};let i=ok(r,t);if(!i)return{ok:!1,error:`The file is not a recording.`};let a=BO(n.pageId??r.pageId,49)||`imported`,o=VO(n.exportedAt);return{ok:!0,pageId:a,...o?{exportedAt:o}:{},recording:{...i,recording:!1}}}var uk=1,dk=1,fk=2,pk={c:`component`,h:`lifecycle-hook`,r:`after-render`,o:`output`},mk=e=>Math.round(e*1e6)/1e3;function hk(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:uk,tid:dk,ts:mk(e),dur:mk(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:ek(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===IO.output){let n=e+i;a.push({name:l,cat:pk[d],ph:`X`,pid:uk,tid:fk,ts:mk(n),dur:mk(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=mk((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:uk,tid:e,args:{name:n}});return{traceEvents:[l(0,`process_name`,`Angular change detection (page ${t})`),l(dk,`thread_name`,`Change detection`),l(fk,`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()}:{}}}}var gk=16.6;function _k(e){return e.ms>gk}function vk(e){return`${e<10?e.toFixed(2):Math.round(e)} ms`}function yk(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 bk(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 xk(e){let t=e.reduce((e,t)=>Math.max(e,t.ms),0);return Math.max(t,gk*1.25)}function Sk(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 Ck={c:`component`,h:`hook`,r:`afterRender`,o:`output`};function wk(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 Tk(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],h=f>0&&m!==void 0&&ot.kind,Dk=(e,t)=>t.name,Ok=(e,t)=>t.name+`.`+t.input;function kk(e,t){e&1&&(z(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. `),B())}function Ak(e,t){if(e&1&&(z(0,`tr`)(1,`td`),K(2),B(),z(3,`td`,6),K(4),B()()),e&2){let e=t.$implicit;O(2),q(e.label),O(2),q(e.count)}}function jk(e,t){if(e&1&&(z(0,`table`)(1,`thead`)(2,`tr`)(3,`th`,4),K(4,`Trigger`),B(),z(5,`th`,5),K(6,`Cycles`),B()()(),z(7,`tbody`),N(8,Ak,5,2,`tr`,null,Ek),B()()),e&2){let e=W(2);O(8),P(e.causes())}}function Mk(e,t){e&1&&(z(0,`p`,3),K(1,`No cycle has a cause yet.`),B())}function Nk(e,t){if(e&1&&(z(0,`tr`)(1,`td`,7),K(2),B(),z(3,`td`,6),K(4),B(),z(5,`td`,7),K(6),B()()),e&2){let e=t.$implicit;O(2),q(e.name),O(2),q(e.ticks),O(2),q(e.tasks?.join(`, `))}}function Pk(e,t){if(e&1&&(z(0,`table`)(1,`thead`)(2,`tr`)(3,`th`,4),K(4,`Component`),B(),z(5,`th`,5),K(6,`Zone-only ticks`),B(),z(7,`th`,4),K(8,`After`),B()()(),z(9,`tbody`),N(10,Nk,7,3,`tr`,null,Dk),B()()),e&2){let e=W(3);O(10),P(e.zone())}}function Fk(e,t){if(e&1&&(z(0,`p`,3),K(1),B()),e&2){let e=W(3);O(),q(e.zoneNote())}}function Ik(e,t){if(e&1&&(z(0,`div`)(1,`h4`),K(2,`Depends on zone.js`),B(),j(3,Pk,12,0,`table`)(4,Fk,2,1,`p`,3),B()),e&2){let e=W(),t=W();O(3),M(t.zone().length?3:e.triggers?4:-1)}}function Lk(e,t){e&1&&(z(0,`p`,3),K(1,`The page can't watch DOM updates, so wasted checks are not counted.`),B())}function Rk(e,t){if(e&1&&(z(0,`tr`)(1,`td`,7),K(2),B(),z(3,`td`,6),K(4),B(),z(5,`td`,6),K(6),B(),z(7,`td`),K(8),B()()),e&2){let e=t.$implicit,n=W(3);O(2),q(e.name),O(2),q(e.refreshed),O(2),Y(``,e.unchanged,` (`,n.share(e.unchanged,e.refreshed),`)`),O(2),q(e.strategy??`Unknown`)}}function zk(e,t){if(e&1&&(z(0,`table`)(1,`thead`)(2,`tr`)(3,`th`,4),K(4,`Component`),B(),z(5,`th`,5),K(6,`Refreshed`),B(),z(7,`th`,5),K(8,`Changed nothing`),B(),z(9,`th`,4),K(10,`Strategy`),B()()(),z(11,`tbody`),N(12,Rk,9,5,`tr`,null,Dk),B()()),e&2){let e=W(2);O(12),P(e.wasted())}}function Bk(e,t){e&1&&(z(0,`p`,3),K(1,`Every refreshed check changed something.`),B())}function Vk(e,t){if(e&1&&(z(0,`tr`)(1,`td`,7),K(2),B(),z(3,`td`,7),K(4),B(),z(5,`td`,6),K(6),B(),z(7,`td`,6),K(8),B()()),e&2){let e=t.$implicit;O(2),Y(``,e.name,`.`,e.input),O(2),q(e.parent??`Unknown`),O(2),q(e.inPlace),O(2),q(e.sameContents)}}function Hk(e,t){if(e&1&&(z(0,`h4`),K(1,`Inputs that break OnPush`),B(),z(2,`table`)(3,`thead`)(4,`tr`)(5,`th`,4),K(6,`Input`),B(),z(7,`th`,4),K(8,`Set by`),B(),z(9,`th`,5),K(10,`Changed in place`),B(),z(11,`th`,5),K(12,`Same contents, new reference`),B()()(),z(13,`tbody`),N(14,Vk,9,5,`tr`,null,Ok),B()()),e&2){let e=W(2);O(14),P(e.inputs())}}function Uk(e,t){if(e&1&&(z(0,`li`),K(1),B()),e&2){let e=t.$implicit;O(),q(e.text)}}function Wk(e,t){if(e&1&&(z(0,`h4`),K(1,`Hints`),B(),z(2,`ul`,8),N(3,Uk,2,1,`li`,null,gg),B()),e&2){let e=W(2);O(3),P(e.hints())}}function Gk(e,t){if(e&1&&(z(0,`section`,0)(1,`h3`,1),K(2,`Why it ran and what it wasted`),B(),z(3,`div`,2)(4,`div`)(5,`h4`),K(6,`What started the cycles`),B(),j(7,kk,2,0,`p`,3)(8,jk,10,0,`table`)(9,Mk,2,0,`p`,3),B(),j(10,Ik,5,1,`div`),B(),z(11,`h4`),K(12,`Wasted checks`),B(),j(13,Lk,2,0,`p`,3)(14,zk,14,0,`table`)(15,Bk,2,0,`p`,3),j(16,Hk,16,0),j(17,Wk,5,0),B()),e&2){let e=t,n=W();O(7),M(e.triggers?n.causes().length?8:9:7),O(3),M(n.hasZone()?10:-1),O(3),M(e.waste?n.wasted().length?14:15:13),O(3),M(n.inputs().length?16:-1),O(),M(n.hints().length?17:-1)}}var Kk=10,qk=class e{page=$(null);diagnosis=X(()=>this.page()?.diagnosis??null);causes=X(()=>{let e=this.diagnosis()?.causes??{};return KO.filter(t=>e[t]).map(t=>({kind:t,label:qO[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(()=>tk(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=k({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&&j(0,Gk,18,5,`section`,0),e&2){let e;M((e=t.diagnosis())?0:-1,e)}},styles:[`[_nghost-%COMP%] { display: block; } @@ -844,7 +844,7 @@ td.mono[_ngcontent-%COMP%] { .hints[_ngcontent-%COMP%] li[_ngcontent-%COMP%] + li[_ngcontent-%COMP%] { margin-top: 4px; -}`]})},Xk=(e,t)=>t.cycle.id,Zk=(e,t)=>t.id;function Qk(e,t){if(e&1){let e=V();z(0,`button`,27),U(`click`,function(){return w(e),T(W().showAll())}),K(1,`Show all cycles`),B()}}function $k(e,t){if(e&1&&Og(0,`div`,28),e&2){let e=t;y_(`left`,e.left,`%`)(`width`,e.width,`%`)}}function eA(e,t){if(e&1&&(z(0,`div`,29),Og(1,`span`,30),B()),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),Pg(`id`,n.optionId(e.index)),A(`data-index`,e.index)(`aria-selected`,n.inRange(e.index))(`aria-label`,e.label),O(),y_(`height`,e.height,`%`)}}function tA(e,t){e&1&&(z(0,`span`,33),K(1,`over budget`),B())}function nA(e,t){if(e&1&&(z(0,`p`),K(1,` after `),z(2,`span`,35),K(3),B()()),e&2){let e=W();O(3),q(e.cycle.trigger)}}function rA(e,t){if(e&1&&(z(0,`p`,34)(1,`span`,36),K(2),B(),z(3,`span`),K(4),B()()),e&2){let e=t.$implicit,n=W(2);O(2),q(e.name),O(2),q(n.fmt(e.ms))}}function iA(e,t){if(e&1&&(z(0,`div`,31)(1,`p`,32)(2,`strong`),K(3),B(),z(4,`span`),K(5),B(),j(6,tA,2,0,`span`,33),B(),j(7,nA,4,1,`p`),z(8,`p`),K(9),B(),N(10,rA,5,2,`p`,34,gg),B()),e&2){let e=t,n=W();y_(`left`,e.left)(`right`,e.right),O(3),q(n.fmt(e.cycle.ms)),O(2),J(`cycle `,e.cycle.id),O(),M(e.over?6:-1),O(),M(e.cycle.trigger?7:-1),O(2),B_(` `,e.cycle.checks,` `,e.cycle.checks===1?`check`:`checks`,`, `,e.cycle.passes,` `,e.cycle.passes===1?`pass`:`passes`,` `),O(),P(e.top)}}function aA(e,t){if(e&1&&Og(0,`span`),e&2){let e=t.$implicit;G(`over`,e.over)}}function oA(e,t){if(e&1&&K(0),e&2){let e=t,n=W(2);Y(` `,e.name,` (`,n.fmt(e.ms),`) `)}}function sA(e,t){if(e&1&&(z(0,`tr`)(1,`td`,37),K(2),B(),z(3,`td`,37),K(4),B(),z(5,`td`),K(6),B(),z(7,`td`,37),K(8),B(),z(9,`td`,37),K(10),B(),z(11,`td`,35),K(12),B(),z(13,`td`,35),j(14,oA,1,2),B()()),e&2){let e,n=t.$implicit,r=W();O(2),q(n.id),O(2),q(r.fmt(n.ms)),O(2),q(r.isOver(n)?`Over`:`Within`),O(2),q(n.checks),O(2),q(n.passes),O(2),q(n.trigger??``),O(2),M((e=n.components[0])?14:-1,e)}}var cA=0,lA=80,uA=10,dA=class e{cycles=$([]);range=Tv(null);gapUntil=lA;budgetLabel=`${vk} ms budget`;uid=`cd-chart-${cA++}`;hintId=`${this.uid}-hint`;active=D(null);anchor=null;dragging=!1;hover=D(null);focused=D(!1);max=X(()=>Ck(this.cycles()));budgetAt=X(()=>vk/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:yk(t),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||axk(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=e.filter(yk).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`}`}. ${t} over the ${vk} 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:yk(t),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}`,bk(e.ms)];yk(e)&&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} ${bk(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+uA;break;case`PageUp`:r=n-uA;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=k({type:e,selectors:[[`app-cd-cycle-chart`]],hostBindings:function(e,t){e&1&&H(`pointerup`,function(){return t.endDrag()},Au)(`pointercancel`,function(){return t.endDrag()},Au)},inputs:{cycles:[1,`cycles`],range:[1,`range`]},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&&(z(0,`div`,0)(1,`label`)(2,`span`),K(3,`Start`),B(),z(4,`input`,1),U(`change`,function(e){return t.setEnd(`from`,e)}),B()(),z(5,`label`)(6,`span`),K(7,`End`),B(),z(8,`input`,1),U(`change`,function(e){return t.setEnd(`to`,e)}),B()(),j(9,Qk,2,0,`button`,2),z(10,`p`,3),K(11),B()(),z(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. `),B(),z(14,`div`,5)(15,`div`,6)(16,`span`,7),K(17),B(),z(18,`span`,8),K(19,`0 ms`),B()(),z(20,`div`,9),j(21,$k,1,4,`div`,10),z(22,`div`,11)(23,`span`),K(24),B()(),z(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)}),N(26,eA,2,12,`div`,13,Xk),B(),j(28,iA,12,12,`div`,14),B()(),z(29,`div`,15),N(30,aA,1,2,`span`,16,Xk),B(),z(32,`ul`,17)(33,`li`),Og(34,`span`,18),K(35,`Within budget`),B(),z(36,`li`),Og(37,`span`,19)(38,`span`,20),K(39,`Over budget `),B(),z(40,`li`),Og(41,`span`,21),K(42),B()(),z(43,`details`,22)(44,`summary`),K(45,`Show the cycles as a table`),B(),z(46,`div`,23)(47,`table`)(48,`caption`,24),K(49),B(),z(50,`thead`)(51,`tr`)(52,`th`,25),K(53,`Cycle`),B(),z(54,`th`,25),K(55,`Duration`),B(),z(56,`th`,26),K(57,`Budget`),B(),z(58,`th`,25),K(59,`Checks`),B(),z(60,`th`,25),K(61,`Passes`),B(),z(62,`th`,26),K(63,`After`),B(),z(64,`th`,26),K(65,`Slowest component`),B()()(),z(66,`tbody`),N(67,sA,15,7,`tr`,null,Zk),B()()()()),e&2){let e,n;O(4),Pg(`min`,t.firstId())(`max`,t.lastId())(`value`,t.startId()),O(4),Pg(`min`,t.firstId())(`max`,t.lastId())(`value`,t.endId()),O(),M(t.range()?9:-1),O(2),q(t.summary()),O(),Pg(`id`,t.hintId),O(2),G(`flush`,t.bars().length>t.gapUntil),O(3),q(t.fmt(t.max())),O(4),M((e=t.band())?21:-1,e),O(),y_(`bottom`,t.budgetAt(),`%`),O(2),q(t.budgetLabel),O(),A(`aria-label`,`Change detection cycles, `+t.summary())(`aria-describedby`,t.hintId)(`aria-activedescendant`,t.activeOptionId()),O(),P(t.bars()),O(2),M((n=t.tip())?28:-1,n),O(),G(`flush`,t.bars().length>t.gapUntil),O(),P(t.bars()),O(12),q(t.budgetLabel),O(4),A(`aria-label`,t.tableLabel()),O(3),J(` `,t.tableLabel(),` `),O(18),P(t.selected())}},styles:[`[_nghost-%COMP%] { +}`]})},Jk=(e,t)=>t.cycle.id,Yk=(e,t)=>t.id;function Xk(e,t){if(e&1){let e=V();z(0,`button`,27),U(`click`,function(){return w(e),T(W().showAll())}),K(1,`Show all cycles`),B()}}function Zk(e,t){if(e&1&&Og(0,`div`,28),e&2){let e=t;y_(`left`,e.left,`%`)(`width`,e.width,`%`)}}function Qk(e,t){if(e&1&&(z(0,`div`,29),Og(1,`span`,30),B()),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),Pg(`id`,n.optionId(e.index)),A(`data-index`,e.index)(`aria-selected`,n.inRange(e.index))(`aria-label`,e.label),O(),y_(`height`,e.height,`%`)}}function $k(e,t){e&1&&(z(0,`span`,33),K(1,`over budget`),B())}function eA(e,t){if(e&1&&(z(0,`p`),K(1,` after `),z(2,`span`,35),K(3),B()()),e&2){let e=W();O(3),q(e.cycle.trigger)}}function tA(e,t){if(e&1&&(z(0,`p`,34)(1,`span`,36),K(2),B(),z(3,`span`),K(4),B()()),e&2){let e=t.$implicit,n=W(2);O(2),q(e.name),O(2),q(n.fmt(e.ms))}}function nA(e,t){if(e&1&&(z(0,`div`,31)(1,`p`,32)(2,`strong`),K(3),B(),z(4,`span`),K(5),B(),j(6,$k,2,0,`span`,33),B(),j(7,eA,4,1,`p`),z(8,`p`),K(9),B(),N(10,tA,5,2,`p`,34,gg),B()),e&2){let e=t,n=W();y_(`left`,e.left)(`right`,e.right),O(3),q(n.fmt(e.cycle.ms)),O(2),J(`cycle `,e.cycle.id),O(),M(e.over?6:-1),O(),M(e.cycle.trigger?7:-1),O(2),V_(` `,e.cycle.checks,` `,e.cycle.checks===1?`check`:`checks`,`, `,e.cycle.passes,` `,e.cycle.passes===1?`pass`:`passes`,` `),O(),P(e.top)}}function rA(e,t){if(e&1&&Og(0,`span`),e&2){let e=t.$implicit;G(`over`,e.over)}}function iA(e,t){if(e&1&&K(0),e&2){let e=t,n=W(2);Y(` `,e.name,` (`,n.fmt(e.ms),`) `)}}function aA(e,t){if(e&1&&(z(0,`tr`)(1,`td`,37),K(2),B(),z(3,`td`,37),K(4),B(),z(5,`td`),K(6),B(),z(7,`td`,37),K(8),B(),z(9,`td`,37),K(10),B(),z(11,`td`,35),K(12),B(),z(13,`td`,35),j(14,iA,1,2),B()()),e&2){let e,n=t.$implicit,r=W();O(2),q(n.id),O(2),q(r.fmt(n.ms)),O(2),q(r.isOver(n)?`Over`:`Within`),O(2),q(n.checks),O(2),q(n.passes),O(2),q(n.trigger??``),O(2),M((e=n.components[0])?14:-1,e)}}var oA=0,sA=80,cA=10,lA=class e{cycles=$([]);range=Ev(null);gapUntil=sA;budgetLabel=`${gk} ms budget`;uid=`cd-chart-${oA++}`;hintId=`${this.uid}-hint`;active=D(null);anchor=null;dragging=!1;hover=D(null);focused=D(!1);max=X(()=>xk(this.cycles()));budgetAt=X(()=>gk/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:_k(t),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||ayk(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=e.filter(_k).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`}`}. ${t} over the ${gk} 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:_k(t),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}`,vk(e.ms)];_k(e)&&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} ${vk(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+cA;break;case`PageUp`:r=n-cA;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=k({type:e,selectors:[[`app-cd-cycle-chart`]],hostBindings:function(e,t){e&1&&H(`pointerup`,function(){return t.endDrag()},ju)(`pointercancel`,function(){return t.endDrag()},ju)},inputs:{cycles:[1,`cycles`],range:[1,`range`]},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&&(z(0,`div`,0)(1,`label`)(2,`span`),K(3,`Start`),B(),z(4,`input`,1),U(`change`,function(e){return t.setEnd(`from`,e)}),B()(),z(5,`label`)(6,`span`),K(7,`End`),B(),z(8,`input`,1),U(`change`,function(e){return t.setEnd(`to`,e)}),B()(),j(9,Xk,2,0,`button`,2),z(10,`p`,3),K(11),B()(),z(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. `),B(),z(14,`div`,5)(15,`div`,6)(16,`span`,7),K(17),B(),z(18,`span`,8),K(19,`0 ms`),B()(),z(20,`div`,9),j(21,Zk,1,4,`div`,10),z(22,`div`,11)(23,`span`),K(24),B()(),z(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)}),N(26,Qk,2,12,`div`,13,Jk),B(),j(28,nA,12,12,`div`,14),B()(),z(29,`div`,15),N(30,rA,1,2,`span`,16,Jk),B(),z(32,`ul`,17)(33,`li`),Og(34,`span`,18),K(35,`Within budget`),B(),z(36,`li`),Og(37,`span`,19)(38,`span`,20),K(39,`Over budget `),B(),z(40,`li`),Og(41,`span`,21),K(42),B()(),z(43,`details`,22)(44,`summary`),K(45,`Show the cycles as a table`),B(),z(46,`div`,23)(47,`table`)(48,`caption`,24),K(49),B(),z(50,`thead`)(51,`tr`)(52,`th`,25),K(53,`Cycle`),B(),z(54,`th`,25),K(55,`Duration`),B(),z(56,`th`,26),K(57,`Budget`),B(),z(58,`th`,25),K(59,`Checks`),B(),z(60,`th`,25),K(61,`Passes`),B(),z(62,`th`,26),K(63,`After`),B(),z(64,`th`,26),K(65,`Slowest component`),B()()(),z(66,`tbody`),N(67,aA,15,7,`tr`,null,Yk),B()()()()),e&2){let e,n;O(4),Pg(`min`,t.firstId())(`max`,t.lastId())(`value`,t.startId()),O(4),Pg(`min`,t.firstId())(`max`,t.lastId())(`value`,t.endId()),O(),M(t.range()?9:-1),O(2),q(t.summary()),O(),Pg(`id`,t.hintId),O(2),G(`flush`,t.bars().length>t.gapUntil),O(3),q(t.fmt(t.max())),O(4),M((e=t.band())?21:-1,e),O(),y_(`bottom`,t.budgetAt(),`%`),O(2),q(t.budgetLabel),O(),A(`aria-label`,`Change detection cycles, `+t.summary())(`aria-describedby`,t.hintId)(`aria-activedescendant`,t.activeOptionId()),O(),P(t.bars()),O(2),M((n=t.tip())?28:-1,n),O(),G(`flush`,t.bars().length>t.gapUntil),O(),P(t.bars()),O(12),q(t.budgetLabel),O(4),A(`aria-label`,t.tableLabel()),O(3),J(` `,t.tableLabel(),` `),O(18),P(t.selected())}},styles:[`[_nghost-%COMP%] { display: block; min-width: 0; } @@ -1224,7 +1224,7 @@ td.mono[_ngcontent-%COMP%] { .bar[_ngcontent-%COMP%] { transition: none; } -}`]})},fA=(e,t)=>t.id,pA=(e,t)=>t.index,mA=(e,t)=>t.kind;function hA(e,t){if(e&1&&(z(0,`p`,0),K(1),B()),e&2){let e=W(2);O(),Y(` Pick `,e.max,` cycles or fewer to see their spans. `,e.count(),` are picked. `)}}function gA(e,t){if(e&1&&(z(0,`span`),K(1),B()),e&2){let e=t.$implicit;y_(`left`,e.x,`%`)(`width`,e.w,`%`),O(),J(`cycle `,e.id)}}function _A(e,t){if(e&1){let e=V();z(0,`button`,11),U(`focus`,function(){let t=w(e).$implicit;return T(W(3).current.set(t.index))})(`mouseenter`,function(){let t=w(e).$implicit;return T(W(3).hover.set(t.index))})(`mouseleave`,function(){return w(e),T(W(3).hover.set(null))})(`click`,function(){let t=w(e).$implicit;return T(W(3).choose(t))}),z(1,`span`,12),K(2),B()()}if(e&2){let e=t.$implicit,n=W(3);b_(Y_(`block kind-`,e.kind)),y_(`left`,e.x,`%`)(`width`,e.w,`%`)(`top`,e.depth*n.row,`px`),G(`narrow`,e.w<4),A(`tabindex`,e.index===n.tabStop()?0:-1)(`data-index`,e.index)(`aria-label`,n.describe(e))(`aria-disabled`,e.component?null:`true`),O(2),q(e.name)}}function vA(e,t){if(e&1&&(z(0,`li`),Og(1,`span`,13),K(2),B()),e&2){let e=t.$implicit;O(),b_(Y_(`key kind-`,e.kind)),O(),q(e.label)}}function yA(e,t){if(e&1&&(z(0,`p`,0),K(1),B()),e&2){let e=W(3);O(),Y(` Each cycle keeps its longest spans. `,e.dropped(),` shorter `,e.dropped()===1?`span was`:`spans were`,` left out. `)}}function bA(e,t){if(e&1&&(z(0,`tr`)(1,`td`,17),K(2),B(),z(3,`td`,18),K(4),B(),z(5,`td`),K(6),B(),z(7,`td`,17),K(8),B(),z(9,`td`,17),K(10),B(),z(11,`td`,17),K(12),B(),z(13,`td`,17),K(14),B()()),e&2){let e=t.$implicit,n=W(4);O(2),q(e.cycleId),O(),y_(`padding-left`,6+e.depth*8,`px`),O(),q(e.name),O(2),q(n.kindLabel(e)),O(2),q(e.depth),O(2),q(n.fmt(e.start)),O(2),q(n.fmt(e.ms)),O(2),q(n.fmt(e.selfMs))}}function xA(e,t){if(e&1&&(z(0,`div`,10)(1,`table`)(2,`caption`,14),K(3),B(),z(4,`thead`)(5,`tr`)(6,`th`,15),K(7,`Cycle`),B(),z(8,`th`,16),K(9,`Span`),B(),z(10,`th`,16),K(11,`Kind`),B(),z(12,`th`,15),K(13,`Depth`),B(),z(14,`th`,15),K(15,`Start`),B(),z(16,`th`,15),K(17,`Total`),B(),z(18,`th`,15),K(19,`Self`),B()()(),z(20,`tbody`),N(21,bA,15,9,`tr`,null,pA),B()()()),e&2){let e=W(),t=W(2);A(`aria-label`,t.tableLabel()),O(3),J(` `,t.tableLabel(),` `),O(18),P(e.blocks)}}function SA(e,t){if(e&1){let e=V();z(0,`div`,1),U(`keydown`,function(t){return w(e),T(W(2).onKey(t))}),z(1,`div`,2),N(2,gA,2,5,`span`,3,fA),B(),z(4,`div`,4),N(5,_A,3,16,`button`,5,pA),B()(),z(7,`p`,6),K(8),B(),z(9,`ul`,7),N(10,vA,3,4,`li`,null,mA),B(),z(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. `),B(),j(14,yA,2,2,`p`,0),z(15,`details`,9),U(`toggle`,function(t){return w(e),T(W(2).onToggle(t))}),z(16,`summary`),K(17,`Show the spans as a table`),B(),j(18,xA,23,2,`div`,10),B()}if(e&2){let e=t,n=W(2);A(`aria-label`,n.label()),O(2),P(e.cycles),O(2),y_(`height`,e.depth*n.row,`px`),O(),P(e.blocks),O(3),q(n.readout()),O(2),P(n.kinds),O(4),M(n.dropped()?14:-1),O(4),M(n.tableOpen()?18:-1)}}function CA(e,t){if(e&1&&(z(0,`h3`),K(1,`Spans in the picked cycles`),B(),j(2,hA,2,2,`p`,0)(3,SA,19,6)),e&2){let e,t=W();O(2),M(t.tooMany()?2:(e=t.graph())?3:-1,e)}}var wA=22;function TA(e,t){for(let n=e.length-1;n>=0;n--)if(t(e[n]))return e[n]}var EA=class e{cycles=$([]);names=$([]);scope=$(`the recording`);pick=bv();row=wA;max=30;kinds=[`c`,`h`,`r`,`o`].map(e=>({kind:e,label:Tk[e]}));current=D(0);tableOpen=D(!1);hover=D(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:Dk(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 bk(e)}kindLabel(e){return Tk[e.kind]}onToggle(e){this.tableOpen.set(e.target.open)}describe(e){let t=[e.name,Tk[e.kind],`${bk(e.ms)} total`];return e.selfMs!==e.ms&&t.push(`${bk(e.selfMs)} self`),t.push(e.start<0?`cycle ${e.cycleId}, ${bk(-e.start)} before it started`:`cycle ${e.cycleId} at ${bk(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=TA(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=k({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&&j(0,CA,4,1),e&2&&M(t.hasSpans()?0:-1)},styles:[`[_nghost-%COMP%] { +}`]})},uA=(e,t)=>t.id,dA=(e,t)=>t.index,fA=(e,t)=>t.kind;function pA(e,t){if(e&1&&(z(0,`p`,0),K(1),B()),e&2){let e=W(2);O(),Y(` Pick `,e.max,` cycles or fewer to see their spans. `,e.count(),` are picked. `)}}function mA(e,t){if(e&1&&(z(0,`span`),K(1),B()),e&2){let e=t.$implicit;y_(`left`,e.x,`%`)(`width`,e.w,`%`),O(),J(`cycle `,e.id)}}function hA(e,t){if(e&1){let e=V();z(0,`button`,11),U(`focus`,function(){let t=w(e).$implicit;return T(W(3).current.set(t.index))})(`mouseenter`,function(){let t=w(e).$implicit;return T(W(3).hover.set(t.index))})(`mouseleave`,function(){return w(e),T(W(3).hover.set(null))})(`click`,function(){let t=w(e).$implicit;return T(W(3).choose(t))}),z(1,`span`,12),K(2),B()()}if(e&2){let e=t.$implicit,n=W(3);b_(X_(`block kind-`,e.kind)),y_(`left`,e.x,`%`)(`width`,e.w,`%`)(`top`,e.depth*n.row,`px`),G(`narrow`,e.w<4),A(`tabindex`,e.index===n.tabStop()?0:-1)(`data-index`,e.index)(`aria-label`,n.describe(e))(`aria-disabled`,e.component?null:`true`),O(2),q(e.name)}}function gA(e,t){if(e&1&&(z(0,`li`),Og(1,`span`,13),K(2),B()),e&2){let e=t.$implicit;O(),b_(X_(`key kind-`,e.kind)),O(),q(e.label)}}function _A(e,t){if(e&1&&(z(0,`p`,0),K(1),B()),e&2){let e=W(3);O(),Y(` Each cycle keeps its longest spans. `,e.dropped(),` shorter `,e.dropped()===1?`span was`:`spans were`,` left out. `)}}function vA(e,t){if(e&1&&(z(0,`tr`)(1,`td`,17),K(2),B(),z(3,`td`,18),K(4),B(),z(5,`td`),K(6),B(),z(7,`td`,17),K(8),B(),z(9,`td`,17),K(10),B(),z(11,`td`,17),K(12),B(),z(13,`td`,17),K(14),B()()),e&2){let e=t.$implicit,n=W(4);O(2),q(e.cycleId),O(),y_(`padding-left`,6+e.depth*8,`px`),O(),q(e.name),O(2),q(n.kindLabel(e)),O(2),q(e.depth),O(2),q(n.fmt(e.start)),O(2),q(n.fmt(e.ms)),O(2),q(n.fmt(e.selfMs))}}function yA(e,t){if(e&1&&(z(0,`div`,10)(1,`table`)(2,`caption`,14),K(3),B(),z(4,`thead`)(5,`tr`)(6,`th`,15),K(7,`Cycle`),B(),z(8,`th`,16),K(9,`Span`),B(),z(10,`th`,16),K(11,`Kind`),B(),z(12,`th`,15),K(13,`Depth`),B(),z(14,`th`,15),K(15,`Start`),B(),z(16,`th`,15),K(17,`Total`),B(),z(18,`th`,15),K(19,`Self`),B()()(),z(20,`tbody`),N(21,vA,15,9,`tr`,null,dA),B()()()),e&2){let e=W(),t=W(2);A(`aria-label`,t.tableLabel()),O(3),J(` `,t.tableLabel(),` `),O(18),P(e.blocks)}}function bA(e,t){if(e&1){let e=V();z(0,`div`,1),U(`keydown`,function(t){return w(e),T(W(2).onKey(t))}),z(1,`div`,2),N(2,mA,2,5,`span`,3,uA),B(),z(4,`div`,4),N(5,hA,3,16,`button`,5,dA),B()(),z(7,`p`,6),K(8),B(),z(9,`ul`,7),N(10,gA,3,4,`li`,null,fA),B(),z(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. `),B(),j(14,_A,2,2,`p`,0),z(15,`details`,9),U(`toggle`,function(t){return w(e),T(W(2).onToggle(t))}),z(16,`summary`),K(17,`Show the spans as a table`),B(),j(18,yA,23,2,`div`,10),B()}if(e&2){let e=t,n=W(2);A(`aria-label`,n.label()),O(2),P(e.cycles),O(2),y_(`height`,e.depth*n.row,`px`),O(),P(e.blocks),O(3),q(n.readout()),O(2),P(n.kinds),O(4),M(n.dropped()?14:-1),O(4),M(n.tableOpen()?18:-1)}}function xA(e,t){if(e&1&&(z(0,`h3`),K(1,`Spans in the picked cycles`),B(),j(2,pA,2,2,`p`,0)(3,bA,19,6)),e&2){let e,t=W();O(2),M(t.tooMany()?2:(e=t.graph())?3:-1,e)}}var SA=22;function CA(e,t){for(let n=e.length-1;n>=0;n--)if(t(e[n]))return e[n]}var wA=class e{cycles=$([]);names=$([]);scope=$(`the recording`);pick=xv();row=SA;max=30;kinds=[`c`,`h`,`r`,`o`].map(e=>({kind:e,label:Ck[e]}));current=D(0);tableOpen=D(!1);hover=D(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:Tk(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 vk(e)}kindLabel(e){return Ck[e.kind]}onToggle(e){this.tableOpen.set(e.target.open)}describe(e){let t=[e.name,Ck[e.kind],`${vk(e.ms)} total`];return e.selfMs!==e.ms&&t.push(`${vk(e.selfMs)} self`),t.push(e.start<0?`cycle ${e.cycleId}, ${vk(-e.start)} before it started`:`cycle ${e.cycleId} at ${vk(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=CA(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=k({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&&j(0,xA,4,1),e&2&&M(t.hasSpans()?0:-1)},styles:[`[_nghost-%COMP%] { display: block; min-width: 0; } @@ -1431,7 +1431,7 @@ td.mono[_ngcontent-%COMP%] { .num[_ngcontent-%COMP%] { text-align: right; font-variant-numeric: tabular-nums; -}`]})};function DA(e,t){if(e&1&&(z(0,`tr`)(1,`td`,5),K(2),B(),z(3,`td`,6),K(4),B(),z(5,`td`,6),K(6),B(),z(7,`td`,6),K(8),B()()),e&2){let e=t.$implicit,n=W(3);O(2),Y(``,e.name,`.`,e.hook),O(2),q(e.calls),O(2),q(n.ms(e.ms)),O(2),q(n.ms(e.maxMs))}}function OA(e,t){if(e&1&&(z(0,`div`)(1,`h3`),K(2,`Lifecycle hooks`),B(),z(3,`table`)(4,`thead`)(5,`tr`)(6,`th`,3),K(7,`Hook`),B(),z(8,`th`,4),K(9,`Calls`),B(),z(10,`th`,4),K(11,`Time`),B(),z(12,`th`,4),K(13,`Slowest`),B()()(),z(14,`tbody`),N(15,DA,9,5,`tr`,null,gg),B()()()),e&2){let e=W(2);O(15),P(e.hooks())}}function kA(e,t){if(e&1&&K(0),e&2){let e=W().$implicit;J(` (`,e.listener,`) `)}}function AA(e,t){if(e&1&&(z(0,`tr`)(1,`td`,5),K(2),j(3,kA,1,1),B(),z(4,`td`,6),K(5),B(),z(6,`td`,6),K(7),B(),z(8,`td`,6),K(9),B()()),e&2){let e=t.$implicit,n=W(3);O(2),J(` `,e.name,` `),O(),M(e.listener?3:-1),O(2),q(e.calls),O(2),q(n.ms(e.ms)),O(2),q(n.ms(e.maxMs))}}function jA(e,t){if(e&1&&(z(0,`div`)(1,`h3`),K(2,`Output listeners`),B(),z(3,`table`)(4,`thead`)(5,`tr`)(6,`th`,3),K(7,`Listener`),B(),z(8,`th`,4),K(9,`Calls`),B(),z(10,`th`,4),K(11,`Time`),B(),z(12,`th`,4),K(13,`Slowest`),B()()(),z(14,`tbody`),N(15,AA,10,5,`tr`,null,gg),B()()()),e&2){let e=W(2);O(15),P(e.outputs())}}function MA(e,t){if(e&1&&(z(0,`p`,1),K(1),B()),e&2){let e=t,n=W(2);O(),B_(` afterRender callbacks ran `,e.runs,` `,e.runs===1?`time`:`times`,`, `,n.ms(e.ms),` in total, slowest `,n.ms(e.maxMs),`. `)}}function NA(e,t){if(e&1&&(z(0,`p`,2),K(1),B()),e&2){let e=W(2);O(),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 PA(e,t){if(e&1&&(z(0,`div`,0),j(1,OA,17,0,`div`),j(2,jA,17,0,`div`),B(),j(3,MA,2,4,`p`,1),j(4,NA,2,2,`p`,2)),e&2){let e,t=W();O(),M(t.hooks().length?1:-1),O(),M(t.outputs().length?2:-1),O(),M((e=t.afterRender())?3:-1,e),O(),M(t.dropped()?4:-1)}}var FA=10;function IA(e){return`${e<10?e.toFixed(2):Math.round(e)} ms`}var LA=class e{page=$(null);hooks=X(()=>(this.page()?.hooks??[]).slice(0,FA));outputs=X(()=>(this.page()?.outputs??[]).slice(0,FA));afterRender=X(()=>{let e=this.page()?.afterRender;return e?.runs?e:null});dropped=X(()=>this.page()?.droppedTimings??0);ms(e){return IA(e)}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({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&&j(0,PA,5,4),e&2&&M(t.hooks().length||t.outputs().length||t.afterRender()?0:-1)},styles:[`[_nghost-%COMP%] { +}`]})};function TA(e,t){if(e&1&&(z(0,`tr`)(1,`td`,5),K(2),B(),z(3,`td`,6),K(4),B(),z(5,`td`,6),K(6),B(),z(7,`td`,6),K(8),B()()),e&2){let e=t.$implicit,n=W(3);O(2),Y(``,e.name,`.`,e.hook),O(2),q(e.calls),O(2),q(n.ms(e.ms)),O(2),q(n.ms(e.maxMs))}}function EA(e,t){if(e&1&&(z(0,`div`)(1,`h3`),K(2,`Lifecycle hooks`),B(),z(3,`table`)(4,`thead`)(5,`tr`)(6,`th`,3),K(7,`Hook`),B(),z(8,`th`,4),K(9,`Calls`),B(),z(10,`th`,4),K(11,`Time`),B(),z(12,`th`,4),K(13,`Slowest`),B()()(),z(14,`tbody`),N(15,TA,9,5,`tr`,null,gg),B()()()),e&2){let e=W(2);O(15),P(e.hooks())}}function DA(e,t){if(e&1&&K(0),e&2){let e=W().$implicit;J(` (`,e.listener,`) `)}}function OA(e,t){if(e&1&&(z(0,`tr`)(1,`td`,5),K(2),j(3,DA,1,1),B(),z(4,`td`,6),K(5),B(),z(6,`td`,6),K(7),B(),z(8,`td`,6),K(9),B()()),e&2){let e=t.$implicit,n=W(3);O(2),J(` `,e.name,` `),O(),M(e.listener?3:-1),O(2),q(e.calls),O(2),q(n.ms(e.ms)),O(2),q(n.ms(e.maxMs))}}function kA(e,t){if(e&1&&(z(0,`div`)(1,`h3`),K(2,`Output listeners`),B(),z(3,`table`)(4,`thead`)(5,`tr`)(6,`th`,3),K(7,`Listener`),B(),z(8,`th`,4),K(9,`Calls`),B(),z(10,`th`,4),K(11,`Time`),B(),z(12,`th`,4),K(13,`Slowest`),B()()(),z(14,`tbody`),N(15,OA,10,5,`tr`,null,gg),B()()()),e&2){let e=W(2);O(15),P(e.outputs())}}function AA(e,t){if(e&1&&(z(0,`p`,1),K(1),B()),e&2){let e=t,n=W(2);O(),V_(` afterRender callbacks ran `,e.runs,` `,e.runs===1?`time`:`times`,`, `,n.ms(e.ms),` in total, slowest `,n.ms(e.maxMs),`. `)}}function jA(e,t){if(e&1&&(z(0,`p`,2),K(1),B()),e&2){let e=W(2);O(),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 MA(e,t){if(e&1&&(z(0,`div`,0),j(1,EA,17,0,`div`),j(2,kA,17,0,`div`),B(),j(3,AA,2,4,`p`,1),j(4,jA,2,2,`p`,2)),e&2){let e,t=W();O(),M(t.hooks().length?1:-1),O(),M(t.outputs().length?2:-1),O(),M((e=t.afterRender())?3:-1,e),O(),M(t.dropped()?4:-1)}}var NA=10;function PA(e){return`${e<10?e.toFixed(2):Math.round(e)} ms`}var FA=class e{page=$(null);hooks=X(()=>(this.page()?.hooks??[]).slice(0,NA));outputs=X(()=>(this.page()?.outputs??[]).slice(0,NA));afterRender=X(()=>{let e=this.page()?.afterRender;return e?.runs?e:null});dropped=X(()=>this.page()?.droppedTimings??0);ms(e){return PA(e)}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({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&&j(0,MA,5,4),e&2&&M(t.hooks().length||t.outputs().length||t.afterRender()?0:-1)},styles:[`[_nghost-%COMP%] { display: block; } @@ -1491,7 +1491,7 @@ td.mono[_ngcontent-%COMP%] { margin: 8px 0 0; color: var(--%NS%text-2); font-size: 12px; -}`]})};function RA(e,t){if(e&1&&(z(0,`p`,5),K(1),B()),e&2){let e=W();O(),q(e.error())}}function zA(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 BA=class e{page=$(null);maxCycles=$(200);imported=bv();error=D(``);hasCycles(){return(this.page()?.cycles.length??0)>0}exportJson(){let e=this.page();e&&zA(uk(e,e.pageId),`change-detection-${e.pageId}.json`)}exportTrace(){let e=this.page();e&&zA(_k(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=dk(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=k({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=V();z(0,`div`,1)(1,`button`,2),U(`click`,function(){return t.exportJson()}),K(2,`Export JSON`),B(),z(3,`button`,2),U(`click`,function(){return t.exportTrace()}),K(4,` Export trace (Perfetto) `),B(),z(5,`button`,3),U(`click`,function(){return w(e),T(Qg(8).click())}),K(6,`Import`),B(),z(7,`input`,4,0),U(`change`,function(){w(e);let n=Qg(8);return T(t.read(n))}),B()(),j(9,RA,2,1,`p`,5)}e&2&&(O(),Pg(`disabled`,!t.hasCycles()),O(2),Pg(`disabled`,!t.hasCycles()),O(6),M(t.error()?9:-1))},styles:[`[_nghost-%COMP%] { +}`]})};function IA(e,t){if(e&1&&(z(0,`p`,5),K(1),B()),e&2){let e=W();O(),q(e.error())}}function LA(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 RA=class e{page=$(null);maxCycles=$(200);imported=xv();error=D(``);hasCycles(){return(this.page()?.cycles.length??0)>0}exportJson(){let e=this.page();e&&LA(ck(e,e.pageId),`change-detection-${e.pageId}.json`)}exportTrace(){let e=this.page();e&&LA(hk(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=lk(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=k({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=V();z(0,`div`,1)(1,`button`,2),U(`click`,function(){return t.exportJson()}),K(2,`Export JSON`),B(),z(3,`button`,2),U(`click`,function(){return t.exportTrace()}),K(4,` Export trace (Perfetto) `),B(),z(5,`button`,3),U(`click`,function(){return w(e),T(Qg(8).click())}),K(6,`Import`),B(),z(7,`input`,4,0),U(`change`,function(){w(e);let n=Qg(8);return T(t.read(n))}),B()(),j(9,IA,2,1,`p`,5)}e&2&&(O(),Pg(`disabled`,!t.hasCycles()),O(2),Pg(`disabled`,!t.hasCycles()),O(6),M(t.error()?9:-1))},styles:[`[_nghost-%COMP%] { display: contents; } @@ -1533,7 +1533,7 @@ button[_ngcontent-%COMP%]:disabled { margin: 0; color: var(--%NS%danger-text); font-size: 12px; -}`]})},VA=(e,t)=>t.stat.name;function HA(e,t){if(e&1&&(z(0,`span`,8),K(1),B()),e&2){let e=W(2).$implicit;O(),J(``,e.other,` more`)}}function UA(e,t){if(e&1&&(z(0,`div`,6)(1,`span`,7),K(2),B(),j(3,HA,2,1,`span`,8),B()),e&2){let e=W().$implicit;y_(`--%NS%tone`,e.tone+`%`),O(2),q(e.label),O(),M(e.roomy?3:-1)}}function WA(e,t){if(e&1&&(z(0,`span`,10),K(1),B(),z(2,`span`,11),K(3),B()),e&2){let e=W(2).$implicit,t=W(2);O(),q(e.stat.name),O(2),q(t.fmt(e.stat.ms))}}function GA(e,t){if(e&1){let e=V();z(0,`button`,9),U(`focus`,function(){w(e);let t=W().$index;return T(W(2).current.set(t))})(`click`,function(){w(e);let t=W().$implicit;return T(W(2).pick.emit(t.stat.name))}),j(1,WA,4,2),B()}if(e&2){let e=W(),t=e.$implicit,n=e.$index,r=W(2);y_(`--%NS%tone`,t.tone+`%`),A(`tabindex`,n===r.tabStop()?0:-1)(`aria-label`,t.label)(`data-index`,n),O(),M(t.roomy?1:-1)}}function KA(e,t){if(e&1&&(z(0,`li`),j(1,UA,4,4,`div`,4)(2,GA,2,6,`button`,5),B()),e&2){let e=t.$implicit;y_(`left`,e.x,`%`)(`top`,e.y,`%`)(`width`,e.w,`%`)(`height`,e.h,`%`),O(),M(e.other?1:2)}}function qA(e,t){if(e&1){let e=V();z(0,`ul`,2),U(`keydown`,function(t){return w(e),T(W().onKey(t))}),N(1,KA,3,9,`li`,3,VA),B()}if(e&2){let e=W();A(`aria-label`,e.label()),O(),P(e.cells())}}function JA(e,t){e&1&&(z(0,`p`,1),K(1,`No component time in these cycles.`),B())}var YA=24,XA=3,ZA=class e{stats=$([]);scope=$(`the recording`);pick=bv();current=D(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,YA),n=e.slice(YA),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=wk(i,e=>e.stat.ms,XA);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, ${bk(t.ms)}, ${r}% of self time`:`${t.name}, ${bk(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 bk(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=k({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&&j(0,qA,3,1,`ul`,0)(1,JA,2,0,`p`,1),e&2&&M(+!t.cells().length)},styles:[`[_nghost-%COMP%] { +}`]})},zA=(e,t)=>t.stat.name;function BA(e,t){if(e&1&&(z(0,`span`,8),K(1),B()),e&2){let e=W(2).$implicit;O(),J(``,e.other,` more`)}}function VA(e,t){if(e&1&&(z(0,`div`,6)(1,`span`,7),K(2),B(),j(3,BA,2,1,`span`,8),B()),e&2){let e=W().$implicit;y_(`--%NS%tone`,e.tone+`%`),O(2),q(e.label),O(),M(e.roomy?3:-1)}}function HA(e,t){if(e&1&&(z(0,`span`,10),K(1),B(),z(2,`span`,11),K(3),B()),e&2){let e=W(2).$implicit,t=W(2);O(),q(e.stat.name),O(2),q(t.fmt(e.stat.ms))}}function UA(e,t){if(e&1){let e=V();z(0,`button`,9),U(`focus`,function(){w(e);let t=W().$index;return T(W(2).current.set(t))})(`click`,function(){w(e);let t=W().$implicit;return T(W(2).pick.emit(t.stat.name))}),j(1,HA,4,2),B()}if(e&2){let e=W(),t=e.$implicit,n=e.$index,r=W(2);y_(`--%NS%tone`,t.tone+`%`),A(`tabindex`,n===r.tabStop()?0:-1)(`aria-label`,t.label)(`data-index`,n),O(),M(t.roomy?1:-1)}}function WA(e,t){if(e&1&&(z(0,`li`),j(1,VA,4,4,`div`,4)(2,UA,2,6,`button`,5),B()),e&2){let e=t.$implicit;y_(`left`,e.x,`%`)(`top`,e.y,`%`)(`width`,e.w,`%`)(`height`,e.h,`%`),O(),M(e.other?1:2)}}function GA(e,t){if(e&1){let e=V();z(0,`ul`,2),U(`keydown`,function(t){return w(e),T(W().onKey(t))}),N(1,WA,3,9,`li`,3,zA),B()}if(e&2){let e=W();A(`aria-label`,e.label()),O(),P(e.cells())}}function KA(e,t){e&1&&(z(0,`p`,1),K(1,`No component time in these cycles.`),B())}var qA=24,JA=3,YA=class e{stats=$([]);scope=$(`the recording`);pick=xv();current=D(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,qA),n=e.slice(qA),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=Sk(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, ${vk(t.ms)}, ${r}% of self time`:`${t.name}, ${vk(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 vk(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=k({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&&j(0,GA,3,1,`ul`,0)(1,KA,2,0,`p`,1),e&2&&M(+!t.cells().length)},styles:[`[_nghost-%COMP%] { display: block; min-width: 0; } @@ -1609,7 +1609,7 @@ button.cell[_ngcontent-%COMP%]:focus-visible { .empty[_ngcontent-%COMP%] { margin: 8px 0; color: var(--%NS%text-2); -}`]})},QA=(e,t)=>t.id;function $A(e,t){if(e&1){let e=V();I(0,`button`,14),H(`click`,function(){return w(e),T(W(2).clear())}),K(1,`Clear`),L()}}function ej(e,t){if(e&1){let e=V();I(0,`button`,11),H(`click`,function(){return w(e),T(W().toggle())}),R(1,`span`,12),K(2),L(),j(3,$A,2,0,`button`,13)}if(e&2){let e=W();G(`on`,e.recording()),F(`disabled`,!e.pageId()),O(2),J(` `,e.recording()?`Stop recording`:`Record`,` `),O(),M(e.cycles().length?3:-1)}}function tj(e,t){if(e&1){let e=V();I(0,`p`,6)(1,`span`,15),K(2,`Imported recording`),L(),I(3,`span`,16),K(4),L(),I(5,`button`,14),H(`click`,function(){return w(e),T(W().closeImport())}),K(6,`Back to live recording`),L()()}e&2&&(O(4),q(t.fileName))}function nj(e,t){e&1&&K(0,` An app on a device has no DOM, so checks that changed nothing are not counted there. `)}function rj(e,t){e&1&&(I(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. `),L())}function ij(e,t){e&1&&R(0,`app-angular-unavailable`,17),e&2&&F(`page`,W(2).angularPage())}function aj(e,t){e&1&&j(0,rj,2,0,`p`,9)(1,ij,1,1,`app-angular-unavailable`,17),e&2&&M(+!W().attachPending())}function oj(e,t){e&1&&(I(0,`p`,9),K(1,`Angular profiling stays on until the page reloads.`),L())}function sj(e,t){e&1&&R(0,`app-angular-unavailable`,21),e&2&&F(`page`,W(2).angularPage())}function cj(e,t){if(e&1){let e=V();I(0,`div`,18)(1,`span`,19),K(2,`Live views`),L(),I(3,`button`,20),H(`click`,function(){w(e);let t=W();return T(t.setView(`flash`,!t.views().flash))}),R(4,`span`,12),K(5,` Flash checks `),L(),I(6,`button`,20),H(`click`,function(){w(e);let t=W();return T(t.setView(`track`,!t.views().track))}),R(7,`span`,12),K(8,` Performance track `),L(),I(9,`button`,20),H(`click`,function(){return w(e),T(W().setView(`angularProfiling`,!0))}),R(10,`span`,12),K(11,` Angular profiling `),L()(),I(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. `),L(),j(14,oj,2,0,`p`,9)(15,sj,1,1,`app-angular-unavailable`,21)}if(e&2){let e=W();O(3),F(`disabled`,!e.canShowViews()),A(`aria-pressed`,e.views().flash),O(3),F(`disabled`,!e.canShowViews()),A(`aria-pressed`,e.views().track),O(3),F(`disabled`,!e.canShowViews()||e.views().angularProfiling||!e.views().angularProfilingAvailable),A(`aria-pressed`,e.views().angularProfiling),O(5),M(e.views().angularProfiling?14:e.views().angularProfilingAvailable?-1:15)}}function lj(e,t){if(e&1&&(I(0,`p`,9),K(1),L()),e&2){let e=t.$implicit;O(),q(e)}}function uj(e,t){if(e&1&&(I(0,`p`,24),K(1),L()),e&2){let e=W(2);O(),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 dj(e,t){e&1&&(I(0,`p`,9),K(1,` For picked cycles, totals come from the 10 slowest components each cycle lists. `),L())}function fj(e,t){if(e&1){let e=V();I(0,`h3`),K(1,`Cycles`),L(),I(2,`app-cd-cycle-chart`,22),W_(`rangeChange`,function(t){w(e);let n=W();return U_(n.range,t)||(n.range=t),T(t)}),L(),I(3,`app-cd-flame-graph`,23),H(`pick`,function(t){return w(e),T(W().showComponent.emit(t))}),L(),j(4,uj,2,1,`p`,24),I(5,`h3`),K(6,`Self time by component`),L(),j(7,dj,2,0,`p`,9),I(8,`app-cd-treemap`,25),H(`pick`,function(t){return w(e),T(W().showComponent.emit(t))}),L()}if(e&2){let e=W();O(2),F(`cycles`,e.cycles()),H_(`range`,e.range),O(),F(`cycles`,e.picked())(`names`,e.spanNames())(`scope`,e.scope()),O(),M(e.hasSpans()?-1:4),O(3),M(e.range()?7:-1),O(),F(`stats`,e.stats())(`scope`,e.scope())}}function pj(e,t){if(e&1&&(I(0,`tr`)(1,`td`,16),K(2),L(),I(3,`td`,31),K(4),L(),I(5,`td`,31),K(6),L(),I(7,`td`,31),K(8),L()()),e&2){let e=t.$implicit,n=W(2);O(2),q(e.name),O(2),q(e.checks),O(2),q(n.ms(e.ms)),O(2),q(n.ms(e.maxMs))}}function mj(e,t){e&1&&(I(0,`tr`)(1,`td`,32),K(2,`No component time in the picked cycles.`),L()())}function hj(e,t){if(e&1&&(I(0,`span`,34),K(1,`from `),I(2,`span`,16),K(3),L()()),e&2){let e=W(3);O(3),q(e.causeText(t))}}function gj(e,t){if(e&1&&(I(0,`span`,34),K(1,`after `),I(2,`span`,16),K(3),L()()),e&2){let e=W().$implicit;O(3),q(e.trigger)}}function _j(e,t){if(e&1&&(I(0,`span`,35),K(1),L()),e&2){let e=W().$implicit;O(),J(``,e.unchanged,` changed nothing`)}}function vj(e,t){if(e&1&&(I(0,`span`,35),K(1),L()),e&2){let e=W().$implicit,t=W(2);O(),J(`hooks `,t.ms(e.hookMs))}}function yj(e,t){if(e&1&&(I(0,`span`,35),K(1),L()),e&2){let e=W().$implicit,t=W(2);O(),J(`afterRender `,t.ms(e.afterRenderMs))}}function bj(e,t){if(e&1&&(I(0,`span`,36),K(1,` slowest `),I(2,`span`,16),K(3),L(),K(4),L()),e&2){let e=t,n=W(3);O(3),q(e.name),O(),J(` `,n.ms(e.ms),` `)}}function xj(e,t){if(e&1&&(I(0,`li`)(1,`span`,33),K(2),L(),I(3,`span`,16),K(4),L(),I(5,`span`),K(6),L(),j(7,hj,4,1,`span`,34)(8,gj,4,1,`span`,34),j(9,_j,2,1,`span`,35),j(10,vj,2,1,`span`,35),j(11,yj,2,1,`span`,35),j(12,bj,5,2,`span`,36),L()),e&2){let e,n,r=t.$implicit,i=W(2);O(2),q(i.clock(r.at)),O(2),q(i.ms(r.ms)),O(2),B_(` `,r.checks,` `,r.checks===1?`check`:`checks`,`, `,r.passes,` `,r.passes===1?`pass`:`passes`,` `),O(),M((e=r.cause)?7:r.trigger?8:-1,e),O(2),M(r.unchanged?9:-1),O(),M(r.hookMs?10:-1),O(),M(r.afterRenderMs?11:-1),O(),M((n=r.components[0])?12:-1,n)}}function Sj(e,t){if(e&1&&(I(0,`div`,26)(1,`div`)(2,`h3`),K(3),L(),I(4,`table`)(5,`thead`)(6,`tr`)(7,`th`,27),K(8,`Component`),L(),I(9,`th`,28),K(10,`Checks`),L(),I(11,`th`,28),K(12,`Self time`),L(),I(13,`th`,28),K(14,`Slowest`),L()()(),I(15,`tbody`),N(16,pj,9,4,`tr`,null,gg,!1,mj,3,0,`tr`),L()()(),I(19,`div`)(20,`h3`),K(21,`Latest cycles`),L(),I(22,`ol`,29),N(23,xj,13,11,`li`,null,QA),L()()(),R(25,`app-cd-timing`,30)(26,`app-cd-diagnosis`,30)),e&2){let e=W();O(3),J(` `,e.range()?`Slowest components in the picked cycles`:`Slowest components`,` `),O(13),P(e.slowest()),O(7),P(e.latest()),O(2),F(`page`,e.page()),O(),F(`page`,e.page())}}function Cj(e,t){e&1&&(I(0,`p`,10),K(1,`Use the app. Cycles show up here as Angular runs change detection.`),L())}var wj=3e3,Tj=10,Ej=class e{livePage=$(null,{alias:`page`});pageId=$(null);rpc=$(null);native=$(!1);angularPages=AD(()=>this.rpc());angularPage=X(()=>jD(this.angularPages(),this.pageId()));attachPending=X(()=>this.angularPage()?.capabilities.profiler===!0);showComponent=bv();range=D(null);imported=D(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=D(``);announcement=D(``);recording=X(()=>this.page()?.recording===!0);cycles=X(()=>this.page()?.cycles??[]);maxCycles=X(()=>_E(this.rpc()).limits.cdCycles);picked=X(()=>xk(this.cycles(),this.range()));hasSpans=X(()=>this.picked().some(e=>e.spans?.length));spanNames=X(()=>this.page()?.spanNames??[]);stats=X(()=>this.range()?Sk(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,Tj));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 vO(e)}causeText(e){return nk(e)}confirming=D(null);confirmTimer;constructor(){_c(()=>{let e=this.confirming();e!==null&&this.livePage()?.recording===!0===e&&Z(()=>this.confirmed(e))}),C(As).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)},wj))}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 tE(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=k({type:e,selectors:[[`app-cd-recording`]],inputs:{livePage:[1,`page`,`livePage`],pageId:[1,`pageId`],rpc:[1,`rpc`],native:[1,`native`]},outputs:{showComponent:`showComponent`},decls:22,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`,`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`],[1,`num`],[`colspan`,`4`],[1,`when`],[1,`trigger`],[1,`timing`],[1,`top`]],template:function(e,t){if(e&1&&(I(0,`section`,0)(1,`div`,1)(2,`h2`,2),K(3,`Change detection`),L(),j(4,ej,4,5),I(5,`app-cd-transfer`,3),H(`imported`,function(e){return t.showImport(e)}),L(),I(6,`p`,4),K(7),L(),I(8,`p`,5),K(9),L()(),j(10,tj,7,1,`p`,6),I(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. `),j(13,nj,1,0),L(),j(14,aj,2,1),j(15,cj,16,7),R(16,`app-limit-note`,8),N(17,lj,2,1,`p`,9,_g),j(19,fj,9,9),j(20,Sj,27,4)(21,Cj,2,0,`p`,10),L()),e&2){let e;O(4),M(t.imported()?-1:4),O(),F(`page`,t.page())(`maxCycles`,t.maxCycles()),O(2),q(t.status()),O(2),q(t.announcement()),O(),M((e=t.imported())?10:-1,e),O(3),M(t.native()?13:-1),O(),M(t.page()?.supported===!1?14:-1),O(),M(!t.imported()&&!t.native()?15:-1),O(),F(`dropped`,t.page()?.dropped??0)(`max`,t.maxCycles()),O(),P(t.capNotes()),O(2),M(t.cycles().length?19:-1),O(),M(t.page()?.components?.length?20:t.recording()?21:-1)}},dependencies:[FD,wO,LA,Yk,BA,dA,EA,ZA],styles:[`[_nghost-%COMP%] { +}`]})},XA=(e,t)=>t.id;function ZA(e,t){if(e&1){let e=V();I(0,`button`,14),H(`click`,function(){return w(e),T(W(2).clear())}),K(1,`Clear`),L()}}function QA(e,t){if(e&1){let e=V();I(0,`button`,11),H(`click`,function(){return w(e),T(W().toggle())}),R(1,`span`,12),K(2),L(),j(3,ZA,2,0,`button`,13)}if(e&2){let e=W();G(`on`,e.recording()),F(`disabled`,!e.pageId()),O(2),J(` `,e.recording()?`Stop recording`:`Record`,` `),O(),M(e.cycles().length?3:-1)}}function $A(e,t){if(e&1){let e=V();I(0,`p`,6)(1,`span`,15),K(2,`Imported recording`),L(),I(3,`span`,16),K(4),L(),I(5,`button`,14),H(`click`,function(){return w(e),T(W().closeImport())}),K(6,`Back to live recording`),L()()}e&2&&(O(4),q(t.fileName))}function ej(e,t){e&1&&K(0,` An app on a device has no DOM, so checks that changed nothing are not counted there. `)}function tj(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 nj(e,t){e&1&&(I(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. `),L())}function rj(e,t){e&1&&R(0,`app-angular-unavailable`,17),e&2&&F(`page`,W(2).angularPage())}function ij(e,t){e&1&&j(0,nj,2,0,`p`,9)(1,rj,1,1,`app-angular-unavailable`,17),e&2&&M(+!W().attachPending())}function aj(e,t){e&1&&(I(0,`p`,9),K(1,`Angular profiling stays on until the page reloads.`),L())}function oj(e,t){e&1&&R(0,`app-angular-unavailable`,21),e&2&&F(`page`,W(2).angularPage())}function sj(e,t){if(e&1){let e=V();I(0,`div`,18)(1,`span`,19),K(2,`Live views`),L(),I(3,`button`,20),H(`click`,function(){w(e);let t=W();return T(t.setView(`flash`,!t.views().flash))}),R(4,`span`,12),K(5,` Flash checks `),L(),I(6,`button`,20),H(`click`,function(){w(e);let t=W();return T(t.setView(`track`,!t.views().track))}),R(7,`span`,12),K(8,` Performance track `),L(),I(9,`button`,20),H(`click`,function(){return w(e),T(W().setView(`angularProfiling`,!0))}),R(10,`span`,12),K(11,` Angular profiling `),L()(),I(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. `),L(),j(14,aj,2,0,`p`,9)(15,oj,1,1,`app-angular-unavailable`,21)}if(e&2){let e=W();O(3),F(`disabled`,!e.canShowViews()),A(`aria-pressed`,e.views().flash),O(3),F(`disabled`,!e.canShowViews()),A(`aria-pressed`,e.views().track),O(3),F(`disabled`,!e.canShowViews()||e.views().angularProfiling||!e.views().angularProfilingAvailable),A(`aria-pressed`,e.views().angularProfiling),O(5),M(e.views().angularProfiling?14:e.views().angularProfilingAvailable?-1:15)}}function cj(e,t){if(e&1&&(I(0,`p`,9),K(1),L()),e&2){let e=t.$implicit;O(),q(e)}}function lj(e,t){if(e&1&&(I(0,`p`,24),K(1),L()),e&2){let e=W(2);O(),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 uj(e,t){e&1&&(I(0,`p`,9),K(1,` For picked cycles, totals come from the 10 slowest components each cycle lists. `),L())}function dj(e,t){if(e&1){let e=V();I(0,`h3`),K(1,`Cycles`),L(),I(2,`app-cd-cycle-chart`,22),G_(`rangeChange`,function(t){w(e);let n=W();return W_(n.range,t)||(n.range=t),T(t)}),L(),I(3,`app-cd-flame-graph`,23),H(`pick`,function(t){return w(e),T(W().showComponent.emit(t))}),L(),j(4,lj,2,1,`p`,24),I(5,`h3`),K(6,`Self time by component`),L(),j(7,uj,2,0,`p`,9),I(8,`app-cd-treemap`,25),H(`pick`,function(t){return w(e),T(W().showComponent.emit(t))}),L()}if(e&2){let e=W();O(2),F(`cycles`,e.cycles()),U_(`range`,e.range),O(),F(`cycles`,e.picked())(`names`,e.spanNames())(`scope`,e.scope()),O(),M(e.hasSpans()?-1:4),O(3),M(e.range()?7:-1),O(),F(`stats`,e.stats())(`scope`,e.scope())}}function fj(e,t){if(e&1){let e=V();I(0,`tr`)(1,`td`,16)(2,`button`,31),H(`click`,function(){let t=w(e).$implicit;return T(W(2).showComponent.emit(t.name))}),K(3),L()(),I(4,`td`,32),K(5),L(),I(6,`td`,32),K(7),L(),I(8,`td`,32),K(9),L()()}if(e&2){let e=t.$implicit,n=W(2);O(3),J(` `,e.name,` `),O(2),q(e.checks),O(2),q(n.ms(e.ms)),O(2),q(n.ms(e.maxMs))}}function pj(e,t){e&1&&(I(0,`tr`)(1,`td`,33),K(2,`No component time in the picked cycles.`),L()())}function mj(e,t){if(e&1){let e=V();I(0,`tr`)(1,`td`,16)(2,`button`,31),H(`click`,function(){let t=w(e).$implicit;return T(W(2).showComponent.emit(t.name))}),K(3),L()(),I(4,`td`,32),K(5),L(),I(6,`td`,32),K(7),L(),I(8,`td`,32),K(9),L()()}if(e&2){let e=t.$implicit,n=W(2);O(3),J(` `,e.name,` `),O(2),q(e.checks),O(2),q(e.cycles),O(2),q(n.ms(e.ms))}}function hj(e,t){e&1&&(I(0,`tr`)(1,`td`,33),K(2,`No component checks in the picked cycles.`),L()())}function gj(e,t){if(e&1&&(I(0,`span`,35),K(1,`from `),I(2,`span`,16),K(3),L()()),e&2){let e=W(3);O(3),q(e.causeText(t))}}function _j(e,t){if(e&1&&(I(0,`span`,35),K(1,`after `),I(2,`span`,16),K(3),L()()),e&2){let e=W().$implicit;O(3),q(e.trigger)}}function vj(e,t){if(e&1&&(I(0,`span`,36),K(1),L()),e&2){let e=W().$implicit;O(),J(``,e.unchanged,` changed nothing`)}}function yj(e,t){if(e&1&&(I(0,`span`,36),K(1),L()),e&2){let e=W().$implicit,t=W(2);O(),J(`hooks `,t.ms(e.hookMs))}}function bj(e,t){if(e&1&&(I(0,`span`,36),K(1),L()),e&2){let e=W().$implicit,t=W(2);O(),J(`afterRender `,t.ms(e.afterRenderMs))}}function xj(e,t){if(e&1&&(I(0,`span`,37),K(1,` slowest `),I(2,`span`,16),K(3),L(),K(4),L()),e&2){let e=t,n=W(3);O(3),q(e.name),O(),J(` `,n.ms(e.ms),` `)}}function Sj(e,t){if(e&1&&(I(0,`li`)(1,`span`,34),K(2),L(),I(3,`span`,16),K(4),L(),I(5,`span`),K(6),L(),j(7,gj,4,1,`span`,35)(8,_j,4,1,`span`,35),j(9,vj,2,1,`span`,36),j(10,yj,2,1,`span`,36),j(11,bj,2,1,`span`,36),j(12,xj,5,2,`span`,37),L()),e&2){let e,n,r=t.$implicit,i=W(2);O(2),q(i.clock(r.at)),O(2),q(i.ms(r.ms)),O(2),V_(` `,r.checks,` `,r.checks===1?`check`:`checks`,`, `,r.passes,` `,r.passes===1?`pass`:`passes`,` `),O(),M((e=r.cause)?7:r.trigger?8:-1,e),O(2),M(r.unchanged?9:-1),O(),M(r.hookMs?10:-1),O(),M(r.afterRenderMs?11:-1),O(),M((n=r.components[0])?12:-1,n)}}function Cj(e,t){if(e&1&&(I(0,`div`,26)(1,`div`)(2,`h3`),K(3),L(),I(4,`table`)(5,`thead`)(6,`tr`)(7,`th`,27),K(8,`Component`),L(),I(9,`th`,28),K(10,`Checks`),L(),I(11,`th`,28),K(12,`Self time`),L(),I(13,`th`,28),K(14,`Slowest`),L()()(),I(15,`tbody`),N(16,fj,10,4,`tr`,null,gg,!1,pj,3,0,`tr`),L()(),I(19,`h3`),K(20),L(),I(21,`table`)(22,`thead`)(23,`tr`)(24,`th`,27),K(25,`Component`),L(),I(26,`th`,28),K(27,`Checks`),L(),I(28,`th`,28),K(29,`Cycles`),L(),I(30,`th`,28),K(31,`Self time`),L()()(),I(32,`tbody`),N(33,mj,10,4,`tr`,null,gg,!1,hj,3,0,`tr`),L()(),I(36,`p`,7),K(37,` Select a component name to show its most checked instance in the tree. `),L()(),I(38,`div`)(39,`h3`),K(40,`Latest cycles`),L(),I(41,`ol`,29),N(42,Sj,13,11,`li`,null,XA),L()()(),R(44,`app-cd-timing`,30)(45,`app-cd-diagnosis`,30)),e&2){let e=W();O(3),J(` `,e.range()?`Slowest components in the picked cycles`:`Slowest components`,` `),O(13),P(e.slowest()),O(4),J(` `,e.range()?`Most often checked in the picked cycles`:`Most often checked`,` `),O(13),P(e.busiest()),O(9),P(e.latest()),O(2),F(`page`,e.page()),O(),F(`page`,e.page())}}function wj(e,t){e&1&&(I(0,`p`,10),K(1,`Use the app. Cycles show up here as Angular runs change detection.`),L())}var Tj=3e3,Ej=10,Dj=class e{livePage=$(null,{alias:`page`});pageId=$(null);rpc=$(null);native=$(!1);angularPages=OD(()=>this.rpc());angularPage=X(()=>kD(this.angularPages(),this.pageId()));attachPending=X(()=>this.angularPage()?.capabilities.profiler===!0);showComponent=xv();range=D(null);imported=D(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=D(``);announcement=D(``);recording=X(()=>this.page()?.recording===!0);cycles=X(()=>this.page()?.cycles??[]);maxCycles=X(()=>hE(this.rpc()).limits.cdCycles);picked=X(()=>yk(this.cycles(),this.range()));hasSpans=X(()=>this.picked().some(e=>e.spans?.length));spanNames=X(()=>this.page()?.spanNames??[]);stats=X(()=>this.range()?bk(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,Ej));busiest=X(()=>[...this.stats()].sort((e,t)=>t.checks-e.checks).slice(0,Ej));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 gO(e)}causeText(e){return ek(e)}confirming=D(null);confirmTimer;constructor(){_c(()=>{let e=this.confirming();e!==null&&this.livePage()?.recording===!0===e&&Z(()=>this.confirmed(e))}),C(As).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)},Tj))}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 $T(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=k({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`,`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&&(I(0,`section`,0)(1,`div`,1)(2,`h2`,2),K(3,`Change detection`),L(),j(4,QA,4,5),I(5,`app-cd-transfer`,3),H(`imported`,function(e){return t.showImport(e)}),L(),I(6,`p`,4),K(7),L(),I(8,`p`,5),K(9),L()(),j(10,$A,7,1,`p`,6),I(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. `),j(13,ej,1,0)(14,tj,1,0),L(),j(15,ij,2,1),j(16,sj,16,7),R(17,`app-limit-note`,8),N(18,cj,2,1,`p`,9,_g),j(20,dj,9,9),j(21,Cj,46,6)(22,wj,2,0,`p`,10),L()),e&2){let e;O(4),M(t.imported()?-1:4),O(),F(`page`,t.page())(`maxCycles`,t.maxCycles()),O(2),q(t.status()),O(2),q(t.announcement()),O(),M((e=t.imported())?10:-1,e),O(3),M(t.native()?13:14),O(2),M(t.page()?.supported===!1?15:-1),O(),M(!t.imported()&&!t.native()?16:-1),O(),F(`dropped`,t.page()?.dropped??0)(`max`,t.maxCycles()),O(),P(t.capNotes()),O(2),M(t.cycles().length?20:-1),O(),M(t.page()?.components?.length?21:t.recording()?22:-1)}},dependencies:[ND,SO,FA,qk,RA,lA,wA,YA],styles:[`[_nghost-%COMP%] { display: block; margin-top: 16px; } @@ -1756,6 +1756,30 @@ td.mono[_ngcontent-%COMP%] { overflow-wrap: anywhere; } +.name-link[_ngcontent-%COMP%] { + height: auto; + min-height: 0; + padding: 0; + border: 0; + background: none; + color: var(--%NS%text-strong); + font: inherit; + text-align: left; + text-decoration: underline; + text-underline-offset: 2px; + cursor: pointer; +} + +.name-link[_ngcontent-%COMP%]:hover { + background: none; + text-decoration-thickness: 2px; +} + +.name-link[_ngcontent-%COMP%]:focus-visible { + outline: 2px solid var(--%NS%accent); + outline-offset: -2px; +} + .num[_ngcontent-%COMP%] { text-align: right; font-variant-numeric: tabular-nums; @@ -1811,7 +1835,7 @@ td.mono[_ngcontent-%COMP%] { .trigger[_ngcontent-%COMP%] .mono[_ngcontent-%COMP%], .top[_ngcontent-%COMP%] .mono[_ngcontent-%COMP%] { overflow-wrap: anywhere; -}`]})},Dj=[`*`];function Oj(e,t){e&1&&K(0),e&2&&q(W(2).label())}function kj(e,t){e&1&&Jg(0,0,null,Oj,1,1)}function Aj(e,t){if(e&1&&(I(0,`span`,4),K(1),L()),e&2){let e=W(2);O(),q(e.message())}}function jj(e,t){if(e&1){let e=V();I(0,`button`,2),H(`click`,function(){return w(e),T(W().open())}),Mg(1,3),L(),j(2,Aj,2,1,`span`,4)}if(e&2){let e=W(),t=Qg(1);F(`title`,`Open `+e.label()+` in your editor`),A(`aria-label`,`Open `+e.label()+` in your editor`),O(),F(`ngTemplateOutlet`,t),O(),M(e.message()?2:-1)}}function Mj(e,t){if(e&1&&(I(0,`span`,1),Mg(1,3),L()),e&2){let e=W(),t=Qg(1);F(`title`,e.label()),O(),F(`ngTemplateOutlet`,t)}}var Nj=class e{source=D(D(null));client=X(()=>this.source()());available=X(()=>{let e=this.client();return!!e&&!rE(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 tE(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=Rl({token:e,factory:e.ɵfac})};function Pj(e,t){return t?`${e}:${t}`:e}var Fj=class e{editor=C(Nj);file=$.required();line=$(void 0);label=X(()=>Pj(this.file(),this.line()));message=D(``);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=k({type:e,selectors:[[`app-source-link`]],inputs:{file:[1,`file`],line:[1,`line`]},ngContentSelectors:Dj,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&&(qg(),Jh(0,kj,2,0,`ng-template`,null,0,pv),j(2,jj,3,4)(3,Mj,2,2,`span`,1)),e&2&&(O(2),M(t.editor.available()?2:3))},dependencies:[py],styles:[`[_nghost-%COMP%] { +}`]})};function Oj(e){return Object.fromEntries(e.map(e=>[e.name,e.value??null]))}function kj(e){return e.map(e=>({name:e.name,listened:!!e.listened}))}function Aj(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=Oj(e.inputs),t.outputs=kj(e.outputs),t.properties=Oj(e.properties??[]),e.listeners.length&&(t.listeners=e.listeners),e.directives.length&&(t.directives=e.directives.map(e=>({name:e.name,inputs:Oj(e.inputs),outputs:kj(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 jj(e){return e.selector||e.path}var Mj=1e3;function Nj(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 Pj(e){try{return JSON.stringify(e)??`undefined`}catch{return String(e)}}var Fj=class{ms;changed=D(new Set);owner=null;last=new Map;timers=new Map;constructor(e=Mj){this.ms=e}update(e,t){let n=new Map([...t].map(([e,t])=>[e,Pj(t)]));if(e!==this.owner){this.clear(),this.owner=e,this.last=n;return}let r=Nj(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 Ij(e,t,n=0){return e===`directive`?`directive:${n}:${t}`:`${e}:${t}`}var Lj=[`*`];function Rj(e,t){e&1&&K(0),e&2&&q(W(2).label())}function zj(e,t){e&1&&Jg(0,0,null,Rj,1,1)}function Bj(e,t){if(e&1&&(I(0,`span`,4),K(1),L()),e&2){let e=W(2);O(),q(e.message())}}function Vj(e,t){if(e&1){let e=V();I(0,`button`,2),H(`click`,function(){return w(e),T(W().open())}),Mg(1,3),L(),j(2,Bj,2,1,`span`,4)}if(e&2){let e=W(),t=Qg(1);F(`title`,`Open `+e.label()+` in your editor`),A(`aria-label`,`Open `+e.label()+` in your editor`),O(),F(`ngTemplateOutlet`,t),O(),M(e.message()?2:-1)}}function Hj(e,t){if(e&1&&(I(0,`span`,1),Mg(1,3),L()),e&2){let e=W(),t=Qg(1);F(`title`,e.label()),O(),F(`ngTemplateOutlet`,t)}}var Uj=class e{source=D(D(null));client=X(()=>this.source()());available=X(()=>{let e=this.client();return!!e&&!tE(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 $T(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=Rl({token:e,factory:e.ɵfac})};function Wj(e,t){return t?`${e}:${t}`:e}var Gj=class e{editor=C(Uj);file=$.required();line=$(void 0);label=X(()=>Wj(this.file(),this.line()));message=D(``);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=k({type:e,selectors:[[`app-source-link`]],inputs:{file:[1,`file`],line:[1,`line`]},ngContentSelectors:Lj,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&&(qg(),Jh(0,zj,2,0,`ng-template`,null,0,mv),j(2,Vj,3,4)(3,Hj,2,2,`span`,1)),e&2&&(O(2),M(t.editor.available()?2:3))},dependencies:[uy],styles:[`[_nghost-%COMP%] { display: inline; min-width: 0; } @@ -1846,7 +1870,7 @@ td.mono[_ngcontent-%COMP%] { color: var(--%NS%danger-text); font-family: var(--%NS%font-sans); font-size: 0.92em; -}`]})},Ij=[`field`],Lj=[`editButton`],Rj=[`valueBox`];function zj(e,t){if(e&1){let e=V();z(0,`div`,5)(1,`label`,6),K(2),B(),z(3,`input`,7,0),U(`input`,function(t){return w(e),T(W().draft.set(t.target.value))})(`keydown.enter`,function(t){w(e);let n=W();return t.preventDefault(),T(n.apply())})(`keydown.escape`,function(t){w(e);let n=W();return t.preventDefault(),t.stopPropagation(),T(n.cancel())}),B(),z(5,`button`,8),U(`click`,function(){return w(e),T(W().apply())}),K(6,`Apply`),B(),z(7,`button`,9),U(`click`,function(){return w(e),T(W().cancel())}),K(8,`Cancel`),B()(),z(9,`p`,10),K(10),B()}if(e&2){let e=W();O(),Pg(`htmlFor`,e.fieldId),O(),J(`New value of `,e.prop().name,`, as JSON`),O(),Pg(`id`,e.fieldId)(`value`,e.draft())(`readOnly`,e.busy()),A(`aria-busy`,e.busy()?`true`:null)(`aria-invalid`,e.error()?`true`:null)(`aria-describedby`,e.hintId+(e.error()?` `+e.errorId:``)),O(2),Pg(`disabled`,e.busy()),O(4),Pg(`id`,e.hintId),O(),J(` JSON, such as "text", 42, true or `,e.objectSample,`. Enter applies, Escape cancels. `)}}function Bj(e,t){if(e&1&&(z(0,`pre`,null,1),K(2),lv(3,`json`),B()),e&2){let e=W(2);A(`tabindex`,e.scrollable()?0:null)(`role`,e.scrollable()?`region`:null)(`aria-label`,e.scrollable()?`Value of `+e.prop().name:null),O(2),q(uv(3,4,e.prop().value))}}function Vj(e,t){if(e&1){let e=V();z(0,`button`,14,2),U(`click`,function(){return w(e),T(W(2).start())}),K(2,` Edit `),B()}if(e&2){let e=W(2);Pg(`disabled`,e.busy()),A(`aria-label`,`Edit `+e.prop().name)}}function Hj(e,t){if(e&1&&(z(0,`p`,13),K(1),B()),e&2){let e=W(2);O(),q(e.prop().locked)}}function Uj(e,t){if(e&1&&(z(0,`div`,11),j(1,Bj,4,6,`pre`),j(2,Vj,3,2,`button`,12),B(),j(3,Hj,2,1,`p`,13)),e&2){let e=W();O(),M(e.bare()?-1:1),O(),M(e.editable()?2:-1),O(),M(e.writes()&&e.prop().locked?3:-1)}}function Wj(e,t){if(e&1&&(z(0,`p`,3),K(1),B()),e&2){let e=W();Pg(`id`,e.errorId),O(),q(e.error())}}var Gj=0;function Kj(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 qj=class e{prop=$.required();componentId=$.required();pageId=$(null);rpc=$(null);writes=$(!1);bare=$(!1);readDraft=$(null);fieldId=`prop-edit-${++Gj}`;hintId=`${this.fieldId}-hint`;errorId=`${this.fieldId}-error`;objectSample=`{"a": 1}`;editing=D(!1);draft=D(``);busy=D(!1);error=D(``);done=D(``);editable=X(()=>this.writes()&&!!this.prop().edit&&!!this.pageId()&&!!this.rpc());field=Dv(`field`);editButton=Dv(`editButton`);valueBox=Dv(`valueBox`);injector=C(Os);scrollable=D(!1);constructor(){Pv(()=>{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),ud(()=>{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=Kj(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(){ud(()=>this.editButton()?.nativeElement.focus(),{injector:this.injector})}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-prop-value`]],viewQuery:function(e,t){e&1&&Xg(t.field,Ij,5)(t.editButton,Lj,5)(t.valueBox,Rj,5),e&2&&Zg(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&&(j(0,zj,11,11)(1,Uj,4,3),j(2,Wj,2,2,`p`,3),z(3,`p`,4),K(4),B()),e&2&&(M(+!t.editing()),O(2),M(t.error()?2:-1),O(2),q(t.done()))},dependencies:[yy],styles:[`[_nghost-%COMP%] { +}`]})},Kj=[`field`],qj=[`editButton`],Jj=[`valueBox`];function Yj(e,t){if(e&1){let e=V();z(0,`div`,5)(1,`label`,6),K(2),B(),z(3,`input`,7,0),U(`input`,function(t){return w(e),T(W().draft.set(t.target.value))})(`keydown.enter`,function(t){w(e);let n=W();return t.preventDefault(),T(n.apply())})(`keydown.escape`,function(t){w(e);let n=W();return t.preventDefault(),t.stopPropagation(),T(n.cancel())}),B(),z(5,`button`,8),U(`click`,function(){return w(e),T(W().apply())}),K(6,`Apply`),B(),z(7,`button`,9),U(`click`,function(){return w(e),T(W().cancel())}),K(8,`Cancel`),B()(),z(9,`p`,10),K(10),B()}if(e&2){let e=W();O(),Pg(`htmlFor`,e.fieldId),O(),J(`New value of `,e.prop().name,`, as JSON`),O(),Pg(`id`,e.fieldId)(`value`,e.draft())(`readOnly`,e.busy()),A(`aria-busy`,e.busy()?`true`:null)(`aria-invalid`,e.error()?`true`:null)(`aria-describedby`,e.hintId+(e.error()?` `+e.errorId:``)),O(2),Pg(`disabled`,e.busy()),O(4),Pg(`id`,e.hintId),O(),J(` JSON, such as "text", 42, true or `,e.objectSample,`. Enter applies, Escape cancels. `)}}function Xj(e,t){if(e&1&&(z(0,`pre`,null,1),K(2),uv(3,`json`),B()),e&2){let e=W(2);A(`tabindex`,e.scrollable()?0:null)(`role`,e.scrollable()?`region`:null)(`aria-label`,e.scrollable()?`Value of `+e.prop().name:null),O(2),q(dv(3,4,e.prop().value))}}function Zj(e,t){if(e&1){let e=V();z(0,`button`,14,2),U(`click`,function(){return w(e),T(W(2).start())}),K(2,` Edit `),B()}if(e&2){let e=W(2);Pg(`disabled`,e.busy()),A(`aria-label`,`Edit `+e.prop().name)}}function Qj(e,t){if(e&1&&(z(0,`p`,13),K(1),B()),e&2){let e=W(2);O(),q(e.prop().locked)}}function $j(e,t){if(e&1&&(z(0,`div`,11),j(1,Xj,4,6,`pre`),j(2,Zj,3,2,`button`,12),B(),j(3,Qj,2,1,`p`,13)),e&2){let e=W();O(),M(e.bare()?-1:1),O(),M(e.editable()?2:-1),O(),M(e.writes()&&e.prop().locked?3:-1)}}function eM(e,t){if(e&1&&(z(0,`p`,3),K(1),B()),e&2){let e=W();Pg(`id`,e.errorId),O(),q(e.error())}}var tM=0;function nM(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 rM=class e{prop=$.required();componentId=$.required();pageId=$(null);rpc=$(null);writes=$(!1);bare=$(!1);readDraft=$(null);fieldId=`prop-edit-${++tM}`;hintId=`${this.fieldId}-hint`;errorId=`${this.fieldId}-error`;objectSample=`{"a": 1}`;editing=D(!1);draft=D(``);busy=D(!1);error=D(``);done=D(``);editable=X(()=>this.writes()&&!!this.prop().edit&&!!this.pageId()&&!!this.rpc());field=Ov(`field`);editButton=Ov(`editButton`);valueBox=Ov(`valueBox`);injector=C(Os);scrollable=D(!1);constructor(){Fv(()=>{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),dd(()=>{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=nM(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(){dd(()=>this.editButton()?.nativeElement.focus(),{injector:this.injector})}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-prop-value`]],viewQuery:function(e,t){e&1&&Xg(t.field,Kj,5)(t.editButton,qj,5)(t.valueBox,Jj,5),e&2&&Zg(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&&(j(0,Yj,11,11)(1,$j,4,3),j(2,eM,2,2,`p`,3),z(3,`p`,4),K(4),B()),e&2&&(M(+!t.editing()),O(2),M(t.error()?2:-1),O(2),q(t.done()))},dependencies:[gy],styles:[`[_nghost-%COMP%] { display: block; min-width: 0; } @@ -1969,7 +1993,7 @@ button.edit[_ngcontent-%COMP%] { .error[_ngcontent-%COMP%] { color: var(--%NS%danger-text); -}`]})},Jj=1e3,Yj={depth:5,limit:100},Xj=`[redacted]`;function Zj(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function Qj(e){return Zj(e)&&typeof e.$more==`number`&&Object.keys(e).length===1}function $j(e){return Zj(e)&&typeof e.$collapsed==`string`&&typeof e.size==`number`&&Object.keys(e).length===2}function eM(e){return e===`Array`?`array`:e===`Map`?`map`:e===`Set`?`set`:`object`}function tM(e){return e.$type===`Map`&&Array.isArray(e.entries)}function nM(e){return e.$type===`Set`&&Array.isArray(e.values)}function rM(e){return Object.keys(e).filter(e=>e!==`$type`&&e!==`$more`)}function iM(e){if(!e||typeof e!=`object`)return null;if($j(e))return e.size<=0?null:{kind:eM(e.$collapsed),type:e.$collapsed,size:e.size,collapsed:!0};if(Qj(e))return null;if(Array.isArray(e)){let t=e.at(-1),n=Qj(t)?t.$more:0,r=e.length-+!!n+n;return r?{kind:`array`,type:`Array`,size:r,collapsed:!1}:null}let t=e;if(tM(t)||nM(t)){let e=typeof t.size==`number`?t.size:0,n=tM(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=rM(t).length+n,i=typeof t.$type==`string`?t.$type:`Object`;return r?{kind:`object`,type:i,size:r,collapsed:!1}:null}function aM(e){if(typeof e==`string`)return JSON.stringify(e);let t=iM(e);if(t)return cM(t);try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function oM(e){let t=iM(e);if(!t||t.collapsed)return{children:[],more:0};if(Array.isArray(e)){let n=(Qj(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:aM(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:rM(n).map(e=>({key:e,label:e,value:n[e]})),more:typeof n.$more==`number`?n.$more:0}}function sM(e,t,n){return`${e} ${e===1?t:n}`}function cM(e){let t={array:sM(e.size,`item`,`items`),object:sM(e.size,`key`,`keys`),map:sM(e.size,`entry`,`entries`),set:sM(e.size,`value`,`values`)}[e.kind];return`${e.type} (${t})`}function lM(e,t){return JSON.stringify(t===void 0?e:[t,...e])}function uM(e,t){return e.map((e,n)=>n===0?e:(t?t[n-1]!==`object`:/^\d+$/.test(e))?`[${e}]`:`.${e}`).join(``)}function dM(e){return e.every(e=>e&&e===e.trim()&&!/[.[\]]/.test(e))?e.join(`.`):null}var fM=/^\[(Getter|Unreadable|Circular|Truncated|Function\b.*|Promise)\]$/;function pM(e){return e===null||typeof e==`boolean`?!0:typeof e==`number`?Number.isFinite(e):typeof e==`string`&&e!==Xj&&!fM.test(e)&&!e.endsWith(`…`)}function mM(e,t){return!e||t.kind===`map`||t.kind===`set`||e===`signal`&&t.kind===`object`&&t.type!==`Object`?null:e}function hM(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=lM(e);if(!(s.has(r)||a.length>=i)){s.add(r);for(let r of oM(t).children){let t=[...e,r.key];if(r.label.toLowerCase().includes(o)&&a.push(t),!iM(r.value))continue;let i=n(t)??(iM(r.value)?.collapsed?void 0:r.value);i!==void 0&&c(t,i)}}};return c(e,n(e)??t),a}var gM=(e,t)=>t.id;function _M(e,t){if(e&1){let e=V();I(0,`button`,2),H(`click`,function(){w(e);let t=W().$implicit;return T(W(3).toggle(t))}),E(),I(1,`svg`,3),R(2,`path`,4),L(),bs(),I(3,`span`,14),K(4),L(),I(5,`span`,5),K(6),L()()}if(e&2){let e=W().$implicit;A(`aria-expanded`,e.open)(`aria-label`,e.label+`: `+e.text),O(4),J(``,e.label,`:`),O(2),q(e.text)}}function vM(e,t){if(e&1&&R(0,`app-prop-value`,15),e&2){let e=W(5);F(`prop`,t)(`componentId`,e.componentId())(`pageId`,e.pageId())(`rpc`,e.rpc())(`writes`,e.writes())}}function yM(e,t){if(e&1&&(I(0,`span`,16),K(1),L()),e&2){let e=W(2).$implicit;O(),q(e.text)}}function bM(e,t){if(e&1&&(I(0,`span`,14),K(1),L(),j(2,vM,1,5,`app-prop-value`,15)(3,yM,2,1,`span`,16)),e&2){let e,t=W().$implicit;O(),J(``,t.label,`:`),O(),M((e=t.edit)?2:3,e)}}function xM(e,t){if(e&1){let e=V();I(0,`button`,17),H(`click`,function(){w(e);let t=W().$implicit;return T(W(3).more(t))}),K(1),I(2,`span`,18),K(3),L()()}if(e&2){let e=W().$implicit,t=W(3);O(),J(` Show `,t.step(e),` more `),O(2),J(`(`,e.more,` not listed)`)}}function SM(e,t){e&1&&(I(0,`span`,12),K(1,`Reading from the page…`),L())}function CM(e,t){if(e&1&&(I(0,`span`,13),K(1),L()),e&2){let e=W().$implicit;O(),q(e.text)}}function wM(e,t){if(e&1&&(I(0,`li`,9),j(1,_M,7,4,`button`,10)(2,bM,4,2)(3,xM,4,2,`button`,11)(4,SM,2,0,`span`,12)(5,CM,2,1,`span`,13),L()),e&2){let e,n=t.$implicit;y_(`padding-left`,n.depth*14,`px`),O(),M((e=n.kind)===`node`?1:e===`leaf`?2:e===`more`?3:e===`loading`?4:e===`error`?5:-1)}}function TM(e,t){if(e&1&&(I(0,`ul`,7),N(1,wM,6,3,`li`,8,gM),L()),e&2){let e=W(2);F(`id`,e.listId),A(`aria-label`,e.prop().name+` entries`),O(),P(e.rows())}}function EM(e,t){if(e&1){let e=V();I(0,`div`,1)(1,`button`,2),H(`click`,function(){return w(e),T(W().toggleRoot())}),E(),I(2,`svg`,3),R(3,`path`,4),L(),bs(),I(4,`span`,5),K(5),L()(),R(6,`app-prop-value`,6),L(),j(7,TM,3,2,`ul`,7)}if(e&2){let e=t,n=W();O(),A(`aria-expanded`,n.rootOpen())(`aria-controls`,n.rootOpen()?n.listId:null)(`aria-label`,n.prop().name+`: `+n.summaryOf(e)),O(4),q(n.summaryOf(e)),O(),F(`bare`,!0)(`prop`,n.prop())(`componentId`,n.componentId())(`pageId`,n.pageId())(`rpc`,n.rpc())(`writes`,n.writes())(`readDraft`,n.readWhole),O(),M(n.rootOpen()?7:-1)}}function DM(e,t){if(e&1&&R(0,`app-prop-value`,0),e&2){let e=W();F(`prop`,e.prop())(`componentId`,e.componentId())(`pageId`,e.pageId())(`rpc`,e.rpc())(`writes`,e.writes())}}var OM=0;function kM(e){if(e===void 0)return`undefined`;try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function AM(e){if(Array.isArray(e))return e.every(AM);if(e&&typeof e==`object`){let t=e;return![`$collapsed`,`$more`,`$type`].some(e=>Object.hasOwn(t,e))&&Object.values(t).every(AM)}return pM(e)}var jM=class e{prop=$.required();store=$.required();componentId=$.required();pageId=$(null);rpc=$(null);writes=$(!1);directive=$(void 0);query=$(``);listId=`value-tree-${++OM}`;host=C(Vl);pendingMore=null;constructor(){Pv(()=>{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(()=>iM(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 hM(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(lM(e));for(let t=2;t<=e.length;t++)i.add(lM(e.slice(0,t)))}let o=this.prop(),s=this.writes()&&n===void 0,c=[],l=(e,o,d,f,p,m)=>{let{children:h,more:g}=oM(e);for(let e of h){let h=[...o,e.key],g=lM(h);if(r&&!m&&!i.has(g))continue;let _=iM(e.value),ee=lM(h,n);if(!_){let t=p&&pM(e.value)?dM(h):null;c.push({id:ee,kind:`leaf`,depth:f,path:h,label:e.label,text:kM(e.value),edit:s&&t&&p?{name:uM(h,[...d]),prop:t,value:e.value,edit:p}:void 0});continue}let te=!!r&&!m&&i.has(g)&&!a.has(g)||t.isOpen(h,n);if(c.push({id:ee,kind:`node`,depth:f,path:h,label:e.label,text:cM(_),container:_,open:te}),!te)continue;let ne=t.level(h,n)??(_.collapsed?void 0:e.value),re=[...d,_.kind];ne===void 0?t.errors().has(ee)?c.push({...u(h,f+1,`error`),text:t.errors().get(ee)}):c.push(u(h,f+1,`loading`)):l(ne,h,re,f+1,mM(p,_),m||a.has(g))}g>0&&(!r||m)&&c.push({...u(o,f,`more`),more:g,listed:h.length})},u=(e,t,r)=>({id:`${lM(e,n)}:${r}`,kind:r,depth:t,path:e,label:``,text:``});return l(this.rootValue(),this.rootPath(),[e.kind],0,s?mM(o.editInside??null,e):null,!r),c});readWhole=async()=>{let e=await this.store().read(this.rootPath(),Yj.depth,Yj.limit);return e.ok?AM(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 cM(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=k({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&&j(0,EM,8,12)(1,DM,1,5,`app-prop-value`,0),e&2){let e;M((e=t.root())?0:1,e)}},dependencies:[qj],styles:[`[_nghost-%COMP%] { +}`]})},iM=1e3,aM={depth:5,limit:100},oM=`[redacted]`;function sM(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function cM(e){return sM(e)&&typeof e.$more==`number`&&Object.keys(e).length===1}function lM(e){return sM(e)&&typeof e.$collapsed==`string`&&typeof e.size==`number`&&Object.keys(e).length===2}function uM(e){return e===`Array`?`array`:e===`Map`?`map`:e===`Set`?`set`:`object`}function dM(e){return e.$type===`Map`&&Array.isArray(e.entries)}function fM(e){return e.$type===`Set`&&Array.isArray(e.values)}function pM(e){return Object.keys(e).filter(e=>e!==`$type`&&e!==`$more`)}function mM(e){if(!e||typeof e!=`object`)return null;if(lM(e))return e.size<=0?null:{kind:uM(e.$collapsed),type:e.$collapsed,size:e.size,collapsed:!0};if(cM(e))return null;if(Array.isArray(e)){let t=e.at(-1),n=cM(t)?t.$more:0,r=e.length-+!!n+n;return r?{kind:`array`,type:`Array`,size:r,collapsed:!1}:null}let t=e;if(dM(t)||fM(t)){let e=typeof t.size==`number`?t.size:0,n=dM(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=pM(t).length+n,i=typeof t.$type==`string`?t.$type:`Object`;return r?{kind:`object`,type:i,size:r,collapsed:!1}:null}function hM(e){if(typeof e==`string`)return JSON.stringify(e);let t=mM(e);if(t)return vM(t);try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function gM(e){let t=mM(e);if(!t||t.collapsed)return{children:[],more:0};if(Array.isArray(e)){let n=(cM(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:hM(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:pM(n).map(e=>({key:e,label:e,value:n[e]})),more:typeof n.$more==`number`?n.$more:0}}function _M(e,t,n){return`${e} ${e===1?t:n}`}function vM(e){let t={array:_M(e.size,`item`,`items`),object:_M(e.size,`key`,`keys`),map:_M(e.size,`entry`,`entries`),set:_M(e.size,`value`,`values`)}[e.kind];return`${e.type} (${t})`}function yM(e,t){return JSON.stringify(t===void 0?e:[t,...e])}function bM(e,t){return e.map((e,n)=>n===0?e:(t?t[n-1]!==`object`:/^\d+$/.test(e))?`[${e}]`:`.${e}`).join(``)}function xM(e){return e.every(e=>e&&e===e.trim()&&!/[.[\]]/.test(e))?e.join(`.`):null}var SM=/^\[(Getter|Unreadable|Circular|Truncated|Function\b.*|Promise)\]$/;function CM(e){return e===null||typeof e==`boolean`?!0:typeof e==`number`?Number.isFinite(e):typeof e==`string`&&e!==oM&&!SM.test(e)&&!e.endsWith(`…`)}function wM(e,t){return!e||t.kind===`map`||t.kind===`set`||e===`signal`&&t.kind===`object`&&t.type!==`Object`?null:e}function TM(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=yM(e);if(!(s.has(r)||a.length>=i)){s.add(r);for(let r of gM(t).children){let t=[...e,r.key];if(r.label.toLowerCase().includes(o)&&a.push(t),!mM(r.value))continue;let i=n(t)??(mM(r.value)?.collapsed?void 0:r.value);i!==void 0&&c(t,i)}}};return c(e,n(e)??t),a}var EM=(e,t)=>t.id;function DM(e,t){if(e&1){let e=V();I(0,`button`,2),H(`click`,function(){w(e);let t=W().$implicit;return T(W(3).toggle(t))}),E(),I(1,`svg`,3),R(2,`path`,4),L(),bs(),I(3,`span`,14),K(4),L(),I(5,`span`,5),K(6),L()()}if(e&2){let e=W().$implicit;A(`aria-expanded`,e.open)(`aria-label`,e.label+`: `+e.text),O(4),J(``,e.label,`:`),O(2),q(e.text)}}function OM(e,t){if(e&1&&R(0,`app-prop-value`,15),e&2){let e=W(5);F(`prop`,t)(`componentId`,e.componentId())(`pageId`,e.pageId())(`rpc`,e.rpc())(`writes`,e.writes())}}function kM(e,t){if(e&1&&(I(0,`span`,16),K(1),L()),e&2){let e=W(2).$implicit;O(),q(e.text)}}function AM(e,t){if(e&1&&(I(0,`span`,14),K(1),L(),j(2,OM,1,5,`app-prop-value`,15)(3,kM,2,1,`span`,16)),e&2){let e,t=W().$implicit;O(),J(``,t.label,`:`),O(),M((e=t.edit)?2:3,e)}}function jM(e,t){if(e&1){let e=V();I(0,`button`,17),H(`click`,function(){w(e);let t=W().$implicit;return T(W(3).more(t))}),K(1),I(2,`span`,18),K(3),L()()}if(e&2){let e=W().$implicit,t=W(3);O(),J(` Show `,t.step(e),` more `),O(2),J(`(`,e.more,` not listed)`)}}function MM(e,t){e&1&&(I(0,`span`,12),K(1,`Reading from the page…`),L())}function NM(e,t){if(e&1&&(I(0,`span`,13),K(1),L()),e&2){let e=W().$implicit;O(),q(e.text)}}function PM(e,t){if(e&1&&(I(0,`li`,9),j(1,DM,7,4,`button`,10)(2,AM,4,2)(3,jM,4,2,`button`,11)(4,MM,2,0,`span`,12)(5,NM,2,1,`span`,13),L()),e&2){let e,n=t.$implicit;y_(`padding-left`,n.depth*14,`px`),O(),M((e=n.kind)===`node`?1:e===`leaf`?2:e===`more`?3:e===`loading`?4:e===`error`?5:-1)}}function FM(e,t){if(e&1&&(I(0,`ul`,7),N(1,PM,6,3,`li`,8,EM),L()),e&2){let e=W(2);F(`id`,e.listId),A(`aria-label`,e.prop().name+` entries`),O(),P(e.rows())}}function IM(e,t){if(e&1){let e=V();I(0,`div`,1)(1,`button`,2),H(`click`,function(){return w(e),T(W().toggleRoot())}),E(),I(2,`svg`,3),R(3,`path`,4),L(),bs(),I(4,`span`,5),K(5),L()(),R(6,`app-prop-value`,6),L(),j(7,FM,3,2,`ul`,7)}if(e&2){let e=t,n=W();O(),A(`aria-expanded`,n.rootOpen())(`aria-controls`,n.rootOpen()?n.listId:null)(`aria-label`,n.prop().name+`: `+n.summaryOf(e)),O(4),q(n.summaryOf(e)),O(),F(`bare`,!0)(`prop`,n.prop())(`componentId`,n.componentId())(`pageId`,n.pageId())(`rpc`,n.rpc())(`writes`,n.writes())(`readDraft`,n.readWhole),O(),M(n.rootOpen()?7:-1)}}function LM(e,t){if(e&1&&R(0,`app-prop-value`,0),e&2){let e=W();F(`prop`,e.prop())(`componentId`,e.componentId())(`pageId`,e.pageId())(`rpc`,e.rpc())(`writes`,e.writes())}}var RM=0;function zM(e){if(e===void 0)return`undefined`;try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function BM(e){if(Array.isArray(e))return e.every(BM);if(e&&typeof e==`object`){let t=e;return![`$collapsed`,`$more`,`$type`].some(e=>Object.hasOwn(t,e))&&Object.values(t).every(BM)}return CM(e)}var VM=class e{prop=$.required();store=$.required();componentId=$.required();pageId=$(null);rpc=$(null);writes=$(!1);directive=$(void 0);query=$(``);listId=`value-tree-${++RM}`;host=C(Vl);pendingMore=null;constructor(){Fv(()=>{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(()=>mM(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 TM(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(yM(e));for(let t=2;t<=e.length;t++)i.add(yM(e.slice(0,t)))}let o=this.prop(),s=this.writes()&&n===void 0,c=[],l=(e,o,d,f,p,m)=>{let{children:h,more:g}=gM(e);for(let e of h){let h=[...o,e.key],g=yM(h);if(r&&!m&&!i.has(g))continue;let _=mM(e.value),ee=yM(h,n);if(!_){let t=p&&CM(e.value)?xM(h):null;c.push({id:ee,kind:`leaf`,depth:f,path:h,label:e.label,text:zM(e.value),edit:s&&t&&p?{name:bM(h,[...d]),prop:t,value:e.value,edit:p}:void 0});continue}let te=!!r&&!m&&i.has(g)&&!a.has(g)||t.isOpen(h,n);if(c.push({id:ee,kind:`node`,depth:f,path:h,label:e.label,text:vM(_),container:_,open:te}),!te)continue;let ne=t.level(h,n)??(_.collapsed?void 0:e.value),re=[...d,_.kind];ne===void 0?t.errors().has(ee)?c.push({...u(h,f+1,`error`),text:t.errors().get(ee)}):c.push(u(h,f+1,`loading`)):l(ne,h,re,f+1,wM(p,_),m||a.has(g))}g>0&&(!r||m)&&c.push({...u(o,f,`more`),more:g,listed:h.length})},u=(e,t,r)=>({id:`${yM(e,n)}:${r}`,kind:r,depth:t,path:e,label:``,text:``});return l(this.rootValue(),this.rootPath(),[e.kind],0,s?wM(o.editInside??null,e):null,!r),c});readWhole=async()=>{let e=await this.store().read(this.rootPath(),aM.depth,aM.limit);return e.ok?BM(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 vM(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=k({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&&j(0,IM,8,12)(1,LM,1,5,`app-prop-value`,0),e&2){let e;M((e=t.root())?0:1,e)}},dependencies:[rM],styles:[`[_nghost-%COMP%] { display: block; min-width: 0; } @@ -2091,7 +2115,7 @@ button.edit[_ngcontent-%COMP%] { .more[_ngcontent-%COMP%] { transition: none; } -}`]})};function MM(e,t){return e.length>t.length&&e.startsWith(`${t.slice(0,-1)},`)}var NM=class{sender;target={rpc:null,pageId:null,componentId:null};fetched=D(new Map);pushed=D({});open=D(new Set);loading=D(new Set);errors=D(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=lM(e,t),r=this.pushed();return Object.hasOwn(r,n)?r[n]:this.fetched().get(n)}isOpen(e,t){return this.open().has(lM(e,t))}toggle(e,t,n){let r=lM(e,t),i=new Set(this.open());if(i.has(r)){for(let e of i)(e===r||MM(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=lM(e,t),i=Math.min(Jj,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=lM(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 PM(e,t){if(e&1&&(z(0,`span`,1),K(1),B()),e&2){let e=W(2);O(),J(`: `,e.label())}}function FM(e,t){if(e&1&&(z(0,`span`,1),K(1),B()),e&2){let e=W(3);O(),J(`: `,e.label())}}function IM(e,t){if(e&1){let e=V();z(0,`button`,4),U(`click`,function(){return w(e),T(W(2).store(`log`))}),K(1,` Log to console `),j(2,FM,2,1,`span`,1),B()}if(e&2){let e=W(2);Pg(`disabled`,e.busy()||!e.rpc()||!e.pageId()),O(2),M(e.label()?2:-1)}}function LM(e,t){if(e&1){let e=V();z(0,`button`,0),U(`click`,function(){return w(e),T(W().store())}),K(1,` Store as global `),j(2,PM,2,1,`span`,1),B(),j(3,IM,3,2,`button`,2),z(4,`span`,3),K(5),B()}if(e&2){let e=W();Pg(`disabled`,e.busy()||!e.rpc()||!e.pageId()),O(2),M(e.label()?2:-1),O(),M(e.canLog()?3:-1),O(2),q(e.message())}}var RM=class e{rpc=$(null);pageId=$(null);target=$.required();label=$(``);canLog=$(!1);staticReport=X(()=>rE(this.rpc()));busy=D(!1);message=D(``);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=k({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&&j(0,LM,6,4),e&2&&M(t.staticReport()?-1:0)},styles:[`[_nghost-%COMP%] { +}`]})};function HM(e,t){return e.length>t.length&&e.startsWith(`${t.slice(0,-1)},`)}var UM=class{sender;target={rpc:null,pageId:null,componentId:null};fetched=D(new Map);pushed=D({});open=D(new Set);loading=D(new Set);errors=D(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=yM(e,t),r=this.pushed();return Object.hasOwn(r,n)?r[n]:this.fetched().get(n)}isOpen(e,t){return this.open().has(yM(e,t))}toggle(e,t,n){let r=yM(e,t),i=new Set(this.open());if(i.has(r)){for(let e of i)(e===r||HM(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=yM(e,t),i=Math.min(iM,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=yM(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 WM(e,t){if(e&1&&(z(0,`span`,1),K(1),B()),e&2){let e=W(2);O(),J(`: `,e.label())}}function GM(e,t){if(e&1&&(z(0,`span`,1),K(1),B()),e&2){let e=W(3);O(),J(`: `,e.label())}}function KM(e,t){if(e&1){let e=V();z(0,`button`,4),U(`click`,function(){return w(e),T(W(2).store(`log`))}),K(1,` Log to console `),j(2,GM,2,1,`span`,1),B()}if(e&2){let e=W(2);Pg(`disabled`,e.busy()||!e.rpc()||!e.pageId()),O(2),M(e.label()?2:-1)}}function qM(e,t){if(e&1){let e=V();z(0,`button`,0),U(`click`,function(){return w(e),T(W().store())}),K(1,` Store as global `),j(2,WM,2,1,`span`,1),B(),j(3,KM,3,2,`button`,2),z(4,`span`,3),K(5),B()}if(e&2){let e=W();Pg(`disabled`,e.busy()||!e.rpc()||!e.pageId()),O(2),M(e.label()?2:-1),O(),M(e.canLog()?3:-1),O(2),q(e.message())}}var JM=class e{rpc=$(null);pageId=$(null);target=$.required();label=$(``);canLog=$(!1);staticReport=X(()=>tE(this.rpc()));busy=D(!1);message=D(``);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=k({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&&j(0,qM,6,4),e&2&&M(t.staticReport()?-1:0)},styles:[`[_nghost-%COMP%] { display: inline-flex; flex-wrap: wrap; align-items: center; @@ -2140,7 +2164,7 @@ button.edit[_ngcontent-%COMP%] { .status[_ngcontent-%COMP%]:empty { display: none; -}`]})},zM=(e,t)=>t.block.id,BM=(e,t)=>t.kind;function VM(e,t){if(e&1&&K(0),e&2){let e=W().$implicit;J(` `,e.label,` `)}}function HM(e,t){if(e&1&&(K(0),z(1,`span`,11),K(2),B()),e&2){let e=W().$implicit;J(` `,e.kind,` `),O(2),J(``,e.seconds,`s`)}}function UM(e,t){if(e&1&&(z(0,`span`,8),j(1,VM,1,1)(2,HM,3,2),B()),e&2){let e=t.$implicit;b_(`note-`+e.kind),A(`title`,e.text),O(),M(e.seconds===void 0?1:2)}}function WM(e,t){e&1&&(z(0,`span`,8),K(1,`hydrated`),B())}function GM(e,t){e&1&&(z(0,`span`,8),K(1,`@error block`),B())}function KM(e,t){if(e&1&&(z(0,`span`,9),K(1),B()),e&2){let e=W().$implicit;O(),q(e.timings)}}function qM(e,t){if(e&1){let e=V();z(0,`li`)(1,`button`,4),U(`click`,function(){let t=w(e).$implicit;return T(W(2).showOwner.emit(t.block))})(`focus`,function(){let t=w(e).$implicit;return T(W(2).highlight.emit(t.block))})(`blur`,function(){return w(e),T(W(2).highlight.emit(null))})(`mouseenter`,function(){let t=w(e).$implicit;return T(W(2).highlight.emit(t.block))})(`mouseleave`,function(){return w(e),T(W(2).highlight.emit(null))}),z(2,`span`,5),K(3),B(),z(4,`span`,6),K(5),B(),N(6,UM,3,4,`span`,7,BM),j(8,WM,2,0,`span`,8),j(9,GM,2,0,`span`,8),j(10,KM,2,1,`span`,9),z(11,`span`,10),K(12),B()()()}if(e&2){let e=t.$implicit;O(),A(`aria-disabled`,e.block.owner?null:`true`),O(2),q(e.block.owner?.name??`Unknown component`),O(),b_(`defer-state-`+e.block.state),O(),q(e.block.state),O(),P(e.notes),O(2),M(e.block.hydration===`hydrated`?8:-1),O(),M(e.block.hasErrorBlock?9:-1),O(),M(e.timings?10:-1),O(2),q(e.block.triggers.join(`, `)||`no triggers`)}}function JM(e,t){if(e&1&&(z(0,`section`,0)(1,`h2`,1),K(2,` Defer blocks `),z(3,`span`,2),K(4),B()(),z(5,`ul`,3),N(6,qM,13,9,`li`,null,zM),B()()),e&2){let e=W();O(4),Y(``,e.rows().length,``,e.truncated()?`+`:``),O(2),P(e.rows())}}function YM(e){return e<1e3?`${e}ms`:`${Number((e/1e3).toFixed(2))}s`}function XM(e){let t=[],n=e.placeholder?.minimumTime;n!=null&&t.push(`placeholder min ${YM(n)}`);let r=[e.loading?.afterTime==null?``:`after ${YM(e.loading.afterTime)}`,e.loading?.minimumTime==null?``:`min ${YM(e.loading.minimumTime)}`].filter(Boolean);return r.length&&t.push(`loading ${r.join(`, `)}`),t.join(` · `)}var ZM=class e{blocks=$([]);truncated=$(!1);clockOffset=$(0);showOwner=bv();highlight=bv();now=D(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:KT({...t,since:t.since||e},e),timings:XM(t)}))});constructor(){let e,t=()=>{clearInterval(e),e=void 0};_c(()=>{if(!this.waiting())return t();e===void 0&&(this.now.set(Date.now()),e=setInterval(()=>this.now.set(Date.now()),1e3))}),C(As).onDestroy(t)}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-defer-blocks`]],inputs:{blocks:[1,`blocks`],truncated:[1,`truncated`],clockOffset:[1,`clockOffset`]},outputs:{showOwner:`showOwner`,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`],[`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,`triggers`,`mono`],[`aria-hidden`,`true`]],template:function(e,t){e&1&&j(0,JM,8,2,`section`,0),e&2&&M(t.rows().length?0:-1)},styles:[`[_nghost-%COMP%] { +}`]})},YM=(e,t)=>t.block.id,XM=(e,t)=>t.kind,ZM=(e,t)=>t.id;function QM(e,t){if(e&1&&K(0),e&2){let e=W().$implicit;J(` `,e.label,` `)}}function $M(e,t){if(e&1&&(K(0),z(1,`span`,18),K(2),B()),e&2){let e=W().$implicit;J(` `,e.kind,` `),O(2),J(``,e.seconds,`s`)}}function eN(e,t){if(e&1&&(z(0,`span`,9),j(1,QM,1,1)(2,$M,3,2),B()),e&2){let e=t.$implicit;b_(`note-`+e.kind),A(`title`,e.text),O(),M(e.seconds===void 0?1:2)}}function tN(e,t){if(e&1&&(z(0,`span`,9),K(1),B()),e&2){let e=W().$implicit;A(`title`,e.block.hydratedAt===void 0?`The block hydrated before the devtools attached to the page.`:null),O(),q(e.hydrated)}}function nN(e,t){e&1&&(z(0,`span`,9),K(1,`@error block`),B())}function rN(e,t){if(e&1&&(z(0,`span`,10),K(1),B()),e&2){let e=W().$implicit;O(),q(e.timings)}}function iN(e,t){e&1&&(z(0,`span`,11),K(1,`mismatch`),B())}function aN(e,t){if(e&1&&(z(0,`dt`),K(1,`Template of`),B(),z(2,`dd`,19),K(3),B()),e&2){let e=t;O(3),Y(``,e.name,` <`,e.tag,`>`)}}function oN(e,t){if(e&1&&(z(0,`dt`),K(1,`In this state since`),B(),z(2,`dd`),K(3),B()),e&2){let e=W(2).$implicit,t=W(2);O(3),q(t.clock(e.block.since))}}function sN(e,t){if(e&1&&(z(0,`dt`),K(1,`Hydrated`),B(),z(2,`dd`),K(3),B()),e&2){let e=W(2).$implicit,t=W(2);O(3),J(` `,e.block.hydratedAt===void 0?`Before the devtools attached`:t.clock(e.block.hydratedAt),` `)}}function cN(e,t){if(e&1&&(z(0,`span`,23),K(1),B()),e&2){let e=W().$implicit;O(),q(e.hydration)}}function lN(e,t){if(e&1&&(z(0,`li`)(1,`span`,22),K(2),B(),z(3,`span`,19),K(4),B(),j(5,cN,2,1,`span`,23),B()),e&2){let e=t.$implicit,n=W(5);O(2),q(n.clock(e.at)),O(2),q(e.state),O(),M(e.hydration===`not-configured`?-1:5)}}function uN(e,t){if(e&1&&(z(0,`h3`,20),K(1,`Transitions`),B(),z(2,`ol`,21),N(3,lN,6,3,`li`,null,gg),B()),e&2){let e=W(2).$implicit;O(3),P(e.block.transitions)}}function dN(e,t){if(e&1){let e=V();z(0,`li`)(1,`button`,25),U(`click`,function(){let t=w(e).$implicit;return T(W(5).showNode.emit(t.id))}),K(2),z(3,`span`,19),K(4),B()()()}if(e&2){let e=t.$implicit;O(2),J(` Show `,e.name,` `),O(2),J(`<`,e.tag,`>`)}}function fN(e,t){if(e&1&&(z(0,`h3`,20),K(1,`Hydration mismatches`),B(),z(2,`ul`,24),N(3,dN,5,2,`li`,null,ZM),B()),e&2){let e=W(2).$implicit;O(3),P(e.mismatches)}}function pN(e,t){if(e&1&&(z(0,`div`,17)(1,`dl`)(2,`dt`),K(3,`Block`),B(),z(4,`dd`,19),K(5),B(),j(6,aN,4,2),j(7,oN,4,1),j(8,sN,4,1),z(9,`dt`),K(10,`Root elements`),B(),z(11,`dd`),K(12),B(),z(13,`dt`),K(14,`Triggers`),B(),z(15,`dd`,19),K(16),B()(),j(17,uN,5,0),j(18,fN,5,0),B()),e&2){let e,t=W().$implicit;Pg(`id`,`defer-detail-`+t.block.id),O(5),q(t.block.id),O(),M((e=t.block.owner)?6:-1,e),O(),M(t.block.since?7:-1),O(),M(t.block.hydration===`hydrated`?8:-1),O(4),q(t.block.rootIds.length||`None rendered`),O(4),q(t.block.triggers.join(`, `)||`None`),O(),M(t.block.transitions?.length?17:-1),O(),M(t.mismatches.length?18:-1)}}function mN(e,t){if(e&1){let e=V();z(0,`li`,4)(1,`button`,5),U(`click`,function(){let t=w(e).$implicit;return T(W(2).showOwner.emit(t.block))})(`focus`,function(){let t=w(e).$implicit;return T(W(2).highlight.emit(t.block))})(`blur`,function(){return w(e),T(W(2).highlight.emit(null))})(`mouseenter`,function(){let t=w(e).$implicit;return T(W(2).highlight.emit(t.block))})(`mouseleave`,function(){return w(e),T(W(2).highlight.emit(null))}),z(2,`span`,6),K(3),B(),z(4,`span`,7),K(5),B(),N(6,eN,3,4,`span`,8,XM),j(8,tN,2,2,`span`,9),j(9,nN,2,0,`span`,9),j(10,rN,2,1,`span`,10),j(11,iN,2,0,`span`,11),z(12,`span`,12),K(13),B()(),z(14,`button`,13),U(`click`,function(){let t=w(e).$implicit;return T(W(2).toggle(t.block.id))}),E(),z(15,`svg`,14),Og(16,`path`,15),B(),bs(),z(17,`span`,16),K(18),B()(),j(19,pN,19,9,`div`,17),B()}if(e&2){let e=t.$implicit,n=W(2);O(),A(`aria-disabled`,e.block.owner?null:`true`),O(2),q(e.block.owner?.name??`Unknown component`),O(),b_(`defer-state-`+e.block.state),O(),q(e.block.state),O(),P(e.notes),O(2),M(e.hydrated?8:-1),O(),M(e.block.hasErrorBlock?9:-1),O(),M(e.timings?10:-1),O(),M(e.mismatches.length?11:-1),O(2),q(e.block.triggers.join(`, `)||`no triggers`),O(),A(`aria-expanded`,n.isOpen(e.block.id))(`aria-controls`,n.isOpen(e.block.id)?`defer-detail-`+e.block.id:null),O(4),J(`Details of the block in `,e.block.owner?.name??`an unknown component`),O(),M(n.isOpen(e.block.id)?19:-1)}}function hN(e,t){if(e&1&&(z(0,`section`,0)(1,`h2`,1),K(2,` Defer blocks `),z(3,`span`,2),K(4),B()(),z(5,`ul`,3),N(6,mN,20,14,`li`,4,YM),B()()),e&2){let e=W();O(4),Y(``,e.rows().length,``,e.truncated()?`+`:``),O(2),P(e.rows())}}function gN(e){return e<1e3?`${e}ms`:`${Number((e/1e3).toFixed(2))}s`}function _N(e){let t=[],n=e.placeholder?.minimumTime;n!=null&&t.push(`placeholder min ${gN(n)}`);let r=[e.loading?.afterTime==null?``:`after ${gN(e.loading.afterTime)}`,e.loading?.minimumTime==null?``:`min ${gN(e.loading.minimumTime)}`].filter(Boolean);return r.length&&t.push(`loading ${r.join(`, `)}`),t.join(` · `)}var vN=class e{blocks=$([]);truncated=$(!1);clockOffset=$(0);showOwner=xv();mismatches=$([]);showNode=xv();open=D(new Set);highlight=xv();now=D(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:WT({...t,since:t.since||e},e),timings:_N(t),mismatches:this.mismatches().filter(e=>t.rootIds.includes(e.id)),hydrated:t.hydration===`hydrated`?VT(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 gO(e)}constructor(){let e,t=()=>{clearInterval(e),e=void 0};_c(()=>{if(!this.waiting())return t();e===void 0&&(this.now.set(Date.now()),e=setInterval(()=>this.now.set(Date.now()),1e3))}),C(As).onDestroy(t)}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({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&&j(0,hN,8,2,`section`,0),e&2&&M(t.rows().length?0:-1)},styles:[`[_nghost-%COMP%] { display: block; } @@ -2183,6 +2207,102 @@ button.edit[_ngcontent-%COMP%] { list-style: none; } +.defer-item[_ngcontent-%COMP%] { + display: grid; + grid-template-columns: minmax(0, 1fr) var(--%NS%control-h); + gap: 6px; +} + +.defer-toggle[_ngcontent-%COMP%] { + width: var(--%NS%control-h); + padding: 0; + background: var(--%NS%surface); +} + +.defer-toggle[_ngcontent-%COMP%] svg[_ngcontent-%COMP%] { + width: 14px; + height: 14px; + fill: none; + stroke: currentColor; + stroke-width: 2; + transition: transform 150ms var(--%NS%ease); +} + +.defer-toggle[aria-expanded=true][_ngcontent-%COMP%] svg[_ngcontent-%COMP%] { + transform: rotate(90deg); +} + +@media (prefers-reduced-motion: reduce) { + .defer-toggle[_ngcontent-%COMP%] svg[_ngcontent-%COMP%] { + transition: none; + } +} +.defer-toggle[_ngcontent-%COMP%]:focus-visible { + outline: 2px solid var(--%NS%accent); + outline-offset: 2px; +} + +.defer-detail[_ngcontent-%COMP%] { + grid-column: 1/-1; + padding: 8px 12px; + border: 1px solid var(--%NS%border); + border-radius: var(--%NS%radius-sm); + background: var(--%NS%bg); + font-size: 12px; +} + +.defer-detail[_ngcontent-%COMP%] dl[_ngcontent-%COMP%] { + display: grid; + grid-template-columns: max-content minmax(0, 1fr); + gap: 4px 12px; + margin: 0; +} + +.defer-detail[_ngcontent-%COMP%] dt[_ngcontent-%COMP%] { + color: var(--%NS%text-2); +} + +.defer-detail[_ngcontent-%COMP%] dd[_ngcontent-%COMP%] { + min-width: 0; + margin: 0; + color: var(--%NS%text); + overflow-wrap: anywhere; +} + +.detail-label[_ngcontent-%COMP%] { + color: var(--%NS%text-3); + font-size: 11px; + font-weight: 600; + letter-spacing: 0.08em; + text-transform: uppercase; + margin: 10px 0 4px; +} + +.transitions[_ngcontent-%COMP%], +.mismatch-links[_ngcontent-%COMP%] { + display: grid; + gap: 4px; + margin: 0; + padding: 0; + list-style: none; +} + +.transitions[_ngcontent-%COMP%] li[_ngcontent-%COMP%] { + display: flex; + flex-wrap: wrap; + gap: 8px; +} + +.when[_ngcontent-%COMP%], +.muted[_ngcontent-%COMP%] { + color: var(--%NS%text-2); +} + +.mismatch-links[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:focus-visible { + outline: 2px solid var(--%NS%accent); + outline-offset: 2px; +} + .defer-row[_ngcontent-%COMP%] { justify-content: flex-start; flex-wrap: wrap; @@ -2282,7 +2402,7 @@ button.edit[_ngcontent-%COMP%] { min-width: 0; text-overflow: ellipsis; white-space: nowrap; -}`]})},QM=(e,t)=>t.id;function $M(e,t){if(e&1&&(I(0,`p`,4),K(1),L()),e&2){let e=W(2);O(),J(`The page has more @for blocks than the `,e.length,` listed.`)}}function eN(e,t){e&1&&(I(0,`span`,9),K(1,`@empty showing`),L())}function tN(e,t){e&1&&(I(0,`span`,10),K(1,`@empty`),L())}function nN(e,t){e&1&&(I(0,`span`,10),K(1,`renders nothing`),L())}function rN(e,t){if(e&1){let e=V();I(0,`li`)(1,`button`,6),H(`click`,function(){let t=w(e).$implicit;return T(W(3).showOwner.emit(t))})(`focus`,function(){let t=w(e).$implicit,n=W(3);return T(n.highlight.emit(n.target(t)))})(`blur`,function(){return w(e),T(W(3).highlight.emit(null))})(`mouseenter`,function(){let t=w(e).$implicit,n=W(3);return T(n.highlight.emit(n.target(t)))})(`mouseleave`,function(){return w(e),T(W(3).highlight.emit(null))}),I(2,`span`,7),K(3),L(),I(4,`span`,8),K(5),L(),j(6,eN,2,0,`span`,9)(7,tN,2,0,`span`,10)(8,nN,2,0,`span`,10),I(9,`span`,11),K(10),L()()()}if(e&2){let e=t.$implicit,n=W(3);O(),A(`aria-disabled`,e.owner?null:`true`),O(2),q(e.owner?.name??`Unknown component`),O(2),Y(` `,e.count,` `,e.count===1?`item`:`items`,` `),O(),M(e.showingEmpty?6:e.hasEmptyBlock?7:e.count===0?8:-1),O(4),q(n.trackLabel(e))}}function iN(e,t){if(e&1&&(I(0,`section`,1)(1,`h2`,2),K(2,` @for blocks `),I(3,`span`,3),K(4),L()(),j(5,$M,2,1,`p`,4),I(6,`ul`,5),N(7,rN,11,6,`li`,null,QM),L()()),e&2){let e=W(),t=W();O(4),q(t.truncated()?e.length+`+`:e.length),O(),M(t.truncated()?5:-1),O(2),P(e)}}function aN(e,t){e&1&&j(0,iN,9,2,`section`,1),e&2&&M(t.length?0:-1)}function oN(e,t){e&1&&R(0,`app-angular-unavailable`,0),e&2&&F(`page`,W().angular())}var sN={$index:`track $index`,item:`track item`,function:`track expression`},cN=class e{blocks=$(void 0);truncated=$(!1);supported=$(null);angular=$(null);showOwner=bv();highlight=bv();target(e){return e.rootIds[0]??e.owner?.id??null}trackLabel(e){return e.track?sN[e.track]:`track unknown`}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({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&&j(0,aN,1,1)(1,oN,1,1,`app-angular-unavailable`,0),e&2){let e;M((e=t.blocks())?0:t.supported()===!1?1:-1,e)}},dependencies:[FD],styles:[`[_nghost-%COMP%] { +}`]})},yN=(e,t)=>t.id;function bN(e,t){if(e&1&&(I(0,`p`,4),K(1),L()),e&2){let e=W(2);O(),J(`The page has more @for blocks than the `,e.length,` listed.`)}}function xN(e,t){e&1&&(I(0,`span`,9),K(1,`@empty showing`),L())}function SN(e,t){e&1&&(I(0,`span`,10),K(1,`@empty`),L())}function CN(e,t){e&1&&(I(0,`span`,10),K(1,`renders nothing`),L())}function wN(e,t){if(e&1){let e=V();I(0,`li`)(1,`button`,6),H(`click`,function(){let t=w(e).$implicit;return T(W(3).showOwner.emit(t))})(`focus`,function(){let t=w(e).$implicit,n=W(3);return T(n.highlight.emit(n.target(t)))})(`blur`,function(){return w(e),T(W(3).highlight.emit(null))})(`mouseenter`,function(){let t=w(e).$implicit,n=W(3);return T(n.highlight.emit(n.target(t)))})(`mouseleave`,function(){return w(e),T(W(3).highlight.emit(null))}),I(2,`span`,7),K(3),L(),I(4,`span`,8),K(5),L(),j(6,xN,2,0,`span`,9)(7,SN,2,0,`span`,10)(8,CN,2,0,`span`,10),I(9,`span`,11),K(10),L()()()}if(e&2){let e=t.$implicit,n=W(3);O(),A(`aria-disabled`,e.owner?null:`true`),O(2),q(e.owner?.name??`Unknown component`),O(2),Y(` `,e.count,` `,e.count===1?`item`:`items`,` `),O(),M(e.showingEmpty?6:e.hasEmptyBlock?7:e.count===0?8:-1),O(4),q(n.trackLabel(e))}}function TN(e,t){if(e&1&&(I(0,`section`,1)(1,`h2`,2),K(2,` @for blocks `),I(3,`span`,3),K(4),L()(),j(5,bN,2,1,`p`,4),I(6,`ul`,5),N(7,wN,11,6,`li`,null,yN),L()()),e&2){let e=W(),t=W();O(4),q(t.truncated()?e.length+`+`:e.length),O(),M(t.truncated()?5:-1),O(2),P(e)}}function EN(e,t){e&1&&j(0,TN,9,2,`section`,1),e&2&&M(t.length?0:-1)}function DN(e,t){e&1&&R(0,`app-angular-unavailable`,0),e&2&&F(`page`,W().angular())}var ON={$index:`track $index`,item:`track item`,function:`track expression`},kN=class e{blocks=$(void 0);truncated=$(!1);supported=$(null);angular=$(null);showOwner=xv();highlight=xv();target(e){return e.rootIds[0]??e.owner?.id??null}trackLabel(e){return e.track?ON[e.track]:`track unknown`}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({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&&j(0,EN,1,1)(1,DN,1,1,`app-angular-unavailable`,0),e&2){let e;M((e=t.blocks())?0:t.supported()===!1?1:-1,e)}},dependencies:[ND],styles:[`[_nghost-%COMP%] { display: block; } @@ -2400,7 +2520,7 @@ button.edit[_ngcontent-%COMP%] { min-width: 0; text-overflow: ellipsis; white-space: nowrap; -}`]})},lN=(e,t)=>t.id;function uN(e,t){if(e&1&&(I(0,`p`,11),K(1),L(),I(2,`h3`,7),K(3,`Still retained`),L(),I(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. `),L()),e&2){let e=W(),t=W();O(),q(t.plural(e.navigations,`navigation`))}}function dN(e,t){e&1&&(I(0,`p`,6),K(1,` This page cannot track destroyed components. It needs WeakRef, FinalizationRegistry and the Angular debug API of a development build. `),L())}function fN(e,t){if(e&1&&(I(0,`span`,18),K(1),L()),e&2){let e=W().$implicit,t=W(4);O(),q(t.plural(e.subscriptions,`open subscription`))}}function pN(e,t){if(e&1&&(I(0,`li`,13)(1,`span`,14),K(2),L(),I(3,`span`,15),K(4),L(),I(5,`span`,16),K(6),L(),I(7,`span`,17),K(8),L(),j(9,fN,2,1,`span`,18),L()),e&2){let e=t.$implicit,n=W(4);O(2),q(e.name),O(2),q(e.route||`/`),O(2),J(``,n.plural(e.navigations,`navigation`),` ago`),O(2),q(n.ageOf(e)),O(),M(e.subscriptions?9:-1)}}function mN(e,t){if(e&1&&(I(0,`p`,6),K(1),L(),I(2,`ul`,12),N(3,pN,10,5,`li`,13,lN),L()),e&2){let e=W(3);O(),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. `),O(2),P(e.retained().slice(0,e.shown))}}function hN(e,t){e&1&&(I(0,`p`,6),K(1,`No destroyed component is still in memory after a few navigations.`),L())}function gN(e,t){if(e&1&&(I(0,`p`,6),K(1),I(2,`span`,19),K(3),L(),K(4,`. Navigate a few times to see whether they stay. `),L()),e&2){let e=W(3);O(),J(` `,e.plural(e.recent().length,`instance`),` destroyed recently and not collected yet: `),O(2),q(e.names(e.recent()))}}function _N(e,t){if(e&1&&(j(0,dN,2,0,`p`,6),I(1,`p`,11),K(2),L(),I(3,`h3`,7),K(4,` Still retained `),I(5,`span`,8),K(6),L()(),j(7,mN,5,2)(8,hN,2,0,`p`,6),j(9,gN,5,2,`p`,6)),e&2){let e=W(),t=W();M(e.support.retention?-1:0),O(2),z_(` `,t.plural(e.navigations,`navigation`),` · `,t.retained().length,` still retained · `,t.plural(e.totals.collected,`instance`),` collected `),O(4),q(t.retained().length),O(),M(t.retained().length?7:8),O(2),M(t.recent().length?9:-1)}}function vN(e,t){if(e&1&&(I(0,`p`,6),K(1,` Off the page but not destroyed (detached views, such as a route reuse cache): `),I(2,`span`,19),K(3),L(),K(4,`. `),L()),e&2){let e=W(2);O(3),q(e.names(e.detached()))}}function yN(e,t){if(e&1&&(I(0,`span`,8),K(1),L()),e&2){let e=W();O(),q(e.subscriptions.length)}}function bN(e,t){if(e&1&&(I(0,`span`,15),K(1),L()),e&2){let e=W().$implicit;O(),q(e.source)}}function xN(e,t){if(e&1&&(I(0,`li`,13)(1,`span`,14),K(2),L(),I(3,`span`,16),K(4),L(),I(5,`span`,18),K(6),L(),j(7,bN,2,1,`span`,15),L()),e&2){let e=t.$implicit;O(2),q(e.name),O(2),J(``,e.count,` open`),O(2),J(` `,e.reason===`instance-destroyed`?`instance destroyed`:`no instance left`,` `),O(),M(e.source?7:-1)}}function SN(e,t){if(e&1&&(I(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. `),L(),I(2,`ul`,12),N(3,xN,8,4,`li`,13,gg),L()),e&2){let e=W(2),t=W();O(3),P(e.subscriptions.slice(0,t.shown))}}function CN(e,t){e&1&&(I(0,`p`,6),K(1,`No subscription is still open after its component went away.`),L())}function wN(e,t){e&1&&(I(0,`p`,6),K(1,` Subscriptions are tied to component classes only; Angular 20 profiler hooks tie them to instances. `),L())}function TN(e,t){if(e&1&&(j(0,SN,5,0)(1,CN,2,0,`p`,6),j(2,wN,2,0,`p`,6)),e&2){let e=W();M(+!e.subscriptions.length),O(2),M(e.support.instances?-1:2)}}function EN(e,t){e&1&&(I(0,`p`,9),K(1,` Tracking could not start: the page has no RxJS the overlay can load. `),L())}function DN(e,t){e&1&&(I(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. `),L())}function ON(e,t){e&1&&R(0,`app-angular-unavailable`,10),e&2&&F(`page`,W(2).angular())}function kN(e,t){if(e&1&&(I(0,`span`,16),K(1),L()),e&2){let e=W().$implicit,t=W(3);O(),q(t.plural(e.subscriptions,`subscription`))}}function AN(e,t){if(e&1){let e=V();I(0,`li`)(1,`button`,20),H(`click`,function(){let t=w(e).$implicit;return T(W(3).showComponent.emit(t.id))})(`focus`,function(){let t=w(e).$implicit;return T(W(3).highlight.emit(t.id))})(`blur`,function(){return w(e),T(W(3).highlight.emit(null))})(`mouseenter`,function(){let t=w(e).$implicit;return T(W(3).highlight.emit(t.id))})(`mouseleave`,function(){return w(e),T(W(3).highlight.emit(null))}),I(2,`span`,14),K(3),L(),I(4,`span`,16),K(5),L(),j(6,kN,2,1,`span`,16),L()()}if(e&2){let e=t.$implicit,n=W(2),r=W();O(3),q(e.name),O(2),q(r.effectsText(e)),O(),M(n.support.subscriptions===`on`?6:-1)}}function jN(e,t){e&1&&(I(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. `),L())}function MN(e,t){if(e&1&&(I(0,`ul`,12),N(1,AN,7,3,`li`,null,lN),L(),j(3,jN,2,0,`p`,6)),e&2){let e=W(),t=W();O(),P(e.components.slice(0,t.shown)),O(2),M(e.components.some(t.hasShared)?3:-1)}}function NN(e,t){e&1&&(I(0,`p`,6),K(1,`No component on the page has a live effect or a tracked subscription.`),L())}function PN(e,t){if(e&1&&(j(0,uN,6,1)(1,_N,10,7),j(2,vN,5,1,`p`,6),I(3,`h3`,7),K(4,` Open subscriptions after destroy `),j(5,yN,2,1,`span`,8),L(),j(6,TN,3,2)(7,EN,2,0,`p`,9)(8,DN,2,0,`p`,6),I(9,`h3`,7),K(10,` Live effects and subscriptions `),I(11,`span`,8),K(12),L()(),j(13,ON,1,1,`app-angular-unavailable`,10),j(14,MN,4,1)(15,NN,2,0,`p`,6)),e&2){let e,n=t,r=W();M(n.support.retention===`dev-di-debug`?0:1),O(2),M(r.detached().length?2:-1),O(3),M(n.support.subscriptions===`on`?5:-1),O(),M((e=n.support.subscriptions)===`on`?6:e===`unavailable`?7:8),O(6),q(n.components.length),O(),M(n.support.effects?-1:13),O(),M(n.components.length?14:15)}}function FN(e,t){e&1&&(I(0,`p`,6),K(1,`No leak data from this page yet. It comes with the next report.`),L())}var IN=20;function LN(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 RN=(e,t,n=`${t}s`)=>`${e} ${e===1?t:n}`,zN=class e{report=$(null);pageId=$(null);rpc=$(null);angular=$(null);now=$(()=>Date.now());showComponent=bv();highlight=bv();shown=IN;minNavigations=2;minSeconds=sT/1e3;plural=RN;busy=D(!1);announcement=D(``);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?`${LN(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=RN(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 tE(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=k({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&&(I(0,`section`,0)(1,`div`,1)(2,`h2`,2),K(3,`Leaks`),L(),I(4,`button`,3),H(`click`,function(){return t.toggle()}),K(5,` Track subscriptions `),L(),I(6,`p`,4),K(7),L()(),I(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. `),L(),j(10,PN,16,7)(11,FN,2,0,`p`,6),L()),e&2){let e;O(4),F(`disabled`,!t.pageId()||!t.report()),A(`aria-pressed`,t.tracking())(`aria-disabled`,t.busy()||null),O(3),q(t.announcement()),O(3),M((e=t.report())?10:11,e)}},dependencies:[FD],styles:[`[_nghost-%COMP%] { +}`]})},AN=(e,t)=>t.id;function jN(e,t){if(e&1&&(I(0,`p`,11),K(1),L(),I(2,`h3`,7),K(3,`Still retained`),L(),I(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. `),L()),e&2){let e=W(),t=W();O(),q(t.plural(e.navigations,`navigation`))}}function MN(e,t){e&1&&(I(0,`p`,6),K(1,` This page cannot track destroyed components. It needs WeakRef, FinalizationRegistry and the Angular debug API of a development build. `),L())}function NN(e,t){if(e&1&&(I(0,`span`,18),K(1),L()),e&2){let e=W().$implicit,t=W(4);O(),q(t.plural(e.subscriptions,`open subscription`))}}function PN(e,t){if(e&1&&(I(0,`li`,13)(1,`span`,14),K(2),L(),I(3,`span`,15),K(4),L(),I(5,`span`,16),K(6),L(),I(7,`span`,17),K(8),L(),j(9,NN,2,1,`span`,18),L()),e&2){let e=t.$implicit,n=W(4);O(2),q(e.name),O(2),q(e.route||`/`),O(2),J(``,n.plural(e.navigations,`navigation`),` ago`),O(2),q(n.ageOf(e)),O(),M(e.subscriptions?9:-1)}}function FN(e,t){if(e&1&&(I(0,`p`,6),K(1),L(),I(2,`ul`,12),N(3,PN,10,5,`li`,13,AN),L()),e&2){let e=W(3);O(),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. `),O(2),P(e.retained().slice(0,e.shown))}}function IN(e,t){e&1&&(I(0,`p`,6),K(1,`No destroyed component is still in memory after a few navigations.`),L())}function LN(e,t){if(e&1&&(I(0,`p`,6),K(1),I(2,`span`,19),K(3),L(),K(4,`. Navigate a few times to see whether they stay. `),L()),e&2){let e=W(3);O(),J(` `,e.plural(e.recent().length,`instance`),` destroyed recently and not collected yet: `),O(2),q(e.names(e.recent()))}}function RN(e,t){if(e&1&&(j(0,MN,2,0,`p`,6),I(1,`p`,11),K(2),L(),I(3,`h3`,7),K(4,` Still retained `),I(5,`span`,8),K(6),L()(),j(7,FN,5,2)(8,IN,2,0,`p`,6),j(9,LN,5,2,`p`,6)),e&2){let e=W(),t=W();M(e.support.retention?-1:0),O(2),B_(` `,t.plural(e.navigations,`navigation`),` · `,t.retained().length,` still retained · `,t.plural(e.totals.collected,`instance`),` collected `),O(4),q(t.retained().length),O(),M(t.retained().length?7:8),O(2),M(t.recent().length?9:-1)}}function zN(e,t){if(e&1&&(I(0,`p`,6),K(1,` Off the page but not destroyed (detached views, such as a route reuse cache): `),I(2,`span`,19),K(3),L(),K(4,`. `),L()),e&2){let e=W(2);O(3),q(e.names(e.detached()))}}function BN(e,t){if(e&1&&(I(0,`span`,8),K(1),L()),e&2){let e=W();O(),q(e.subscriptions.length)}}function VN(e,t){if(e&1&&(I(0,`span`,15),K(1),L()),e&2){let e=W().$implicit;O(),q(e.source)}}function HN(e,t){if(e&1&&(I(0,`li`,13)(1,`span`,14),K(2),L(),I(3,`span`,16),K(4),L(),I(5,`span`,18),K(6),L(),j(7,VN,2,1,`span`,15),L()),e&2){let e=t.$implicit;O(2),q(e.name),O(2),J(``,e.count,` open`),O(2),J(` `,e.reason===`instance-destroyed`?`instance destroyed`:`no instance left`,` `),O(),M(e.source?7:-1)}}function UN(e,t){if(e&1&&(I(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. `),L(),I(2,`ul`,12),N(3,HN,8,4,`li`,13,gg),L()),e&2){let e=W(2),t=W();O(3),P(e.subscriptions.slice(0,t.shown))}}function WN(e,t){e&1&&(I(0,`p`,6),K(1,`No subscription is still open after its component went away.`),L())}function GN(e,t){e&1&&(I(0,`p`,6),K(1,` Subscriptions are tied to component classes only; Angular 20 profiler hooks tie them to instances. `),L())}function KN(e,t){if(e&1&&(j(0,UN,5,0)(1,WN,2,0,`p`,6),j(2,GN,2,0,`p`,6)),e&2){let e=W();M(+!e.subscriptions.length),O(2),M(e.support.instances?-1:2)}}function qN(e,t){e&1&&(I(0,`p`,9),K(1,` Tracking could not start: the page has no RxJS the overlay can load. `),L())}function JN(e,t){e&1&&(I(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. `),L())}function YN(e,t){e&1&&R(0,`app-angular-unavailable`,10),e&2&&F(`page`,W(2).angular())}function XN(e,t){if(e&1&&(I(0,`span`,16),K(1),L()),e&2){let e=W().$implicit,t=W(3);O(),q(t.plural(e.subscriptions,`subscription`))}}function ZN(e,t){if(e&1){let e=V();I(0,`li`)(1,`button`,20),H(`click`,function(){let t=w(e).$implicit;return T(W(3).showComponent.emit(t.id))})(`focus`,function(){let t=w(e).$implicit;return T(W(3).highlight.emit(t.id))})(`blur`,function(){return w(e),T(W(3).highlight.emit(null))})(`mouseenter`,function(){let t=w(e).$implicit;return T(W(3).highlight.emit(t.id))})(`mouseleave`,function(){return w(e),T(W(3).highlight.emit(null))}),I(2,`span`,14),K(3),L(),I(4,`span`,16),K(5),L(),j(6,XN,2,1,`span`,16),L()()}if(e&2){let e=t.$implicit,n=W(2),r=W();O(3),q(e.name),O(2),q(r.effectsText(e)),O(),M(n.support.subscriptions===`on`?6:-1)}}function QN(e,t){e&1&&(I(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. `),L())}function $N(e,t){if(e&1&&(I(0,`ul`,12),N(1,ZN,7,3,`li`,null,AN),L(),j(3,QN,2,0,`p`,6)),e&2){let e=W(),t=W();O(),P(e.components.slice(0,t.shown)),O(2),M(e.components.some(t.hasShared)?3:-1)}}function eP(e,t){e&1&&(I(0,`p`,6),K(1,`No component on the page has a live effect or a tracked subscription.`),L())}function tP(e,t){if(e&1&&(j(0,jN,6,1)(1,RN,10,7),j(2,zN,5,1,`p`,6),I(3,`h3`,7),K(4,` Open subscriptions after destroy `),j(5,BN,2,1,`span`,8),L(),j(6,KN,3,2)(7,qN,2,0,`p`,9)(8,JN,2,0,`p`,6),I(9,`h3`,7),K(10,` Live effects and subscriptions `),I(11,`span`,8),K(12),L()(),j(13,YN,1,1,`app-angular-unavailable`,10),j(14,$N,4,1)(15,eP,2,0,`p`,6)),e&2){let e,n=t,r=W();M(n.support.retention===`dev-di-debug`?0:1),O(2),M(r.detached().length?2:-1),O(3),M(n.support.subscriptions===`on`?5:-1),O(),M((e=n.support.subscriptions)===`on`?6:e===`unavailable`?7:8),O(6),q(n.components.length),O(),M(n.support.effects?-1:13),O(),M(n.components.length?14:15)}}function nP(e,t){e&1&&(I(0,`p`,6),K(1,`No leak data from this page yet. It comes with the next report.`),L())}var rP=20;function iP(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 aP=(e,t,n=`${t}s`)=>`${e} ${e===1?t:n}`,oP=class e{report=$(null);pageId=$(null);rpc=$(null);angular=$(null);now=$(()=>Date.now());showComponent=xv();highlight=xv();shown=rP;minNavigations=2;minSeconds=iT/1e3;plural=aP;busy=D(!1);announcement=D(``);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?`${iP(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=aP(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 $T(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=k({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&&(I(0,`section`,0)(1,`div`,1)(2,`h2`,2),K(3,`Leaks`),L(),I(4,`button`,3),H(`click`,function(){return t.toggle()}),K(5,` Track subscriptions `),L(),I(6,`p`,4),K(7),L()(),I(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. `),L(),j(10,tP,16,7)(11,nP,2,0,`p`,6),L()),e&2){let e;O(4),F(`disabled`,!t.pageId()||!t.report()),A(`aria-pressed`,t.tracking())(`aria-disabled`,t.busy()||null),O(3),q(t.announcement()),O(3),M((e=t.report())?10:11,e)}},dependencies:[ND],styles:[`[_nghost-%COMP%] { display: block; } @@ -2556,7 +2676,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); -}`]})},BN=12,VN=900;function HN(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 UN=class{options;injector=C(Os);visibleTop=D(0);viewport=D(VN);rowHeight;host=null;scroller=null;detach=null;enabled;range;padTop;padBottom;constructor(e){this.options=e,this.rowHeight=D(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)-BN));return{start:a,end:Math.min(t,Math.max(a,Math.ceil((i+r)/n)+BN))}}),this.padTop=X(()=>this.enabled()?this.range().start*this.rowHeight():0),this.padBottom=X(()=>this.enabled()?(e.count()-this.range().end)*this.rowHeight():0),_c(()=>{e.count(),ud(()=>this.update(),{injector:this.injector})}),C(As).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:VN)}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&&ud(t,{injector:this.injector})}};function WN(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 GN=e=>{let t=parseFloat(e);return Number.isFinite(t)?t:0};function KN(e,t=8){let n=e.ownerDocument.defaultView;if(!n)return e.offsetHeight+t;let r=WN(e),i=r?n.getComputedStyle(r):null,a=i?GN(i.paddingTop):0,o=i?GN(i.scrollPaddingTop):0,s=GN(n.getComputedStyle(e).top);return Math.max(0,Math.ceil(a+s+e.offsetHeight+t-o))}function qN(e,t,n=8){let r=WN(e),i=t.getBoundingClientRect().bottom+n-e.getBoundingClientRect().top;i<=0||(r?r.scrollTop-=i:e.ownerDocument.defaultView?.scrollBy(0,-i))}var JN=[`filterInput`],YN=[`treeEl`],XN=[`propFilterInput`],ZN=()=>[],QN=e=>({kind:`component`,id:e}),$N=(e,t)=>t.row.node.id,eP=(e,t)=>t.outlet+t.route,tP=(e,t)=>t+e;function nP(e,t){return this.sourceKey(t)}var rP=(e,t)=>t.formId,iP=(e,t)=>t.name+t.index,aP=(e,t)=>t.name,oP=(e,t)=>t.token+e;function sP(e,t){if(e&1){let e=V();I(0,`span`,40),K(1,`Page`),L(),I(2,`app-select`,41),H(`valueChange`,function(t){return w(e),T(W(2).selectPage(t))}),L()}if(e&2){let e=W(2);O(2),F(`options`,e.pageOptions())(`value`,e.page()?.pageId??null)}}function cP(e,t){if(e&1){let e=V();I(0,`button`,42),H(`click`,function(){return w(e),T(W(2).toggleDirectiveHosts())}),E(),I(1,`svg`,15),R(2,`path`,43)(3,`path`,44),L(),bs(),I(4,`span`,18),K(5,`Directive hosts`),L()()}e&2&&A(`aria-pressed`,W(2).showDirectiveHosts())}function lP(e,t){if(e&1){let e=V();I(0,`button`,45),H(`click`,function(){w(e);let t=W(2);return T(t.picking()?t.cancelPick():t.pick())}),E(),I(1,`svg`,15),R(2,`path`,46),L(),bs(),I(3,`span`,18),K(4),L()()}if(e&2){let e=W(2);G(`on`,e.picking()),A(`title`,e.pickLabel()),O(4),q(e.pickLabel())}}function uP(e,t){if(e&1&&(I(0,`p`,24),K(1),L()),e&2){let e=W(2);O(),q(e.pickMessage())}}function dP(e,t){if(e&1&&(I(0,`p`,25),K(1),L()),e&2){let e=W(2);O(),q(e.truncationText())}}function fP(e,t){e&1&&(I(0,`p`,48),K(1,`The filter only searches the components the tree lists.`),L())}function pP(e,t){e&1&&(I(0,`p`,48),K(1,`Directive hosts are hidden, so they are not searched.`),L())}function mP(e,t){if(e&1){let e=V();I(0,`div`,29)(1,`p`,47),K(2),L(),j(3,fP,2,0,`p`,48),j(4,pP,2,0,`p`,48),I(5,`button`,49),H(`click`,function(){return w(e),T(W(2).clearFilter())}),K(6,`Clear filters`),L()()}if(e&2){let e=W(2);O(2),J(`No components match “`,e.filter().trim(),`”`),O(),M(e.page().truncated?3:-1),O(),M(!e.showDirectiveHosts()&&e.page().directiveHostCount?4:-1)}}function hP(e,t){if(e&1&&(I(0,`p`,30),K(1),L()),e&2){let e=W(2);O(),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 gP(e,t){if(e&1){let e=V();I(0,`span`,57),H(`click`,function(t){w(e),W();let n=J_(0);return T(W(2).toggle(n.node.id,t))}),E(),I(1,`svg`,58),R(2,`path`,59),L()()}e&2&&(W(),G(`open`,J_(0).expanded))}function _P(e,t){e&1&&R(0,`span`,52)}function vP(e,t){if(e&1&&(I(0,`span`,60),K(1),L(),I(2,`span`,61),K(3),L(),I(4,`span`,28),K(5,`directive host`),L()),e&2){W();let e=J_(0),t=W(2);O(),J(`<`,e.node.tag,`>`),O(),A(`title`,e.node.directives?.join(`, `)),O(),q(t.hostLabel(e.node))}}function yP(e,t){if(e&1&&(I(0,`span`,62),K(1),L(),I(2,`span`,63),K(3),L()),e&2){W();let e=J_(0);A(`title`,e.node.name),O(),q(e.node.name),O(),A(`title`,`<`+e.node.tag+`>`),O(),J(`<`,e.node.tag,`>`)}}function bP(e,t){if(e&1&&(I(0,`span`)(1,`span`,28),K(2,`Hydration: `),L(),K(3),L()),e&2){let e=t,n=W(3);b_(`hyd hyd-`+e),O(3),q(n.hydrationText(e))}}function xP(e,t){if(e&1&&(I(0,`span`,54),K(1),L()),e&2){let e=t.$implicit;O(),q(e.route||`/`)}}function SP(e,t){if(e&1&&(I(0,`span`,55),K(1),I(2,`span`,28),K(3),L()()),e&2){let e=t;O(),J(` `,e),O(2),J(` `,e===1?`check`:`checks`,` while recording`)}}function CP(e,t){if(e&1&&(I(0,`span`,56),K(1),I(2,`span`,28),K(3),L()()),e&2){W();let e=J_(0);A(`title`,e.node.directives.join(`, `)),O(),J(` +`,e.node.directives.length,` `),O(2),J(` `,e.node.directives.length===1?`directive`:`directives`,` `)}}function wP(e,t){if(e&1){let e=V();K_(0),I(1,`div`,50),H(`click`,function(){w(e);let t=J_(0);return T(W(2).select(t.node.id))})(`focus`,function(t){w(e);let n=J_(0),r=W(2);return r.focusId.set(n.node.id),r.highlight(n.node.id),T(r.showNameTip(t))})(`blur`,function(){w(e);let t=W(2);return t.highlight(null),T(t.nameTip.set(null))})(`keydown.escape`,function(){return w(e),T(W(2).nameTip.set(null))})(`mouseenter`,function(){w(e);let t=J_(0);return T(W(2).highlight(t.node.id))})(`mouseleave`,function(){return w(e),T(W(2).highlight(null))}),j(2,gP,3,2,`span`,51)(3,_P,1,0,`span`,52),j(4,vP,6,3)(5,yP,4,4),j(6,bP,4,3,`span`,53),N(7,xP,2,1,`span`,54,eP),j(9,SP,4,2,`span`,55),j(10,CP,4,3,`span`,56),L()}if(e&2){let e,n,r=t.$implicit,i=W(2),a=q_(r.row);O(),y_(`--%NS%depth`,a.depth),G(`selected`,i.selectedId()===a.node.id)(`dir-host`,a.node.kind===`directive`),A(`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),O(),M(a.hasChildren?2:3),O(2),M(a.node.kind===`directive`?4:5),O(2),M((e=a.node.hydration)?6:-1,e),O(),P(i.routedById().get(a.node.id)??rv(20,ZN)),O(2),M((n=i.cdHosts()[a.node.id])?9:-1,n),O(),M(a.node.kind!==`directive`&&a.node.directives?.length?10:-1)}}function TP(e,t){if(e&1&&(I(0,`div`,64),K(1),L()),e&2){let e=t;y_(`top`,e.top,`px`),O(),J(` `,e.text,` `)}}function EP(e,t){if(e&1&&(I(0,`li`,72),K(1),L()),e&2){let e=t.$implicit;O(),q(e)}}function DP(e,t){if(e&1){let e=V();I(0,`div`,74)(1,`button`,49),H(`click`,function(){let t=w(e);return T(W(3).reveal(t.id,!0))}),K(2),L()()}e&2&&(O(2),J(` Show `,t.name,` `))}function OP(e,t){if(e&1&&(I(0,`section`,34)(1,`header`,65)(2,`span`,66),K(3,`directive host`),L(),I(4,`h2`,67),K(5),L(),I(6,`span`,68),K(7),L()(),I(8,`div`,69)(9,`h3`),K(10,` Directives `),I(11,`span`,70),K(12),L()(),I(13,`ul`,71),N(14,EP,2,1,`li`,72,tP),L()(),I(16,`div`,69)(17,`p`,73),K(18,` This element hosts directives but no component. Their inputs are bound in the template of the component that renders it. `),L(),j(19,DP,3,1,`div`,74),L()()),e&2){let e,n=t,r=W(2);O(5),J(`<`,n.tag,`>`),O(2),q(r.hostLabel(n)),O(5),q(n.directives?.length??0),O(2),P(n.directives??rv(4,ZN)),O(5),M((e=r.ownerOf(n.id))?19:-1,e)}}function kP(e,t){if(e&1&&(I(0,`p`,75),R(1,`app-source-link`,79),L()),e&2){let e=t;O(),F(`file`,e.file)(`line`,e.line)}}function AP(e,t){if(e&1&&(I(0,`p`,80)(1,`span`,82),K(2,`Likely`),L(),I(3,`span`,28),K(4,`, matched by class name: `),L(),R(5,`app-source-link`,79),L()),e&2){W();let e=J_(0);F(`title`,W(3).guessTitle),O(5),F(`file`,e[0].file)(`line`,e[0].line)}}function jP(e,t){if(e&1&&(I(0,`li`),R(1,`app-source-link`,79),L()),e&2){let e=t.$implicit;O(),F(`file`,e.file)(`line`,e.line)}}function MP(e,t){if(e&1&&(I(0,`div`,81)(1,`p`,83)(2,`span`,82),K(3,`Not certain`),L(),K(4),L(),I(5,`ul`,84),N(6,jP,2,2,`li`,null,nP,!0),L()()),e&2){W();let e=J_(0),t=W(),n=W(2);F(`title`,n.guessTitle),O(4),Y(` `,e.length,` source files define `,n.bareName(t.name),`: `),O(2),P(e)}}function NP(e,t){if(e&1&&(K_(0),j(1,AP,6,3,`p`,80)(2,MP,8,3,`div`,81)),e&2){let e=W(),t=q_(W(2).sourceCandidates(e));O(),M(t.length===1?1:t.length>1?2:-1)}}function PP(e,t){if(e&1){let e=V();I(0,`div`,85)(1,`button`,49),H(`click`,function(){w(e);let t=W();return T(W(2).revealInElements(t))}),K(2,`Reveal in Elements`),L(),I(3,`button`,49),H(`click`,function(){w(e);let t=W();return T(W(2).openSource(t))}),K(4,`Open source`),L()(),I(5,`p`,86),K(6),L()}if(e&2){let e=W(3);O(6),q(e.actionMessage())}}function FP(e,t){if(e&1){let e=V();I(0,`button`,88),H(`click`,function(){let t=w(e).$implicit;return T(W(5).showForm.emit(t.formId))}),K(1),L()}if(e&2){let e=t.$implicit;O(),J(` Show `,e.label,` in Forms `)}}function IP(e,t){if(e&1&&(I(0,`div`,76),N(1,FP,2,1,`button`,87,rP),L()),e&2){let e=W(),t=W(3);O(),P(t.formsIn(e.file))}}function LP(e,t){e&1&&j(0,IP,3,0,`div`,76),e&2&&M(W(3).formsIn(t.file).length?0:-1)}function RP(e,t){if(e&1){let e=V();I(0,`div`,76)(1,`button`,49),H(`click`,function(){w(e);let t=W();return T(W(2).openInjector(t))}),K(2,` Show in Injectors `),I(3,`span`,28),K(4),L()()()}if(e&2){let e=W();O(4),J(`: `,e.name)}}function zP(e,t){if(e&1&&R(0,`app-store-global`,77),e&2){let e=W(),t=W(2);F(`rpc`,t.rpc())(`pageId`,t.page()?.pageId)(`target`,iv(4,QN,e.id))(`label`,e.name)}}function BP(e,t){if(e&1&&(I(0,`dt`),K(1,`Routed`),L(),I(2,`dd`,90),K(3),L()),e&2){let e=t.$implicit;O(3),Y(``,e.route||`/`,` in outlet `,e.outlet)}}function VP(e,t){if(e&1&&(I(0,`span`,11),K(1),L()),e&2){let e=W(4);O(),Y(``,e.shownValues()?.count??0,` of `,e.valueTotal())}}function HP(e,t){if(e&1){let e=V();I(0,`div`,94)(1,`p`,47),K(2),L(),I(3,`p`,48),K(4,` The filter searches names, and the nested keys of values you opened. `),L(),I(5,`button`,49),H(`click`,function(){return w(e),T(W(5).clearPropFilter())}),K(6,`Clear filters`),L()()}if(e&2){let e=W(5);O(2),J(` No inputs, outputs or properties match “`,e.propFilter().trim(),`” `)}}function UP(e,t){if(e&1&&(I(0,`span`,98),K(1),L()),e&2){let e=W().$implicit;O(),J(`(`,e.prop,`)`)}}function WP(e,t){if(e&1&&(I(0,`li`,96)(1,`span`,97),K(2),j(3,UP,2,1,`span`,98),L(),R(4,`app-value-tree`,99),L()),e&2){let e=t.$implicit,n=W(4),r=W(3);O(2),J(` `,e.name,` `),O(),M(e.prop===e.name?-1:3),O(),F(`prop`,e)(`store`,r.values)(`query`,r.propFilter())(`componentId`,n.id)(`pageId`,r.page()?.pageId??null)(`rpc`,r.rpc())(`writes`,r.canEdit())}}function GP(e,t){if(e&1&&(I(0,`ul`,95),N(1,WP,5,9,`li`,96,aP),L()),e&2){let e=W(2);O(),P(e.inputs)}}function KP(e,t){e&1&&(I(0,`p`,73),K(1,`No inputs.`),L())}function qP(e,t){if(e&1&&(I(0,`div`,69)(1,`h3`),K(2,` Inputs `),I(3,`span`,70),K(4),L()(),j(5,GP,3,0,`ul`,95)(6,KP,2,0,`p`,73),L()),e&2){let e=W();O(4),q(e.inputs.length),O(),M(e.inputs.length?5:6)}}function JP(e,t){if(e&1&&(I(0,`li`,101)(1,`span`,90),K(2),L(),I(3,`span`,102),K(4),L()()),e&2){let e=t.$implicit;G(`on`,e.listened),O(2),q(e.name),O(2),q(e.listened?`listened`:`no listener`)}}function YP(e,t){if(e&1&&(I(0,`ul`,71),N(1,JP,5,4,`li`,100,aP),L()),e&2){let e=W(2);O(),P(e.outputs)}}function XP(e,t){e&1&&(I(0,`p`,73),K(1,`No outputs.`),L())}function ZP(e,t){if(e&1&&(I(0,`div`,69)(1,`h3`),K(2,` Outputs `),I(3,`span`,70),K(4),L()(),j(5,YP,3,0,`ul`,71)(6,XP,2,0,`p`,73),L()),e&2){let e=W();O(4),q(e.outputs.length),O(),M(e.outputs.length?5:6)}}function QP(e,t){if(e&1&&(I(0,`span`,103),K(1),L()),e&2){let e=W().$implicit;O(),q(e.kind)}}function $P(e,t){if(e&1&&(I(0,`li`,96)(1,`span`,97),K(2),j(3,QP,2,1,`span`,103),L(),R(4,`app-value-tree`,99),L()),e&2){let e=t.$implicit,n=W(4),r=W(3);O(2),J(` `,e.name,` `),O(),M(e.kind?3:-1),O(),F(`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&&(I(0,`ul`,95),N(1,$P,5,9,`li`,96,aP),L()),e&2){let e=W(2);O(),P(e.properties)}}function tF(e,t){e&1&&(I(0,`p`,73),K(1,`No other properties.`),L())}function nF(e,t){if(e&1&&(I(0,`div`,69)(1,`h3`),K(2,` Properties `),I(3,`span`,70),K(4),L()(),j(5,eF,3,0,`ul`,95)(6,tF,2,0,`p`,73),L()),e&2){let e=W();O(4),q(e.properties.length),O(),M(e.properties.length?5:6)}}function rF(e,t){if(e&1&&(I(0,`li`,72),K(1),L()),e&2){let e=t.$implicit;O(),q(e)}}function iF(e,t){if(e&1&&(I(0,`div`,69)(1,`h3`),K(2,` DOM listeners `),I(3,`span`,70),K(4),L()(),I(5,`ul`,71),N(6,rF,2,1,`li`,72,_g),L()()),e&2){let e=W(2);O(4),q(e.listeners.length),O(2),P(e.listeners)}}function aF(e,t){if(e&1&&(I(0,`li`,96)(1,`span`,97),K(2),L(),R(3,`app-value-tree`,104),L()),e&2){let e=t.$implicit,n=W(2).$implicit,r=W(2),i=W(3);O(2),q(e.name),O(),F(`prop`,e)(`store`,i.values)(`query`,i.propFilter())(`directive`,n.index)(`componentId`,r.id)(`pageId`,i.page()?.pageId??null)(`rpc`,i.rpc())}}function oF(e,t){if(e&1&&(I(0,`ul`,95),N(1,aF,4,8,`li`,96,aP),L()),e&2){let e=W().$implicit;O(),P(e.inputs)}}function sF(e,t){if(e&1&&(I(0,`li`,101)(1,`span`,90),K(2),L(),I(3,`span`,102),K(4),L()()),e&2){let e=t.$implicit;G(`on`,e.listened),O(2),q(e.name),O(2),q(e.listened?`listened`:`no listener`)}}function cF(e,t){if(e&1&&(I(0,`ul`,71),N(1,sF,5,4,`li`,100,aP),L()),e&2){let e=W().$implicit;O(),P(e.outputs)}}function lF(e,t){e&1&&(I(0,`p`,73),K(1,`No inputs or outputs.`),L())}function uF(e,t){if(e&1&&(I(0,`div`,69)(1,`h3`)(2,`span`,90),K(3),L(),I(4,`span`,103),K(5,`directive on host`),L()(),j(6,oF,3,0,`ul`,95),j(7,cF,3,0,`ul`,71),j(8,lF,2,0,`p`,73),L()),e&2){let e=t.$implicit;O(3),q(e.name),O(3),M(e.inputs.length?6:-1),O(),M(e.outputs.length?7:-1),O(),M(!e.inputs.length&&!e.outputs.length?8:-1)}}function dF(e,t){if(e&1&&(j(0,HP,7,1,`div`,94),j(1,qP,7,2,`div`,69),j(2,ZP,7,2,`div`,69),j(3,nF,7,2,`div`,69),j(4,iF,8,1,`div`,69),N(5,uF,9,4,`div`,69,iP)),e&2){let e=t,n=W(),r=W(3);M(r.propQuery()&&!e.count?0:-1),O(),M(!r.propQuery()||e.inputs.length?1:-1),O(),M(!r.propQuery()||e.outputs.length?2:-1),O(),M(!r.propQuery()||e.properties.length?3:-1),O(),M(!r.propQuery()&&n.listeners.length?4:-1),O(),P(e.directives)}}function fF(e,t){if(e&1&&(I(0,`span`,103),K(1),L()),e&2){let e=t.$implicit;O(),q(e)}}function pF(e,t){if(e&1&&(I(0,`span`,107),K(1,`from `),I(2,`span`,90),K(3),L()()),e&2){let e=W().$implicit;O(3),q(e.providedByName??`an injector`)}}function mF(e,t){e&1&&(I(0,`span`,108),K(1,`not provided`),L())}function hF(e,t){if(e&1&&(I(0,`li`,105)(1,`span`,106),K(2),L(),N(3,fF,2,1,`span`,103,_g),j(5,pF,4,1,`span`,107)(6,mF,2,0,`span`,108),L()),e&2){let e=t.$implicit;O(2),q(e.token),O(),P(e.flags),O(2),M(e.providedBy?5:6)}}function gF(e,t){if(e&1&&(I(0,`ul`,93),N(1,hF,7,2,`li`,105,oP),L()),e&2){let e=W();O(),P(e.dependencies)}}function _F(e,t){e&1&&(I(0,`p`,73),K(1,`Nothing is injected through the constructor or inject().`),L())}function vF(e,t){if(e&1){let e=V();I(0,`dl`,89)(1,`dt`),K(2,`Change detection`),L(),I(3,`dd`),K(4),L(),I(5,`dt`),K(6,`Encapsulation`),L(),I(7,`dd`),K(8),L(),I(9,`dt`),K(10,`Host path`),L(),I(11,`dd`,90),K(12),L(),N(13,BP,4,2,null,null,eP),L(),I(15,`div`,91)(16,`div`,5),E(),I(17,`svg`,6),R(18,`circle`,7)(19,`path`,8),L(),bs(),I(20,`input`,92,2),H(`input`,function(t){return w(e),T(W(3).propFilter.set(t.target.value))})(`keydown.escape`,function(t){return w(e),T(W(3).clearPropFilter(t))}),L()(),j(22,VP,2,2,`span`,11),I(23,`p`,23),K(24),L()(),j(25,dF,7,5),I(26,`div`,69)(27,`h3`),K(28,` Injected `),I(29,`span`,70),K(30),L()(),j(31,gF,3,0,`ul`,93)(32,_F,2,0,`p`,73),L()}if(e&2){let e,n=t,r=W(),i=W(2);O(4),q(n.changeDetection??`Unknown`),O(4),q(n.encapsulation??`Unknown`),O(4),q(n.path),O(),P(i.routedById().get(r.id)??rv(9,ZN)),O(7),F(`value`,i.propFilter()),O(2),M(i.propQuery()?22:-1),O(2),q(i.propFilterStatus()),O(),M((e=i.shownValues())?25:-1,e),O(5),q(n.dependencies.length),O(),M(n.dependencies.length?31:32)}}function yF(e,t){e&1&&(I(0,`div`,78),R(1,`span`,109),I(2,`p`,48),K(3,`Reading live values from the page…`),L()())}function bF(e,t){if(e&1&&(I(0,`section`,34)(1,`header`,65)(2,`span`,66),K(3,`component`),L(),I(4,`h2`,67),K(5),L(),I(6,`span`,68),K(7),L(),j(8,kP,2,2,`p`,75)(9,NP,3,2),j(10,PP,7,1),j(11,LP,1,1),j(12,RP,5,1,`div`,76),j(13,zP,1,6,`app-store-global`,77),L(),j(14,vF,33,10)(15,yF,4,0,`div`,78),L()),e&2){let e,n,r,i=t,a=W(2);O(5),q(i.name),O(2),J(`<`,i.tag,`>`),O(),M((e=a.detail()?.source)?8:9,e),O(2),M(a.devtoolsActions()?10:-1),O(),M((n=a.sourceFor(i))?11:-1,n),O(),M(a.canShowInjector()&&!a.staticReport()?12:-1),O(),M(!a.staticReport()&&!a.native()?13:-1),O(),M((r=a.detail())?14:15,r)}}function xF(e,t){e&1&&(I(0,`p`,47),K(1,`The selected component was destroyed`),L(),I(2,`p`,48)(3,`span`,90),K(4),L(),K(5,` is no longer on the page. Select another component to see its live values. `),L()),e&2&&(O(4),q(t))}function SF(e,t){e&1&&(I(0,`p`,48),K(1,` Select a component to see its live inputs, properties, outputs, change detection and injected services. `),L())}function CF(e,t){if(e&1&&(I(0,`div`,35),j(1,xF,6,1)(2,SF,2,0,`p`,48),L()),e&2){let e,t=W(2);O(),M((e=t.destroyed())?1:2,e)}}function wF(e,t){e&1&&R(0,`app-angular-unavailable`,37),e&2&&F(`page`,W(2).angularPage())}function TF(e,t){if(e&1){let e=V();I(0,`app-hydration-section`,110),H(`overlay`,function(t){return w(e),T(W(2).setHydrationOverlay(t))})(`showNode`,function(t){return w(e),T(W(2).revealNode(t))})(`highlight`,function(t){return w(e),T(W(2).highlight(t))}),L()}e&2&&F(`report`,W(2).page()?.hydration)}function EF(e,t){if(e&1){let e=V();I(0,`app-cd-recording`,111),H(`showComponent`,function(t){return w(e),T(W(2).showCdComponent(t))}),L(),I(1,`app-leaks-section`,112),H(`showComponent`,function(t){return w(e),T(W(2).showLeakComponent(t))})(`highlight`,function(t){return w(e),T(W(2).highlight(t))}),L()}if(e&2){let e=W(2);F(`page`,e.cdPage())(`pageId`,e.page().pageId)(`rpc`,e.rpc())(`native`,e.native()),O(),F(`report`,e.leaksPage())(`pageId`,e.page().pageId)(`rpc`,e.rpc())(`angular`,e.angularPage())}}function DF(e,t){if(e&1){let e=V();I(0,`p`,3),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. `),L(),I(2,`div`,4)(3,`div`,5),E(),I(4,`svg`,6),R(5,`circle`,7)(6,`path`,8),L(),bs(),I(7,`input`,9,0),H(`input`,function(t){return w(e),T(W().setFilter(t.target.value))})(`keydown.escape`,function(){return w(e),T(W().setFilter(``))}),L(),I(9,`span`,10),K(10,` Type plain text, a tag such as