{"version":3,"file":"talenra-ngx-base-app-layout.mjs","sources":["../../../projects/ngx-base/app-layout/src/app-sidenav/sidenav.service.ts","../../../projects/ngx-base/app-layout/src/header-drawer/header-drawer.service.ts","../../../projects/ngx-base/app-layout/src/header-drawer/header-drawer.component.ts","../../../projects/ngx-base/app-layout/src/header-drawer/header-drawer.component.html","../../../projects/ngx-base/app-layout/src/header-drawer/header-drawer.types.ts","../../../projects/ngx-base/app-layout/src/app-footer/system-info/system-info.types.ts","../../../projects/ngx-base/app-layout/src/app-header/app-header.component.ts","../../../projects/ngx-base/app-layout/src/app-header/app-header.component.html","../../../projects/ngx-base/app-layout/src/app-sidenav/sidenav-item/sidenav-item.component.ts","../../../projects/ngx-base/app-layout/src/app-sidenav/sidenav-item/sidenav-item.component.html","../../../projects/ngx-base/app-layout/src/app-sidenav/sidenav-highlight/sidenav-highlight.component.ts","../../../projects/ngx-base/app-layout/src/app-sidenav/app-sidenav.state.ts","../../../projects/ngx-base/app-layout/src/app-sidenav/app-sidenav.component.ts","../../../projects/ngx-base/app-layout/src/app-sidenav/app-sidenav.component.html","../../../projects/ngx-base/app-layout/src/app-footer/system-info/system-info.component.ts","../../../projects/ngx-base/app-layout/src/app-footer/system-info/system-info.component.html","../../../projects/ngx-base/app-layout/src/app-footer/app-footer.component.ts","../../../projects/ngx-base/app-layout/src/app-footer/app-footer.component.html","../../../projects/ngx-base/app-layout/src/app-frame/app-frame.component.ts","../../../projects/ngx-base/app-layout/src/app-frame/app-frame.component.html","../../../projects/ngx-base/app-layout/src/workspace.types.ts","../../../projects/ngx-base/app-layout/talenra-ngx-base-app-layout.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { SidenavItem } from './app-sidenav.types';\nimport { SidenavState } from './app-sidenav.state';\n\n/**\n * Provides control and state of the app's side navigation.\n *\n * ### Import\n *\n * ```typescript\n * import { SidenavService } from '@talenra/ngx-base/app-layout';\n * ```\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class SidenavService {\n  // --- Expanded state\n\n  /**\n   * Provides whether the side-navigation is expanded. Note that it might be\n   * expanded even when hidden.\n   */\n  public readonly isExpanded$ = new BehaviorSubject(false);\n\n  /**\n   * Collapses or expands the side-navigation\n   */\n  public setExpanded(isExpanded: boolean): void {\n    this.isExpanded$.next(isExpanded);\n  }\n\n  // --- Hidden state\n\n  /**\n   * Provides whether the side-navigation is hidden. Note that the\n   * side-navigation will keep its state (collapsed or expanded) while hidden.\n   */\n  public readonly isHidden$ = new BehaviorSubject(false);\n\n  /**\n   * Hides or shows the side-navigation\n   */\n  public setHidden(isHidden: boolean): void {\n    this.isHidden$.next(isHidden);\n  }\n\n  // --- Currently selected items\n\n  /**\n   * **Experimental:** Provides an array with the currently selected sidenav items.\n   *\n   * ```typescript\n   * constructor(private navigationService: SidenavService) {}\n   *\n   * ngOnInit(): void {\n   *   this.navigationService.currentItems$.subscribe((value) => {\n   *     console.log(value);\n   *   });\n   * }\n   * ```\n   *\n   * This feature is considered _experimental_ as the logic could be implemented by\n   * the consuming app, which might be the ideal approach (only implemented if used).\n   *\n   * @experimental\n   */\n  public readonly currentItems$ = new BehaviorSubject<SidenavItem[] | null>(null);\n\n  /**\n   * Sets the current item.\n   *\n   * @internal\n   */\n  public setCurrentItems(currentItems: SidenavItem[]): void {\n    this.currentItems$.next(currentItems);\n  }\n\n  // -- SidenavItems access\n\n  /**\n   * Sidenav state provided by Sidenav component\n   */\n  private _state?: SidenavState;\n\n  /**\n   * Attach Sidenav's state instance\n   *\n   * @internal\n   */\n  public attachState(state: SidenavState): void {\n    this._state = state;\n  }\n\n  /**\n   * **Experimental:** Returns an array of items matching a given identifer. Returns an empty array if no matches.\n   *\n   * @experimental\n   */\n  public getItemsByIdentifier(identifier = ''): SidenavItem[] {\n    return this._state ? this._state.getItemsByIdentifier(identifier) : [];\n  }\n\n  /**\n   * **Experimental:** Returns an array of indices of items matching a given identifer. Returns an empty array if no matches.\n   *\n   * @experimental\n   */\n  public getIndicesByIdentifier(identifier = ''): number[][] {\n    return this._state ? this._state.getIndicesByIdentifier(identifier) : [];\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, startWith, pairwise, map } from 'rxjs';\nimport { AppHeaderDrawerStateItem } from './header-drawer.types';\n\n/**\n * Provides control and state of the app's header-drawer.\n *\n * ### Import\n *\n * ```typescript\n * import { HeaderDrawerService } from '@talenra/ngx-base/app-layout';\n * ```\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class HeaderDrawerService {\n  /**\n   * Storage property accessed by `item$`\n   */\n  private stateSrc = new BehaviorSubject<AppHeaderDrawerStateItem>(null);\n\n  /**\n   * Provides the header-drawer's state (current and previous items).\n   *\n   * Used by\n   * - {@link AppFrameComponent}\n   * - {@link HeaderDrawerComponent}\n   */\n  public readonly item$ = this.stateSrc.pipe(\n    startWith(null),\n    pairwise(),\n    map(([prev, current]) => ({ prev, current }))\n  );\n\n  /**\n   * Toggles the header-drawer-item given.\n   */\n  public toggleItem(item: string): void {\n    const currentValue: AppHeaderDrawerStateItem = this.stateSrc.value;\n    this.stateSrc.next(currentValue === item ? null : item);\n  }\n\n  /**\n   * Displays the header-drawer-item given. Pass an item of value `null` to\n   * collapse the header-drawer.\n   */\n  public setItem(item: AppHeaderDrawerStateItem): void {\n    this.stateSrc.next(item);\n  }\n\n  /**\n   * Close the header-drawer.\n   */\n  public close(): void {\n    this.stateSrc.next(null);\n  }\n}\n","import {\n  AfterViewInit,\n  Component,\n  ElementRef,\n  Input,\n  OnInit,\n  ViewChild,\n  AfterContentChecked,\n  DestroyRef,\n  inject,\n} from '@angular/core';\nimport { debounceTime, tap, fromEvent, Observable } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { HeaderDrawerService } from './header-drawer.service';\nimport { AppHeaderDrawerState, AppHeaderDrawerLayoutType } from './header-drawer.types';\n\n/**\n * Provides a wrapper for header-drawer content.\n *\n * ### Import\n *\n * ```typescript\n * import { AppLayoutModule } from '@talenra/ngx-base/app-layout';\n * ```\n *\n * <example-url>../../#/welcome</example-url>\n */\n@Component({\n  selector: 'talenra-header-drawer',\n  templateUrl: './header-drawer.component.html',\n  styleUrls: ['./header-drawer.component.scss'],\n  host: {\n    '(window:keyup.escape)': 'collapse()',\n  },\n})\nexport class HeaderDrawerComponent implements AfterViewInit, AfterContentChecked, OnInit {\n  /** @internal */\n  public static TRANSITION_DURATION = 0.4; // Transition duration in sec\n\n  /**\n   * Unique identifier of the drawer\n   */\n  @Input() public id = '';\n\n  /**\n   * Layout to be applied\n   *\n   * see {@link AppHeaderDrawerLayoutType}\n   */\n  @Input() public layoutType?: AppHeaderDrawerLayoutType;\n\n  /**\n   * Tracking reference is used to determinate whether the drawer needs re-initialization. If you use the\n   * HeaderDrawer with static content only, you might not need this.\n   *\n   * If you use the HeaderDrawer with dynamic content (e.g. inject async data or content changes based on\n   * route updates or user interactions), you need to provide an updated value for `trackingRef` whenever\n   * content changes.\n   */\n  @Input() public trackingRef = '';\n\n  private prevTrackingRef = '';\n\n  /** @internal */\n  @ViewChild('wrapper') private wrapperRef!: ElementRef;\n\n  private elementHeight = 99999; // Ensure element is hidden on init\n\n  /** @internal */\n  public currentItemId$: Observable<AppHeaderDrawerState>;\n\n  private latestDrawerState?: AppHeaderDrawerState;\n\n  /** @internal */\n  public transitionDuration: number = HeaderDrawerComponent.TRANSITION_DURATION; // Make available to template\n\n  /** @internal */\n  public transitionDelay = 0;\n\n  /** @internal */\n  public isResizing = false;\n\n  private readonly destroyRef: DestroyRef = inject(DestroyRef);\n\n  /**\n   * This property is used to initially hide the component and reveal it slightly after the view is initialized. This\n   * is a workaround to prevent flickering when re-/loading.\n   *\n   * @internal */\n  public viewIsInitialized = false;\n\n  private resizeTimeout?: number;\n\n  private headerDrawerService = inject(HeaderDrawerService);\n\n  /** @internal */\n  constructor() {\n    this.currentItemId$ = this.headerDrawerService.item$;\n  }\n\n  /** @internal */\n  ngOnInit(): void {\n    this.watchDrawerState();\n  }\n\n  /** @internal */\n  ngAfterViewInit(): void {\n    // Invoke delayed to prevent ExpressionChangedAfterItHasBeenCheckedError\n    // (Expression has changed after it was checked). https://angular.io/errors/NG0100\n    setTimeout(() => {\n      this.setDrawerHeight();\n      this.viewIsInitialized = true;\n    }, 100);\n    // Update drawer height when viewport resized\n    fromEvent(window, 'resize')\n      .pipe(debounceTime(10), tap(this.handleResize.bind(this)), takeUntilDestroyed(this.destroyRef))\n      .subscribe();\n  }\n\n  /**\n   * Updates drawer height when content _and_ tracking reference changes. To prevent costly change detection, we use a\n   * tracking reference to determine whether an update is required.\n   *\n   * @internal\n   */\n  ngAfterContentChecked(): void {\n    if (this.trackingRef === this.prevTrackingRef) return;\n    this.prevTrackingRef = this.trackingRef;\n    this.latestDrawerState?.current ? this.setDrawerHeight() : this.handleResize();\n  }\n\n  /**\n   * Handle drawer state changes: Delay the fade-in transtion if another drawer\n   * item is already active.\n   */\n  private watchDrawerState(): void {\n    this.currentItemId$.subscribe(({ prev, current }) => {\n      this.latestDrawerState = { prev, current };\n      this.transitionDelay = current === this.id && prev ? HeaderDrawerComponent.TRANSITION_DURATION + 0.1 : 0;\n    });\n  }\n\n  /**\n   * Hide the drawer while the viewport is resized to prevent flickering. Flickering can be observed when the\n   * component's layout switches (breakpoints). Once the resizing is done, update the drawer height and show\n   * it again.\n   */\n  private handleResize(): void {\n    window.clearTimeout(this.resizeTimeout);\n    this.isResizing = true;\n    this.setDrawerHeight();\n    this.resizeTimeout = window.setTimeout(() => {\n      this.isResizing = false;\n    }, 100);\n  }\n\n  private setDrawerHeight(): void {\n    if (!this.wrapperRef) return;\n    this.elementHeight = this.wrapperRef.nativeElement.scrollHeight;\n  }\n\n  /** @internal */\n  public wrapperOffset(): number {\n    return this.latestDrawerState?.current === this.id ? 0 : this.elementHeight * -1;\n  }\n\n  /** @internal */\n  public isActive(): boolean {\n    return this.latestDrawerState?.current === this.id;\n  }\n\n  /**\n   * Collapses the current drawer.\n   */\n  private collapse(): void {\n    this.headerDrawerService.setItem(null);\n  }\n}\n","<div\n  class=\"outer\"\n  [class.active]=\"isActive()\"\n  [class.hidden]=\"isResizing || !viewIsInitialized\"\n  [class]=\"!!layoutType ? 'layout--' + layoutType : ''\"\n  [style.marginTop.px]=\"wrapperOffset()\"\n  [style.transitionDuration.s]=\"transitionDuration\"\n  [style.transitionDelay.s]=\"transitionDelay\"\n  #wrapper>\n  <div class=\"inner\">\n    <ng-content />\n  </div>\n</div>\n","/**\n * Layout type to be applied to content renderend inside\n * `<talenra-header-drawer>` component. Currently only a single layout-type is\n * supported.\n *\n * Used by\n * - {@link HeaderDrawerComponent}\n *\n * ### Import\n *\n * ```typescript\n * import { AppHeaderDrawerLayoutType } from '@talenra/ngx-base/app-layout';\n * ```\n */\nexport enum AppHeaderDrawerLayoutType {\n  ThreeColumns = 'three-columns',\n}\n\n/**\n * Represents a header-drawer-item (content displayed in the header-drawer component)\n *\n * Used by\n * - AppHeaderDrawer\n *\n * @internal\n */\nexport type AppHeaderDrawerStateItem = null | string;\n\n/**\n * Represents the state of the global header-drawer.\n *\n * @internal\n */\nexport interface AppHeaderDrawerState {\n  /** The item displayed before the current item was displayed in the header-drawer. */\n  prev: AppHeaderDrawerStateItem;\n  /** The item currently displayed in the header-drawer. */\n  current: AppHeaderDrawerStateItem;\n}\n","/**\n * Supported Environments\n *\n * ### Import\n *\n * ```typescript\n * import { SupportedEnvironments } from '@talenra/ngx-base/app-layout';\n * ```\n */\nexport enum SupportedEnvironment {\n  AIT = 'AIT',\n  DEV = 'DEV',\n  EDU = 'EDU',\n  SIT = 'SIT',\n  PROD = 'PROD',\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { IconComponent } from '@talenra/ngx-base/icons';\nimport { SupportedEnvironment } from '../app-footer/system-info/system-info.types';\n\n/** @internal */\n@Component({\n  selector: 'talenra-app-header',\n  templateUrl: './app-header.component.html',\n  styleUrls: ['./app-header.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: {\n    '[class]': 'hostClass',\n    '[class.show-env-label]': 'showEnvLabel',\n    '(window:keydown.control.shift.x)': 'toggleEnvLabel()',\n  },\n  imports: [IconComponent],\n})\nexport class AppHeaderComponent {\n  /** Name of the issuer of the app (e.g. \"SVA Zürich\") */\n  public issuerName = input<string>('');\n  /** Name of the app as displayed in the header. If the app name is associated with a\n   * logotype, this logotype is rendered and the display name is shortened accordingly\n   * (e.g. \"talenra Fall-Manager\" is rendered as \"[talenra Logotype] Fall-Manager\") */\n  public appDisplayName = input<string>('');\n  /** Key of the optional logotype to be used in the UI. Currently only 'talenra' is supported. */\n  public logotype = input<string>('');\n  /** Code for the current environment */\n  public appEnv = input<SupportedEnvironment>(SupportedEnvironment.PROD);\n  /** Determines whether the environment label is visible. */\n  protected showEnvLabel: boolean = true;\n\n  /** Toggle environment label */\n  protected toggleEnvLabel(): void {\n    this.showEnvLabel = !this.showEnvLabel;\n  }\n\n  private get hostClass(): string {\n    return `env--${this.appEnv().toLowerCase()}`;\n  }\n}\n","@if (showEnvLabel && appEnv() !== 'PROD') {\n  <div class=\"env\">\n    <span class=\"env-label\">{{ appEnv() }}</span>\n  </div>\n}\n<div class=\"app-identification\">\n  <span class=\"issuer-name\">{{ issuerName() }}</span>\n  <span class=\"app-name\">\n    @if (logotype()) {\n      <span class=\"wordmark\">\n        <talenra-icon class=\"wordmark-icon\" [name]=\"'wordmark-' + logotype()\" />\n      </span>\n    }\n    <span class=\"display-name\">{{ appDisplayName() }}</span>\n  </span>\n</div>\n<ng-content />\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { IconComponent } from '@talenra/ngx-base/icons';\nimport { BadgeComponent } from '@talenra/ngx-base/badge';\nimport { SidenavItem } from '../app-sidenav.types';\n\n/** @internal */\n@Component({\n  selector: 'talenra-sidenav-item',\n  templateUrl: './sidenav-item.component.html',\n  styleUrls: ['./sidenav-item.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [IconComponent, BadgeComponent],\n})\nexport class SidenavItemComponent {\n  @Input() public isActive = false;\n  @Input() public isExpanded = false;\n  @Input() public isHighlighted = false;\n  @Input() public level = 0;\n  @Input() public item: SidenavItem = { label: '', icon: '', destination: '' };\n  @Output() public readonly itemChange: EventEmitter<SidenavItem> = new EventEmitter<SidenavItem>();\n  @Output() public readonly itemExpandedChange: EventEmitter<SidenavItem> = new EventEmitter<SidenavItem>();\n\n  private router = inject(Router);\n\n  /**\n   * Navigates to the item's destination if the click target was not the accordion icon.\n   */\n  public navigate(event: MouseEvent): void {\n    // Prevent navigation if the the accordion icon was clicked\n    if ((event.target as HTMLElement).classList.contains('accordion-icon')) return;\n    // If the item has no destination …\n    if (!this.item.destination) {\n      // … toggle children if available\n      this.hasChildren() && this.toggleChildren();\n      // … and prevent navigation\n      return;\n    }\n    // Finally navigate to the item's destination\n    this.router.navigate([this.item.destination]);\n  }\n\n  /**\n   * Returns boolean indicating whether the group has children.\n   */\n  public hasChildren(): boolean {\n    return !!this.item.children && this.item.children.length > 0;\n  }\n\n  /**\n   * Toggles the group's expanded state and emits the new state.\n   */\n  public toggleChildren(): void {\n    this.item.isExpanded = !this.item.isExpanded;\n    this.itemChange.emit(this.item);\n    this.itemExpandedChange.emit(this.item);\n  }\n}\n","<li\n  class=\"item\"\n  [class]=\"level < 2 ? 'level-' + level : 'level-n'\"\n  [class.active]=\"isActive\"\n  [class.expanded]=\"isExpanded\"\n  [class.highlighted]=\"isHighlighted\"\n  [class.children-visible]=\"item.isExpanded\"\n  [class.no-action]=\"!item.destination && !hasChildren()\">\n  <a (click)=\"navigate($event)\" class=\"item-link\">\n    <talenra-icon [name]=\"item.icon\" class=\"item-icon\" />\n    <span class=\"item-label\"\n      >{{ item.label }}\n      @if (item.counter) {\n        <span class=\"counter\"><talenra-badge [counter]=\"item.counter\" [maxVal]=\"9999\" /></span>\n      }\n    </span>\n    @if (hasChildren()) {\n      <talenra-icon name=\"expand-more\" class=\"accordion-icon\" (click)=\"toggleChildren()\" />\n    }\n  </a>\n</li>\n","import {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  Input,\n  OnChanges,\n  SimpleChanges,\n  inject,\n} from '@angular/core';\n\n/**\n * Type accepted by component's state property.\n *\n * @internal\n */\nexport type SidenavHighlightState = 'active' | 'inactive';\n\n/**\n * Vertical bar highlighting the currently active 1st-level item in Sidenav.\n *\n * @internal\n */\n@Component({\n  selector: 'talenra-sidenav-highlight',\n  template: ``,\n  styleUrls: ['./sidenav-highlight.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: {\n    '[style.top.px]': 'top',\n    '[style.bottom.px]': 'bottom',\n    '[class]': 'hostClass',\n  },\n})\nexport class SidenavHighlightComponent implements AfterViewInit, OnChanges {\n  /**\n   * Determinates whether the component is initialised. Used to delay the active state slightly\n   * to avoid flickering effects when the app is first rendered.\n   */\n  private isInitialised = false;\n\n  /**\n   * Stores the state to be applied after the component is initialised.\n   * State is not applied while the component is not initialised, s. `isInitialised`.\n   */\n  private stateAfterInit: SidenavHighlightState = 'inactive';\n\n  /**\n   * Triggers animated fade-in/-out of the highlight.\n   */\n  @Input()\n  public get state(): SidenavHighlightState {\n    return this._state;\n  }\n  public set state(value: SidenavHighlightState) {\n    if (!this.isInitialised) {\n      this.stateAfterInit = value;\n      return;\n    }\n    this._state = value;\n    this.updateHostClass();\n  }\n  private _state: SidenavHighlightState = 'inactive';\n\n  /**\n   * Shows/hides the highlight _without_ animation.\n   * Used to hide the highlight while the window resizes.\n   */\n  @Input()\n  public get visible(): boolean {\n    return this._visible;\n  }\n  public set visible(value: boolean) {\n    this._visible = value;\n    this.updateHostClass();\n  }\n  private _visible = true;\n\n  /**\n   * The highlight's top position. Triggers a transition when changed.\n   */\n  @Input() public top = 0;\n\n  /**\n   * The highlight's bottom position. Triggers a transition when changed.\n   */\n  @Input() public bottom = 0;\n\n  /**\n   * Determinates whether the highlight is in transition.\n   */\n  @Input()\n  public get inTransition(): boolean {\n    return this._inTransition;\n  }\n  public set inTransition(value: boolean) {\n    this._inTransition = value;\n    this.updateHostClass();\n  }\n  private _inTransition = true;\n\n  /**\n   * Calculated direction of the movement. Control's the CSS transition.\n   */\n  private direction: 'up' | 'down' = 'down';\n\n  private hostClass = '';\n\n  private changeDetector = inject(ChangeDetectorRef);\n\n  /** @internal */\n  ngAfterViewInit(): void {\n    // Fade-in highlight after initial rendering\n    setTimeout(() => {\n      this.isInitialised = true;\n      this.state = this.stateAfterInit;\n      this.changeDetector.markForCheck();\n    }, 1000);\n  }\n\n  /** @internal */\n  ngOnChanges(changes: SimpleChanges): void {\n    // Update animation direction\n    if (changes.top) {\n      this.direction = changes.top.currentValue > changes.top.previousValue ? 'down' : 'up';\n      this.updateHostClass();\n    }\n  }\n\n  private updateHostClass(): void {\n    this.hostClass = [\n      this.visible ? '' : 'is-hidden',\n      this.state === 'active' ? 'is-active' : '',\n      `direction--${this.direction}`,\n      this.inTransition ? 'in-transition' : '',\n    ]\n      .filter((item) => item)\n      .join(' ');\n  }\n}\n","import { SidenavItem } from './app-sidenav.types';\n\n/**\n * Hash table of items using the given destination (URL) as key.\n *\n * e.g. { '/foo': [\n *  {\n *    items: [...], // array of all items having destination '/foo'\n *    indices: [...], // indices used to locate these items in component's items tree\n *  }\n * ]}\n *\n * @internal\n */\ntype TItemsByKey = {\n  // Key can be any string value (e.g. '/foo/bar' or '2a5f1d11-10dd-4c5e-85cd-88dc575ffd57')\n  [key: string]: {\n    // Array of items using the given destination\n    items: SidenavItem[];\n    // Array of indices (e.g. [1, 3, 0]) referring thouse items in this.items\n    indices: number[][];\n  };\n};\n\n/**\n * Provides utilities used for state management in SideNav.\n *\n * @internal\n */\nexport class SidenavState {\n  /** Hash table to access items by identifier. */\n  private _itemsByIdentifier: TItemsByKey = {};\n  /** Hash table to access items by URL fragment. */\n  private _itemsByDestination: TItemsByKey = {};\n\n  /**\n   * Creates a hash table by flattening the items array, using destination strings (URLs) as keys.\n   * e.g. { '/foo/bar': [{ label: 'Foo', icon: 'bar', destination: '/foo/bar' }] }\n   *\n   * Note that a given URL might match several items as the URL in SidenavItem.destination must\n   * not be unique.\n   */\n  public createTable = (items: SidenavItem[]): void => {\n    const byDestinationTmp: TItemsByKey = {};\n    const byIdentifierTmp: TItemsByKey = {};\n    // Helper: Adds items/indices to a given table\n    const addToTable = (table: TItemsByKey, key: string, item: SidenavItem, indices: number[]): void => {\n      // Create the key's array if not existing yet\n      if (!table[key]) table[key] = { items: [], indices: [] };\n      // Add item/indices to the key's array\n      table[key].items.push(item);\n      table[key].indices.push(indices);\n    };\n    const processItems = (items: SidenavItem[], indices: number[]): void => {\n      items.forEach((item, index) => {\n        // Destination is a string -> add it to the table\n        typeof item.destination === 'string' &&\n          addToTable(byDestinationTmp, item.destination, item, [...indices, index]);\n        // Item has an identifier -> add it to the table\n        item.identifier && addToTable(byIdentifierTmp, item.identifier, item, [...indices, index]);\n        // Item has children -> invoke the 'flattener' recursively\n        item.children && item.children.length > 0 && processItems(item.children as SidenavItem[], [...indices, index]);\n      });\n    };\n    processItems(items, []);\n    this._itemsByDestination = byDestinationTmp;\n    this._itemsByIdentifier = byIdentifierTmp;\n  };\n\n  /**\n   * Returns an array of items matching a given destination (URL). Returns an empty array if no matches.\n   */\n  public getItemsByDestination = (destination: string): SidenavItem[] => {\n    return this._itemsByDestination[destination]?.items || [];\n  };\n\n  /**\n   * Returns an array of indices matching a given destination (URL). Returns an empty array if no matches.\n   * The indices represent the matched item's position in sidenav item's tree.\n   */\n  public getIndicesByDestination = (destination: string): number[][] => {\n    return this._itemsByDestination[destination]?.indices || [];\n  };\n\n  /**\n   * Returns an array of items matching a given identifer. Returns an empty array if no matches.\n   */\n  public getItemsByIdentifier = (identifier: string): SidenavItem[] => {\n    return this._itemsByIdentifier[identifier]?.items || [];\n  };\n\n  /**\n   * Returns an array of indices matching a given destination (URL). Returns an empty array if no matches.\n   * The indices represent the matched item's position in sidenav item's tree.\n   */\n  public getIndicesByIdentifier = (identifier: string): number[][] => {\n    return this._itemsByIdentifier[identifier]?.indices || [];\n  };\n}\n","import {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  DestroyRef,\n  ElementRef,\n  EventEmitter,\n  inject,\n  Input,\n  OnInit,\n  Output,\n  QueryList,\n  ViewChild,\n  ViewChildren,\n} from '@angular/core';\nimport { Event, NavigationEnd, Router } from '@angular/router';\nimport { asapScheduler, fromEvent } from 'rxjs';\nimport { debounceTime, filter, tap } from 'rxjs/operators';\nimport { LayoutService } from '@talenra/ngx-base/layout-service';\nimport { IconComponent } from '@talenra/ngx-base/icons';\nimport { ScrollContainerComponent } from '@talenra/ngx-base/scroll-container';\nimport { NgTemplateOutlet, AsyncPipe } from '@angular/common';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { SidenavService } from './sidenav.service';\nimport { SidenavItem } from './app-sidenav.types';\nimport { SidenavItemComponent } from './sidenav-item/sidenav-item.component';\nimport { SidenavHighlightState, SidenavHighlightComponent } from './sidenav-highlight/sidenav-highlight.component';\nimport { SidenavState } from './app-sidenav.state';\n\n/**\n * Highlight position transition duration in seconds.\n *\n * @internal\n */\nconst HIGHLIGHT_TRANSITION_DURATION = 0.5;\n\n/**\n * Initial transiton duration in seconds\n *\n * @internal\n */\nconst INITIAL_TRANSITION_DURATION = 1.4;\n\n/**\n * Duration of toggle children transition\n *\n * @internal\n */\nconst TOGGLE_TRANSITION_DURATION = 0.3;\n\n/** @internal */\n@Component({\n  selector: 'talenra-app-sidenav',\n  templateUrl: './app-sidenav.component.html',\n  styleUrls: ['./app-sidenav.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: {\n    '(mouseenter)': 'handleMouseEnterLeave($event)',\n    '(mouseleave)': 'handleMouseEnterLeave($event)',\n  },\n  imports: [\n    IconComponent,\n    ScrollContainerComponent,\n    NgTemplateOutlet,\n    SidenavHighlightComponent,\n    SidenavItemComponent,\n    AsyncPipe,\n  ],\n})\nexport class AppSidenavComponent implements OnInit, AfterViewInit {\n  /** Navigation tree provided by the app for the upper slot (main navigation). */\n  @Input()\n  /** Get navigation tree */\n  get items(): SidenavItem[] {\n    return this._items;\n  }\n  /** Set navigation tree */\n  set items(sidenavItems: SidenavItem[]) {\n    // Convert deprecated data model\n    this._items = sidenavItems;\n    // Create/update the hash table\n    this.state.createTable(this.items);\n    // Update the index of the highlighted 1st-level item\n    this.setHighlightedItem(false);\n  }\n  private _items: SidenavItem[] = [];\n  /** Emits whenever items updated. The updated navigation tree (SidenavItems[]) is attached. */\n  @Output() public readonly itemsChange: EventEmitter<SidenavItem[]> = new EventEmitter<SidenavItem[]>();\n  /** Emits whenever an item is toggled (property `isExpanded` has changed). The updated item (SidenavItem) is attached. */\n  @Output() public readonly itemExpandedChange: EventEmitter<SidenavItem> = new EventEmitter<SidenavItem>();\n  private state: SidenavState = new SidenavState();\n\n  /** Navigation tree provided by the app for the lower slot (typically used for settings etc.). */\n  @Input() public bottomItems: SidenavItem[] = [];\n  /** The current URL fragment. Used to match the highlighted item. */\n  private currentUrl = '/';\n  /** Determines whether viewport resizing is in progress. */\n  public isResizing = false;\n\n  // -- Navigation layout\n\n  /** Reference to the scroll container element. Used to detect it's height. */\n  @ViewChild('scrollContainer', { read: ElementRef }) private scrollContainerElm!: ElementRef;\n  /**\n   * Reference to the navigation wrapper element. Used to set it's height as we want it to span the whole height\n   * available. As the element is a child of scroll container, we cannot do this via CSS.\n   */\n  @ViewChild('navWrapper', { read: ElementRef }) private navWrapperElm!: ElementRef;\n  /** Min height of the navigation wrapper. Equals scroll container height */\n  public navMinHeight = 0;\n\n  // -- Highlight 1st-level item\n\n  /** Item element references, used to determinate rendered position. */\n  @ViewChildren(SidenavItemComponent, { read: ElementRef }) private itemRefs!: QueryList<ElementRef>;\n  /** The index of the currently highlighted 1st-level item */\n  public highlightIndex?: number;\n  /** Properties passed to the highlight component */\n  public highlightProps: { state: SidenavHighlightState; top: number; bottom: number } = {\n    state: 'inactive',\n    top: 0,\n    bottom: 0,\n  };\n  /** Determines whether the highlight transition is in progress. */\n  public highlightInTransition = false;\n  /** Highlight transition timeout id */\n  private highlightTransitionTimeoutId?: ReturnType<typeof setTimeout>;\n  /**\n   * Determinates whether the component is initialised. Used to setup the initial position of the\n   * animated highlight and to hide item's highlight until the animated highlight is in place.\n   */\n  private isInitialised = false;\n\n  protected readonly sidenavService = inject(SidenavService);\n  private readonly router = inject(Router);\n  private readonly changeDetector = inject(ChangeDetectorRef);\n  private readonly layoutService = inject(LayoutService);\n  private readonly destroyRef: DestroyRef = inject(DestroyRef);\n\n  /** @internal */\n  constructor() {\n    this.sidenavService.attachState(this.state);\n  }\n\n  /** @internal */\n  ngOnInit(): void {\n    // Update state after navigation\n    this.router.events\n      .pipe(\n        filter((event: Event) => event instanceof NavigationEnd),\n        takeUntilDestroyed(this.destroyRef)\n      )\n      .subscribe((event) => {\n        // Update the stored URL fragment\n        this.currentUrl = (event as NavigationEnd).urlAfterRedirects;\n        // Update the highlighted item\n        this.sidenavService.setCurrentItems(this.state.getItemsByDestination(this.currentUrl));\n        // Update the index of the highlighted 1st-level item\n        this.setHighlightedItem();\n        this.changeDetector.detectChanges();\n      });\n  }\n\n  /** @internal */\n  ngAfterViewInit(): void {\n    asapScheduler.schedule(() => this.updateNavLayout());\n    this.addResizeHandler();\n  }\n\n  /** Toggle the Sidenav (width) */\n  public toggle(): void {\n    const isExpanded = this.sidenavService.isExpanded$.getValue();\n    this.sidenavService.setExpanded(!isExpanded);\n  }\n\n  /** Return whether the given item is active/highlighted based on the current URL */\n  public isActive(item: SidenavItem): boolean {\n    // Helper: Escapes string to be used in regex\n    const escapeRegex = (str: string): string => str.replace(/[/\\-\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n    // Item with no own destination cannot be active\n    if (typeof item.destination !== 'string') {\n      return false;\n    }\n    // Item is considered active if the current URL matches the item's destination exactly\n    if (decodeURIComponent(this.currentUrl) === item.destination) return true;\n    // Item is considered active if the current URL starts with the item's destination followed by\n    // a trailing slash (/), nothing/no trailing slash ($) or a query string (?) (regex '($|/|?)').\n    // Matches for destination '/foo' include: '/foo', '/foo/', '/foo?bar=1', '/foo/bar', /foo/?bar=1'\n    // but exclude '/foobar'.\n    const pattern = new RegExp(`^${escapeRegex(item.destination)}($|/|\\\\?)`);\n    return pattern.test(decodeURIComponent(this.currentUrl));\n  }\n\n  /** @internal */\n  public itemTrackBy(index: number, value: SidenavItem): string {\n    return `${value.label}-${index}`;\n  }\n\n  /** Returns whether the given item has children. */\n  public itemHasChildren(item: SidenavItem): boolean {\n    return !!item.children && item.children.length > 0;\n  }\n\n  /** Return the given item's children (or emtpy array) */\n  public itemGetChildren(item: SidenavItem): SidenavItem[] {\n    return item.children || [];\n  }\n\n  /** Updates the highlighted 1st-level item. */\n  private setHighlightedItem(animated = true): void {\n    const indices: number[][] = this.state.getIndicesByDestination(decodeURI(this.currentUrl));\n    if (indices && indices[0]) {\n      const previousIndex = this.highlightIndex;\n      this.highlightIndex = indices[0][0];\n      if (previousIndex === this.highlightIndex) return;\n      // Highlight was inactive: Set the position to the current item to prevent transition from a random positon.\n      previousIndex === undefined && this.updateHighlightPosition(false);\n      this.highlightProps.state = 'active';\n      this.updateHighlightPosition(animated);\n    } else {\n      this.highlightIndex = undefined;\n      this.highlightInTransition = true;\n      this.highlightProps.state = 'inactive';\n      this.changeDetector.detectChanges();\n    }\n  }\n\n  /** Update the highlight position */\n  private updateHighlightPosition(animated = true): void {\n    if (this.highlightIndex === undefined || !this.navWrapperElm) return;\n    // Get coordinates of navigation wrapper and highlighted item\n    const wrapperRect = this.navWrapperElm.nativeElement.getBoundingClientRect();\n    const itemRect = this.itemRefs.get(this.highlightIndex)?.nativeElement.getBoundingClientRect();\n    // Update the highlight properties\n    this.highlightInTransition = animated;\n    this.highlightProps.top = itemRect.top - wrapperRect.top;\n    this.highlightProps.bottom = wrapperRect.bottom - itemRect.bottom;\n    this.changeDetector.detectChanges();\n    if (!animated) return;\n    // Reset the highlight's transition state after the transition has finished\n    clearTimeout(this.highlightTransitionTimeoutId);\n    this.highlightTransitionTimeoutId = setTimeout(\n      () => {\n        this.isInitialised = true; // Consider the component as \"initalised\" after the initial transition has completed.\n        this.highlightInTransition = false;\n        this.changeDetector.detectChanges();\n      },\n      (this.isInitialised ? HIGHLIGHT_TRANSITION_DURATION : INITIAL_TRANSITION_DURATION) * 1000\n    );\n  }\n\n  /** Update the highlight position when a group has been toggled. */\n  public onItemExpandedChange(item: SidenavItem): void {\n    setTimeout(this.updateHighlightPosition.bind(this, false), TOGGLE_TRANSITION_DURATION * 1000);\n    this.itemExpandedChange.emit(item);\n    this.itemsChange.emit(this.items);\n  }\n\n  /** Updates the navigation layout. Invoked on initialisation and when resizing. */\n  private updateNavLayout(): void {\n    this.navMinHeight = this.scrollContainerElm.nativeElement.getBoundingClientRect().height;\n    this.changeDetector.detectChanges();\n  }\n\n  /** Handle highlight while window resize */\n  private addResizeHandler(): void {\n    fromEvent(window, 'resize')\n      .pipe(\n        takeUntilDestroyed(this.destroyRef),\n        // Hide highlight while resizing to avoid strange visual effects\n        tap(() => {\n          this.isResizing = true;\n          this.changeDetector.detectChanges();\n        }),\n        // Update layout\n        debounceTime(50),\n        tap(() => {\n          this.updateNavLayout();\n          this.updateHighlightPosition(false);\n        }),\n        // Show the highlight again after resize has finished\n        debounceTime(300),\n        tap(() => {\n          this.isResizing = false;\n          this.changeDetector.detectChanges();\n          this.updateNavLayout();\n        })\n      )\n      .subscribe();\n  }\n\n  /**\n   * Auto collapse/expand on mouse enter/leave while in overlay-mode (small viewports).\n   */\n  private handleMouseEnterLeave(event: MouseEvent): void {\n    if (!this.layoutService.useOverlayLayout()) return;\n    this.sidenavService.setExpanded(event.type === 'mouseenter');\n  }\n}\n","<nav\n  class=\"wrapper\"\n  [class.expanded]=\"sidenavService.isExpanded$ | async\"\n  [class.highlight-transition-in-progress]=\"highlightInTransition\"\n  [class.is-resizing]=\"isResizing\">\n  <ul>\n    <li class=\"highlight\" data-cy=\"open-sidenav\" data-testid=\"open-sidenav\">\n      <span class=\"item-link\" (click)=\"toggle()\">\n        <talenra-icon name=\"menu\" class=\"item-icon\" [class.active]=\"(sidenavService.isExpanded$ | async) !== true\" />\n        <talenra-icon name=\"arrow-back\" class=\"item-icon\" [class.active]=\"sidenavService.isExpanded$ | async\" />\n      </span>\n    </li>\n  </ul>\n  <talenra-scroll-container class=\"scroll-container\" useOffset #scrollContainer>\n    <div class=\"nav-wrapper\" [style.minHeight.px]=\"navMinHeight\" #navWrapper>\n      <ul class=\"nav-upper\">\n        <ng-template *ngTemplateOutlet=\"tplItems; context: { slot: 'top', items: items, level: 0 }\" />\n      </ul>\n      @if (bottomItems.length > 0) {\n        <ul class=\"nav-lower\">\n          <ng-template *ngTemplateOutlet=\"tplItems; context: { slot: 'bottom', items: bottomItems, level: 0 }\" />\n        </ul>\n      }\n      <talenra-sidenav-highlight\n        [visible]=\"!isResizing\"\n        [state]=\"highlightProps.state\"\n        [top]=\"highlightProps.top\"\n        [bottom]=\"highlightProps.bottom\"\n        [inTransition]=\"highlightInTransition\" />\n    </div>\n  </talenra-scroll-container>\n</nav>\n\n<!--\n  Reusable template block \"navigation items group\".\n  s. https://angular.io/api/common/NgTemplateOutlet\n-->\n<ng-template #tplItems let-slot=\"slot\" let-items=\"items\" let-level=\"level\">\n  @for (item of items; track itemTrackBy($index, item)) {\n    <!-- Item without children -->\n    @if (!itemHasChildren(item)) {\n      <talenra-sidenav-item\n        [isActive]=\"isActive(item)\"\n        [isExpanded]=\"!!(sidenavService.isExpanded$ | async)\"\n        [isHighlighted]=\"!!(slot === 'top' && level === 0 && $index === highlightIndex)\"\n        [item]=\"item\"\n        [level]=\"level\" />\n    } @else {\n      <talenra-sidenav-item\n        [isActive]=\"isActive(item)\"\n        [isExpanded]=\"!!(sidenavService.isExpanded$ | async)\"\n        [isHighlighted]=\"!!(slot === 'top' && level === 0 && $index === highlightIndex)\"\n        [(item)]=\"items[$index]\"\n        [level]=\"level\"\n        (itemExpandedChange)=\"onItemExpandedChange($event)\" />\n      <ul class=\"item-group\" [class.visible]=\"item.isExpanded\">\n        <div class=\"item-group__inner\">\n          <ng-container *ngTemplateOutlet=\"tplItems; context: { items: itemGetChildren(item), level: level + 1 }\" />\n        </div>\n      </ul>\n    }\n    <!-- Item with children -->\n  }\n</ng-template>\n","import { Component, Input, Output, EventEmitter, OnChanges, ViewChild, ElementRef, AfterViewInit } from '@angular/core';\nimport { asapScheduler } from 'rxjs';\nimport { IconComponent } from '@talenra/ngx-base/icons';\nimport { CdkCopyToClipboard } from '@angular/cdk/clipboard';\nimport { ScrollContainerComponent } from '@talenra/ngx-base/scroll-container';\nimport { SupportedEnvironment } from './system-info.types';\n\n/**\n * Localized text for tooltip.\n * This is a temporary solution as we do not support i18n yet.\n * TODO: Migrate once we have i18n set-up.\n *\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst clipboardLabelText: any = {\n  en: 'Copy list',\n  de: 'Liste kopieren',\n  fr: 'Copier la liste',\n  it: \"Copiare l'elenco\",\n};\n\n/** @internal */\n@Component({\n  selector: 'talenra-system-info',\n  templateUrl: './system-info.component.html',\n  styleUrls: ['./system-info.component.scss'],\n  imports: [IconComponent, CdkCopyToClipboard, ScrollContainerComponent],\n})\nexport class SystemInfoComponent implements AfterViewInit, OnChanges {\n  /** Name of the app as displayed in the header. If the app name is associated with a\n   * logotype, this logotype is rendered and the display name is shortened accordingly\n   * (e.g. \"talenra Fall-Manager\" is rendered as \"[talenra Logotype] Fall-Manager\") */\n  @Input() public appDisplayName = '';\n  /** Key of the logotype to be used in the UI. */\n  @Input() public logotype = '';\n  /** Code for current environment (e.g. 'DEV', 'EDU', 'PROD').  */\n  @Input() env: SupportedEnvironment = SupportedEnvironment.PROD;\n  /** Code for the current language (e.g. 'de', 'fr', 'it'). */\n  @Input() public lang = '';\n  /** Version as displayed in the app footer. */\n  @Input() versionString = '';\n  /** Emitted when the system info panel is closed. */\n  @Output() closed = new EventEmitter();\n  /** Determines whether to show the app name. */\n  public showAppName = false;\n  /** Text used in the clipboard tooltip */\n  public clipboardLabel = '';\n  /** Content copied to the user's clipboard if the button is triggered. */\n  public clipboardContent = '';\n  /** @internal */\n  @ViewChild('content') private contentRef?: ElementRef;\n\n  /** @internal */\n  public closePanel(): void {\n    this.closed.emit();\n  }\n\n  /** @internal */\n  ngAfterViewInit(): void {\n    asapScheduler.schedule(() => {\n      this.updateClipboardContent();\n    });\n  }\n\n  /** @internal */\n  ngOnChanges(): void {\n    this.showAppName = !!this.logotype && this.env.toUpperCase() === 'PROD';\n    this.clipboardLabel = clipboardLabelText[this.lang] || clipboardLabelText.en;\n    asapScheduler.schedule(() => {\n      this.updateClipboardContent();\n    });\n  }\n\n  /**\n   * Update the content copied to the user's clipboard\n   */\n  private updateClipboardContent(): void {\n    const contentElm = this.contentRef?.nativeElement;\n    const frags: string[] = [];\n    // App name, environment, version and language\n    frags.push(`${this.appDisplayName} ${this.versionString}`);\n    // Content of the panel in plain text\n    contentElm && frags.push(`${contentElm.textContent || contentElm.innerText}`.trim());\n    this.clipboardContent = frags.join(' - ');\n  }\n}\n","<header class=\"header\" [class]=\"env.toLowerCase()\">\n  @if (showAppName) {\n    <span class=\"wordmark\">\n      <talenra-icon class=\"wordmark-icon\" [name]=\"'wordmark-' + logotype\" />\n    </span>\n  }\n  <span class=\"title\">\n    <span>{{ showAppName ? appDisplayName : versionString }}</span>\n    <span class=\"copy\">\n      @if (!!versionString) {\n        <talenra-icon name=\"layers\" class=\"icon\" [cdkCopyToClipboard]=\"clipboardContent\" />\n      }\n      <span class=\"tooltip\">{{ clipboardLabel }}</span>\n    </span>\n  </span>\n  <span class=\"close\" (click)=\"closePanel()\">\n    <talenra-icon name=\"close\" class=\"icon\" />\n  </span>\n</header>\n<div class=\"content\" #content>\n  <talenra-scroll-container useOffset class=\"content__inner\">\n    <ng-content />\n  </talenra-scroll-container>\n</div>\n","import { AfterViewInit, Component, ElementRef, Input, OnChanges, ViewChild } from '@angular/core';\nimport { asapScheduler } from 'rxjs';\nimport { LIB_VERSION } from '@talenra/ngx-base/shared';\nimport { IconComponent } from '@talenra/ngx-base/icons';\nimport { ClickStopPropagationDirective } from '@talenra/ngx-base/dev-kit';\nimport { SystemInfoComponent } from './system-info/system-info.component';\nimport { SupportedEnvironment } from './system-info/system-info.types';\n\n/** @internal */\n@Component({\n  selector: 'talenra-app-footer',\n  templateUrl: './app-footer.component.html',\n  styleUrls: ['./app-footer.component.scss'],\n  host: {\n    '(window:keyup.escape)': 'hideSystemInfo()',\n  },\n  imports: [IconComponent, SystemInfoComponent, ClickStopPropagationDirective],\n})\nexport class AppFooterComponent implements OnChanges, AfterViewInit {\n  /** Code for current environment (e.g. 'DEV', 'EDU', 'PROD').  */\n  @Input() public env: SupportedEnvironment = SupportedEnvironment.PROD;\n  /** The current version (e.g. 'AB123'). */\n  @Input() public appVersion = '';\n  /** Code for the current language (e.g. 'de', 'fr', 'it'). */\n  @Input() public lang = '';\n  /** Name of the app as displayed in the header. If the app name is associated with a\n   * logotype, this logotype is rendered and the display name is shortened accordingly\n   * (e.g. \"talenra Fall-Manager\" is rendered as \"[talenra Logotype] Fall-Manager\") */\n  @Input() public appDisplayName = '';\n  /** Key of the logotype to be used in the UI. */\n  @Input() public logotype = '';\n  protected copyrightYear: string = new Date().getFullYear().toString();\n  protected versionString = '';\n  /** Indicates whether the system info overlay is visible. */\n  protected showSystemInfo = false;\n  /**\n   * Reference to the system info (content) provided by the app.\n   * @internal\n   */\n  @ViewChild('systemInfo') private systemInfoRef?: ElementRef;\n  /**\n   * Indicates whether system info (content) is provided by the app. If not provided, the panel won't be available.\n   */\n  protected hasSystemInfo = false;\n\n  /** @internal */\n  constructor() {\n    const version = LIB_VERSION;\n    const emoticon = version.includes('-rc.') ? '🔬' : '🐙';\n    console.log(\n      `%c${emoticon}  Talenra ${version}`,\n      'font-size: 1rem; font-family: \"Roboto Light\", sans-serif; margin: 0.75rem;'\n    );\n  }\n\n  /** @internal */\n  ngOnChanges(): void {\n    this.updateVersionString();\n  }\n\n  /** @internal */\n  ngAfterViewInit(): void {\n    asapScheduler.schedule(() => {\n      this.hasSystemInfo = !!this.systemInfoRef?.nativeElement.childNodes.length;\n    });\n  }\n\n  /**\n   * Build and set the version string as displayed in the UI.\n   */\n  private updateVersionString(): void {\n    this.versionString = [this.env, this.appVersion, this.lang]\n      .filter((item) => item) // remove empty items\n      .join(' ')\n      .toUpperCase();\n  }\n\n  /** Toggle visibility of system info overlay. */\n  protected toggleSystemInfo(): void {\n    this.showSystemInfo = this.hasSystemInfo && !this.showSystemInfo;\n  }\n\n  /**\n   * Closes system info panel\n   */\n  private hideSystemInfo(): void {\n    this.showSystemInfo && this.toggleSystemInfo();\n  }\n}\n","<div class=\"container\">\n  <div class=\"app-meta\">\n    <talenra-icon name=\"wordmark\" class=\"logotype\" />\n    <span class=\"copyright\">© {{ copyrightYear }} Talenra GmbH</span>\n    <div class=\"label\" [class]=\"env.toLowerCase()\" [class.has-pane]=\"hasSystemInfo\" (click)=\"toggleSystemInfo()\">\n      @if (hasSystemInfo) {\n        <talenra-icon name=\"info\" class=\"label__icon\" />\n      }\n      <span class=\"label__version\">{{ versionString }}</span>\n    </div>\n  </div>\n</div>\n\n<div\n  class=\"system-info-backdrop\"\n  [class.disabled]=\"!hasSystemInfo\"\n  [class.active]=\"showSystemInfo\"\n  [attr.inert]=\"showSystemInfo ? null : ''\"\n  (click)=\"toggleSystemInfo()\">\n  <talenra-system-info\n    class=\"system-info-pane\"\n    [appDisplayName]=\"appDisplayName\"\n    [logotype]=\"logotype\"\n    [env]=\"env\"\n    [lang]=\"lang\"\n    [versionString]=\"versionString\"\n    clickStopPropagation\n    (closed)=\"toggleSystemInfo()\"\n    ><div #systemInfo><ng-content></ng-content></div\n  ></talenra-system-info>\n</div>\n","import {\n  Component,\n  Input,\n  OnInit,\n  OnChanges,\n  booleanAttribute,\n  EventEmitter,\n  Output,\n  inject,\n  DestroyRef,\n} from '@angular/core';\nimport { LayoutService } from '@talenra/ngx-base/layout-service';\nimport { SidepanelService } from '@talenra/ngx-base/workspace-sidepanel';\nimport { deprecationWarning } from '@talenra/ngx-base/dev-kit';\nimport { AsyncPipe } from '@angular/common';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { SidenavService } from '../app-sidenav/sidenav.service';\nimport { HeaderDrawerService } from '../header-drawer/header-drawer.service';\nimport { SidenavItem } from '../app-sidenav/app-sidenav.types';\nimport { AppHeaderDrawerStateItem } from '../header-drawer/header-drawer.types';\nimport { SupportedEnvironment } from '../app-footer/system-info/system-info.types';\nimport { AppHeaderComponent } from '../app-header/app-header.component';\nimport { AppSidenavComponent } from '../app-sidenav/app-sidenav.component';\nimport { AppFooterComponent } from '../app-footer/app-footer.component';\n\n/**\n * Provides the global app layout. Is typically placed at the root of your app's\n * component tree.\n *\n * ### Template slots\n *\n * The template uses three template slots\n *\n * - **[default]** – Projects child elements of `<talenra-app-frame>` except for\n * children using one of the following attributes. Typically the only element\n * you want to be projected in the default template slot is `<router-outlet>`.\n * - **appHeader** - The element with the `appHeader` attribute is\n * projected in the slot in the upper-right corner of the app's header. This\n * slot is typically used for buttons like \"apps\", \"user-settings\" etc. Expects\n * a single element. Example: `<div appHeader>`\n * - **appHeaderDrawer** - Elements with the `appHeaderDrawer` attribute are\n * expected to be instances of `<talenra-header-drawer>` component and are\n * projected in the global \"App Header Drawer\". Check the component's docs for\n * details. Example: `<talenra-header-drawer appHeaderDrawer […] >`\n *\n * ### Import\n *\n * ```typescript\n * import { AppLayoutModule } from '@talenra/ngx-base/app-layout';\n * ```\n *\n * <example-url>../../#/welcome</example-url>\n */\n@Component({\n  selector: 'talenra-app-frame',\n  templateUrl: './app-frame.component.html',\n  styleUrls: ['./app-frame.component.scss'],\n  host: {\n    '(window:keyup.escape)': 'autoCollapse()',\n    '[class.headerless]': 'headerless',\n  },\n  imports: [AppHeaderComponent, AppSidenavComponent, AppFooterComponent, AsyncPipe],\n})\nexport class AppFrameComponent implements OnInit, OnChanges {\n  /** Name of the issuer of the app (e.g. \"SVA Zürich\") */\n  @Input() public issuerName = '';\n\n  /**\n   * Name of the app (e.g. \"SoHi\"). Note that while most app names are\n   * displayed as plain text, some names might be represented as logotype\n   * (e.g. \"talenra\").\n   */\n  @Input() public appName = '';\n  /** Code for the current environment (e.g. 'AIT', 'DEV', 'EDU', 'SIT', 'PROD'). Displayed in the app's footer. */\n  @Input() public appEnv: SupportedEnvironment = SupportedEnvironment.PROD;\n  /** Version of the app (e.g. 'AB123' or '1.2.3') */\n  @Input() public appVersion = '';\n  /** Code for the current language (e.g. 'de', 'fr', 'it'). Displayed in the app's footer. */\n  @Input() public appLang = '';\n\n  /**\n   * Items displayed in the main section of the side-navigation. Supports two-way binding.\n   *\n   * ```html\n   * <!-- Component template -->\n   * <talenra-app-frame [...] [(sidenavItems)]=\"sidenavItems\"></talenra-checkbox>\n   * ```\n   *\n   * see {@link SidenavItem}\n   */\n  @Input() public sidenavItems: SidenavItem[] = [];\n\n  /**\n   * Event emitted when value of `sidenavItems` changes.\n   *\n   * ```typescript\n   * // Component class\n   * sidenavItemsChange(sidenavItems: SidenavItem[]): void => {\n   *   console.log(sidenavItems);\n   * }\n   * ```\n   *\n   * ```html\n   * <!-- Component template -->\n   * <talenra-app-frame [...] [(sidenavItems)]=\"sidenavItems\" (sidenavItemsChange)=\"sidenavItemsChange($event)\"></talenra-app-frame>\n   * ```\n   */\n  @Output() public readonly sidenavItemsChange: EventEmitter<SidenavItem[]> = new EventEmitter<SidenavItem[]>();\n\n  /**\n   * Event emitted when a sidenavItem is toggled (property `isExpanded` has updated). The updated item is attached.\n   *\n   * ```typescript\n   * // Component class\n   * sidenavItemExpandedChange(sidenavItem: SidenavItem): void => {\n   *   console.log(sidenavItem);\n   * }\n   * ```\n   *\n   * ```html\n   * <!-- Component template -->\n   * <talenra-app-frame\n   *   [...]\n   *   [(sidenavItems)]=\"sidenavItems\"\n   *   (sidenavItemExpandedChange)=\"sidenavItemExpandedChange($event)\"></talenra-app-frame>\n   * ```\n   */\n  @Output() public readonly sidenavItemExpandedChange: EventEmitter<SidenavItem> = new EventEmitter<SidenavItem>();\n\n  /**\n   * Items displayed in the footer section of the side-navigation. Typically\n   * used for things like settings.\n   *\n   * see {@link SidenavItem}\n   */\n  @Input() public sidenavBottomItems: SidenavItem[] = [];\n\n  /**\n   * Renders the layout _without_ the app's header. Note that this option is deprecated and support will be dropped.\n   *\n   * Headerless mode is required by the apps listed below. It is deprecated on release and _shall not be used by any\n   * other product_.\n   *\n   * - KAMESA\n   * - SoHi\n   *\n   * IMPORTANT: Support shall not be dropped without consulting the teams responsible for the apps listed above.\n   *\n   * @deprecated\n   */\n  @Input({ transform: booleanAttribute })\n  public headerless = false;\n\n  protected currentAppHeaderDrawerItem: AppHeaderDrawerStateItem = null;\n\n  /** List of all logotypes available. */\n  private logotypes: string[] = ['talenra'];\n\n  /** Name of the app as displayed in the header. If the app name is associated with a\n   * logotype, this logotype is rendered and the display name is shortened accordingly\n   * (e.g. \"talenra Fall-Manager\" is rendered as \"[talenra Logotype] Fall-Manager\") */\n  @Input() public appDisplayName = '';\n\n  /**\n   * Key of the logotype to be used in the UI. Is set automatically based on the provided app name.\n   */\n  protected logotype = '';\n\n  private readonly layoutService = inject(LayoutService);\n  protected readonly sidenavService = inject(SidenavService);\n  protected readonly sidepanelService = inject(SidepanelService);\n  private readonly headerDrawerService = inject(HeaderDrawerService);\n  private readonly destroyRef: DestroyRef = inject(DestroyRef);\n\n  /** @internal */\n  ngOnInit(): void {\n    // Subscribe to header-drawer udpates\n    this.headerDrawerService.item$\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe(({ current }) => (this.currentAppHeaderDrawerItem = current));\n  }\n\n  /** @internal */\n  // Update class name whenever `headerless` updates\n  ngOnChanges(): void {\n    this.updateAppDisplayName();\n    // Throw deprecation warning whenever headless mode is used\n    this.headerless &&\n      deprecationWarning({\n        submodule: 'app-frame',\n        className: this.constructor.name,\n        member: 'Headerless mode',\n        instructions: 'Remove property `headerless` from `<talenra-app-frame>`',\n      });\n  }\n\n  protected handleItemsChange(): void {\n    this.sidenavItemsChange.emit(this.sidenavItems);\n  }\n\n  protected onSidenavItemExpandedChange(item: SidenavItem): void {\n    this.sidenavItemExpandedChange.emit(item);\n  }\n\n  /**\n   * Collapse overlays on outside-click\n   */\n  protected autoCollapse(): void {\n    this.headerDrawerService.close();\n    // Small viewports only: Collapse side-navigation and side-panel\n    if (this.layoutService.useOverlayLayout()) {\n      this.sidenavService.setExpanded(false);\n      this.sidepanelService.setExpanded(false);\n    }\n  }\n\n  /**\n   * Updates the app's display name logotype key based on the given app name.\n   */\n  private updateAppDisplayName(): void {\n    const appNameLower = this.appName.toLowerCase();\n    const index = this.logotypes.findIndex((logotype) => appNameLower.startsWith(logotype));\n    this.logotype = index >= 0 ? this.logotypes[index] : '';\n    this.appDisplayName = this.appName.substring(this.logotype.length).trim();\n  }\n}\n","@if (!!currentAppHeaderDrawerItem || (sidenavService.isExpanded$ | async) || (sidepanelService.isExpanded$ | async)) {\n  <div class=\"auto-collapse\" [class.has-drawer]=\"!!currentAppHeaderDrawerItem\" (mouseover)=\"autoCollapse()\"></div>\n}\n\n@if (headerless !== true) {\n  <talenra-app-header\n    class=\"header\"\n    [issuerName]=\"issuerName\"\n    [appDisplayName]=\"appDisplayName\"\n    [logotype]=\"logotype\"\n    [appEnv]=\"appEnv\">\n    <ng-content select=\"[appHeader]\" />\n  </talenra-app-header>\n}\n<div class=\"drawer\" [class.active]=\"!!currentAppHeaderDrawerItem\">\n  <ng-content select=\"[appHeaderDrawer]\" />\n</div>\n<section\n  class=\"body\"\n  [class.sidenav-expanded]=\"(sidenavService.isExpanded$ | async) && (sidenavService.isHidden$ | async) !== true\">\n  <div class=\"page\">\n    <talenra-app-sidenav\n      class=\"sidenav\"\n      [class.hidden]=\"sidenavService.isHidden$ | async\"\n      [class.expanded]=\"sidenavService.isExpanded$ | async\"\n      [(items)]=\"sidenavItems\"\n      (itemsChange)=\"handleItemsChange()\"\n      (itemExpandedChange)=\"onSidenavItemExpandedChange($event)\"\n      [bottomItems]=\"sidenavBottomItems\" />\n    <div class=\"feature\">\n      <ng-content />\n    </div>\n  </div>\n</section>\n<talenra-app-footer\n  class=\"footer\"\n  [appVersion]=\"appVersion\"\n  [appDisplayName]=\"appDisplayName\"\n  [logotype]=\"logotype\"\n  [lang]=\"appLang\"\n  [env]=\"appEnv\"\n  ><ng-content select=\"[systemInfo]\" />\n</talenra-app-footer>\n\n<div class=\"overlay-container\"></div>\n","/**\n * Layout widths supported by workspace layouts (e.g. WorkspaceSimple).\n *\n * ```html\n * <talenra-workspace-simple width=\"s\"></talenra-workspace-simple>\n * ```\n *\n * ### Import\n *\n * ```typescript\n * import { WorkspaceWidth } from '@talenra/ngx-base/app-layout';\n * ```\n *\n * @see {@link TWorkspaceWidth}\n * @see {@link WorkspaceSimpleComponent}\n */\nexport const WorkspaceWidth = {\n  XS: 'xs',\n  S: 's',\n  M: 'm',\n  L: 'l',\n  Max: 'max',\n} as const;\n\n/**\n * Type of layout sizes supported by Workspace layouts.\n *\n * ### Import\n *\n * ```typescript\n * import { TWorkspaceWidth } from '@talenra/ngx-base/app-layout';\n * ```\n *\n * @see {@link WorkspaceWidth}\n * @see {@link WorkspaceSimpleComponent}\n */\nexport type TWorkspaceWidth = (typeof WorkspaceWidth)[keyof typeof WorkspaceWidth];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["tap","debounceTime"],"mappings":";;;;;;;;;;;;;;;;AAKA;;;;;;;;AAQG;MAIU,cAAc,CAAA;AAH3B,IAAA,WAAA,GAAA;;AAME;;;AAGG;AACa,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC;;AAWxD;;;AAGG;AACa,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC;;AAWtD;;;;;;;;;;;;;;;;;AAiBG;AACa,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,eAAe,CAAuB,IAAI,CAAC;AA4ChF;AAtFC;;AAEG;AACI,IAAA,WAAW,CAAC,UAAmB,EAAA;AACpC,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC;;AAWnC;;AAEG;AACI,IAAA,SAAS,CAAC,QAAiB,EAAA;AAChC,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;;AAyB/B;;;;AAIG;AACI,IAAA,eAAe,CAAC,YAA2B,EAAA;AAChD,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC;;AAUvC;;;;AAIG;AACI,IAAA,WAAW,CAAC,KAAmB,EAAA;AACpC,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;;AAGrB;;;;AAIG;IACI,oBAAoB,CAAC,UAAU,GAAG,EAAE,EAAA;AACzC,QAAA,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,UAAU,CAAC,GAAG,EAAE;;AAGxE;;;;AAIG;IACI,sBAAsB,CAAC,UAAU,GAAG,EAAE,EAAA;AAC3C,QAAA,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,UAAU,CAAC,GAAG,EAAE;;8GA7F/D,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAd,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA,CAAA;;2FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACZD;;;;;;;;AAQG;MAIU,mBAAmB,CAAA;AAHhC,IAAA,WAAA,GAAA;AAIE;;AAEG;AACK,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,eAAe,CAA2B,IAAI,CAAC;AAEtE;;;;;;AAMG;AACa,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CACxC,SAAS,CAAC,IAAI,CAAC,EACf,QAAQ,EAAE,EACV,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAC9C;AAwBF;AAtBC;;AAEG;AACI,IAAA,UAAU,CAAC,IAAY,EAAA;AAC5B,QAAA,MAAM,YAAY,GAA6B,IAAI,CAAC,QAAQ,CAAC,KAAK;AAClE,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;;AAGzD;;;AAGG;AACI,IAAA,OAAO,CAAC,IAA8B,EAAA;AAC3C,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;;AAG1B;;AAEG;IACI,KAAK,GAAA;AACV,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;;8GAvCf,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFlB,MAAM,EAAA,CAAA,CAAA;;2FAEP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACCD;;;;;;;;;;AAUG;MASU,qBAAqB,CAAA;;AAElB,IAAA,SAAA,IAAA,CAAA,mBAAmB,GAAG,GAAG,CAAC;;AA2DxC,IAAA,WAAA,GAAA;AAzDA;;AAEG;QACa,IAAE,CAAA,EAAA,GAAG,EAAE;AASvB;;;;;;;AAOG;QACa,IAAW,CAAA,WAAA,GAAG,EAAE;QAExB,IAAe,CAAA,eAAA,GAAG,EAAE;AAKpB,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAC;;AAQvB,QAAA,IAAA,CAAA,kBAAkB,GAAW,qBAAqB,CAAC,mBAAmB,CAAC;;QAGvE,IAAe,CAAA,eAAA,GAAG,CAAC;;QAGnB,IAAU,CAAA,UAAA,GAAG,KAAK;AAER,QAAA,IAAA,CAAA,UAAU,GAAe,MAAM,CAAC,UAAU,CAAC;AAE5D;;;;AAIe;QACR,IAAiB,CAAA,iBAAA,GAAG,KAAK;AAIxB,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;QAIvD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK;;;IAItD,QAAQ,GAAA;QACN,IAAI,CAAC,gBAAgB,EAAE;;;IAIzB,eAAe,GAAA;;;QAGb,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,eAAe,EAAE;AACtB,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;SAC9B,EAAE,GAAG,CAAC;;AAEP,QAAA,SAAS,CAAC,MAAM,EAAE,QAAQ;aACvB,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AAC7F,aAAA,SAAS,EAAE;;AAGhB;;;;;AAKG;IACH,qBAAqB,GAAA;AACnB,QAAA,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,eAAe;YAAE;AAC/C,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,WAAW;AACvC,QAAA,IAAI,CAAC,iBAAiB,EAAE,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE;;AAGhF;;;AAGG;IACK,gBAAgB,GAAA;AACtB,QAAA,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAI;YAClD,IAAI,CAAC,iBAAiB,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE;YAC1C,IAAI,CAAC,eAAe,GAAG,OAAO,KAAK,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,qBAAqB,CAAC,mBAAmB,GAAG,GAAG,GAAG,CAAC;AAC1G,SAAC,CAAC;;AAGJ;;;;AAIG;IACK,YAAY,GAAA;AAClB,QAAA,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;AACvC,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;QACtB,IAAI,CAAC,eAAe,EAAE;QACtB,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,MAAK;AAC1C,YAAA,IAAI,CAAC,UAAU,GAAG,KAAK;SACxB,EAAE,GAAG,CAAC;;IAGD,eAAe,GAAA;QACrB,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE;QACtB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY;;;IAI1D,aAAa,GAAA;QAClB,OAAO,IAAI,CAAC,iBAAiB,EAAE,OAAO,KAAK,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;;;IAI3E,QAAQ,GAAA;QACb,OAAO,IAAI,CAAC,iBAAiB,EAAE,OAAO,KAAK,IAAI,CAAC,EAAE;;AAGpD;;AAEG;IACK,QAAQ,GAAA;AACd,QAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC;;8GA5I7B,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,kUCnClC,8YAaA,EAAA,MAAA,EAAA,CAAA,6oCAAA,CAAA,EAAA,CAAA,CAAA;;2FDsBa,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBARjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAG3B,IAAA,EAAA;AACJ,wBAAA,uBAAuB,EAAE,YAAY;AACtC,qBAAA,EAAA,QAAA,EAAA,8YAAA,EAAA,MAAA,EAAA,CAAA,6oCAAA,CAAA,EAAA;wDASe,EAAE,EAAA,CAAA;sBAAjB;gBAOe,UAAU,EAAA,CAAA;sBAAzB;gBAUe,WAAW,EAAA,CAAA;sBAA1B;gBAK6B,UAAU,EAAA,CAAA;sBAAvC,SAAS;uBAAC,SAAS;;;AEhEtB;;;;;;;;;;;;;AAaG;IACS;AAAZ,CAAA,UAAY,yBAAyB,EAAA;AACnC,IAAA,yBAAA,CAAA,cAAA,CAAA,GAAA,eAA8B;AAChC,CAAC,EAFW,yBAAyB,KAAzB,yBAAyB,GAEpC,EAAA,CAAA,CAAA;;AChBD;;;;;;;;AAQG;IACS;AAAZ,CAAA,UAAY,oBAAoB,EAAA;AAC9B,IAAA,oBAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACX,IAAA,oBAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACX,IAAA,oBAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACX,IAAA,oBAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACX,IAAA,oBAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACf,CAAC,EANW,oBAAoB,KAApB,oBAAoB,GAM/B,EAAA,CAAA,CAAA;;ACXD;MAaa,kBAAkB,CAAA;AAZ/B,IAAA,WAAA,GAAA;;AAcS,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAS,EAAE,CAAC;AACrC;;AAEoF;AAC7E,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAS,EAAE,CAAC;;AAElC,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAS,EAAE,CAAC;;AAE5B,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAuB,oBAAoB,CAAC,IAAI,CAAC;;QAE5D,IAAY,CAAA,YAAA,GAAY,IAAI;AAUvC;;IAPW,cAAc,GAAA;AACtB,QAAA,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY;;AAGxC,IAAA,IAAY,SAAS,GAAA;QACnB,OAAO,CAAA,KAAA,EAAQ,IAAI,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAA,CAAE;;8GApBnC,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,gCAAA,EAAA,kBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,WAAA,EAAA,sBAAA,EAAA,cAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjB/B,0gBAiBA,EAAA,MAAA,EAAA,CAAA,2xDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDFY,aAAa,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAEZ,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAZ9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAGb,eAAA,EAAA,uBAAuB,CAAC,MAAM,EACzC,IAAA,EAAA;AACJ,wBAAA,SAAS,EAAE,WAAW;AACtB,wBAAA,wBAAwB,EAAE,cAAc;AACxC,wBAAA,kCAAkC,EAAE,kBAAkB;qBACvD,EACQ,OAAA,EAAA,CAAC,aAAa,CAAC,EAAA,QAAA,EAAA,0gBAAA,EAAA,MAAA,EAAA,CAAA,2xDAAA,CAAA,EAAA;;;AET1B;MAQa,oBAAoB,CAAA;AAPjC,IAAA,WAAA,GAAA;QAQkB,IAAQ,CAAA,QAAA,GAAG,KAAK;QAChB,IAAU,CAAA,UAAA,GAAG,KAAK;QAClB,IAAa,CAAA,aAAA,GAAG,KAAK;QACrB,IAAK,CAAA,KAAA,GAAG,CAAC;AACT,QAAA,IAAA,CAAA,IAAI,GAAgB,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;AAClD,QAAA,IAAA,CAAA,UAAU,GAA8B,IAAI,YAAY,EAAe;AACvE,QAAA,IAAA,CAAA,kBAAkB,GAA8B,IAAI,YAAY,EAAe;AAEjG,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAkChC;AAhCC;;AAEG;AACI,IAAA,QAAQ,CAAC,KAAiB,EAAA;;QAE/B,IAAK,KAAK,CAAC,MAAsB,CAAC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAAE;;AAExE,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;;YAE1B,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE;;YAE3C;;;AAGF,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;;AAG/C;;AAEG;IACI,WAAW,GAAA;AAChB,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;;AAG9D;;AAEG;IACI,cAAc,GAAA;QACnB,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU;QAC5C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;;8GAzC9B,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,ECdjC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,aAAA,EAAA,eAAA,EAAA,KAAA,EAAA,OAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,uwBAqBA,EDTY,MAAA,EAAA,CAAA,s+GAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,aAAa,2EAAE,cAAc,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAE5B,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;+BACE,sBAAsB,EAAA,eAAA,EAGf,uBAAuB,CAAC,MAAM,WACtC,CAAC,aAAa,EAAE,cAAc,CAAC,EAAA,QAAA,EAAA,uwBAAA,EAAA,MAAA,EAAA,CAAA,s+GAAA,CAAA,EAAA;8BAGxB,QAAQ,EAAA,CAAA;sBAAvB;gBACe,UAAU,EAAA,CAAA;sBAAzB;gBACe,aAAa,EAAA,CAAA;sBAA5B;gBACe,KAAK,EAAA,CAAA;sBAApB;gBACe,IAAI,EAAA,CAAA;sBAAnB;gBACyB,UAAU,EAAA,CAAA;sBAAnC;gBACyB,kBAAkB,EAAA,CAAA;sBAA3C;;;AEHH;;;;AAIG;MAYU,yBAAyB,CAAA;AAXtC,IAAA,WAAA,GAAA;AAYE;;;AAGG;QACK,IAAa,CAAA,aAAA,GAAG,KAAK;AAE7B;;;AAGG;QACK,IAAc,CAAA,cAAA,GAA0B,UAAU;QAiBlD,IAAM,CAAA,MAAA,GAA0B,UAAU;QAc1C,IAAQ,CAAA,QAAA,GAAG,IAAI;AAEvB;;AAEG;QACa,IAAG,CAAA,GAAA,GAAG,CAAC;AAEvB;;AAEG;QACa,IAAM,CAAA,MAAA,GAAG,CAAC;QAalB,IAAa,CAAA,aAAA,GAAG,IAAI;AAE5B;;AAEG;QACK,IAAS,CAAA,SAAA,GAAkB,MAAM;QAEjC,IAAS,CAAA,SAAA,GAAG,EAAE;AAEd,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;AA+BnD;AA5FC;;AAEG;AACH,IAAA,IACW,KAAK,GAAA;QACd,OAAO,IAAI,CAAC,MAAM;;IAEpB,IAAW,KAAK,CAAC,KAA4B,EAAA;AAC3C,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACvB,YAAA,IAAI,CAAC,cAAc,GAAG,KAAK;YAC3B;;AAEF,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;QACnB,IAAI,CAAC,eAAe,EAAE;;AAIxB;;;AAGG;AACH,IAAA,IACW,OAAO,GAAA;QAChB,OAAO,IAAI,CAAC,QAAQ;;IAEtB,IAAW,OAAO,CAAC,KAAc,EAAA;AAC/B,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;QACrB,IAAI,CAAC,eAAe,EAAE;;AAcxB;;AAEG;AACH,IAAA,IACW,YAAY,GAAA;QACrB,OAAO,IAAI,CAAC,aAAa;;IAE3B,IAAW,YAAY,CAAC,KAAc,EAAA;AACpC,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;QAC1B,IAAI,CAAC,eAAe,EAAE;;;IAcxB,eAAe,GAAA;;QAEb,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,cAAc;AAChC,YAAA,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;SACnC,EAAE,IAAI,CAAC;;;AAIV,IAAA,WAAW,CAAC,OAAsB,EAAA;;AAEhC,QAAA,IAAI,OAAO,CAAC,GAAG,EAAE;YACf,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,MAAM,GAAG,IAAI;YACrF,IAAI,CAAC,eAAe,EAAE;;;IAIlB,eAAe,GAAA;QACrB,IAAI,CAAC,SAAS,GAAG;YACf,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,WAAW;YAC/B,IAAI,CAAC,KAAK,KAAK,QAAQ,GAAG,WAAW,GAAG,EAAE;YAC1C,CAAc,WAAA,EAAA,IAAI,CAAC,SAAS,CAAE,CAAA;YAC9B,IAAI,CAAC,YAAY,GAAG,eAAe,GAAG,EAAE;AACzC;AACE,aAAA,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI;aACrB,IAAI,CAAC,GAAG,CAAC;;8GAvGH,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,0TAT1B,CAAE,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,6oBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FASD,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAXrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,2BAA2B,YAC3B,CAAE,CAAA,EAAA,eAAA,EAEK,uBAAuB,CAAC,MAAM,EACzC,IAAA,EAAA;AACJ,wBAAA,gBAAgB,EAAE,KAAK;AACvB,wBAAA,mBAAmB,EAAE,QAAQ;AAC7B,wBAAA,SAAS,EAAE,WAAW;AACvB,qBAAA,EAAA,MAAA,EAAA,CAAA,6oBAAA,CAAA,EAAA;8BAmBU,KAAK,EAAA,CAAA;sBADf;gBAmBU,OAAO,EAAA,CAAA;sBADjB;gBAae,GAAG,EAAA,CAAA;sBAAlB;gBAKe,MAAM,EAAA,CAAA;sBAArB;gBAMU,YAAY,EAAA,CAAA;sBADtB;;;ACnEH;;;;AAIG;MACU,YAAY,CAAA;AAAzB,IAAA,WAAA,GAAA;;QAEU,IAAkB,CAAA,kBAAA,GAAgB,EAAE;;QAEpC,IAAmB,CAAA,mBAAA,GAAgB,EAAE;AAE7C;;;;;;AAMG;AACI,QAAA,IAAA,CAAA,WAAW,GAAG,CAAC,KAAoB,KAAU;YAClD,MAAM,gBAAgB,GAAgB,EAAE;YACxC,MAAM,eAAe,GAAgB,EAAE;;YAEvC,MAAM,UAAU,GAAG,CAAC,KAAkB,EAAE,GAAW,EAAE,IAAiB,EAAE,OAAiB,KAAU;;AAEjG,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AAAE,oBAAA,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;;gBAExD,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC3B,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;AAClC,aAAC;AACD,YAAA,MAAM,YAAY,GAAG,CAAC,KAAoB,EAAE,OAAiB,KAAU;gBACrE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;;AAE5B,oBAAA,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ;AAClC,wBAAA,UAAU,CAAC,gBAAgB,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC;;oBAE3E,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,eAAe,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC;;oBAE1F,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,QAAyB,EAAE,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC;AAChH,iBAAC,CAAC;AACJ,aAAC;AACD,YAAA,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC;AACvB,YAAA,IAAI,CAAC,mBAAmB,GAAG,gBAAgB;AAC3C,YAAA,IAAI,CAAC,kBAAkB,GAAG,eAAe;AAC3C,SAAC;AAED;;AAEG;AACI,QAAA,IAAA,CAAA,qBAAqB,GAAG,CAAC,WAAmB,KAAmB;YACpE,OAAO,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,KAAK,IAAI,EAAE;AAC3D,SAAC;AAED;;;AAGG;AACI,QAAA,IAAA,CAAA,uBAAuB,GAAG,CAAC,WAAmB,KAAgB;YACnE,OAAO,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,OAAO,IAAI,EAAE;AAC7D,SAAC;AAED;;AAEG;AACI,QAAA,IAAA,CAAA,oBAAoB,GAAG,CAAC,UAAkB,KAAmB;YAClE,OAAO,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE,KAAK,IAAI,EAAE;AACzD,SAAC;AAED;;;AAGG;AACI,QAAA,IAAA,CAAA,sBAAsB,GAAG,CAAC,UAAkB,KAAgB;YACjE,OAAO,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE,OAAO,IAAI,EAAE;AAC3D,SAAC;;AACF;;ACpED;;;;AAIG;AACH,MAAM,6BAA6B,GAAG,GAAG;AAEzC;;;;AAIG;AACH,MAAM,2BAA2B,GAAG,GAAG;AAEvC;;;;AAIG;AACH,MAAM,0BAA0B,GAAG,GAAG;AAEtC;MAmBa,mBAAmB,CAAA;;AAE9B,IAAA,IAEI,KAAK,GAAA;QACP,OAAO,IAAI,CAAC,MAAM;;;IAGpB,IAAI,KAAK,CAAC,YAA2B,EAAA;;AAEnC,QAAA,IAAI,CAAC,MAAM,GAAG,YAAY;;QAE1B,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;;AAElC,QAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;;;AAyDhC,IAAA,WAAA,GAAA;QAvDQ,IAAM,CAAA,MAAA,GAAkB,EAAE;;AAER,QAAA,IAAA,CAAA,WAAW,GAAgC,IAAI,YAAY,EAAiB;;AAE5E,QAAA,IAAA,CAAA,kBAAkB,GAA8B,IAAI,YAAY,EAAe;AACjG,QAAA,IAAA,CAAA,KAAK,GAAiB,IAAI,YAAY,EAAE;;QAGhC,IAAW,CAAA,WAAA,GAAkB,EAAE;;QAEvC,IAAU,CAAA,UAAA,GAAG,GAAG;;QAEjB,IAAU,CAAA,UAAA,GAAG,KAAK;;QAYlB,IAAY,CAAA,YAAA,GAAG,CAAC;;AAShB,QAAA,IAAA,CAAA,cAAc,GAAkE;AACrF,YAAA,KAAK,EAAE,UAAU;AACjB,YAAA,GAAG,EAAE,CAAC;AACN,YAAA,MAAM,EAAE,CAAC;SACV;;QAEM,IAAqB,CAAA,qBAAA,GAAG,KAAK;AAGpC;;;AAGG;QACK,IAAa,CAAA,aAAA,GAAG,KAAK;AAEV,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACzC,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC1C,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AACrC,QAAA,IAAA,CAAA,UAAU,GAAe,MAAM,CAAC,UAAU,CAAC;QAI1D,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;;;IAI7C,QAAQ,GAAA;;QAEN,IAAI,CAAC,MAAM,CAAC;AACT,aAAA,IAAI,CACH,MAAM,CAAC,CAAC,KAAY,KAAK,KAAK,YAAY,aAAa,CAAC,EACxD,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AAEpC,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;;AAEnB,YAAA,IAAI,CAAC,UAAU,GAAI,KAAuB,CAAC,iBAAiB;;AAE5D,YAAA,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;;YAEtF,IAAI,CAAC,kBAAkB,EAAE;AACzB,YAAA,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE;AACrC,SAAC,CAAC;;;IAIN,eAAe,GAAA;QACb,aAAa,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QACpD,IAAI,CAAC,gBAAgB,EAAE;;;IAIlB,MAAM,GAAA;QACX,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,QAAQ,EAAE;QAC7D,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC;;;AAIvC,IAAA,QAAQ,CAAC,IAAiB,EAAA;;AAE/B,QAAA,MAAM,WAAW,GAAG,CAAC,GAAW,KAAa,GAAG,CAAC,OAAO,CAAC,wBAAwB,EAAE,MAAM,CAAC;;AAE1F,QAAA,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE;AACxC,YAAA,OAAO,KAAK;;;QAGd,IAAI,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,WAAW;AAAE,YAAA,OAAO,IAAI;;;;;AAKzE,QAAA,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,CAAI,CAAA,EAAA,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA,SAAA,CAAW,CAAC;QACxE,OAAO,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;;;IAInD,WAAW,CAAC,KAAa,EAAE,KAAkB,EAAA;AAClD,QAAA,OAAO,GAAG,KAAK,CAAC,KAAK,CAAI,CAAA,EAAA,KAAK,EAAE;;;AAI3B,IAAA,eAAe,CAAC,IAAiB,EAAA;AACtC,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;;;AAI7C,IAAA,eAAe,CAAC,IAAiB,EAAA;AACtC,QAAA,OAAO,IAAI,CAAC,QAAQ,IAAI,EAAE;;;IAIpB,kBAAkB,CAAC,QAAQ,GAAG,IAAI,EAAA;AACxC,QAAA,MAAM,OAAO,GAAe,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAC1F,QAAA,IAAI,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE;AACzB,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc;YACzC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,YAAA,IAAI,aAAa,KAAK,IAAI,CAAC,cAAc;gBAAE;;YAE3C,aAAa,KAAK,SAAS,IAAI,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC;AAClE,YAAA,IAAI,CAAC,cAAc,CAAC,KAAK,GAAG,QAAQ;AACpC,YAAA,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC;;aACjC;AACL,YAAA,IAAI,CAAC,cAAc,GAAG,SAAS;AAC/B,YAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;AACjC,YAAA,IAAI,CAAC,cAAc,CAAC,KAAK,GAAG,UAAU;AACtC,YAAA,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE;;;;IAK/B,uBAAuB,CAAC,QAAQ,GAAG,IAAI,EAAA;QAC7C,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE;;QAE9D,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,qBAAqB,EAAE;AAC5E,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,aAAa,CAAC,qBAAqB,EAAE;;AAE9F,QAAA,IAAI,CAAC,qBAAqB,GAAG,QAAQ;AACrC,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG;AACxD,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM;AACjE,QAAA,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE;AACnC,QAAA,IAAI,CAAC,QAAQ;YAAE;;AAEf,QAAA,YAAY,CAAC,IAAI,CAAC,4BAA4B,CAAC;AAC/C,QAAA,IAAI,CAAC,4BAA4B,GAAG,UAAU,CAC5C,MAAK;AACH,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AAC1B,YAAA,IAAI,CAAC,qBAAqB,GAAG,KAAK;AAClC,YAAA,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE;AACrC,SAAC,EACD,CAAC,IAAI,CAAC,aAAa,GAAG,6BAA6B,GAAG,2BAA2B,IAAI,IAAI,CAC1F;;;AAII,IAAA,oBAAoB,CAAC,IAAiB,EAAA;AAC3C,QAAA,UAAU,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,0BAA0B,GAAG,IAAI,CAAC;AAC7F,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;QAClC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;;;IAI3B,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC,MAAM;AACxF,QAAA,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE;;;IAI7B,gBAAgB,GAAA;AACtB,QAAA,SAAS,CAAC,MAAM,EAAE,QAAQ;AACvB,aAAA,IAAI,CACH,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;;QAEnCA,KAAG,CAAC,MAAK;AACP,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,YAAA,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE;AACrC,SAAC,CAAC;;AAEF,QAAAC,cAAY,CAAC,EAAE,CAAC,EAChBD,KAAG,CAAC,MAAK;YACP,IAAI,CAAC,eAAe,EAAE;AACtB,YAAA,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC;AACrC,SAAC,CAAC;;AAEF,QAAAC,cAAY,CAAC,GAAG,CAAC,EACjBD,KAAG,CAAC,MAAK;AACP,YAAA,IAAI,CAAC,UAAU,GAAG,KAAK;AACvB,YAAA,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE;YACnC,IAAI,CAAC,eAAe,EAAE;AACxB,SAAC,CAAC;AAEH,aAAA,SAAS,EAAE;;AAGhB;;AAEG;AACK,IAAA,qBAAqB,CAAC,KAAiB,EAAA;AAC7C,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE;YAAE;QAC5C,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC;;8GAnOnD,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,YAAA,EAAA,+BAAA,EAAA,YAAA,EAAA,+BAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAiCQ,UAAU,EAKf,EAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAAA,UAAU,2CAO7B,oBAAoB,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAAU,UAAU,ECnHxD,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,ssFAgEA,4+EDFI,aAAa,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,wBAAwB,EACxB,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,WAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,gBAAgB,oJAChB,yBAAyB,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,KAAA,EAAA,QAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACzB,oBAAoB,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,eAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACpB,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAGA,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAlB/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAGd,eAAA,EAAA,uBAAuB,CAAC,MAAM,EACzC,IAAA,EAAA;AACJ,wBAAA,cAAc,EAAE,+BAA+B;AAC/C,wBAAA,cAAc,EAAE,+BAA+B;qBAChD,EACQ,OAAA,EAAA;wBACP,aAAa;wBACb,wBAAwB;wBACxB,gBAAgB;wBAChB,yBAAyB;wBACzB,oBAAoB;wBACpB,SAAS;AACV,qBAAA,EAAA,QAAA,EAAA,ssFAAA,EAAA,MAAA,EAAA,CAAA,o7EAAA,CAAA,EAAA;wDAMG,KAAK,EAAA,CAAA;sBAFR;gBAgByB,WAAW,EAAA,CAAA;sBAApC;gBAEyB,kBAAkB,EAAA,CAAA;sBAA3C;gBAIe,WAAW,EAAA,CAAA;sBAA1B;gBAS2D,kBAAkB,EAAA,CAAA;sBAA7E,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,iBAAiB,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;gBAKK,aAAa,EAAA,CAAA;sBAAnE,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,YAAY,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;gBAOqB,QAAQ,EAAA,CAAA;sBAAzE,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,oBAAoB,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;;;AE5G1D;;;;;;AAMG;AACH;AACA,MAAM,kBAAkB,GAAQ;AAC9B,IAAA,EAAE,EAAE,WAAW;AACf,IAAA,EAAE,EAAE,gBAAgB;AACpB,IAAA,EAAE,EAAE,iBAAiB;AACrB,IAAA,EAAE,EAAE,kBAAkB;CACvB;AAED;MAOa,mBAAmB,CAAA;AANhC,IAAA,WAAA,GAAA;AAOE;;AAEoF;QACpE,IAAc,CAAA,cAAA,GAAG,EAAE;;QAEnB,IAAQ,CAAA,QAAA,GAAG,EAAE;;AAEpB,QAAA,IAAA,CAAA,GAAG,GAAyB,oBAAoB,CAAC,IAAI;;QAE9C,IAAI,CAAA,IAAA,GAAG,EAAE;;QAEhB,IAAa,CAAA,aAAA,GAAG,EAAE;;AAEjB,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAE;;QAE9B,IAAW,CAAA,WAAA,GAAG,KAAK;;QAEnB,IAAc,CAAA,cAAA,GAAG,EAAE;;QAEnB,IAAgB,CAAA,gBAAA,GAAG,EAAE;AAqC7B;;IAhCQ,UAAU,GAAA;AACf,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;;;IAIpB,eAAe,GAAA;AACb,QAAA,aAAa,CAAC,QAAQ,CAAC,MAAK;YAC1B,IAAI,CAAC,sBAAsB,EAAE;AAC/B,SAAC,CAAC;;;IAIJ,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,MAAM;AACvE,QAAA,IAAI,CAAC,cAAc,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,EAAE;AAC5E,QAAA,aAAa,CAAC,QAAQ,CAAC,MAAK;YAC1B,IAAI,CAAC,sBAAsB,EAAE;AAC/B,SAAC,CAAC;;AAGJ;;AAEG;IACK,sBAAsB,GAAA;AAC5B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa;QACjD,MAAM,KAAK,GAAa,EAAE;;AAE1B,QAAA,KAAK,CAAC,IAAI,CAAC,CAAA,EAAG,IAAI,CAAC,cAAc,CAAA,CAAA,EAAI,IAAI,CAAC,aAAa,CAAA,CAAE,CAAC;;AAE1D,QAAA,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,CAAA,EAAG,UAAU,CAAC,WAAW,IAAI,UAAU,CAAC,SAAS,CAAA,CAAE,CAAC,IAAI,EAAE,CAAC;QACpF,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;;8GAvDhC,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,wWC7BhC,w0BAwBA,EAAA,MAAA,EAAA,CAAA,m4DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDGY,aAAa,EAAE,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,kBAAkB,sKAAE,wBAAwB,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,WAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAE1D,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAN/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,WAGtB,CAAC,aAAa,EAAE,kBAAkB,EAAE,wBAAwB,CAAC,EAAA,QAAA,EAAA,w0BAAA,EAAA,MAAA,EAAA,CAAA,m4DAAA,CAAA,EAAA;8BAMtD,cAAc,EAAA,CAAA;sBAA7B;gBAEe,QAAQ,EAAA,CAAA;sBAAvB;gBAEQ,GAAG,EAAA,CAAA;sBAAX;gBAEe,IAAI,EAAA,CAAA;sBAAnB;gBAEQ,aAAa,EAAA,CAAA;sBAArB;gBAES,MAAM,EAAA,CAAA;sBAAf;gBAQ6B,UAAU,EAAA,CAAA;sBAAvC,SAAS;uBAAC,SAAS;;;AE3CtB;MAUa,kBAAkB,CAAA;;AA4B7B,IAAA,WAAA,GAAA;;AA1BgB,QAAA,IAAA,CAAA,GAAG,GAAyB,oBAAoB,CAAC,IAAI;;QAErD,IAAU,CAAA,UAAA,GAAG,EAAE;;QAEf,IAAI,CAAA,IAAA,GAAG,EAAE;AACzB;;AAEoF;QACpE,IAAc,CAAA,cAAA,GAAG,EAAE;;QAEnB,IAAQ,CAAA,QAAA,GAAG,EAAE;QACnB,IAAa,CAAA,aAAA,GAAW,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;QAC3D,IAAa,CAAA,aAAA,GAAG,EAAE;;QAElB,IAAc,CAAA,cAAA,GAAG,KAAK;AAMhC;;AAEG;QACO,IAAa,CAAA,aAAA,GAAG,KAAK;QAI7B,MAAM,OAAO,GAAG,WAAW;AAC3B,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,IAAI;QACvD,OAAO,CAAC,GAAG,CACT,CAAK,EAAA,EAAA,QAAQ,CAAa,UAAA,EAAA,OAAO,CAAE,CAAA,EACnC,4EAA4E,CAC7E;;;IAIH,WAAW,GAAA;QACT,IAAI,CAAC,mBAAmB,EAAE;;;IAI5B,eAAe,GAAA;AACb,QAAA,aAAa,CAAC,QAAQ,CAAC,MAAK;AAC1B,YAAA,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,UAAU,CAAC,MAAM;AAC5E,SAAC,CAAC;;AAGJ;;AAEG;IACK,mBAAmB,GAAA;AACzB,QAAA,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI;aACvD,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;aACtB,IAAI,CAAC,GAAG;AACR,aAAA,WAAW,EAAE;;;IAIR,gBAAgB,GAAA;QACxB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,cAAc;;AAGlE;;AAEG;IACK,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,gBAAgB,EAAE;;8GApErC,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,4YClB/B,6iCA+BA,EAAA,MAAA,EAAA,CAAA,+5CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDfY,aAAa,EAAE,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,mBAAmB,6JAAE,6BAA6B,EAAA,QAAA,EAAA,wBAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAEhE,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAT9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAGxB,IAAA,EAAA;AACJ,wBAAA,uBAAuB,EAAE,kBAAkB;AAC5C,qBAAA,EAAA,OAAA,EACQ,CAAC,aAAa,EAAE,mBAAmB,EAAE,6BAA6B,CAAC,EAAA,QAAA,EAAA,6iCAAA,EAAA,MAAA,EAAA,CAAA,+5CAAA,CAAA,EAAA;wDAI5D,GAAG,EAAA,CAAA;sBAAlB;gBAEe,UAAU,EAAA,CAAA;sBAAzB;gBAEe,IAAI,EAAA,CAAA;sBAAnB;gBAIe,cAAc,EAAA,CAAA;sBAA7B;gBAEe,QAAQ,EAAA,CAAA;sBAAvB;gBASgC,aAAa,EAAA,CAAA;sBAA7C,SAAS;uBAAC,YAAY;;;AEdzB;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BG;MAWU,iBAAiB,CAAA;AAV9B,IAAA,WAAA,GAAA;;QAYkB,IAAU,CAAA,UAAA,GAAG,EAAE;AAE/B;;;;AAIG;QACa,IAAO,CAAA,OAAA,GAAG,EAAE;;AAEZ,QAAA,IAAA,CAAA,MAAM,GAAyB,oBAAoB,CAAC,IAAI;;QAExD,IAAU,CAAA,UAAA,GAAG,EAAE;;QAEf,IAAO,CAAA,OAAA,GAAG,EAAE;AAE5B;;;;;;;;;AASG;QACa,IAAY,CAAA,YAAA,GAAkB,EAAE;AAEhD;;;;;;;;;;;;;;AAcG;AACuB,QAAA,IAAA,CAAA,kBAAkB,GAAgC,IAAI,YAAY,EAAiB;AAE7G;;;;;;;;;;;;;;;;;AAiBG;AACuB,QAAA,IAAA,CAAA,yBAAyB,GAA8B,IAAI,YAAY,EAAe;AAEhH;;;;;AAKG;QACa,IAAkB,CAAA,kBAAA,GAAkB,EAAE;AAEtD;;;;;;;;;;;;AAYG;QAEI,IAAU,CAAA,UAAA,GAAG,KAAK;QAEf,IAA0B,CAAA,0BAAA,GAA6B,IAAI;;AAG7D,QAAA,IAAA,CAAA,SAAS,GAAa,CAAC,SAAS,CAAC;AAEzC;;AAEoF;QACpE,IAAc,CAAA,cAAA,GAAG,EAAE;AAEnC;;AAEG;QACO,IAAQ,CAAA,QAAA,GAAG,EAAE;AAEN,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AACnC,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC7C,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACjD,QAAA,IAAA,CAAA,UAAU,GAAe,MAAM,CAAC,UAAU,CAAC;AAqD7D;;IAlDC,QAAQ,GAAA;;QAEN,IAAI,CAAC,mBAAmB,CAAC;AACtB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,0BAA0B,GAAG,OAAO,CAAC,CAAC;;;;IAK5E,WAAW,GAAA;QACT,IAAI,CAAC,oBAAoB,EAAE;;AAE3B,QAAA,IAAI,CAAC,UAAU;AACb,YAAA,kBAAkB,CAAC;AACjB,gBAAA,SAAS,EAAE,WAAW;AACtB,gBAAA,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI;AAChC,gBAAA,MAAM,EAAE,iBAAiB;AACzB,gBAAA,YAAY,EAAE,yDAAyD;AACxE,aAAA,CAAC;;IAGI,iBAAiB,GAAA;QACzB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;;AAGvC,IAAA,2BAA2B,CAAC,IAAiB,EAAA;AACrD,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;;AAG3C;;AAEG;IACO,YAAY,GAAA;AACpB,QAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE;;AAEhC,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,EAAE;AACzC,YAAA,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,KAAK,CAAC;AACtC,YAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,KAAK,CAAC;;;AAI5C;;AAEG;IACK,oBAAoB,GAAA;QAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,QAAQ,KAAK,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AACvF,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE;AACvD,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE;;8GAhKhE,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,OAAA,EAAA,SAAA,EAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAuFR,gBAAgB,CAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,qBAAA,EAAA,gBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtJtC,whDA6CA,EAAA,MAAA,EAAA,CAAA,ylEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDgBY,kBAAkB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,kBAAkB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,YAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAErE,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAV7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAGvB,IAAA,EAAA;AACJ,wBAAA,uBAAuB,EAAE,gBAAgB;AACzC,wBAAA,oBAAoB,EAAE,YAAY;qBACnC,EACQ,OAAA,EAAA,CAAC,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,SAAS,CAAC,EAAA,QAAA,EAAA,whDAAA,EAAA,MAAA,EAAA,CAAA,ylEAAA,CAAA,EAAA;8BAIjE,UAAU,EAAA,CAAA;sBAAzB;gBAOe,OAAO,EAAA,CAAA;sBAAtB;gBAEe,MAAM,EAAA,CAAA;sBAArB;gBAEe,UAAU,EAAA,CAAA;sBAAzB;gBAEe,OAAO,EAAA,CAAA;sBAAtB;gBAYe,YAAY,EAAA,CAAA;sBAA3B;gBAiByB,kBAAkB,EAAA,CAAA;sBAA3C;gBAoByB,yBAAyB,EAAA,CAAA;sBAAlD;gBAQe,kBAAkB,EAAA,CAAA;sBAAjC;gBAgBM,UAAU,EAAA,CAAA;sBADhB,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;gBAWtB,cAAc,EAAA,CAAA;sBAA7B;;;AEjKH;;;;;;;;;;;;;;;AAeG;AACU,MAAA,cAAc,GAAG;AAC5B,IAAA,EAAE,EAAE,IAAI;AACR,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,GAAG,EAAE,KAAK;;;ACrBZ;;AAEG;;;;"}