{"version":3,"file":"cisstech-nge-doc-default-layout.component-CjTyGxaW.mjs","sources":["../../../projects/nge/doc/src/ui/layouts/default/breadcrumb/breadcrumb.component.ts","../../../projects/nge/doc/src/ui/layouts/default/icon/icon.component.ts","../../../projects/nge/doc/src/ui/layouts/default/theme-toggle/theme-toggle.component.ts","../../../projects/nge/doc/src/ui/layouts/default/header/header.component.ts","../../../projects/nge/doc/src/ui/layouts/default/header/header.component.html","../../../projects/nge/doc/src/ui/layouts/default/page-actions/page-actions.component.ts","../../../projects/nge/doc/src/ui/layouts/default/pager/pager.component.ts","../../../projects/nge/doc/src/ui/layouts/default/pager/pager.component.html","../../../projects/nge/doc/src/ui/layouts/default/search/search-palette.component.ts","../../../projects/nge/doc/src/ui/layouts/default/search/search-palette.component.html","../../../projects/nge/doc/src/ui/layouts/default/sidenav/sidenav.component.ts","../../../projects/nge/doc/src/ui/layouts/default/sidenav/sidenav.component.html","../../../projects/nge/doc/src/ui/layouts/default/toc/toc.component.ts","../../../projects/nge/doc/src/ui/layouts/default/toc/toc.component.html","../../../projects/nge/doc/src/ui/layouts/default/default-layout.component.ts","../../../projects/nge/doc/src/ui/layouts/default/default-layout.component.html"],"sourcesContent":["import { ChangeDetectionStrategy, Component, inject } from '@angular/core'\nimport { RouterLink } from '@angular/router'\nimport { NgeDocService } from '../../../../core/nge-doc.service'\n\n@Component({\n  selector: 'nge-doc-breadcrumb',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [RouterLink],\n  template: `\n    @if (trail().length) {\n      <nav class=\"breadcrumb\" [attr.aria-label]=\"labels.breadcrumb\">\n        <span class=\"root\">{{ meta().name }}</span>\n        @for (link of trail(); track link.href; let last = $last) {\n          <span class=\"sep\" aria-hidden=\"true\">/</span>\n          @if (last) {\n            <span class=\"current\" aria-current=\"page\">{{ link.title }}</span>\n          } @else {\n            <a [routerLink]=\"link.href\">{{ link.title }}</a>\n          }\n        }\n      </nav>\n    }\n  `,\n  styles: [\n    `\n      .breadcrumb {\n        display: flex;\n        align-items: center;\n        flex-wrap: wrap;\n        gap: 0.4rem;\n        font-size: 0.8rem;\n        color: var(--nge-doc-fg-muted);\n        margin-bottom: 1.1rem;\n      }\n      .sep {\n        color: var(--nge-doc-border-strong);\n      }\n      .current {\n        color: var(--nge-doc-fg);\n        font-weight: 600;\n      }\n      a {\n        color: inherit;\n        text-decoration: none;\n        transition: color 0.12s;\n      }\n      a:hover {\n        color: var(--nge-doc-primary);\n      }\n    `,\n  ],\n})\nexport class BreadcrumbComponent {\n  private readonly docService = inject(NgeDocService)\n  protected readonly trail = this.docService.breadcrumb\n  protected readonly meta = this.docService.meta\n  protected readonly labels = this.docService.labels\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  ElementRef,\n  computed,\n  effect,\n  inject,\n  input,\n  viewChild,\n} from '@angular/core'\nimport { NgeDocIcon } from '../../../../core/nge-doc'\nimport { NgeDocThemeService } from '../../../../core/nge-doc-theme.service'\n\n/**\n * Renders a consumer-provided icon so it looks right in light and dark.\n *\n * A monochrome url is painted with `currentColor` through a CSS mask, so any\n * single-color icon adapts to the theme automatically. A `{ light, dark }` pair\n * (or a non-monochrome icon) is rendered as a plain image with the variant that\n * matches the active scheme.\n */\n@Component({\n  selector: 'nge-doc-icon',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    @if (masked()) {\n      <span #mask class=\"icon\" [style.width]=\"size()\" [style.height]=\"size()\"></span>\n    } @else {\n      <img class=\"icon\" [src]=\"src()\" alt=\"\" [style.width]=\"size()\" [style.height]=\"size()\" />\n    }\n  `,\n  styles: [\n    `\n      :host {\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n      }\n      .icon {\n        display: inline-block;\n        object-fit: contain;\n      }\n      span.icon {\n        background-color: currentColor;\n        -webkit-mask-repeat: no-repeat;\n        mask-repeat: no-repeat;\n        -webkit-mask-position: center;\n        mask-position: center;\n        -webkit-mask-size: contain;\n        mask-size: contain;\n      }\n    `,\n  ],\n})\nexport class NgeDocIconComponent {\n  private readonly theme = inject(NgeDocThemeService)\n  private readonly maskEl = viewChild<ElementRef<HTMLElement>>('mask')\n\n  /** The icon to render (a url, or a light/dark pair). */\n  readonly icon = input.required<NgeDocIcon>()\n  /** Whether a single-url icon is monochrome and should follow the text color. */\n  readonly mono = input(true)\n  /** CSS size applied to both dimensions. */\n  readonly size = input('1em')\n\n  /**\n   * A single-url monochrome icon is drawn with a mask so it follows the text\n   * color. CSS masks enforce CORS, so this only applies to same-origin (or data)\n   * urls; cross-origin icons fall back to an image (use a `{ light, dark }` pair\n   * for those).\n   */\n  protected readonly masked = computed(() => {\n    const icon = this.icon()\n    return this.mono() && typeof icon === 'string' && this.isMaskable(icon)\n  })\n\n  /** Source url for the image branch, resolving light/dark pairs. */\n  protected readonly src = computed(() => {\n    const icon = this.icon()\n    return typeof icon === 'string' ? icon : this.theme.isDark() ? icon.dark : icon.light\n  })\n\n  constructor() {\n    effect(() => {\n      const host = this.maskEl()?.nativeElement\n      const icon = this.icon()\n      if (!host || typeof icon !== 'string') {\n        return\n      }\n      // Set the mask through the DOM to bypass Angular's style url() sanitizer.\n      const value = `url(\"${icon}\")`\n      host.style.setProperty('-webkit-mask-image', value)\n      host.style.setProperty('mask-image', value)\n    })\n  }\n\n  private isMaskable(url: string): boolean {\n    if (url.startsWith('data:')) {\n      return true\n    }\n    try {\n      return new URL(url, document.baseURI).origin === location.origin\n    } catch {\n      return false\n    }\n  }\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core'\nimport { NgeDocThemeService } from '../../../../core/nge-doc-theme.service'\nimport { NgeDocService } from '../../../../core/nge-doc.service'\n\n@Component({\n  selector: 'nge-doc-theme-toggle',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <button\n      class=\"icon-btn\"\n      type=\"button\"\n      [attr.aria-label]=\"isDark() ? labels.switchToLight : labels.switchToDark\"\n      (click)=\"theme.toggle()\"\n    >\n      @if (isDark()) {\n        <svg\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n        >\n          <circle cx=\"12\" cy=\"12\" r=\"4\" />\n          <path\n            d=\"M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\"\n          />\n        </svg>\n      } @else {\n        <svg\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n        >\n          <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\" />\n        </svg>\n      }\n    </button>\n  `,\n})\nexport class ThemeToggleComponent {\n  protected readonly theme = inject(NgeDocThemeService)\n  protected readonly isDark = this.theme.isDark\n  protected readonly labels = inject(NgeDocService).labels\n}\n","import { NgTemplateOutlet } from '@angular/common'\nimport { ChangeDetectionStrategy, Component, inject, input, output } from '@angular/core'\nimport { RouterLink } from '@angular/router'\nimport { NgeDocService } from '../../../../core/nge-doc.service'\nimport { NgeDocIconComponent } from '../icon/icon.component'\nimport { ThemeToggleComponent } from '../theme-toggle/theme-toggle.component'\n\n@Component({\n  selector: 'nge-doc-header',\n  templateUrl: './header.component.html',\n  styleUrls: ['./header.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [RouterLink, NgTemplateOutlet, ThemeToggleComponent, NgeDocIconComponent],\n})\nexport class HeaderComponent {\n  protected readonly docService = inject(NgeDocService)\n  protected readonly meta = this.docService.meta\n  protected readonly currLink = this.docService.currLink\n  protected readonly navbar = this.docService.navbar\n  protected readonly brand = this.docService.brand\n  protected readonly labels = this.docService.labels\n\n  /** Whether the desktop sidebar is currently collapsed. */\n  readonly collapsed = input(false)\n\n  /** Emitted when the mobile navigation toggle is pressed. */\n  readonly toggleSidebar = output()\n  /** Emitted when the desktop sidebar collapse toggle is pressed. */\n  readonly toggleCollapse = output()\n  /** Emitted when the search trigger is pressed (wired by the search feature). */\n  readonly openSearch = output()\n}\n","<button class=\"icon-btn menu\" type=\"button\" [attr.aria-label]=\"labels.toggleNavigation\" (click)=\"toggleSidebar.emit()\">\n  <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\">\n    <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n    <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" />\n    <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\" />\n  </svg>\n</button>\n\n<button\n  class=\"icon-btn sidebar-toggle\"\n  type=\"button\"\n  [attr.aria-label]=\"collapsed() ? labels.showSidebar : labels.hideSidebar\"\n  [attr.aria-pressed]=\"collapsed()\"\n  (click)=\"toggleCollapse.emit()\"\n>\n  <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n    <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" />\n    <line x1=\"9\" y1=\"4\" x2=\"9\" y2=\"20\" />\n  </svg>\n</button>\n\n@if (brand().href; as href) {\n  <a class=\"brand\" [routerLink]=\"href\">\n    <ng-container [ngTemplateOutlet]=\"brandContent\" />\n  </a>\n} @else if (meta().backUrlHref && !meta().backUrl) {\n  <a class=\"brand\" [href]=\"meta().backUrlHref\">\n    <ng-container [ngTemplateOutlet]=\"brandContent\" />\n  </a>\n} @else {\n  <a class=\"brand\" [routerLink]=\"meta().backUrl ?? meta().root\">\n    <ng-container [ngTemplateOutlet]=\"brandContent\" />\n  </a>\n}\n\n@if (navbar().length > 1) {\n  <nav class=\"navbar\" [attr.aria-label]=\"labels.sections\">\n    @for (link of navbar(); track link.href) {\n      @if (link.external) {\n        <a class=\"navbar-link\" [href]=\"link.href\" target=\"_blank\" rel=\"noopener\">\n          @if (link.icon) {\n            <nge-doc-icon [icon]=\"link.icon\" size=\"16px\" />\n          }\n          <span>{{ link.title }}</span>\n        </a>\n      } @else {\n        <a class=\"navbar-link\" [routerLink]=\"link.href\" [class.active]=\"docService.isNavLinkActive(link)\">\n          @if (link.icon) {\n            <nge-doc-icon [icon]=\"link.icon\" size=\"16px\" />\n          }\n          <span>{{ link.title }}</span>\n        </a>\n      }\n    }\n  </nav>\n}\n\n<span class=\"spacer\"></span>\n\n<button class=\"search\" type=\"button\" [attr.aria-label]=\"labels.search\" (click)=\"openSearch.emit()\">\n  <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\">\n    <circle cx=\"11\" cy=\"11\" r=\"8\" />\n    <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n  </svg>\n  <span class=\"label\">{{ labels.search }}</span>\n  <span class=\"kbd\">⌘K</span>\n</button>\n\n<nge-doc-theme-toggle />\n\n@for (action of currLink()?.actions ?? []; track action) {\n  <button\n    class=\"icon-btn\"\n    type=\"button\"\n    [title]=\"action.tooltip ?? action.title ?? ''\"\n    [attr.aria-label]=\"action.title ?? action.tooltip ?? labels.action\"\n    (click)=\"docService.runAction(action.run)\"\n  >\n    @if (action.icon) {\n      <nge-doc-icon [icon]=\"action.icon\" size=\"18px\" />\n    } @else {\n      <span>{{ action.title }}</span>\n    }\n  </button>\n}\n\n@for (link of meta().links ?? []; track link.href) {\n  <a class=\"icon-btn\" [href]=\"link.href\" target=\"_blank\" rel=\"noopener\">\n    <nge-doc-icon [icon]=\"link.icon\" size=\"18px\" />\n  </a>\n}\n\n@if (meta().repo; as repo) {\n  <a class=\"icon-btn\" [href]=\"repo.url\" target=\"_blank\" rel=\"noopener\" [attr.aria-label]=\"repo.name || labels.repository\">\n    <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n      <path\n        d=\"M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22\"\n      />\n    </svg>\n  </a>\n}\n\n<ng-template #brandContent>\n  @if (brand().icon; as logo) {\n    <nge-doc-icon [icon]=\"logo\" [mono]=\"false\" size=\"26px\" />\n  } @else {\n    <svg viewBox=\"0 0 32 32\" fill=\"none\" aria-hidden=\"true\">\n      <path d=\"M16 2 4 8v10c0 6.5 5 10.5 12 12 7-1.5 12-5.5 12-12V8L16 2Z\" fill=\"var(--nge-doc-primary)\" opacity=\"0.16\" />\n      <path d=\"M16 2 4 8v10c0 6.5 5 10.5 12 12 7-1.5 12-5.5 12-12V8L16 2Z\" stroke=\"var(--nge-doc-primary)\" stroke-width=\"1.6\" />\n      <path d=\"M16 9v14M10 12l6 3 6-3\" stroke=\"var(--nge-doc-primary)\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n    </svg>\n  }\n  <span>{{ brand().title }}</span>\n</ng-template>\n","import { HttpClient } from '@angular/common/http'\nimport { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core'\nimport { firstValueFrom } from 'rxjs'\nimport { parseFrontmatter } from '../../../../shared/frontmatter'\nimport { NgeDocService } from '../../../../core/nge-doc.service'\n\n/**\n * \"Copy as Markdown\" and \"Open in ChatGPT / Claude\" actions for the active page.\n * Copy fetches the page's raw markdown; the AI links carry its absolute `.md`\n * url (only shown when `withSeo({ url })` provides one).\n */\n@Component({\n  selector: 'nge-doc-page-actions',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    @if (markdownUrl(); as url) {\n      <div class=\"nge-doc-page-actions\">\n        <button type=\"button\" class=\"action\" (click)=\"copy(url)\">\n          {{ copied() ? labels.copied : labels.copyAsMarkdown }}\n        </button>\n        @if (aiLinks(); as ai) {\n          <a class=\"action\" [href]=\"ai.chatgpt\" target=\"_blank\" rel=\"noopener\">{{ labels.openInChatGpt }}</a>\n          <a class=\"action\" [href]=\"ai.claude\" target=\"_blank\" rel=\"noopener\">{{ labels.openInClaude }}</a>\n        }\n      </div>\n    }\n  `,\n  styles: [\n    `\n      .nge-doc-page-actions {\n        display: flex;\n        flex-wrap: wrap;\n        justify-content: flex-end;\n        gap: 0.5rem;\n        margin-bottom: 1rem;\n      }\n      .action {\n        font: inherit;\n        font-size: 0.8rem;\n        padding: 0.25rem 0.6rem;\n        border: 1px solid var(--nge-doc-border);\n        border-radius: 0.4rem;\n        background: transparent;\n        color: var(--nge-doc-fg-muted);\n        cursor: pointer;\n        transition:\n          color 0.12s,\n          border-color 0.12s;\n      }\n      .action:hover {\n        color: var(--nge-doc-primary);\n        border-color: var(--nge-doc-primary);\n      }\n    `,\n  ],\n})\nexport class PageActionsComponent {\n  private readonly docService = inject(NgeDocService)\n  private readonly http = inject(HttpClient, { optional: true })\n\n  protected readonly labels = this.docService.labels\n  protected readonly markdownUrl = this.docService.markdownUrl\n  protected readonly copied = signal(false)\n\n  /** ChatGPT and Claude urls that ask the model to read the page's raw markdown. */\n  protected readonly aiLinks = computed(() => {\n    const url = this.docService.markdownAbsoluteUrl()\n    if (!url) {\n      return undefined\n    }\n    const prompt = encodeURIComponent(`Read ${url} so I can ask you questions about it.`)\n    return { chatgpt: `https://chatgpt.com/?q=${prompt}`, claude: `https://claude.ai/new?q=${prompt}` }\n  })\n\n  protected async copy(url: string): Promise<void> {\n    if (!this.http) {\n      return\n    }\n    try {\n      const raw = await firstValueFrom(this.http.get(url, { responseType: 'text' }))\n      await navigator.clipboard?.writeText(parseFrontmatter(raw).content)\n      this.copied.set(true)\n      setTimeout(() => this.copied.set(false), 2000)\n    } catch {\n      // Clipboard or fetch may be unavailable; leave the label unchanged.\n    }\n  }\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core'\nimport { RouterLink } from '@angular/router'\nimport { NgeDocService } from '../../../../core/nge-doc.service'\n\n@Component({\n  selector: 'nge-doc-pager',\n  templateUrl: './pager.component.html',\n  styleUrls: ['./pager.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [RouterLink],\n})\nexport class PagerComponent {\n  private readonly docService = inject(NgeDocService)\n  protected readonly prev = this.docService.prevLink\n  protected readonly next = this.docService.nextLink\n  protected readonly labels = this.docService.labels\n}\n","@if (prev() || next()) {\n  <nav class=\"pager\" [attr.aria-label]=\"labels.pagination\">\n    @if (prev(); as p) {\n      <a class=\"prev\" [routerLink]=\"p.href\">\n        <span class=\"dir\"><kbd class=\"kbd\" aria-hidden=\"true\">←</kbd> {{ labels.previous }}</span>\n        <span class=\"title\">{{ p.title }}</span>\n      </a>\n    } @else {\n      <span></span>\n    }\n    @if (next(); as n) {\n      <a class=\"next\" [routerLink]=\"n.href\">\n        <span class=\"dir\">{{ labels.next }} <kbd class=\"kbd\" aria-hidden=\"true\">→</kbd></span>\n        <span class=\"title\">{{ n.title }}</span>\n      </a>\n    }\n  </nav>\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  ElementRef,\n  afterNextRender,\n  computed,\n  inject,\n  output,\n  signal,\n  viewChild,\n} from '@angular/core'\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop'\nimport { Router } from '@angular/router'\nimport { switchMap } from 'rxjs'\nimport { NgeDocService } from '../../../../core/nge-doc.service'\nimport { NgeDocSearchResult } from '../../../../core/search'\n\ninterface HighlightPart {\n  text: string\n  hit: boolean\n}\n\ninterface SearchRow {\n  result: NgeDocSearchResult\n  /** Breadcrumb trail down to the page, so same-titled pages read as distinct rows. */\n  crumb: string\n  excerpt: HighlightPart[] | null\n}\n\n/** Splits `text` into segments so each `needle` occurrence can be wrapped in a highlight. */\nfunction highlight(text: string, needle: string): HighlightPart[] {\n  if (!needle) {\n    return [{ text, hit: false }]\n  }\n  const parts: HighlightPart[] = []\n  const lower = text.toLowerCase()\n  const target = needle.toLowerCase()\n  let from = 0\n  for (let at = lower.indexOf(target); at >= 0; at = lower.indexOf(target, from)) {\n    if (at > from) {\n      parts.push({ text: text.slice(from, at), hit: false })\n    }\n    parts.push({ text: text.slice(at, at + target.length), hit: true })\n    from = at + target.length\n  }\n  if (from < text.length) {\n    parts.push({ text: text.slice(from), hit: false })\n  }\n  return parts\n}\n\n@Component({\n  selector: 'nge-doc-search-palette',\n  templateUrl: './search-palette.component.html',\n  styleUrls: ['./search-palette.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SearchPaletteComponent {\n  private readonly docService = inject(NgeDocService)\n  private readonly router = inject(Router)\n\n  private readonly input = viewChild.required<ElementRef<HTMLInputElement>>('input')\n\n  /** Emitted when the palette should be dismissed. */\n  readonly closed = output()\n\n  protected readonly labels = this.docService.labels\n  protected readonly query = signal('')\n  protected readonly activeIndex = signal(0)\n  protected readonly results = toSignal(\n    toObservable(this.query).pipe(switchMap((query) => this.docService.search(query))),\n    { initialValue: [] as NgeDocSearchResult[] }\n  )\n\n  /** Results paired with their breadcrumb and pre-split excerpt, computed once per query, not per render. */\n  protected readonly rows = computed<SearchRow[]>(() => {\n    const needle = this.query().trim()\n    return this.results().map((result) => ({\n      result,\n      // Drop the site name (path[0]); the section trail plus the title is what distinguishes rows.\n      crumb: [...result.path.slice(1), result.title].join(' › '),\n      excerpt: result.excerpt ? highlight(result.excerpt, needle) : null,\n    }))\n  })\n\n  constructor() {\n    afterNextRender(() => this.input().nativeElement.focus())\n  }\n\n  protected onInput(value: string): void {\n    this.query.set(value)\n    this.activeIndex.set(0)\n  }\n\n  protected onKeydown(event: KeyboardEvent): void {\n    const results = this.results()\n    switch (event.key) {\n      case 'Escape':\n        event.preventDefault()\n        this.closed.emit()\n        break\n      case 'ArrowDown':\n        event.preventDefault()\n        this.activeIndex.update((index) => (results.length ? (index + 1) % results.length : 0))\n        break\n      case 'ArrowUp':\n        event.preventDefault()\n        this.activeIndex.update((index) => (results.length ? (index - 1 + results.length) % results.length : 0))\n        break\n      case 'Enter': {\n        event.preventDefault()\n        const result = results[this.activeIndex()]\n        if (result) {\n          this.select(result)\n        }\n        break\n      }\n    }\n  }\n\n  protected select(result: NgeDocSearchResult): void {\n    this.router.navigateByUrl(result.slug)\n    this.closed.emit()\n  }\n\n  protected dismiss(): void {\n    this.closed.emit()\n  }\n}\n","<div class=\"palette\" (keydown)=\"onKeydown($event)\">\n  <div class=\"palette-input\">\n    <svg\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      stroke=\"currentColor\"\n      stroke-width=\"2\"\n      stroke-linecap=\"round\"\n      aria-hidden=\"true\"\n    >\n      <circle cx=\"11\" cy=\"11\" r=\"8\" />\n      <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n    </svg>\n    <input\n      #input\n      type=\"text\"\n      autocomplete=\"off\"\n      spellcheck=\"false\"\n      [attr.placeholder]=\"labels.search\"\n      [attr.aria-label]=\"labels.search\"\n      [value]=\"query()\"\n      (input)=\"onInput(input.value)\"\n    />\n    <button type=\"button\" class=\"kbd\" (click)=\"dismiss()\">Esc</button>\n  </div>\n\n  <div class=\"palette-results\" role=\"listbox\">\n    @if (query() && !results().length) {\n      <div class=\"palette-empty\">{{ labels.searchEmpty }} “{{ query() }}”</div>\n    }\n    @for (row of rows(); track row.result.slug; let i = $index) {\n      <button\n        type=\"button\"\n        role=\"option\"\n        class=\"palette-item\"\n        [class.active]=\"i === activeIndex()\"\n        [attr.aria-selected]=\"i === activeIndex()\"\n        (click)=\"select(row.result)\"\n        (mouseenter)=\"activeIndex.set(i)\"\n      >\n        <span class=\"palette-item-title\">\n          {{ row.crumb }}\n          @if (row.result.heading) {\n            <span class=\"palette-item-section\">› {{ row.result.heading }}</span>\n          }\n        </span>\n        @if (row.excerpt) {\n          <span class=\"palette-item-excerpt\">\n            @for (part of row.excerpt; track $index) {\n              @if (part.hit) {\n                <mark>{{ part.text }}</mark>\n              } @else {\n                <span>{{ part.text }}</span>\n              }\n            }\n          </span>\n        }\n      </button>\n    }\n  </div>\n</div>\n","import { NgTemplateOutlet } from '@angular/common'\nimport { ChangeDetectionStrategy, Component, effect, inject, signal } from '@angular/core'\nimport { RouterLink, RouterLinkActive } from '@angular/router'\nimport { NgeDocLink } from '../../../../core/nge-doc'\nimport { NgeDocService } from '../../../../core/nge-doc.service'\nimport { NgeDocIconComponent } from '../icon/icon.component'\n\n@Component({\n  selector: 'nge-doc-sidenav',\n  templateUrl: './sidenav.component.html',\n  styleUrls: ['./sidenav.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [NgTemplateOutlet, RouterLink, RouterLinkActive, NgeDocIconComponent],\n})\nexport class SidenavComponent {\n  protected readonly docService = inject(NgeDocService)\n  protected readonly rootLinks = this.docService.sidebarLinks\n  protected readonly navbar = this.docService.navbar\n  protected readonly labels = this.docService.labels\n\n  /** Explicit open/closed choices, keyed by href; they win over the default. */\n  private readonly overrides = signal<ReadonlyMap<string, boolean>>(new Map())\n\n  constructor() {\n    // Navigating re-opens the folders leading to the active page, so the reader\n    // always sees where they are even after collapsing a branch earlier.\n    effect(() => {\n      const trail = this.docService.breadcrumb()\n      if (trail.length < 2) {\n        return\n      }\n      const ancestors = trail\n        .slice(0, -1)\n        .map((link) => link.href)\n        .filter((href): href is string => href != null)\n      this.overrides.update((prev) => {\n        if (!ancestors.some((href) => prev.has(href))) {\n          return prev\n        }\n        const next = new Map(prev)\n        ancestors.forEach((href) => next.delete(href))\n        return next\n      })\n    })\n  }\n\n  protected isExpandable(link: NgeDocLink): boolean {\n    return !!link.children?.length\n  }\n\n  /** A folder is open by default when it holds the active page; a toggle overrides that. */\n  protected isOpen(link: NgeDocLink): boolean {\n    const override = link.href ? this.overrides().get(link.href) : undefined\n    return override ?? this.holdsActive(link)\n  }\n\n  protected toggle(link: NgeDocLink): void {\n    if (!link.href) {\n      return\n    }\n    const next = new Map(this.overrides())\n    next.set(link.href, !this.isOpen(link))\n    this.overrides.set(next)\n  }\n\n  /** Whether the active page is this link or lives somewhere in its subtree. */\n  private holdsActive(link: NgeDocLink): boolean {\n    const active = this.docService.currLink()\n    if (!active) {\n      return false\n    }\n    if (link.href === active.href) {\n      return true\n    }\n    return (link.children ?? []).some((child) => this.holdsActive(child))\n  }\n}\n","@if (navbar().length > 1) {\n  <nav class=\"drawer-navbar\" [attr.aria-label]=\"labels.sections\">\n    @for (link of navbar(); track link.href) {\n      @if (link.external) {\n        <a class=\"drawer-navbar-link\" [href]=\"link.href\" target=\"_blank\" rel=\"noopener\">\n          @if (link.icon; as icon) {\n            <nge-doc-icon [icon]=\"icon\" size=\"16px\" />\n          }\n          <span>{{ link.title }}</span>\n        </a>\n      } @else {\n        <a\n          class=\"drawer-navbar-link\"\n          [routerLink]=\"link.href\"\n          [class.active]=\"docService.isNavLinkActive(link)\"\n        >\n          @if (link.icon; as icon) {\n            <nge-doc-icon [icon]=\"icon\" size=\"16px\" />\n          }\n          <span>{{ link.title }}</span>\n        </a>\n      }\n    }\n  </nav>\n}\n\n<nav class=\"nav\">\n  @for (link of rootLinks(); track link) {\n    <ng-container *ngTemplateOutlet=\"node; context: { $implicit: link, depth: 0 }\" />\n  }\n</nav>\n\n<ng-template #node let-link let-depth=\"depth\">\n  @if (link.separator) {\n    <div class=\"nav-section\">\n      @if (link.color) {\n        <span class=\"nav-section-dot\" [style.background]=\"link.color\"></span>\n      }\n      <span>{{ link.title }}</span>\n    </div>\n  } @else if (isExpandable(link)) {\n    <div class=\"nav-folder\" [class.depth0]=\"depth === 0\">\n      @if (link.renderer) {\n        <div class=\"nav-folder-head\">\n          <a\n            class=\"nav-link nav-folder-label\"\n            [routerLink]=\"link.href\"\n            routerLinkActive=\"active\"\n            [routerLinkActiveOptions]=\"{ exact: true }\"\n          >\n            @if (link.icon; as icon) {\n              <nge-doc-icon [icon]=\"icon\" size=\"16px\" />\n            }\n            <span>{{ link.title }}</span>\n          </a>\n          <button\n            class=\"nav-toggle\"\n            type=\"button\"\n            (click)=\"toggle(link)\"\n            [attr.aria-expanded]=\"isOpen(link)\"\n            [attr.aria-label]=\"(isOpen(link) ? labels.collapse : labels.expand) + ' ' + link.title\"\n          >\n            <svg class=\"chevron\" [class.open]=\"isOpen(link)\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n              <polyline points=\"9 18 15 12 9 6\" />\n            </svg>\n          </button>\n        </div>\n      } @else {\n        <button\n          class=\"nav-link nav-folder-label as-button\"\n          type=\"button\"\n          (click)=\"toggle(link)\"\n          [attr.aria-expanded]=\"isOpen(link)\"\n        >\n          @if (link.icon; as icon) {\n            <nge-doc-icon [icon]=\"icon\" size=\"16px\" />\n          }\n          <span>{{ link.title }}</span>\n          <svg class=\"chevron\" [class.open]=\"isOpen(link)\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n            <polyline points=\"9 18 15 12 9 6\" />\n          </svg>\n        </button>\n      }\n      <div class=\"nav-collapse\" [class.open]=\"isOpen(link)\">\n        <div class=\"nav-collapse-inner\" [attr.inert]=\"isOpen(link) ? null : ''\">\n          <div class=\"nav-children\">\n            @for (child of link.children; track child) {\n              <ng-container *ngTemplateOutlet=\"node; context: { $implicit: child, depth: depth + 1 }\" />\n            }\n          </div>\n        </div>\n      </div>\n    </div>\n  } @else {\n    <a\n      class=\"nav-link\"\n      [routerLink]=\"link.href\"\n      routerLinkActive=\"active\"\n      [routerLinkActiveOptions]=\"{ exact: true }\"\n    >\n      @if (link.icon; as icon) {\n        <nge-doc-icon [icon]=\"icon\" size=\"16px\" />\n      }\n      <span>{{ link.title }}</span>\n    </a>\n  }\n</ng-template>\n","import { ChangeDetectionStrategy, Component, inject, input } from '@angular/core'\nimport { NgeDocRendererComponent } from '../../../renderer/renderer.component'\nimport { NgeDocService } from '../../../../core/nge-doc.service'\n\n@Component({\n  selector: 'nge-doc-toc',\n  templateUrl: './toc.component.html',\n  styleUrls: ['./toc.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TocComponent {\n  /** The active renderer, whose extracted headings drive this table of contents. */\n  readonly renderer = input.required<NgeDocRendererComponent>()\n\n  protected readonly labels = inject(NgeDocService).labels\n\n  protected onSelect(event: Event, id: string): void {\n    event.preventDefault()\n    this.renderer().scrollToHeading(id)\n  }\n\n  protected scrollToTop(): void {\n    const options: ScrollToOptions = { top: 0, behavior: 'smooth' }\n    // scrollingElement is the viewport scroller (document root or body).\n    document.scrollingElement?.scrollTo(options)\n    window.scrollTo(options)\n  }\n}\n","@if (renderer().headings().length) {\n  <nav class=\"toc\" [attr.aria-label]=\"labels.tableOfContents\">\n    <div class=\"toc-label\">{{ labels.tableOfContents }}</div>\n    <ul>\n      @for (heading of renderer().headings(); track heading.id) {\n        <li>\n          <a\n            [attr.href]=\"'#' + heading.id\"\n            [class.active]=\"renderer().activeHeadingId() === heading.id\"\n            [class.sub]=\"heading.level >= 3\"\n            (click)=\"onSelect($event, heading.id)\"\n          >\n            {{ heading.label }}\n          </a>\n        </li>\n      }\n    </ul>\n    <button type=\"button\" class=\"toc-top\" (click)=\"scrollToTop()\">\n      <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n        <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"5\" />\n        <polyline points=\"5 12 12 5 19 12\" />\n      </svg>\n      <span>{{ labels.backToTop }}</span>\n    </button>\n  </nav>\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  ElementRef,\n  HostListener,\n  ViewEncapsulation,\n  effect,\n  inject,\n  signal,\n  viewChild,\n} from '@angular/core'\nimport { DatePipe } from '@angular/common'\nimport { Router } from '@angular/router'\nimport { NgeDocRendererComponent } from '../../renderer/renderer.component'\nimport { NgeDocLink } from '../../../core/nge-doc'\nimport { NgeDocService } from '../../../core/nge-doc.service'\nimport { BreadcrumbComponent } from './breadcrumb/breadcrumb.component'\nimport { HeaderComponent } from './header/header.component'\nimport { PageActionsComponent } from './page-actions/page-actions.component'\nimport { PagerComponent } from './pager/pager.component'\nimport { SearchPaletteComponent } from './search/search-palette.component'\nimport { SidenavComponent } from './sidenav/sidenav.component'\nimport { TocComponent } from './toc/toc.component'\n\n@Component({\n  selector: 'nge-doc-default-layout',\n  templateUrl: './default-layout.component.html',\n  styleUrls: ['./default-layout.component.scss', './theme.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  imports: [\n    DatePipe,\n    HeaderComponent,\n    SidenavComponent,\n    NgeDocRendererComponent,\n    BreadcrumbComponent,\n    PageActionsComponent,\n    PagerComponent,\n    TocComponent,\n    SearchPaletteComponent,\n  ],\n})\nexport class DefaultLayoutComponent {\n  private readonly docService = inject(NgeDocService)\n  private readonly router = inject(Router)\n\n  protected readonly labels = this.docService.labels\n  /** \"Edit this page\" url for the active page, when `withEditLink` is set. */\n  protected readonly editUrl = this.docService.editUrl\n  /** ISO date the active page was last updated, when the compiler recorded it. */\n  protected readonly lastUpdated = this.docService.lastUpdated\n  protected readonly sidebarOpen = signal(false)\n  protected readonly searchOpen = signal(false)\n  /** Desktop: whether the sidebar is collapsed to give the content more room. */\n  protected readonly sidebarCollapsed = signal(this.readCollapsed())\n\n  /** The scroll region, focused on navigation so the keyboard scrolls the page. */\n  private readonly main = viewChild<ElementRef<HTMLElement>>('main')\n\n  constructor() {\n    effect(() => {\n      this.docService.currLink()\n      // Close the mobile navigation drawer whenever the active page changes.\n      this.sidebarOpen.set(false)\n      // Move focus to the content so the page can be scrolled with the keyboard\n      // right away, and so assistive tech lands on the new page.\n      this.main()?.nativeElement.focus({ preventScroll: true })\n    })\n  }\n\n  @HostListener('document:keydown', ['$event'])\n  protected onDocumentKeydown(event: KeyboardEvent): void {\n    if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'k') {\n      event.preventDefault()\n      this.searchOpen.update((open) => !open)\n      return\n    }\n\n    // Page shortcuts stay out of the way while typing, with a modifier held, or\n    // when the search palette is open.\n    if (\n      this.searchOpen() ||\n      event.metaKey ||\n      event.ctrlKey ||\n      event.altKey ||\n      event.shiftKey ||\n      this.isTypingTarget(event.target)\n    ) {\n      return\n    }\n\n    if (event.key === 'ArrowRight' && this.goto(this.docService.nextLink())) {\n      event.preventDefault()\n    } else if (event.key === 'ArrowLeft' && this.goto(this.docService.prevLink())) {\n      event.preventDefault()\n    }\n  }\n\n  /** Navigates to a link when it exists; returns whether it did. */\n  private goto(link: NgeDocLink | undefined): boolean {\n    if (!link?.href) {\n      return false\n    }\n    this.router.navigateByUrl(link.href)\n    return true\n  }\n\n  /** Whether the event target is an editable control that owns the arrow keys. */\n  private isTypingTarget(target: EventTarget | null): boolean {\n    const el = target as HTMLElement | null\n    if (!el?.tagName) {\n      return false\n    }\n    return el.tagName === 'INPUT' || el.tagName === 'TEXTAREA' || el.tagName === 'SELECT' || el.isContentEditable\n  }\n\n  protected openSearch(): void {\n    this.searchOpen.set(true)\n  }\n\n  protected closeSearch(): void {\n    this.searchOpen.set(false)\n  }\n\n  protected toggleSidebar(): void {\n    this.sidebarOpen.update((open) => !open)\n  }\n\n  protected closeSidebar(): void {\n    this.sidebarOpen.set(false)\n  }\n\n  protected toggleCollapse(): void {\n    const collapsed = !this.sidebarCollapsed()\n    this.sidebarCollapsed.set(collapsed)\n    try {\n      localStorage?.setItem(COLLAPSE_KEY, collapsed ? '1' : '0')\n    } catch {\n      // storage may be unavailable (private mode, SSR); the choice just resets.\n    }\n  }\n\n  private readCollapsed(): boolean {\n    try {\n      return localStorage?.getItem(COLLAPSE_KEY) === '1'\n    } catch {\n      return false\n    }\n  }\n}\n\nconst COLLAPSE_KEY = 'nge-doc-sidebar-collapsed'\n","<div class=\"nge-doc-theme\" [class.sidebar-collapsed]=\"sidebarCollapsed()\">\n  <nge-doc-header\n    [collapsed]=\"sidebarCollapsed()\"\n    (toggleCollapse)=\"toggleCollapse()\"\n    (toggleSidebar)=\"toggleSidebar()\"\n    (openSearch)=\"openSearch()\"\n  />\n\n  <div class=\"shell\">\n    <nge-doc-sidenav [class.open]=\"sidebarOpen()\" />\n\n    <main #main tabindex=\"-1\">\n      <div class=\"content\">\n        <nge-doc-breadcrumb />\n        <nge-doc-page-actions />\n        <nge-doc-renderer #renderer />\n        @if (editUrl(); as url) {\n          <div class=\"page-meta\">\n            <a class=\"edit-link\" [href]=\"url\" target=\"_blank\" rel=\"noopener\">{{ labels.editThisPage }}</a>\n            @if (lastUpdated(); as date) {\n              <span class=\"last-updated\">{{ labels.lastUpdated }} {{ date | date: 'mediumDate' }}</span>\n            }\n          </div>\n        } @else if (lastUpdated(); as date) {\n          <div class=\"page-meta\">\n            <span class=\"last-updated\">{{ labels.lastUpdated }} {{ date | date: 'mediumDate' }}</span>\n          </div>\n        }\n        <nge-doc-pager />\n        <footer class=\"doc-footer\">\n          <span>{{ labels.poweredBy }}</span>\n          <a href=\"https://cisstech.github.io/nge/docs/nge-doc/\" target=\"_blank\" rel=\"noopener\">ngedoc</a>\n        </footer>\n      </div>\n    </main>\n\n    <nge-doc-toc [renderer]=\"renderer\" />\n  </div>\n\n  @if (sidebarOpen()) {\n    <div class=\"backdrop\" (click)=\"closeSidebar()\"></div>\n  }\n\n  @if (searchOpen()) {\n    <div class=\"nge-doc-search-overlay\" (click)=\"closeSearch()\">\n      <nge-doc-search-palette (closed)=\"closeSearch()\" (click)=\"$event.stopPropagation()\" />\n    </div>\n  }\n</div>\n"],"names":[],"mappings":";;;;;;;;;MAoDa,mBAAmB,CAAA;AAhDhC,IAAA,WAAA,GAAA;AAiDmB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC;AAChC,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU;AAClC,QAAA,IAAA,CAAA,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI;AAC3B,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM;AACnD,IAAA;8GALY,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA5CpB;;;;;;;;;;;;;;AAcT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,qUAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAfS,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FA6CT,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAhD/B,SAAS;+BACE,oBAAoB,EAAA,eAAA,EACb,uBAAuB,CAAC,MAAM,WACtC,CAAC,UAAU,CAAC,EAAA,QAAA,EACX;;;;;;;;;;;;;;AAcT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,qUAAA,CAAA,EAAA;;;ACTH;;;;;;;AAOG;MAkCU,mBAAmB,CAAA;AA4B9B,IAAA,WAAA,GAAA;AA3BiB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC;QAClC,IAAA,CAAA,MAAM,GAAG,SAAS,CAA0B,MAAM;mFAAC;;QAG3D,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,QAAQ;iFAAc;;QAEnC,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,IAAI;iFAAC;;QAElB,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,KAAK;iFAAC;AAE5B;;;;;AAKG;AACgB,QAAA,IAAA,CAAA,MAAM,GAAG,QAAQ,CAAC,MAAK;AACxC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,YAAA,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QACzE,CAAC;mFAAC;;AAGiB,QAAA,IAAA,CAAA,GAAG,GAAG,QAAQ,CAAC,MAAK;AACrC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,YAAA,OAAO,OAAO,IAAI,KAAK,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK;QACvF,CAAC;gFAAC;QAGA,MAAM,CAAC,MAAK;YACV,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa;AACzC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;YACxB,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;gBACrC;YACF;;AAEA,YAAA,MAAM,KAAK,GAAG,CAAA,KAAA,EAAQ,IAAI,IAAI;YAC9B,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,oBAAoB,EAAE,KAAK,CAAC;YACnD,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,KAAK,CAAC;AAC7C,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,UAAU,CAAC,GAAW,EAAA;AAC5B,QAAA,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;AAC3B,YAAA,OAAO,IAAI;QACb;AACA,QAAA,IAAI;AACF,YAAA,OAAO,IAAI,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;QAClE;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,KAAK;QACd;IACF;8GAnDW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,MAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA9BpB;;;;;;AAMT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,gTAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAwBU,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAjC/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,eAAA,EACP,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC;;;;;;AAMT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,gTAAA,CAAA,EAAA;8FA0B4D,MAAM,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MCXxD,oBAAoB,CAAA;AAzCjC,IAAA,WAAA,GAAA;AA0CqB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAClC,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM;AAC1B,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM;AACzD,IAAA;8GAJY,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAtCrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAEU,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAzChC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,sBAAsB;oBAChC,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCT,EAAA,CAAA;AACF,iBAAA;;;MC9BY,eAAe,CAAA;AAP5B,IAAA,WAAA,GAAA;AAQqB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC;AAClC,QAAA,IAAA,CAAA,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI;AAC3B,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ;AACnC,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM;AAC/B,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK;AAC7B,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM;;QAGzC,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,KAAK;sFAAC;;QAGxB,IAAA,CAAA,aAAa,GAAG,MAAM,EAAE;;QAExB,IAAA,CAAA,cAAc,GAAG,MAAM,EAAE;;QAEzB,IAAA,CAAA,UAAU,GAAG,MAAM,EAAE;AAC/B,IAAA;8GAjBY,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECd5B,6qJAkHA,EAAA,MAAA,EAAA,CAAA,qpDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDtGY,UAAU,kPAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,oBAAoB,EAAA,QAAA,EAAA,sBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAEtE,eAAe,EAAA,UAAA,EAAA,CAAA;kBAP3B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,eAAA,EAGT,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,UAAU,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,mBAAmB,CAAC,EAAA,QAAA,EAAA,6qJAAA,EAAA,MAAA,EAAA,CAAA,qpDAAA,CAAA,EAAA;;;AENpF;;;;AAIG;MA8CU,oBAAoB,CAAA;AA7CjC,IAAA,WAAA,GAAA;AA8CmB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC;QAClC,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAE3C,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM;AAC/B,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW;QACzC,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,KAAK;mFAAC;;AAGtB,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;YACzC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,mBAAmB,EAAE;YACjD,IAAI,CAAC,GAAG,EAAE;AACR,gBAAA,OAAO,SAAS;YAClB;YACA,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,GAAG,CAAA,qCAAA,CAAuC,CAAC;AACrF,YAAA,OAAO,EAAE,OAAO,EAAE,CAAA,uBAAA,EAA0B,MAAM,CAAA,CAAE,EAAE,MAAM,EAAE,CAAA,wBAAA,EAA2B,MAAM,CAAA,CAAE,EAAE;QACrG,CAAC;oFAAC;AAeH,IAAA;IAbW,MAAM,IAAI,CAAC,GAAW,EAAA;AAC9B,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACd;QACF;AACA,QAAA,IAAI;YACF,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;AAC9E,YAAA,MAAM,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;AACnE,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,YAAA,UAAU,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;QAChD;AAAE,QAAA,MAAM;;QAER;IACF;8GA9BW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA1CrB;;;;;;;;;;;;AAYT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,4ZAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FA8BU,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBA7ChC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EAAA,eAAA,EACf,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC;;;;;;;;;;;;AAYT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,4ZAAA,CAAA,EAAA;;;MCfU,cAAc,CAAA;AAP3B,IAAA,WAAA,GAAA;AAQmB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC;AAChC,QAAA,IAAA,CAAA,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ;AAC/B,QAAA,IAAA,CAAA,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ;AAC/B,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM;AACnD,IAAA;8GALY,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECX3B,8oBAkBA,EAAA,MAAA,EAAA,CAAA,6sBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDTY,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAET,cAAc,EAAA,UAAA,EAAA,CAAA;kBAP1B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,mBAGR,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,UAAU,CAAC,EAAA,QAAA,EAAA,8oBAAA,EAAA,MAAA,EAAA,CAAA,6sBAAA,CAAA,EAAA;;;AEoBvB;AACA,SAAS,SAAS,CAAC,IAAY,EAAE,MAAc,EAAA;IAC7C,IAAI,CAAC,MAAM,EAAE;QACX,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IAC/B;IACA,MAAM,KAAK,GAAoB,EAAE;AACjC,IAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE;AAChC,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE;IACnC,IAAI,IAAI,GAAG,CAAC;IACZ,KAAK,IAAI,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE;AAC9E,QAAA,IAAI,EAAE,GAAG,IAAI,EAAE;YACb,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;QACxD;QACA,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AACnE,QAAA,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM;IAC3B;AACA,IAAA,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE;AACtB,QAAA,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IACpD;AACA,IAAA,OAAO,KAAK;AACd;MAQa,sBAAsB,CAAA;AA4BjC,IAAA,WAAA,GAAA;AA3BiB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC;AAClC,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAEvB,QAAA,IAAA,CAAA,KAAK,GAAG,SAAS,CAAC,QAAQ,CAA+B,OAAO,CAAC;;QAGzE,IAAA,CAAA,MAAM,GAAG,MAAM,EAAE;AAEP,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM;QAC/B,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,EAAE;kFAAC;QAClB,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,CAAC;wFAAC;AACvB,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CACnC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAClF,EAAE,YAAY,EAAE,EAA0B,EAAE,CAC7C;;AAGkB,QAAA,IAAA,CAAA,IAAI,GAAG,QAAQ,CAAc,MAAK;YACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE;AAClC,YAAA,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,MAAM;gBACrC,MAAM;;gBAEN,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;AAC1D,gBAAA,OAAO,EAAE,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,IAAI;AACnE,aAAA,CAAC,CAAC;QACL,CAAC;iFAAC;AAGA,QAAA,eAAe,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC3D;AAEU,IAAA,OAAO,CAAC,KAAa,EAAA;AAC7B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB;AAEU,IAAA,SAAS,CAAC,KAAoB,EAAA;AACtC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,QAAQ,KAAK,CAAC,GAAG;AACf,YAAA,KAAK,QAAQ;gBACX,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;gBAClB;AACF,YAAA,KAAK,WAAW;gBACd,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM,OAAO,CAAC,MAAM,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACvF;AACF,YAAA,KAAK,SAAS;gBACZ,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM,OAAO,CAAC,MAAM,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACxG;YACF,KAAK,OAAO,EAAE;gBACZ,KAAK,CAAC,cAAc,EAAE;gBACtB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC1C,IAAI,MAAM,EAAE;AACV,oBAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;gBACrB;gBACA;YACF;;IAEJ;AAEU,IAAA,MAAM,CAAC,MAA0B,EAAA;QACzC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;AACtC,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;IAEU,OAAO,GAAA;AACf,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;8GAtEW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,iOCzDnC,i4DA6DA,EAAA,MAAA,EAAA,CAAA,mwDAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FDJa,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBANlC,SAAS;+BACE,wBAAwB,EAAA,eAAA,EAGjB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,i4DAAA,EAAA,MAAA,EAAA,CAAA,mwDAAA,CAAA,EAAA;6FAM2B,OAAO,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ME/CtE,gBAAgB,CAAA;AAS3B,IAAA,WAAA,GAAA;AARmB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC;AAClC,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY;AACxC,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM;AAC/B,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM;;AAGjC,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAA+B,IAAI,GAAG,EAAE;sFAAC;;;QAK1E,MAAM,CAAC,MAAK;YACV,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;AAC1C,YAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;gBACpB;YACF;YACA,MAAM,SAAS,GAAG;AACf,iBAAA,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;iBACX,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;iBACvB,MAAM,CAAC,CAAC,IAAI,KAAqB,IAAI,IAAI,IAAI,CAAC;YACjD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AAC7B,gBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE;AAC7C,oBAAA,OAAO,IAAI;gBACb;AACA,gBAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC;AAC1B,gBAAA,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC9C,gBAAA,OAAO,IAAI;AACb,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,YAAY,CAAC,IAAgB,EAAA;AACrC,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM;IAChC;;AAGU,IAAA,MAAM,CAAC,IAAgB,EAAA;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,SAAS;QACxE,OAAO,QAAQ,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IAC3C;AAEU,IAAA,MAAM,CAAC,IAAgB,EAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACd;QACF;QACA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;AACtC,QAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACvC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;IAC1B;;AAGQ,IAAA,WAAW,CAAC,IAAgB,EAAA;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE;QACzC,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,KAAK;QACd;QACA,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE;AAC7B,YAAA,OAAO,IAAI;QACb;QACA,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACvE;8GA7DW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECd7B,4zHA2GA,EAAA,MAAA,EAAA,CAAA,swGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED/FY,gBAAgB,oJAAE,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,uBAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAElE,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAP5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,eAAA,EAGV,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,gBAAgB,EAAE,UAAU,EAAE,gBAAgB,EAAE,mBAAmB,CAAC,EAAA,QAAA,EAAA,4zHAAA,EAAA,MAAA,EAAA,CAAA,swGAAA,CAAA,EAAA;;;MEFnE,YAAY,CAAA;AANzB,IAAA,WAAA,GAAA;;QAQW,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ;qFAA2B;AAE1C,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM;AAazD,IAAA;IAXW,QAAQ,CAAC,KAAY,EAAE,EAAU,EAAA;QACzC,KAAK,CAAC,cAAc,EAAE;QACtB,IAAI,CAAC,QAAQ,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC;IACrC;IAEU,WAAW,GAAA;QACnB,MAAM,OAAO,GAAoB,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE;;AAE/D,QAAA,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,CAAC,OAAO,CAAC;AAC5C,QAAA,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;IAC1B;8GAhBW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAZ,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,mNCVzB,ogCA0BA,EAAA,MAAA,EAAA,CAAA,+hCAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FDhBa,YAAY,EAAA,UAAA,EAAA,CAAA;kBANxB,SAAS;+BACE,aAAa,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ogCAAA,EAAA,MAAA,EAAA,CAAA,+hCAAA,CAAA,EAAA;;;MEkCpC,sBAAsB,CAAA;AAiBjC,IAAA,WAAA,GAAA;AAhBiB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC;AAClC,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAErB,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM;;AAE/B,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO;;AAEjC,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW;QACzC,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,KAAK;wFAAC;QAC3B,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,KAAK;uFAAC;;AAE1B,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE;6FAAC;;QAGjD,IAAA,CAAA,IAAI,GAAG,SAAS,CAA0B,MAAM;iFAAC;QAGhE,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE;;AAE1B,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;;;AAG3B,YAAA,IAAI,CAAC,IAAI,EAAE,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;AAC3D,QAAA,CAAC,CAAC;IACJ;AAGU,IAAA,iBAAiB,CAAC,KAAoB,EAAA;AAC9C,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;YACvE,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC;YACvC;QACF;;;QAIA,IACE,IAAI,CAAC,UAAU,EAAE;AACjB,YAAA,KAAK,CAAC,OAAO;AACb,YAAA,KAAK,CAAC,OAAO;AACb,YAAA,KAAK,CAAC,MAAM;AACZ,YAAA,KAAK,CAAC,QAAQ;YACd,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,EACjC;YACA;QACF;AAEA,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,EAAE;YACvE,KAAK,CAAC,cAAc,EAAE;QACxB;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,EAAE;YAC7E,KAAK,CAAC,cAAc,EAAE;QACxB;IACF;;AAGQ,IAAA,IAAI,CAAC,IAA4B,EAAA;AACvC,QAAA,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;AACf,YAAA,OAAO,KAAK;QACd;QACA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;AACpC,QAAA,OAAO,IAAI;IACb;;AAGQ,IAAA,cAAc,CAAC,MAA0B,EAAA;QAC/C,MAAM,EAAE,GAAG,MAA4B;AACvC,QAAA,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE;AAChB,YAAA,OAAO,KAAK;QACd;QACA,OAAO,EAAE,CAAC,OAAO,KAAK,OAAO,IAAI,EAAE,CAAC,OAAO,KAAK,UAAU,IAAI,EAAE,CAAC,OAAO,KAAK,QAAQ,IAAI,EAAE,CAAC,iBAAiB;IAC/G;IAEU,UAAU,GAAA;AAClB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3B;IAEU,WAAW,GAAA;AACnB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;IAC5B;IAEU,aAAa,GAAA;AACrB,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC;IAC1C;IAEU,YAAY,GAAA;AACpB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;IAC7B;IAEU,cAAc,GAAA;AACtB,QAAA,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE;AAC1C,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC;AACpC,QAAA,IAAI;AACF,YAAA,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,SAAS,GAAG,GAAG,GAAG,GAAG,CAAC;QAC5D;AAAE,QAAA,MAAM;;QAER;IACF;IAEQ,aAAa,GAAA;AACnB,QAAA,IAAI;YACF,OAAO,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,GAAG;QACpD;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,KAAK;QACd;IACF;8GA1GW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,0QC1CnC,8tDAiDA,EAAA,MAAA,EAAA,CAAA,iiEAAA,EAAA,+sKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDjBI,eAAe,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,gBAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,gBAAgB,4DAChB,uBAAuB,EAAA,QAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvB,mBAAmB,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,oBAAoB,iEACpB,cAAc,EAAA,QAAA,EAAA,eAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,YAAY,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,sBAAsB,mFARtB,QAAQ,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAWC,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAlBlC,SAAS;+BACE,wBAAwB,EAAA,eAAA,EAGjB,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B;wBACP,QAAQ;wBACR,eAAe;wBACf,gBAAgB;wBAChB,uBAAuB;wBACvB,mBAAmB;wBACnB,oBAAoB;wBACpB,cAAc;wBACd,YAAY;wBACZ,sBAAsB;AACvB,qBAAA,EAAA,QAAA,EAAA,8tDAAA,EAAA,MAAA,EAAA,CAAA,iiEAAA,EAAA,+sKAAA,CAAA,EAAA;4FAiB0D,MAAM,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,iBAAA,EAAA,CAAA;sBAahE,YAAY;uBAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC;;AAiF9C,MAAM,YAAY,GAAG,2BAA2B;;;;"}